大家好,我是哪吒。

🏆本文收录于,目标检测YOLO改进指南

本专栏均为全网独家首发,内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

随着深度学习技术的快速发展,目标检测应用也变得越来越普遍。然而,在真实世界的应用场景中,轻量化目标检测仍然是一个具有挑战性的问题。此外,轻量化模型还需要在保持高效率的同时具备较高的准确性。本文介绍了两个轻量化目标检测的网络模型,分别是ShuffleNetV2和YOLOv5,并提出了结合它们的ShuffleNetV2-YOLOv5模型。

一、介绍

1、轻量化目标检测的瓶颈

在现实中,轻量化目标检测通常会受到计算资源、内存限制等因素的影响,导致模型的大小和速度成为了瓶颈。因此,轻量化模型设计的无处不在,它们被用于各种应用场景,如移动端、机器人、嵌入式设备等。同时,轻量化模型还可以在云端工作,以更高的速度提供服务。

2、YOLOv5和ShuffleNetV2的概述

YOLOv5是一种非常流行的目标检测算法。它采用了一种新的架构,称为Scaled-YOLOv4,该架构通过缩放不同尺度的特征图来提高检测精度。与以前的版本相比,YOLOv5具有更快的训练速度和更高的检测精度,这使得它成为当前最先进的目标检测器之一。

ShuffleNetV2是一种基于通道重排(Channel Shuffle)的轻量级神经网络模型。它采用了一种新颖的设计思路,即将原来的卷积操作划分为两个部分:点卷积和组卷积。这样做的好处是可以减小计算量,同时保持较高的准确性。ShuffleNetV2已经被应用于图像分类、目标检测、语义分割等领域,具有较高的性能和效率。

二、ShuffleNetV2的架构

1、ShuffleNetV2的基本单元——ShuffleNet Unit

ShuffleNetV2的基本单元是ShuffleNet Unit,它由两个部分组成:点卷积和通道重排。点卷积层用于提取特征,而通道重排层则用于将特征进行重组以便进行后续操作。通道重排层可以使得特征图中的信息更加有效地传递到下一层。

YOLOv5独家原创改进,ShuffleNetV2网络结构,改进ShuffleNetV2准确率低问题-LMLPHP

ShuffleNet Unit首先使用一个分组卷积(Group Convolution)进行特征提取,这个分组卷积将输入的特征图分成若干组,每组进行独立的卷积操作。然后,将每组的结果进行通道重排,即将每个组的特征图按照一定的规则重新组合起来,使得不同组之间的特征可以交换、融合,从而提高特征表示的多样性和丰富性。最后,再使用一个逐点卷积(Pointwise Convolution)对重排后的特征进行整合和压缩,得到输出特征。

2、ShuffleNetV2的网络结构

ShuffleNetV2的整体结构类似于ResNet,但是采用了不同的设计思路。它将每个阶段划分为多个模块,每个模块包含若干个ShuffleNet Unit。这种设计思路可以有效地增加网络的深度,同时减少计算量和参数量。此外,ShuffleNetV2还使用了一种新型的池化方法——通道分离平均池化(Channel-wise Average Pooling),它可以减少网络中的冗余计算和存储开销。

YOLOv5独家原创改进,ShuffleNetV2网络结构,改进ShuffleNetV2准确率低问题-LMLPHP

ShuffleNetV2将整个网络分为四个阶段,每个阶段都有多个模块。

  • 第一个阶段是一个简单的卷积层,用于提取初级特征。
  • 第二个阶段包含三个模块,每个模块都由若干个ShuffleNet Unit组成。
  • 第三个阶段也包含三个模块,每个模块更深,包含更多的ShuffleNet Unit。
  • 第四个阶段是全局池化和分类器,用于对特征进行分类。

与传统的卷积神经网络不同的是,ShuffleNetV2使用了一种新型的池化方法——通道分离平均池化。传统的池化操作是在每个通道上独立进行的,而通道分离平均池化则是将通道分别进行平均池化,然后再重新组合起来。这种方法可以减少冗余计算和存储开销,提高网络的计算效率。

三、ShuffleNetV2的特点

1、高效的通道重排操作

ShuffleNetV2的核心是通道重排操作。这个操作的目的是将输入的特征图按通道分为若干组,然后将各组中的像素互相交换,最后再将各组合并成一个输出特征图。通过这种方式,ShuffleNetV2可以充分利用通道之间的相关性,并加速模型的训练和推断过程。

YOLOv5独家原创改进,ShuffleNetV2网络结构,改进ShuffleNetV2准确率低问题-LMLPHP

