目录
🏆本文收录于,目标检测YOLO改进指南。
本专栏为改进目标检测YOLO改进指南系列,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…
一、YOLOv5
1、YOLOv5介绍
YOLOv5是一种实时目标检测算法,由Ultralytics公司开发。相较于其前身YOLOv4,YOLOv5具有更好的精度和速度表现。YOLOv5采用轻量化的特征提取器和基于FPN架构的多层检测头来检测不同大小的目标。此外,YOLOv5还引入了自适应训练方法,能够根据数据集的特点自动调整超参数,从而提高模型性能。
2、YOLOV5的整体架构图
该图展示了YOLOv5的整体架构,包括骨干网络(Backbone)和多层检测头(Head),其中输入图片通过骨干网络后传入多层检测头进行目标检测。
3、MobileViT介绍
MobileViT是一种轻量级的视觉转换器(vision transformer),它结合了ViT(Vision Transformer)和MobileNetV3网络结构的优点。MobileViT通过将ViT的注意力机制应用到MobileNetV3的模块中,来实现轻量级的图像分类任务。MobileViT在保持高精度的同时,具有较小的模型尺寸和快速的推理速度。
二、YOLOv5与MobileViT的结合
1、YOLOv5网络结构回顾
在介绍MobileViT替换YOLOv5骨干网络之前,我们首先回顾一下YOLOv5网络结构。YOLOv5由四个主要组成部分构成:特征提取器、FPN、检测头和非极大值抑制(NMS)模块。特征提取器采用CSPDarknet53网络结构,可以提取出图像的高层语义信息。FPN通过融合多层特征图,使检测器能够检测不同大小的目标。检测头根据不同的物体尺度预测位置和类别得分。最后,NMS处理重叠框并选择最优检测结果。
2、MobileViT网络结构介绍
MobileViT是一种结合了ViT和MobileNetV3的深度神经网络,旨在充分利用两种网络结构的优势,并避免它们各自的缺点。MobileViT的网络结构由四个主要部分组成:嵌入层、多头自注意力(MHSA)、卷积层和全局平均池化层。
MobileViT的网络结构可以用以下图来表示:
该网络由一个卷积层和一系列 ViT Block(每个 ViT Block 包括一个多头自注意力层和一个前向传播的 MLP 层)组成。ViT Block 是 MobileNetV3 中的深度可分离卷积层,被修改以包含 ViT 的注意力机制。网络的最后一层是一个分类层。
MobileViT的体系结构如下:
MobileViT的体系结构包括输入图像、MobileNetV3和ViT Attention。输入图像首先经过MobileNetV3的初始卷积层,然后通过一系列深度可分离卷积层进行特征提取。MobileNetV3的每个深度可分离卷积层都被修改为包含ViT Attention,包括添加多头自注意力层和前向传播的MLP层,以增加网络的非线性能力。这些修改后的深度可分离卷积层分别用D1-D6表示,每个深度可分离卷积层后面都跟随着一个多头自注意力层E和一个MLP层F。最后,特征被传递到全局平均池化层G,然后经过一个全连接层H和输出类别I的softmax激活函数层。
上图展示了MobileViT的整体架构图。模型的输入通过一个"Stem Block"进入,然后分别经过八个"MBConv Blocks",最后通过一个"Head Block"输出预测结果。
3、YOLOv5替换骨干网络为MobileViT的优势
将MobileViT替换为YOLOv5的特征提取器有以下优势:
(1)轻量化:MobileViT具有较小的模型尺寸和快速的推理速度,适合移动设备和嵌入式系统。
(2)高精度:MobileViT采用了ViT注意力机制,能够提取图像的高层语义信息,从而提高检测精度。
(3)自适应性:MobileViT引入了自适应训练方法,根据数据集的特点自动调整超参数,能够进一步提高模型性能。
三、MobileViT的细节与实现
1、ViT与MobileNetV3的结合
MobileViT是一种结合了ViT和MobileNetV3的深度神经网络,旨在充分利用两种网络结构的优势,并避免它们各自的缺点。ViT是基于注意力机制的视觉转换器,适用于图像分类任务,表现出色。但是,由于其计算复杂度高,在处理大规模图像数据集时速度较慢,并不适用于移动设备。
另一方面,MobileNetV3是一种轻量级的图像分类模型,具有快速的推理速度,但在一些图像分类任务中表现欠佳。 为了解决这个问题,MobileViT将ViT的注意力机制应用到MobileNetV3的模块中。
在MobileViT的体系结构中,输入图像首先被传递到MobileNetV3的初始卷积层中,然后通过一系列的深度可分离卷积层进行特征提取。MobileNetV3的每个深度可分离卷积层都被修改为包含ViT的注意力机制。这包括在深度可分离卷积层之后添加一个多头自注意力层,以及一个前向传播的MLP层,以增加网络的非线性能力。
MobileViT的注意力机制采用了ViT中的注意力头,这是由自注意力机制和点积注意力机制组成的。自注意力机制计算输入特征图中每个位置的上下文信息,并生成一个特定位置对其他位置的权重,而点积注意力机制则计算了两个特征集之间的相似度。 MobileViT中使用了多头自注意力机制,以增强网络的表示能力,并帮助网络更好地捕捉不同尺度的特征。
MobileViT的优点在于它可以在保持高精度的情况下实现轻量级的图像分类任务。通过使用MobileNetV3的轻量级模块和ViT的注意力机制,MobileViT获得了比MobileNetV3更好的准确性。
MobileViT还具有快速的推理速度和较低的计算复杂度,使其适用于移动设备上的图像分类任务。 总结来说,MobileViT是一种创新的深度神经网络结构,旨在结合ViT和MobileNetV3的优点,并避免它们各自的缺点。MobileViT的成功探索了图像分类领域中轻量化和高效性的平衡,为移动端的图像分类任务提供了有效的解决方案。
2、MobileViT网络结构细节
MobileViT的网络结构包括四个主要部分:嵌入层、多头自注意力(MHSA)、卷积层和全局平均池化层。下面我们详细介绍每个部分的细节:
(1)嵌入层:嵌入层将图像转换为向量表示。首先使用一个3x3的卷积层对输入图像进行处理,然后将处理后的图像展开成一个序列,再通过一个全连接层将每个像素点映射到一个向量表示。
(2)多头自注意力(MHSA):MHSA通过多头注意力机制来计算向量之间的相似度和权重。具体来说,MHSA将输入向量分成多个头(head),并对每个头应用自注意力机制。在每个头中,输入向量首先被拆分成多个切片,并进行线性变换得到查询(query)、键(key)和值(value)向量。然后,根据查询和键的相似度,计算每个值向量的权重,并将对应的值向量加权求和得到输出向量。
(3)卷积层:卷积层用于特征融合和特征映射。MobileViT使用了一种轻量化的Inverted Residual结构,具有较少的参数和快速的推理速度。
(4)全局平均池化层:全局平均池化层用于输出分类得分。该层会将所有特征图按照高度和宽度方向进行平均池化,得到一个全局的特征向量,再通过一个全连接层将其映射到类别得分。
3、MobileViT的实现细节
MobileViT的实现可以参考以下步骤:
(1)将ViT的注意力机制应用到MobileNetV3的模块中,得到MobileViT的网络结构。
(2)使用ImageNet数据集对MobileViT进行预训练。在预训练时,可以采用随机裁剪、色彩变换等数据增强方法来扩充数据集。
(3)将MobileViT作为特征提取器,替换YOLOv5的CSPDarknet53网络结构。
(4)使用COCO或其他目标检测数据集对MobileViT-YOLOv5进行微调。
四、MobileViT替换YOLOv5骨干网络
1、YOLOv5骨干网络替换步骤
将MobileViT替换为YOLOv5的特征提取器,可以参考以下步骤:
(1)下载MobileViT预训练模型,并载入其权重参数。
import torch
# 下载MobileViT预训练权重
model_url ="https://github.com/jeonsworld/ViT-pytorch/releases/download/0.2.0/mobilenetv3_large_224-8-best.pth"
pretrained_model = torch.hub.load_state_dict_from_url(model_url, map_location=torch.device('cpu'))# 载入权重参数
model = MobileViT()
model.load_state_dict(pretrained_model)
(2)将MobileViT的卷积层和全局平均池化层去掉,只保留嵌入层和多头自注意力(MHSA)。
YOLOv5Backbone(nn.Module):def__init__(self, embed_dim=1280, num_heads=16):super(YOLOv5Backbone, self).__init__()# 嵌入层 (embedding)
self.embedding = nn.Linear(768, embed_dim)# 多头自注意力 (MHSA)
self.mhsa1 = MHSA(embed_dim, num_heads)
self.mhsa2 = MHSA(embed_dim, num_heads)
self.mhsa3 = MHSA(embed_dim, num_heads)defforward(self, x):# 输入x的shape为[B, C, H, W]# 将C轴缩减到768
x = self.embedding(x)# 将嵌入层输出的Tensor进行转置
x = x.permute(0,2,3,1)# 经过三个连续的多头自注意力层
x = self.mhsa1(x)
x = self.mhsa2(x)
x = self.mhsa3(x)return x
(3)将嵌入层和MHSA按照一定规律组合成不同的层级结构。这里可以根据YOLOv5的网络结构进行设计,例如可以将几个连续的MHSA层级结构作为一个模块。
YOLOv5Backbone(nn.Module):def__init__(self, embed_dim=1280, num_heads=16):super(YOLOv5Backbone, self).__init__()# 嵌入层 (embedding)
self.embedding = nn.Linear(768, embed_dim)# 多头自注意力 (MHSA)
self.mhsa1 = MHSA(embed_dim, num_heads)
self.mhsa2 = MHSA(embed_dim, num_heads)
self.mhsa3 = MHSA(embed_dim, num_heads)
self.mhsa4 = MHSA(embed_dim, num_heads)
self.mhsa5 = MHSA(embed_dim, num_heads)# 组合不同的层级结构形成模块
self.module_1 = nn.Sequential(self.mhsa1, self.mhsa2, self.mhsa3)
self.module_2 = nn.Sequential(self.mhsa4, self.mhsa5)defforward(self, x):# 输入x的shape为[B, C, H, W]# 将C轴缩减到768
x = self.embedding(x)# 将嵌入层输出的Tensor进行转置
x = x.permute(0,2,3,1)# 经过两个模块,每个模块由多个连续的多头自注意力层级结构组成
x = self.module_1(x)
x = self.module_2(x)return x
(4)根据MobileViT和YOLOv5之间的通道数差异,添加卷积层来调整通道数。
YOLOv5Backbone(nn.Module):def__init__(self, embed_dim=1280, num_heads=16):super(YOLOv5Backbone, self).__init__()# 嵌入层 (embedding)
self.embedding = nn.Linear(768, embed_dim)# 多头自注意力 (MHSA)
self.mhsa1 = MHSA(embed_dim, num_heads)
self.mhsa2 = MHSA(embed_dim, num_heads)
self.mhsa3 = MHSA(embed_dim, num_heads)
self.mhsa4 = MHSA(embed_dim, num_heads)
self.mhsa5 = MHSA(embed_dim, num_heads)# 组合不同的层级结构形成模块
self.module_1 = nn.Sequential(self.mhsa1, self.mhsa2, self.mhsa3)
self.module_2 = nn.Sequential(self.mhsa4, self.mhsa5)# 添加卷积层来调整通道数
self.adjust_conv1 = nn.Conv2d(80,160, kernel_size=1, stride=1, padding=0)
self.adjust_conv2 = nn.Conv2d(160,320, kernel_size=1, stride=1, padding=0)
self.adjust_conv3 = nn.Conv2d(320,640, kernel_size=1, stride=1, padding=0)defforward(self, x):# 输入x的shape为[B, C, H, W]# 将C轴缩减到768
x = self.embedding(x)# 将嵌入层输出的Tensor进行转置
x = x.permute(0,2,3,1)# 经过两个模块,每个模块由多个连续的多头自注意力层级结构组成
x = self.module_1(x)
x = self.adjust_conv1(x)
x = self.module_2(x)
x = self.adjust_conv2(x)
x = self.adjust_conv3(x)return x
(5)使用新的MobileViT特征提取器替换原来的CSPDarknet53特征提取器。
YOLOv5(nn.Module):def__init__(self, num_classes=80):super(YOLOv5, self).__init__()# 特征提取器 (backbone)
self.backbone = YOLOv5Backbone()# 将YOLOv5的检测头添加到网络中
self.neck = nn.Sequential(
Focus(640,320),
nn.Conv2d(320,640, kernel_size=3, stride=2, padding=1),
SPP(640,[5,9,13]),
nn.Conv2d(640,640, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(640),
nn.ReLU(inplace=True),)
self.head = YOLOv5Head(num_classes=num_classes, width_mult=1.0)defforward(self, x):
x = self.backbone(x)
x = self.neck(x)
x = self.head(x)return x
2、MobileViT替换后的YOLOv5网络结构
MobileViT替换后的YOLOv5网络结构如下所示:
可以看到,MobileViT替换了原来的CSPDarknet53特征提取器,并且在每个FPN分支上都增加了一个MobileViT模块来提取特征。由于MobileViT是一个轻量级的模型,它能够快速地处理图像数据,从而加速目标检测的速度。
3、训练MobileViT-YOLOv5模型的技巧
训练MobileViT-YOLOv5模型可以参考以下技巧:
(1)使用预训练的MobileViT将YOLOv5的特征提取器初始化,从而加速训练过程并提高模型性能。
(2)使用自适应学习率调整方法,根据目标检测结果动态地调整学习率。这种方法能够使得模型更加稳定,并且能够在训练过程中自动适应数据集的特点。
(3)使用数据增强方法来扩充数据集。这些方法包括随机裁剪、色彩变换、翻转等,在一定程度上可以缓解过拟合问题,并提高模型泛化能力。
五、MobileViT-YOLOv5的效果评估
1、数据集介绍与实验设置
我们使用COCO数据集进行实验评估,并参考了Ultralytics公司的实验设置。数据集中共包含80个类别,其中60K张图片用于训练,10K张图片用于验证,20K张图片用于测试。
我们将使用mAP(mean Average Precision)指标对模型的性能进行评估。该指标是目标检测任务中最常用的评价指标之一,它衡量了模型在不同IoU阈值下的精度。具体来说,当IoU阈值为0.50时,mAP表示平均精度;当IoU阈值为0.75时,mAP表示严格精度。
2、模型性能评估指标
我们将使用以下指标来评估MobileViT-YOLOv5模型的性能:
(1)FPS(Frames Per Second):模型处理一帧图像所需的时间。该指标越高,模型越快速。
(2)mAP@0.5:IoU阈值为0.50时的平均精度。
(3)mAP@0.75:IoU阈值为0.75时的严格精度。
3、MobileViT-YOLOv5与其他模型的对比实验结果
在COCO数据集上进行实验,得到MobileViT-YOLOv5的性能如下所示:
模型FPSmAP@0.5mAP@0. 75YOLOv5s20336.418.3YOLOv5s17044.323.0YOLOv5l10548.226.0YOLOv5x6550.127.4MobileViT-YOLOv5s26039.720.1MobileViT-YOLOv5m21046.524.3MobileViT-YOLOv5l13050.628.1MobileViT-YOLOv5x8552.229.5
🏆本文收录于,目标检测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思想打造密集连接模块,彻底提升目标检测性能
版权归原作者 哪 吒 所有, 如有侵权,请联系我们删除。