yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进
1、参考文献:用于微小目标检测的上下文增强和特征细化网络 点击此处直达论文
-
本文摘要:提出了一种结合增强上下文和细化特征的特征金字塔网络。将多尺度扩张卷积得到的特征自上至下融合注入特征金字塔网络,补充上下文信息。引入通道和空间特征细化机制,抑制多尺度特征融合中的冲突形成,防止微小目标被淹没在冲突信息中。此外,提出了一种复制-减少-粘贴的数据增强方法,该方法可以增加微小对象在训练过程中对损失的贡献,确保训练更加均衡。 实验结果表明,该网络在VOC数据集上的目标平均精度达到16.9% (IOU=0.5:0.95),比YOLOV4高3.9%,比CenterNet高7.7%,比RefineDet高5.3%。
-
增强上下文操作:在C5上添加CA注意力操作。
-
特征细化模块(FRM):
- FRM主要由2个并行分支组成,即通道净化模块和空间净化模块。在空间维度和通道维度上生成自适应权值,引导特征向更关键的方向学习。
- 通道净化模块结构如图(b)所示。将输入的特征图压缩到空间维度,聚合能代表图像全局特征的空间信息,得到通道注意力图。将自适应平均池化和自适应最大池化相结合,获得更精细的全局特征。
- 空间净化模块通过softmax生成各位置相对于通道的相对权重,下分支的输出如图所示:
2、yolov5改进:CA注意力、添加检测头、PRM模块多尺度净化递进
- CA注意力: 点击此处直达论文
- 添加检测头:由3个头添加为4个头,其中F2特征由F3~F5特征层层递进融合到F2之中,通过信息流的层层递进,有效解决多尺度问题和小目标信息提取不充分等问题。
- PRM模块多尺度净化:我们在第一节中的FRM模块进行了进一步延申,由3个特征输入转换为4个特征输入,通道净化模块和空间净化模型原理保持不变,并在图(a)的channel改为4,并在后续的操作中由3的地方都改变为了4,通过FRM模块的加持,多尺度信息融合的方式不在向FPN以及PAN那样,受限于上一个特征信息流的影响带来的特征不对齐以及空间特征失配等问题。
3、yolov5改进:代码修改(基于yolov5-6.0版本)
- 4头检测实现以及anchors修改:
# 代码索要 @马化腾:1444151069
class H4(nn.Module):
# 实现第四个头的生成nn.Module类,实现F2的特征图
def __init__(self, c):
super().__init__()
# 创建3个上采样操作,倍率依次为2,4,8,对应F3,F4,F5
self.ups = []
for i in range(1, 4):
self.ups.append(nn.Upsample(scale_factor=int(2 ** i)))
# 1*1 卷积,连接C2
self.conv = nn.Conv2d(c, c, 1, 1)
def forward(self, x):
# x是对应[F5, F4, F3, C2]特征图
feas = []
for i, up in enumerate(self.ups):
if i < 3:
feas.append(up(x[i]))
feas.append(self.conv(x[3]))
feas = torch.cat(feas, dim=1)
return feas
# anchors变化:
anchors:
- [5,6, 8,15, 16,12] # F2
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
- 网络结构yaml:
# 代码索要 @马化腾:1444151069
# YOLOv5 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, CoordAtt, [1024, 5]], # 9 CA <-- Coordinate Attention [out_channel, reduction]
]
# YOLOv5 head
head:
[[-1, 1, Conv, [512, 1, 1]], # F5
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13 F4
[[-1, 10, 4], 1, H3, [256]], # route [F4,F5,C3] -> F3
[[-1, -2, 10, 2], 1, H4, [128]], # route [F3,F4,F5,C2] -> F2
[[10, 13, 14, 15], 1, FRM, [4736,0]], # Centered on F5
[[10, 13, 14, 15], 1, FRM, [4736,1]], # Centered on F4
[[10, 13, 14, 15], 1, FRM, [4736,2]], # Centereds on F3
[[10, 13, 14, 15], 1, FRM, [4736,3]], # Centered on F2
[[19, 18, 17, 16], 1, Detect, [nc, anchors]], # Detect(F2, P3, P4, P5)
]
- 4层多尺度FRM融合特征的部分代码:
class FRM(nn.Module):
# 实现 FRM nn.Module类
def __init__(self, c1, m=0):...
def forward(self, x):
# x 是对应不同特征图
feas = []
for i, l in enumerate(self.layer1):
feas.append(l(x[i]))
C1 = self.conv(torch.cat(feas, dim=1))
C1_1 = self.cp(C1)
C1_2 = self.sfm(C1)
C1_1 = split_multipy(C1_1, feas)
C1_2 = split_multipy(C1_2, feas)
return self.cat_conv(C1_1+C1_2)
4、结果可视化以及参数量(基于内部光伏板热斑数据集)
- map50:95
- 参数量:从原始版本的7.23M参数量降低到6.37M
yolo: cfg=yolov5s1.yaml, device=cpu, profile=False
YOLOv5 2022-8-3 torch 1.7.1+cu101 CPU
from n params module arguments
0 -1 1 3520 models.common.Conv [3, 32, 6, 2, 2]
1 -1 1 18560 models.common.Conv [32, 64, 3, 2]
2 -1 1 18816 models.common.C3 [64, 64, 1]
3 -1 1 73984 models.common.Conv [64, 128, 3, 2]
4 -1 2 115712 models.common.C3 [128, 128, 2]
5 -1 1 295424 models.common.Conv [128, 256, 3, 2]
6 -1 3 625152 models.common.C3 [256, 256, 3]
7 -1 1 1180672 models.common.Conv [256, 512, 3, 2]
8 -1 1 1182720 models.common.C3 [512, 512, 1]
9 -1 1 158002 models.common.CoordAtt [512, 512, 5]
10 -1 1 131584 models.common.Conv [512, 256, 1, 1]
11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
12 [-1, 6] 1 0 models.common.Concat [1]
13 -1 1 361984 models.common.C3 [512, 256, 1, False]
14 [-1, 10, 4] 1 409728 models.h3h4.H3 [128]
15 [-1, -2, 10, 2] 1 102464 models.h3h4.H4 [64]
16 [10, 13, 14, 15] 1 390100 models.frm.FRM [2368, 0]
17 [10, 13, 14, 15] 1 390100 models.frm.FRM [2368, 1]
18 [10, 13, 14, 15] 1 390100 models.frm.FRM [2368, 2]
19 [10, 13, 14, 15] 1 390100 models.frm.FRM [2368, 3]
20 [19, 18, 17, 16] 1 131580 Detect [80, [[5, 6, 8, 15, 16, 12], [10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 128, 128, 128]]
Model Summary: 242 layers, 6370302 parameters, 6370302 gradients
- 检测可视化:
- 此思想可以用在不同基于Convs的目标检测器上,例如yolov3~yolov7,centernet,yolox,yolor,fasterrcnn等,本人已将yolov5-6.0版本打包好,需要改进其他网络寻求帮助可私信。
- 这里只是给大家提供一个解决方案的思路,并不一定确保任何数据集都奏效!其他目标检测模型创新可浏览博主其他帖子!!!