本文这次分享的是倒置残差移动块iRMB,iRMB(Inverted Residual Mobile Block)的作用主要是在神经网络中实现高效的特征提取,它融合了卷积神经网络(CNN)捕捉局部特征的高效性和 Transformer 动态建模长距离交互的能力,通过采用如窗口 - MHSA 和深度可分离卷积等操作来减少模型参数和计算量,在提升模型性能的同时还具备设计上的灵活性,能够在不同的网络架构中方便地应用。本文将其添加到YOLOv8模型当中,使得YOLOv8模型可以更全面、更准确地提取特征,无论是局部细节特征还是全局语义特征都能有效获取。
1. 倒置残差移动块iRMB介绍
-
模块结构
- 该模块由三个主要的卷积层和一个注意力机制(Attention Mechanism)组成。
- 模块的输入是一个特征图(Feature Map),输出也是一个特征图。
-
卷积层
- 第一层:1x1 卷积(1x1 Conv)
- 这是模块的第一层,对输入的特征图进行 1x1 卷积操作。
- 该层的输出分为三路,分别用于后续的操作。
- 第二层:3x3 深度可分离卷积(3x3 DW - Conv)
- 这是模块的第二层,对第一层 1x1 卷积的输出进行 3x3 深度可分离卷积操作。
- 深度可分离卷积是一种高效的卷积操作,能够减少计算量。
- 第三层:1x1 卷积(1x1 Conv)
- 这是模块的第三层,对第二层 3x3 深度可分离卷积的输出进行 1x1 卷积操作。
- 该层的输出通过一个跳跃连接(Skip Connection)与模块的输入相加,形成最终的输出。
- 第一层:1x1 卷积(1x1 Conv)
-
注意力机制(Attention Mechanism)
- 在第一层 1x1 卷积的输出中,有一部分被用于生成注意力矩阵(Attn Mat)。
- 这部分输出被分成 Q(Query)、K(Key)和 V(Value)三个部分,用于计算注意力矩阵。
- 注意力矩阵的计算在模块的右侧有详细展示,通过 Q 和 K 的交互生成注意力矩阵,然后与 V 相乘,得到注意力加权后的特征图。
-
跳跃连接(Skip Connection)
- 在模块的最后,第三层 1x1 卷积的输出通过一个跳跃连接与模块的输入相加,形成最终的输出。
- 跳跃连接有助于缓解梯度消失问题,提高网络的训练效率。
3. 倒置残差块
- 定义
- 倒置残差块(Inverted Residual Block)是一种在深度学习架构中使用的模块。从图中可以看到,它是整个架构中的一部分。
- 它通常包含一个 1x1 卷积层(1x1 Conv),其扩张率(λ)为 4,并且有一个高效操作(Efficient Operator),图中用红色的 “F” 表示。
- 工作原理
- 首先,输入的特征图(Feature Map)经过 1x1 卷积层进行通道扩张,将通道数扩大。
- 然后,经过高效操作(Efficient Operator),这个操作可能是一些非线性变换或者其他有助于特征提取的操作。
- 最后,可能还会有一个 1x1 卷积层来调整通道数,使其与输入的通道数匹配(如果有残差连接的话)。
- 在网络中的作用
- 倒置残差块主要用于提取更丰富的特征。通过先扩张通道数再进行特征提取,可以捕捉到更多的特征信息,相比传统的先压缩通道数的残差块(常规残差块),它在一些轻量级网络中表现出更好的性能。
- 它通常用于构建高效的神经网络架构,特别是在移动设备或者对计算资源有限制的场景下,能够在保证一定性能的同时减少计算量。
3. 接下来,我们将详细介绍如何将FSDA集成到 YOLOv8 模型中。
这是我的GitHub代码:tgf123/YOLOv8_improve (github.com)
这是改进讲解:YOLOv8模型改进 第十九讲 添加倒置残差移动块iRMB 去除图像噪声_哔哩哔哩_bilibili
3.1 如何添加
1. 首先,在我上传的代码中yolov8_improve中找到FSDA.py代码部分,它包含两个部分一个是FSDA.py的核心代码,一个是yolov8模型的配置文件。
2. 然后我们在ultralytics文件夹下面创建一个新的文件夹,名字叫做change_models, 然后再这个文件夹下面创建iRMB.py文件,然后将iRMB的核心代码放入其中
3. 在 task.py文件中导入iRMB
from ultralytics.change_models.iRMB import C2f_iRMB,iRMB
4. 然后将 FSDA添加到下面当中
第一个改进修改的地方
第二个改进修改的地方
5. 最后将配置文件复制到下面文件夹下
6. 运行代码跑通
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorldif __name__=="__main__":# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型model = YOLO(r"D:\bilibili\model\YOLOV8_new\ultralytics-main\ultralytics\cfg\models\v8\yolov8_irmb.yaml")\.load(r'D:\bilibili\model\YOLOV8_new\ultralytics-main\yolov8n.pt') # build from YAML and transfer weightsresults = model.train(data=r'D:\bilibili\model\ultralytics-main\ultralytics\cfg\datasets\VOC_my.yaml',epochs=100, imgsz=640, batch=8)