基于Python深度学习的猩猩种类识别系统

编程入门 行业动态 更新时间:2024-10-08 22:47:49

基于Python深度学习的<a href=https://www.elefans.com/category/jswz/34/1415324.html style=猩猩种类识别系统"/>

基于Python深度学习的猩猩种类识别系统

前言

        猩猩是自然界与人类最亲密的动物,与人类基因相似度达96.4%,通常人们把身材高大略显笨拙的大猩猩与身体灵活且矮小的黑猩猩统称为猩猩,但显然他们不是一个种类的,这里就四种常见的统称为猩猩的灵长类动物用深度学习的方法加以识别。

一、四种猩猩的主要特点

1.大猩猩——它们的身体极为粗壮、剽悍和鲁莽,一般全身被黑色长毛,但面部、耳朵、手足等均无毛,也没有须毛,颜面皮肤皱褶很多,长相十分丑陋而凶恶。双眼深深凹陷,距离较宽,眼膜为褐色。鼻梁塌陷,鼻孔特大而且具有光泽,有隆起的褶状鼻翼。

2.红毛猩猩——红毛猩猩全身长着红褐色的粗长的毛发,只有脸部光滑无毛。上肢比下肢长,手足的拇指均很短,无尾。雄猩成年后,喉袋会渐渐松弛垂至胸部,脸颊两侧及眼睛上方会长出大块肉瘤般的赘肉。

3.黑猩猩——体毛较为粗短,体型也显得瘦小,面部以黑色居多,也有白色、肉色和灰褐色的。眉骨较高,两眼深陷,虹膜为黄褐色,嘴巴宽阔,头顶较圆而平,没有大猩猩那样的高耸冠垫,另外鼻孔小而窄,嘴唇长而薄,头上长有一对扇风大耳。

4.倭黑猩猩——和黑猩猩外表相似,但比起黑猩猩,它们较能直立,更温顺,很少发怒,也不爱喧哗,鸣叫声也与黑猩猩不同,较爱好和平,身体被毛较短,黑色,通常臀部有1白斑,面部灰褐色,头顶毛发向后,手和脚灰色并覆以稀疏黑毛。

二、样本数据采集与划分

1.图片下载

来源于网络搜索,由于笔者电脑性能有限,故每种仅采集25个样本共100个,分别存在猩猩文件夹下的四个子文件夹中。

2.训练集与测试集划分

将每种图片随机选取10张,共40张分为验证集,剩余的60张为训练集。

import os
import random
from PIL import Image
file_name = os.listdir('D:/program/猩猩')  # os.listdir 用来列出此目录下所有的文件或文件夹名
if not os.path.exists('D:program/猩猩'):os.mkdir('D:/program/猩猩')   #  os.path.exits判断是否存在这个路径,os.mkdir创建单路径s = ['train','val']
for j in s:for i in file_name:os.makedirs('D:/program/猩猩/{0}/{1}'.format(j,i))  # 将每个分类好的数据文件夹的文件夹名创建到我们要存放的数据的文件夹中,os.makedirs创建多级目录for i in file_name:print(i)file = os.listdir('D:/program/猩猩/%s'%i) # %s用于字符输出 print(len(file))num_val = random.sample(file,10)  # radom.sample随机在每个类别的样本抽取10个到验证集中print(num_val)for j in file:num=0print(j)if j in num_val:img = Image.open('D:/program/猩猩/{0}/{1}'.format(i,j)) # 读取图片img.save('D:/program/猩猩/val/{0}/{1}'.format(i,j)) # 存放图片else:img = Image.open('D:/program/猩猩/{0}/{1}'.format(i,j))img.save('D:/program/猩猩/train/{0}/{1}'.format(i,j))


运行上述代码,生成train的val两个文件夹,且每个文件夹包含四种类别图像数据(上述图片是以大猩猩为例)。

三、具体训练过程

1.采用anaconda全家桶一次性安装好开发环境,具体安装配置在这里省略。

2.导入所需要的包及库。

import matplotlib
import matplotlib.pyplot as plt
import torch
import numpy as np
matplotlib.rc("font",family='SimHei') # 中文字体
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号

检查目前环境,决定是CPU还是GPU处理数据

# 有 GPU 就用 GPU,没有就用 CPU
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
print('device', device)

