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

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版本打包好,需要改进其他网络寻求帮助可私信。
  • 这里只是给大家提供一个解决方案的思路,并不一定确保任何数据集都奏效!其他目标检测模型创新可浏览博主其他帖子!!!
  • 25
    点赞
  • 265
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机视觉、一维信号分类

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值