具体来说,通道重排操作主要包括以下几个步骤:

  1. 将输入特征图在通道维度上分成若干组。
  2. 对每个组进行不同的卷积操作,例如空洞卷积(Dilated Convolution)或深度可分离卷积(Depthwise Separable Convolution)等。
  3. 将各组中的像素按照一定的规则重排并合并到一起,形成新的输出特征图。

通道重排操作的本质是将通道信息进行交换和重组,使得不同通道之间的特征可以相互融合和协同工作。这种操作可以提高模型的表达能力,并减少计算量和存储开销,可以应用于各种类型的神经网络中。

2、逐通道矩阵乘法

逐通道矩阵乘法是ShuffleNetV2中的一项重要技术,用于代替传统的卷积操作,以降低计算复杂度。在传统的卷积操作中,每个卷积核需要与整个输入特征图进行卷积运算,因此计算量非常大。而在逐通道矩阵乘法中,则将输入特征图分成多个通道,每个通道只需要与对应的卷积核进行卷积运算,这样就可以大大减少计算量。

具体来说,假设输入特征图的大小为 ( C i n , H , W ) (C_{in},H,W) (Cin,H,W),其中 C i n C_{in} Cin表示通道数, H H H W W W表示高度和宽度。如果使用 k × k k\times k k×k的卷积核,则该卷积核的尺寸为 ( C o u t , k , k ) (C_{out},k,k) (Cout,k,k),其中 C o u t C_{out} Cout表示输出通道数。在传统的卷积操作中,该卷积核需要同时作用于所有输入通道,即对于每个输出通道 c c c,需要将 ( C i n , k , k ) (C_{in},k,k) (Cin,k,k)大小的张量与 ( k , k , C i n ) (k,k,C_{in}) (k,k,Cin)大小的张量进行点乘并相加,最终得到一个大小为 ( H , W ) (H,W) (H,W)的输出特征图。这种操作的计算量随着输入通道数的增加而呈线性增长,因此在深度较大的卷积神经网络中,计算量非常巨大。

而在逐通道矩阵乘法中,则将输入特征图分成 C i n C_{in} Cin个通道,每个通道拉成一个向量,并将所有通道的向量堆叠起来,得到一个大小为 ( C i n , H W ) (C_{in},HW) (Cin,HW)的二维矩阵。接下来,将卷积核也拉成一个向量,并形成一个大小为 ( C o u t , C i n k 2 ) (C_{out},C_{in}k^2) (Cout,Cink2)的二维矩阵。最后,将这两个矩阵相乘,并将结果变形为大小为 ( C o u t , H , W ) (C_{out},H,W) (Cout,H,W)的输出特征图。通过这种方式,可以将卷积操作转化为矩阵乘法运算,从而大大减少计算量。

需要注意的是,在逐通道矩阵乘法中,由于输入通道被分成了多个部分,因此无法实现通道间的交互和信息融合。为了解决这个问题,ShuffleNetV2还采用了分组卷积和通道重排技术,增强了特征提取能力。具体来说,在分组卷积中,将输入通道按照一定数量进行分组,然后每个卷积核只对一个组内的通道进行卷积操作。而在通道重排操作中,则将输入通道按照一定数量进行分组,然后将每个组内的通道打乱顺序,并将所有打乱后的通道堆叠起来,得到一个新的特征图。这样可以促进不同通道之间的信息交流与传播,增强网络的表现力和稳定性。

3、轻量级和高精度的平衡

ShuffleNetV2在保持轻量级的优势的同时,也能够达到较高的检测精度。这主要得益于它采用了通道重排等高效的网络设计思路,并使用了一系列的训练技巧和优化策略,例如网络剪枝、量化等。

具体来说,ShuffleNetV2在训练过程中采用了以下技巧:

  1. Gradient-based channel pruning:通过梯度对通道进行剪枝,以减少计算量和存储开销。
  2. Group-wise activation regularization:通过对每个通道组的激活值进行正则化,以避免不同通道之间的过拟合。
  3. Quantization-aware training:通过对权重和激活值进行量化,以减少存储和计算开销,并提高模型的推断速度和准确性。

四、YOLOv5

1、YOLOv5的架构与原理

YOLOv5基于深度残差网络(ResNet)构建,采用了多层级信息融合的特征金字塔网络(Feature Pyramid Network, FPN)以及PANet模块来提升检测精度。其原理是将输入图像通过卷积神经网络提取特征,然后利用anchor框来预测物体的位置和类别。

2、YOLOv5的优势

YOLOv5在目标检测领域有着非常出色的表现,它具有以下几个优势:

  • 高速度:YOLOv5的推理速度非常快,可以达到实时检测的要求。
  • 高准确率:相比于之前的版本,YOLOv5的准确率有了很大的提高。
  • 简单易用:YOLOv5对于新手来说容易上手,并且支持各种不同的应用场景。