由于本人电脑没有NVIDIA显卡,故系统采用CPU处理o(╥﹏╥)o

3.图像预处理,主要目的是消除图像中无关的信息,恢复有用的真实信息,增强有关信息的可检测性和最大限度地简化数据,从而改进特征抽取、图像分割、匹配和识别的可靠性。本例中采取缩放、裁剪、图像增强、转Tensor、归一化。

from torchvision import transforms# 训练集图像预处理:缩放、裁剪、图像增强、转Tensor、归一化
train_transform = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])# 测试集图像预处理:缩放、裁剪、转Tensor、归一化
test_transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])

4.载入图像分类数据集训练集路径。

# 数据集文件夹路径
dataset_dir = 'D:\program\猩猩'
train_path = os.path.join(dataset_dir, 'train')
test_path = os.path.join(dataset_dir, 'val')
print('训练集路径', train_path)
print('测试集路径', test_path)
训练集路径 D:\program\猩猩\train
测试集路径 D:\program\猩猩\val
from torchvision import datasets# 载入训练集
train_dataset = datasets.ImageFolder(train_path, train_transform)# 载入测试集
test_dataset = datasets.ImageFolder(test_path, test_transform)print('训练集图像数量', len(train_dataset))
print('类别个数', len(train_dataset.classes))
print('各类别名称', train_dataset.classes)
训练集图像数量 60
类别个数 4
各类别名称 ['倭黑猩猩', '大猩猩', '红毛猩猩', '黑猩猩']
print('测试集图像数量', len(test_dataset))
print('类别个数', len(test_dataset.classes))
print('各类别名称', test_dataset.classes)
测试集图像数量 40
类别个数 4
各类别名称 ['倭黑猩猩', '大猩猩', '红毛猩猩', '黑猩猩']

5.定义数据加载器DataLoader

from torch.utils.data import DataLoaderBATCH_SIZE = 5# 训练集的数据加载器
train_loader = DataLoader(train_dataset,batch_size=BATCH_SIZE,shuffle=True,num_workers=4)# 测试集的数据加载器
test_loader = DataLoader(test_dataset,batch_size=BATCH_SIZE,shuffle=False,num_workers=4)

6.导入训练需使用的工具包

from torchvision import models
import torch.optim as optim
import torch.nn as nn
from tqdm import tqdm

只微调训练模型最后一层

model = models.resnet18(pretrained=True) # 载入预训练模型# 修改全连接层,使得全连接层的输出与当前数据集类别数对应
# 新建的层默认 requires_grad=True
model.fc = nn.Linear(model.fc.in_features, 4)
model.fc
Linear(in_features=512, out_features=4, bias=True)
# 只微调训练最后一层全连接层的参数,其它层冻结
optimizer = optim.Adam(model.fc.parameters())

 训练配置

model = model.to(device)# 交叉熵损失函数
criterion = nn.CrossEntropyLoss() # 训练轮次 Epoch
EPOCHS =10

正式训练

# 遍历每个 EPOCH
for epoch in tqdm(range(EPOCHS)):model.train()for images, labels in train_loader:  # 获得一个 batch 的数据和标注images = images.to(device)labels = labels.to(device)outputs = model(images)loss = criterion(outputs, labels) # 计算当前 batch 中,每个样本的平均交叉熵损失函数值optimizer.zero_grad()loss.backward()optimizer.step()
100%|██████████| 10/10 [39:51<00:00, 239.15s/it

在测试集上初步测试

model.eval()
with torch.no_grad():correct = 0total = 0for images, labels in tqdm(test_loader):images = images.to(device)labels = labels.to(device)outputs = model(images)_, preds = torch.max(outputs, 1)total += labels.size(0)correct += (preds == labels).sum()print('测试集上的准确率为 {:.3f} %'.format(100 * correct / total))
100%|██████████| 8/8 [00:55<00:00,  6.96s/it]
测试集上的准确率为 92.500 %

        由结果可知,仅仅训练60个样本就可以在40个测试样本中得到37个正确结果,也就是说从之前的随机25%的正确率一下子提升到了92.75%的正确率,效果显著。

更多推荐

基于Python深度学习的猩猩种类识别系统

本文发布于:2024-02-14 00:55:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1761456.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:猩猩   识别系统   深度   种类   Python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!