👀🎉📜系列文章目录
【YOLOv5改进系列(1)】高效涨点----使用EIoU、Alpha-IoU、SIoU、Focal-EIOU替换CIou
【YOLOv5改进系列(2)】高效涨点----Wise-IoU详细解读及使用Wise-IoU(WIOU)替换CIOU
【YOLOv5改进系列(3)】高效涨点----Optimal Transport Assignment:OTA最优传输方法
【YOLOv5改进系列(4)】高效涨点----添加可变形卷积DCNv2
【YOLOv5改进系列(5)】高效涨点----添加密集小目标检测NWD方法
【YOLOv5改进系列(6)】高效涨点----使用DAMO-YOLO中的Efficient RepGFPN模块替换yolov5中的Neck部分
【YOLOv5改进系列(7)】高效涨点----使用yolov8中的C2F模块替换yolov5中的C3模块
【YOLOv5改进系列(8)】高效涨点----添加yolov7中Aux head 辅助训练头
【YOLOv5改进系列(9)】高效涨点----使用CAM(上下文增强模块)替换掉yolov5中的SPPF模块
🚀🚀🚀前言
🚀在yolov5改进系列[9]里面我是已经将CAM模块替换掉了backbone最后一层的SPPF模块,经过实验可以得出,在我自己的钢轨表面疵点数据集上使用adaptive连接方式涨点效果最优,map@0.5提升了7个百分点。后来发现在Neck特征融合部分也能添加CAM模块,这里就在PANet的stage=1/32concat特征融合之前添加CAM模块进行处理。
一、1️⃣ 添加位置
在下面蓝色框部分添加CAM模块,用于检测大目标物体。如果有兴趣的也可以试一试分别添加到PANet的stage为16、8这两个部位。
二、2️⃣修改代码内容
📌其实就是在yolov5s_CAM.yaml文件中的head部分,最后一个stage上添加了CAM模块并指定连接方式,添加内容如下:
也可以将下面代码复制到yolov5s_CAM.yaml
### yolov5 cam yaml
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[10, 1, CAM, ['concat']],
[[-2, -1], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 24], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
三、3️⃣参数量变化
🔥下面第一幅图是将CAM替换掉SPPF模块的运行参数量,GFLOPs的为22.0,第二图是与第一幅图有着相同连接方式的CAM模块,但是第二幅图的CAM是添加到了PANet最后一个stage的concat之前,参数量GFLOPs为17.8,会发现参数量少了许多,但是在训练过程中我明显发现第二种CAM添加方式,导致了模型训练的速度变慢了不少,训练速度增加了一倍不止。
四、4️⃣实验结果
这里我不放太多实验了,只选取两个实验,分别是替换SPPF模块和在PANet最后一个stage的concat之前添加CAM模块。这两处的CAM模块都是使用concat连接方式进行连接。
4.1 🎓 替换掉SPPF实验结果
➤训练结果:F1置信度分数为0.73、map@0.5=0.821;
4.2 ✨在Neck部分添加CAM
➤训练结果:F1置信度分数为0.73、map@0.5=0.766;这里添加到Neck部分效果并不太好,如果在PANet的三个stage部分都添加可能会涨点,但是需要你直接去实验。