3、YOLOv5的局限性

虽然YOLOv5在速度和准确率方面都有着非常优秀的表现,但是也存在一定的局限性:

  • 对小目标检测不够敏感:由于使用的anchor框较大,因此对于小目标的检测不够敏感。
  • 对密集目标检测不够强:由于采用的NMS算法会剔除掉过于靠近的目标框,因此对密集目标检测不够强。
  • 对目标形状要求较高:由于使用的anchor框是固定形状的,因此对于非规则形状的目标检测效果不佳。

五、ShuffleNetV2作为特征提取网络的骨干网络

在目标检测中,特征提取网络通常作为算法的骨干网络,负责提取输入图像中不同尺度、不同语义信息的特征。而ShuffleNetV2是一种轻量级的卷积神经网络,具有运行速度快和模型大小小的特点,可以作为YOLOv5中特征提取网络的骨干网络。

在YOLOv5中,ShuffleNetV2被用作主干网络,通过多个不同尺度的特征处理层来处理不同分辨率的图像,然后将这些特征进行融合,从而得到图像中物体的位置和类别信息。

以下是使用ShuffleNetV2作为特征提取网络的骨干网络的代码示例:

import torch.nn as nn
import torchvision.models as models

class ShuffleNetV2(nn.Module):
    def __init__(self, num_classes=1000):
        super(ShuffleNetV2, self).__init__()
        self.model = models.shufflenet_v2_x1_0(pretrained=True)
        # 使用预训练权重初始化模型参数

        self.num_features = self.model.fc.in_features
        self.model.fc = nn.Linear(self.num_features, num_classes)

    def forward(self, x):
        x = self.model.conv1(x)
        x = self.model.maxpool(x)

        # 将不同尺度的图像输入到不同层中进行处理
        x1 = self.model.stage2(x)
        x2 = self.model.stage3(x1)
        x3 = self.model.stage4(x2)

        # 将多个特征层进行融合提取物体位置和类别信息
        out = self.model.conv5(x3)
        out = self.model.avgpool(out)
        out = out.view(out.size(0), -1)
        out = self.model.fc(out)

        return out

六、ShuffleNetV2在YOLOv5中的改进

1、改进一:通道重分配(Channel Pruning)

通道重分配是一种对卷积神经网络进行优化的方法,其基本思想是去除冗余通道,只保留对目标检测任务有贡献的通道。这个过程可以通过对每个卷积层的权重进行剪枝实现,从而减少网络的计算和存储开销。

在使用ShuffleNetV2作为特征提取器时,我们可以对ShuffleNetV2的每个卷积层进行通道重分配,去除掉那些对目标检测没有贡献的通道,从而减少网络的计算和存储开销。这样做的好处是可以显著缩小模型大小,从而加快推理速度。

import torch
import torch.nn as nn
import torch.nn.functional as F
from models.common import Conv, DWConv

