目录
YOLOV11目标检测-主干网络改进实例与创新改进专栏
本文介绍
1.完整代码获取
2.MobileNetv2介绍
摘要
亮点优势
3. MobileNetv2网络结构图
4. yolov11-MobileNetv2 yaml文件
5.MobileNetv2代码实现
6.MobileNetv2添加方式
论文地址: MobileNetV2: Inverted Residuals and Linear Bottleneckshttps://openaccess.thecvf.com/content_cvpr_2018/papers/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.pdfhttps://openaccess.thecvf.com/content_cvpr_2018/papers/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.pdf
本文给大家带来的改进内容是将YOLOv11的主干网络部分替换为轻量级主干网络MobileNetV2,我们可以发现在 MobileNetV1 中存在很多 DW 卷积权重为 0其实是无效的。很重要的一个原因是因为 ReLU 激活函数对在零值时的梯度是零,后续无论怎么迭代这个节点的值都不会恢复了,所以如果节点的值变为 0 就会“死掉”。而 ResNet 的残差结构可以很大程度上缓解这种特征退化问题。所以很自然的,MobileNetV2 尝试引入 Residuals 模块并针对 ReLU 激活函数进行研究,动机相当明确,故事也很清晰。因此,本文想将MobileNetv2移植到YOLOv11上,验证是否有好效果。
此专栏提供完整的改进后的YOLOv11项目文件(有偿),更换数据集便可以直接使用,如果有需要的可以联系我。
+Qq:1921873112
在本文中,我们描述了一种新的移动架构MobileNetV2,该架构提高了移动模型在多个任务和多个基准数据集上以及在不同模型尺寸范围内的最佳性能。我们还描述了在我们称之为SSDLite的新框架中将这些移动模型应用于目标检测的有效方法。此外,我们还演示了如何通过DeepLabv3的简化形式,我们称之为Mobile DeepLabv3来构建移动语义分割模型。
MobileNetV2架构基于倒置的残差结构,其中快捷连接位于窄的瓶颈层之间。中间展开层使用轻量级的深度卷积作为非线性源来过滤特征。此外,我们发现为了保持表示能力,去除窄层中的非线性是非常重要的。我们证实了这可以提高性能并提供了产生此设计的直觉。
最后,我们的方法允许将输入/输出域与变换的表现力解耦,这为进一步分析提供了便利的框架。我们在ImageNet分类,COCO目标检测,VOC图像分割上评估了我们的性能。我们评估了在精度、通过乘加(MAdd)度量的操作次数,以及实际的延迟和参数的数量之间的权衡。
- 倒残差结构创新:传统残差结构通常是先降维卷积,再进行标准卷积,最后升维卷积。而 MobileNetV2 的倒残差结构与之相反,先通过 1×1 卷积进行升维,增加通道数量,接着进行 3×3 深度可分离卷积提取特征,最后再用 1×1 卷积将高维特征映射到低维空间。这种结构使网络在低维空间进行较少计算,在高维空间利用更多通道学习丰富特征,提高了特征提取能力。
- 线性瓶颈设计:在倒残差块中,中间扩展层编码的特征图投影到低维时,若使用传统 ReLU 激活函数会损失信息。MobileNetV2 在网络末层卷积采用线性激活函数替代 ReLU,能更好地保留低维空间中的信息,提升网络表达能力,避免因信道压缩导致的有用信息丢失。
2(a):标准卷积(一个大方块);
2(b):深度可分离卷积(=Depthwise convolution+Pointwise Convolution=薄片片+方块块);
2(c):linear bottleneck,(高维后)relu6-dw-relu6-pw,降维-升维-;
2(d):和图2(c)等效,(线性激活后)pw升维-relu6-dw-relu6-pw,降维-线性激活;
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs
# YOLO11n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, MobileNetV2, []] # 0-4 P1/2
- [-1, 1, SPPF, [1024, 5]] # 5
- [-1, 2, C2PSA, [1024]] # 6
# YOLO11n head
head:
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 3], 1, Concat, [1]] # cat backbone P4
- [-1, 2, C3k2, [512, False]] # 9
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 2], 1, Concat, [1]] # cat backbone P3
- [-1, 2, C3k2, [256, False]] # 12 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P4
- [-1, 2, C3k2, [512, False]] # 15 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 6], 1, Concat, [1]] # cat head P5
- [-1, 2, C3k2, [1024, True]] # 18 (P5/32-large)
- [[12, 15, 18], 1, Detect, [nc]] # Detect(P3, P4, P5)
此专栏提供完整的改进后的YOLOv11项目文件(有偿),更换数据集便可以直接使用,如果有需要的可以联系我。
+Qq:1921873112
此处参照MobileNetv1。
step1:找到ultralytics/nn文件夹下建立一个目录名字呢就是'improved_modules'文件夹,ranhou在这个文件夹下新建一个py文件(你自己想起什么名字都可以),如下图所示:
step2:把代码添加到MobileNetv1.py文件中;
step3:往创建的__init__.py函数中添加调用函数,如下所示;
step4:找到文件'ultralytics/nn/tasks.py'进行导入和注册新建的模块!
step5:找到'ultralytics/nn/tasks.py'文件中的'def parse_model(d, ch, verbose=True)方法,然后按照图片进行添加修改即可。
此篇博客到这里就告一段落了,后续我还会继续更新很多改进,大家感兴趣的可以关注我的专栏。