关于yolov5移植repvgg

这个工作其实已经有大佬已经做过了:https://blog.csdn.net/weixin_45829462/article/details/120372921

这里我把他用到我的数据集上感觉效果不是很理想。阐述如下:

1.网络结构改动模块

repvgg网络加宽了yolov5,这里我们将yolov5原先的conv 3 × 3 3\times3 3×3的卷积替换成repvgg的conv 3 × 3 3\times3 3×3的样子,具体如下如所示:
关于yolov5移植repvgg_第1张图片
在训练的时候,我们将走每一条支路。在测试的时候,将分支都收回来,归并成一个卷积。

2.repvgg原理

具体原理如下:

BN和conv融合

首先我先讲以下 3 × 3 3\times3 3×3卷积和BN的融合,BN层总共有四个参数,x为输入,mean为均值,除方差,加上bais

将卷积的公式带入x,可以重新的整理式子得到如下公式。

即可把训练的参数都吸收到一个fused的卷积中。

3 × 3 3\times3 3×3的卷积和 1 × 1 1\times1 1×1的卷积融合

短路连接的前后的我们的特征图大小应该一致。所以我们假设有一张 5 × 5 5\times5 5×5的特征图,我们用 1 × 1 1\times1 1×1的卷积,步长为1;而 3 × 3 3\times3 3×3的卷积我们需要padding1,那么就是 7 × 7 7\times7 7×7的卷积,步长为1;这里你会神奇的发现, 3 × 3 3\times3 3×3中心这个卷积,他经过的和 1 × 1 1\times1 1×1卷积经过的是一样的,所以我们可以采用 1 × 1 1\times1 1×1叠加 3 × 3 3\times3 3×3

3.repvgg + yolov5

backbone:
[from, number, module, args]
[[-1, 1, Conv, [32, 6, 2, 2]], # 0-P1/2
[-1, 1, RepVGGBlock, [64, 3, 2]], # 1-P2/4
[-1, 1, C3, [64]],
[-1, 1, RepVGGBlock, [128, 3, 2]], # 3-P3/8
[-1, 3, C3, [128]],
[-1, 1, RepVGGBlock, [256, 3, 2]], # 5-P4/16
[-1, 3, C3, [256]],
[-1, 1, RepVGGBlock, [512, 3, 2]], # 7-P4/16
[-1, 1, SPP, [512, [5, 9, 13]]],
[-1, 1, C3, [512, False]], # 9
]

4.实验结果

薄膜数据集属于比较小的目标检测,在相同数据集下,repvgg + yolov5s的效果降低至mAP:70%左右;而yolov5s mAP:90%
repvgg + yolov5s在coco数据集上效果如下:
虽然对整体效果有所提升,但对小目标检测的不是特别友好

5.思考

为什么重参化加宽了网络,反而没有提升效果?
其实在yolov5中有这两个参数
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
第一个参数用于加深网络,第二个参数用于加宽网络的通道数。更加合理。
修改的repvgg+yolov5并没有加宽通道数,会不会有影响呢?

你可能感兴趣的:(深度学习目标检测,深度学习)