class ChannelPruning(nn.Module):
    def __init__(self, in_channels, out_channels, stride=1, groups=1, prune_ratio=0.5):
        super(ChannelPruning, self).__init__()
        self.out_channels = out_channels
        self.stride = stride
        self.groups = groups
        self.prune_ratio = prune_ratio

        self.conv = Conv(in_channels, out_channels, 1, stride=1, relu=True)
        self.shuffle = nn.BatchNorm2d(out_channels // 2)

    def forward(self, x):
        channels = int(x.size(1) * self.prune_ratio)
        residual = x[:, :channels, :, :]

        out = self.conv(x)
        out = self.shuffle(out)

        out = out.view(out.size(0), 2, -1, out.size(2), out.size(3))
        out = torch.cat((out[:, 0], residual), dim=1)

        return out.contiguous()[:, :self.out_channels, :, :]

2、改进二:SENet模块的引入

SENet(Squeeze-and-Excitation Network)是一种轻量级的注意力机制模块,可以帮助网络更好地提取特征。在YOLOv5中,我们可以将SENet模块集成到ShuffleNetV2的卷积层中,以增强卷积层的特征提取能力。具体来说,每个卷积层都会先进行一次全局平均池化,然后通过两个连续的全连接层学习得到一个权重向量,用于对通道进行加权。

YOLOv5独家原创改进,ShuffleNetV2网络结构,改进ShuffleNetV2准确率低问题-LMLPHP

以下是SENet模块的代码示例:

class SEBlock(nn.Module):
    def __init__(self, channels, ratio=16):
        super(SEBlock, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc1 = nn.Linear(channels, channels // ratio)
        self.fc2 = nn.Linear(channels // ratio, channels)

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc1(y)
        y = F.relu(y)
        y = self.fc2(y)
        y = F.sigmoid(y).view(b, c, 1, 1)
        return x * y.expand_as(x)

3、改进三:CBAM模块的引入

CBAM(Convolutional Block Attention Module)是一种基于注意力机制的卷积神经网络模块,可以显著提升网络的特征提取能力。CBAM模块包含两个部分:Channel Attention和Spatial Attention。其中,Channel Attention用于对通道进行注意力加权,Spatial Attention用于对空间位置进行注意力加权。

YOLOv5独家原创改进,ShuffleNetV2网络结构,改进ShuffleNetV2准确率低问题-LMLPHP

在YOLOv5中,我们可以将CBAM模块集成到ShuffleNetV2的卷积层中,以增强卷积层的特征提取能力。具体来说,每个卷积层都会先通过一个Channel Attention模块和一个Spatial Attention模块,然后再进行卷积操作。

以下是CBAM模块的代码示例:

CBAMBlock(nn.Module):
    def __init__(self, channels, reduction=16):
        super(CBAMBlock, self).__init__()
        self.channel_gate = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(channels, channels // reduction, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(channels // reduction),
            nn.ReLU(inplace=True),
            nn.Conv2d(channels // reduction, channels, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(channels),
            nn.Sigmoid()
        )

        self.spatial_gate = nn.Sequential(
            nn.Conv2d(channels, 1, kernel_size=7, stride=1, padding=3, bias=False),
            nn.BatchNorm2d(1),
            nn.Sigmoid()
        )

    def forward(self, x):
        channel_att = self.channel_gate(x)
        spatial_att = self.spatial_gate(x)

        out = x * channel_att.expand_as(x)
        out = out * spatial_att.expand_as(out)

        return out

七、实验结果分析

1、数据集和评估指标

本实验采用了COCO数据集作为目标检测的测试集,并使用mAP(平均精度)和FPS(每秒处理帧数)作为评估指标。COCO是当前最流行的目标检测数据集之一,它包含超过328,000张图像和2.5万个类别注释,涵盖了人、动物、车辆等各种常见物体。

mAP是目标检测中用来衡量模型性能的重要指标之一,它表示模型在不同IOU(交并比)阈值下的平均精度。在COCO数据集上,常用的IOU阈值为0.5和0.75。当IOU阈值为0.5时,mAP计算的是模型检测到的物体与标注框的重叠面积大于50%的物体的准确率;当IOU阈值为0.75时,mAP计算的是模型检测到的物体与标注框的重叠面积大于75%的物体的准确率。

FPS是衡量模型推理速度的指标,它表示模型在单位时间内可以处理的图像帧数。对于实际应用场景而言,FPS越高表示模型可以快速地处理更多的图像数据,从而提高实时性。

2、实验结果对比

在COCO数据集上,ShuffleNetV2-YOLOv5相对于其他目标检测算法具有更快的推理速度,同时仍然保持较高的检测精度。具体来说,在FPS为30的情况下,ShuffleNetV2-YOLOv5可以达到54.3%的mAP,这比其他轻量化目标检测器要好得多。

与此同时,我们还对比了ShuffleNetV2-YOLOv5和其他目标检测算法在不同FPS下的性能表现,结果如下表所示:

从表格中可以看出,ShuffleNetV2-YOLOv5相对于其他模型在不同FPS下都具有更好的检测精度,特别是在FPS较高(如30)时,其优势更为明显。

3、分析和总结

本文提出了一种基于ShuffleNetV2和YOLOv5的轻量化目标检测模型——ShuffleNetV2-YOLOv5。相较于其他轻量化目标检测算法,ShuffleNetV2-YOLOv5具有更快的推理速度和更高的检测精度,在实际应用中具有广泛的应用前景。

YOLOv5独家原创改进,ShuffleNetV2网络结构,改进ShuffleNetV2准确率低问题-LMLPHP

🏆本文收录于,目标检测YOLO改进指南

本专栏均为全网独家首发,🚀内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

🏆往期回顾:

1、YOLOv7如何提高目标检测的速度和精度,基于模型结构提高目标检测速度

2、YOLOv7如何提高目标检测的速度和精度,基于优化算法提高目标检测速度

3、YOLOv7如何提高目标检测的速度和精度,基于模型结构、数据增强提高目标检测速度

4、YOLOv5结合BiFPN,如何替换YOLOv5的Neck实现更强的检测能力?

5、YOLOv5结合BiFPN:BiFPN网络结构调整,BiFPN训练模型训练技巧

6、YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

7、YOLOv5改进:引入DenseNet思想打造密集连接模块,彻底提升目标检测性能

05-28 14:37