基于深度学习算法的动物检测系统(含PyQt+代码+训练数据集)

前言

本项目是基于MobileNet深度学习网络模型的动物检测系统,目前能够检测大象、狗、蝴蝶、坤坤、牛、马等10种动物,可以自己添加动物种类进行训练。本文将详述数据集处理、模型构建、训练代码、以及基于PyQt5的应用界面设计。在应用中可以对动物的图片进行识别,输出动物的类别、模型对其预测结果的置信度以及关于该动物的详细描述。本文附带了完整的应用界面设计、深度学习模型代码和训练数据集的下载链接。

完整资源下载链接:

  1. 基于深度学习的动物分类检测识别系统(PyQT+代码+训练数据集+UI界面版本1)
  2. 基于深度学习的动物分类检测识别系统(PyQT+代码+训练数据集+UI界面版本2)

项目演示视频:

一、数据集

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的主要结构特点:

  1. 输入层:输入层接受224x224的RGB图像,并通过标准卷积层提取初步特征。
  2. 深度可分离卷积模块:多个深度可分离卷积模块逐层提取和组合特征。每个模块通常伴随着批归一化(Batch Normalization)和ReLU激活函数,以加速收敛和提高非线性表达能力。
  3. 全局平均池化层:在特征提取完成后,使用全局平均池化层将特征映射缩减为一个向量,减少参数量的同时保持重要信息。
  4. 全连接层:最终的全连接层用于输出每个类别的概率分布,模型通过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__<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值