基于深度学习算法的动物检测系统(含PyQt+代码+训练数据集)
前言
本项目是基于MobileNet深度学习网络模型的动物检测系统,目前能够检测大象、狗、蝴蝶、坤坤、牛、马等10种动物,可以自己添加动物种类进行训练。本文将详述数据集处理、模型构建、训练代码、以及基于PyQt5的应用界面设计。在应用中可以对动物的图片进行识别,输出动物的类别、模型对其预测结果的置信度以及关于该动物的详细描述。本文附带了完整的应用界面设计、深度学习模型代码和训练数据集的下载链接。
完整资源下载链接:
项目演示视频:
一、数据集
1.1 数据集介绍
本项目使用的数据集在all_data
文件夹下。它包含了来自10种不同的动物类别的图像(来自网络采集),每个类别有1000张以上的图像,共计26179张图像。这些动物类别包括:大象、狗、蝴蝶、坤坤、牛、马等。
该文件夹下包含了10个子文件夹,每个子文件夹都存储了一种类别的动物图像,子文件夹的名称就是动物类别的名称,同时为了保证数据的多样性和代表性,每类动物包括多个个体和不同的姿态。动物数据集,如下图所示:
1.2 数据预处理
首先使用MyDataSet
类在 PyTorch 中加载图像数据并将其与相应的类别标签配对,完成自定义数据集的生成。它包含初始化方法__init__
来接收图像文件路径列表和对应的类别标签列表,并提供了__getitem__
方法来获取图像及其标签,同时还可以使用collate_fn
将多个样本进行批处理。
class MyDataSet(Dataset):
"""自定义数据集"""
def __init__(self, images_path: list, images_class: list, transform=None):
self.images_path = images_path
self.images_class = images_class
self.transform = transform
def __len__(self):
return len(self.images_path)
def __getitem__(self, item):
img = Image.open(self.images_path[item])
# RGB为彩色图片,L为灰度图片
if img.mode != 'RGB':
raise ValueError("image: {} isn't RGB mode.".format(self.images_path[item]))
label = self.images_class[item]
if self.transform is not None:
img = self.transform(img)
return img, label
@staticmethod
def collate_fn(batch):
images, labels = tuple(zip(*batch))
images = torch.stack(images, dim=0)
labels = torch.as_tensor(labels)
return images, labels
然后,我们将所有图像的尺寸调整为224x224像素,以适应模型输入层的要求。最后,应用了一系列数据增强技术来提高模型的泛化能力,包括随机裁剪、水平翻转等。此外,对所有图像进行了标准化处理,使用了ImageNet的预训练均值和标准差,即均值[0.485, 0.456, 0.406],标准差[0.229, 0.224, 0.225]。这些预处理步骤有助于减轻模型在训练过程中因图像大小、颜色变化等因素带来的偏差。
img_size = 224
data_transform = transforms.Compose(
[transforms.Resize(int(img_size * 1.143)),
transforms.CenterCrop(img_size),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
assert os.path.exists(img_path), "file: '{}' dose not exist.".format(img_path)
img = Image.open(img_path)
plt.imshow(img)
# [N, C, H, W]
img = data_transform(img)
# expand batch dimension
img = torch.unsqueeze(img, dim=0)
二、模型搭建
选择MobileNet
作为主要的模型结构。MobileNet
是一种轻量级卷积神经网络,特别适合于资源受限的设备,如移动设备和嵌入式系统。MobileNet
通过引入深度可分离卷积(Depthwise Separable Convolution),显著降低了模型的计算复杂度和参数量,同时保持了较高的分类性能。传统的卷积操作在进行特征提取时需要大量的计算资源。MobileNet
通过将标准卷积分解为深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution),大幅减少了计算量。具体而言,深度卷积是指对每个输入通道单独应用一个卷积核,而逐点卷积则是在深度卷积的输出上应用1x1
卷积核,用于组合这些输出通道。通过这种分解,MobileNet
的计算量和参数量分别减少了约8-9
倍,而模型的分类性能则得到了有效的保持。
MobileNet
的网络架构主要由若干个深度可分离卷积模块组成,每个模块包括一个深度卷积层和一个逐点卷积层。
以下是MobileNet的主要结构特点:
- 输入层:输入层接受224x224的RGB图像,并通过标准卷积层提取初步特征。
- 深度可分离卷积模块:多个深度可分离卷积模块逐层提取和组合特征。每个模块通常伴随着批归一化(Batch Normalization)和ReLU激活函数,以加速收敛和提高非线性表达能力。
- 全局平均池化层:在特征提取完成后,使用全局平均池化层将特征映射缩减为一个向量,减少参数量的同时保持重要信息。
- 全连接层:最终的全连接层用于输出每个类别的概率分布,模型通过Softmax函数生成最终的分类结果。
MobileNet
的网络架构代码如下,
"""mobilenet in pytorch
[1] Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig Adam
MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
https://arxiv.org/abs/1704.04861
"""
import torch
import torch.nn as nn
class DepthSeperabelConv2d(nn.Module):
def __init__(self, input_channels, output_channels, kernel_size, **kwargs):
super().__init__()
self.depthwise = nn.Sequential(
nn.Conv2d(
input_channels,
input_channels,
kernel_size,
groups=input_channels,
**kwargs),
nn.BatchNorm2d(input_channels),
nn.ReLU(inplace=True)
)
self.pointwise = nn.Sequential(
nn.Conv2d(input_channels, output_channels, 1),
nn.BatchNorm2d(output_channels),
nn.ReLU(inplace=True)
)
def forward(self, x):
x = self.depthwise(x)
x = self.pointwise(x)
return x
class BasicConv2d(nn.Module):
def __init__<