YOLO目标检测创新改进与实战案例专栏
专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLO基础解析+创新改进+实战案例
摘要
轻量级卷积神经网络(CNNs)已成为移动视觉任务的事实标准。它们的空间归纳偏差使它们能够跨不同视觉任务学习具有更少参数的表示。然而,这些网络在空间上是局部的。为了学习全局表示,基于自注意力的视觉Transformer(ViTs)已被采纳。与CNNs不同,ViTs是重量级的。在本文中,我们提出以下问题:是否可能结合CNNs和ViTs的优势构建一个轻量级且低延迟的网络用于移动视觉任务?为此,我们介绍了MobileViT,一个面向移动设备的轻量级通用视觉Transformer。MobileViT以不同的视角呈现了使用Transformer进行信息全局处理的方式。我们的结果表明,MobileViT在不同任务和数据集上明显优于基于CNN和ViT的网络。在ImageNet-1k数据集上,MobileViT以约600万参数实现了78.4%的top-1准确率,比MobileNetv3(基于CNN)和DeIT(基于ViT)准确率高出3.2%和6.2%。在MS-COCO目标检测任务中,MobileViT比MobileNetv3准确率高出5.7%,参数数量相近。我们的源代码是开源的,可在以下链接获取:https://github.com/apple/ml-cvnets。
创新点
MobileViT 是一种轻量级、通用且适用于移动设备的视觉Transformer网络
- 结合CNN、Transformer和ViTs的优势:MobileViT将CNN的空间局部性特征学习、Transformer的全局自注意力机制以及ViTs的视觉表示学习相结合,充分利用三者的优势,旨在构建轻量级、通用且适用于移动设备的视觉处理网络。
- 出色的性能表现:在ImageNet-1k数据集上,MobileViT在参数约为250万时优于MobileNetv2、ShuffleNetv2和MobileNetv3等传统CNNs,甚至比ResNet、DenseNet、EfficientNet等重量级CNNs表现更好。
- 通用用途:MobileViT不仅适用于图像分类任务,还在目标检测和语义分割等移动视觉任务中展现出优异的性能,表现出其通用性和多功能性。
- 简单且易于优化:与许多ViT变体需要复杂数据增强相比,MobileViT在基本数据增强下表现出更好的性能,易于优化和应用于新任务和数据集中。
MobileViT的创新设计使其成为当前领先的移动视觉处理网络之一,为移动设备上的视觉任务提供了全新的解决方案。
yolov8 引入
# MobileViT块的定义,整合了卷积和Transformer结构
class MobileViTBlock(nn.Module):
def __init__(self, dim, depth, channel, kernel_size, patch_size, mlp_dim, dropout=0.):
super().__init__()
self.ph = patch_size # 设置patch的高度
self.pw = patch_size # 设置patch的宽度
self.conv1 = conv_nxn_bn(channel, channel, kernel_size) # 第一个卷积层,用于提取特征
self.conv2 = conv_1x1_bn(channel, dim) # 通过1x1卷积调整通道数
self.transformer = Transformer(dim, depth, 4, 8, mlp_dim, dropout) # Transformer模块,用于处理序列化的patch
self.conv3 = conv_1x1_bn(dim, channel) # 通过1x1卷积恢复通道数
self.conv4 = conv_nxn_bn(2 * channel, channel, kernel_size) # 最后的卷积层,融合特征
def forward(self, x):
y = x.clone() # 复制输入,用于后续与Transformer的输出融合
x = self.conv1(x) # 应用第一个卷积层
x = self.conv2(x) # 通过1x1卷积调整通道数
_, _, h, w = x.shape # 获取特征图的高度和宽度
# 重组特征图以适应Transformer的输入格式
x = rearrange(x, 'b d (h ph) (w pw) -> b (ph pw) (h w) d', ph=self.ph, pw=self.pw)
x = self.transformer(x) # 通过Transformer处理
# 重新排列输出以恢复原始的特征图结构
x = rearrange(x, 'b (ph pw) (h w) d -> b d (h ph) (w pw)', h=h // self.ph, w=w // self.pw, ph=self.ph,
pw=self.pw)
x = self.conv3(x) # 通过1x1卷积恢复通道数
x = torch.cat((x, y), 1) # 将Transformer的输出与原始特征图融合
x = self.conv4(x) # 应用最后的卷积层融合特征
return x
task与yaml配置
详见:https://blog.csdn.net/shangyanaf/article/details/136962297