yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进解决小目标检测问题

yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进

1、参考文献:用于微小目标检测的上下文增强和特征细化网络 点击此处直达论文

yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进解决小目标检测问题_第1张图片

  • 本文摘要:提出了一种结合增强上下文和细化特征的特征金字塔网络。将多尺度扩张卷积得到的特征自上至下融合注入特征金字塔网络,补充上下文信息。引入通道和空间特征细化机制,抑制多尺度特征融合中的冲突形成,防止微小目标被淹没在冲突信息中。此外,提出了一种复制-减少-粘贴的数据增强方法,该方法可以增加微小对象在训练过程中对损失的贡献,确保训练更加均衡。 实验结果表明,该网络在VOC数据集上的目标平均精度达到16.9% (IOU=0.5:0.95),比YOLOV4高3.9%,比CenterNet高7.7%,比RefineDet高5.3%。

  • 增强上下文操作:在C5上以不同的扩张率空洞卷积进行卷积以获得不同感受野的语义信息。核大小为3×3,扩张率为1、3、5。其实就是多尺度扩张卷积的级联。
    yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进解决小目标检测问题_第2张图片

  • 特征细化模块(FRM):
    yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进解决小目标检测问题_第3张图片

    • FRM主要由2个并行分支组成,即通道净化模块和空间净化模块。在空间维度和通道维度上生成自适应权值,引导特征向更关键的方向学习。
    • 通道净化模块结构如图(b)所示。将输入的特征图压缩到空间维度,聚合能代表图像全局特征的空间信息,得到通道注意力图。将自适应平均池化和自适应最大池化相结合,获得更精细的全局特征。
    • 空间净化模块通过softmax生成各位置相对于通道的相对权重,下分支的输出如图所示: yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进解决小目标检测问题_第4张图片

2、yolov5改进:CA注意力、添加检测头、PRM模块多尺度净化递进

  • CA注意力: 点击此处直达论文
  • 添加检测头:由3个头添加为4个头,其中F2特征由F3~F5特征层层递进融合到F2之中,通过信息流的层层递进,有效解决多尺度问题和小目标信息提取不充分等问题。
    yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进解决小目标检测问题_第5张图片
  • PRM模块多尺度净化:我们在第一节中的FRM模块进行了进一步延申,由3个特征输入转换为4个特征输入,通道净化模块和空间净化模型原理保持不变,并在图(a)的channel改为4,并在后续的操作中由3的地方都改变为了4,通过FRM模块的加持,多尺度信息融合的方式不在向FPN以及PAN那样,受限于上一个特征信息流的影响带来的特征不对齐以及空间特征失配等问题。
    yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进解决小目标检测问题_第6张图片

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
    yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进解决小目标检测问题_第7张图片
  • 参数量:从原始版本的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
  • 检测可视化:
    yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进解决小目标检测问题_第8张图片
    yolov5 yolov7 目标检测网络改进:引入特征细化网络,重建检测颈部网络,层层递进解决小目标检测问题_第9张图片
  • 此思想可以用在不同基于Convs的目标检测器上,例如yolov3~yolov7,centernet,yolox,yolor,fasterrcnn等,本人已将yolov5-6.0版本打包好,需要改进其他网络寻求帮助可私信。
  • 这里只是给大家提供一个解决方案的思路,并不一定确保任何数据集都奏效!其他目标检测模型创新可浏览博主其他帖子!!!

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