yolo

yoloV5 6.0增加小目标检测层

原始网络结构:

image-20230529152226935

原始网络有三个检测头: 分别是 80x80 (小目标) 40x40(中目标) 160x160(小目标),现在要增加小目标检测层,就可以在80 x 80 的上一步,也就是 160 x 160 尺寸增加

image-20230529154406204

为了检测160 x 160的检测头,因此需将backbon中160 与NECK中的 160 相加(残差网络),但原始网络中 NECK没有60 x 160的特征图,但可以对 80x80的特征图再进行一次上采样,得到160x160的特征图,并于backbon中60x160的特征图连接即可得到下图的网络图

image-20230529155101831

取消红框,增减蓝框区域

取消红框的原因:特征金字塔变长了,红框右侧原来是最底层,因为直接从右侧获取特征图即可,增加后不是最后一层了,需要从它的下侧获取特征图(可参考 40x40 20x20获取特征图的方式)

逻辑:NECK中 80的特征图经过上采样变成160,可与backbon中160的特征图相加,得到一个160的特征图,然后经过下采样,又获得80的特征图(特诊金字塔 FPN + TPN)并经过C3传给检测头

修改yaml

增加小目标层 160 *160并送入检测头

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes  code种类,不需要修改,会根据样本集yaml里的code数量修改
depth_multiple: 0.67  # model depth multiple   模型深度,
#depth_multiple表示channel的缩放系数,就是将配置里面的backbone和head部分有关通道的设置,全部乘以该系数即可
width_multiple: 0.75  # layer channel multiple 模型宽度
#width_multiple表示BottleneckCSP模块的层缩放系数,
#将所有的BottleneckCSP模块的number系数乘上该参数就可以最终的层个数;
#如果希望大一点,就把这个数字改大一点,网络就会按比例变深、变宽;如果希望小一点,就把这个数字改小一点,网络就会按比例变浅、变窄
anchors:
  - [4,5, 8,10, 22,18]   #  P2/4
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

#
# 尺度越大的 feature map 越靠前,相对原图的下采样率越小,感受野越小, 所以相对可以预测一些尺度比较小的物体(小目标),分配到的 anchors 越小。
# 尺度越小的 feature map 越靠后,相对原图的下采样率越大,感受野越大, 所以可以预测一些尺度比较大的物体(大目标),所以分配到的 anchors 越大。
# 即在小特征图(feature map)上检测大目标,中等大小的特征图上检测中等目标, 在大特征图上检测小目标。
# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
# 第一个参数 from :从哪一层获得输入,-1表示从上一层获得,[-1, 6]表示从上层和第6层两层获得。
# 第二个参数 number:表示有几个相同的模块,如果为9则表示有9个相同的模块。
# 第三个参数 module:模块的名称,这些模块写在common.py中。
# 第四个参数 args:类的初始化参数,用于解析作为 moudle 的传入参数,即[ch_out(输出通道), kernel(卷积核尺寸), stride(步长), padding(池化), groups][输出通道数量,卷积核尺寸,步长,padding],这里连ch_in都省去了,因为输入都是上层的输出(初始ch_in为3)
#假设输入图片的尺寸为 [3(输入通道),640(输入高),640(输入宽)]
   [[-1, 1, Conv, [64, 6, 2, 2]],  #0 卷积层(foucus) 通道变为64,尺寸减半,则[64,320,320 ]
   [-1, 1, Conv, [128, 3, 2]], #1   卷积层 通道变为128,尺寸减半,则[128,160,160] 
   [-1, 3, C3, [128]],         #2   C3 通道变为128,尺寸不变,则[128,160,160],主要用于提取特征
   
   [-1, 1, Conv, [256, 3, 2]], #3   卷积层 通道变为256,尺寸减半,则[256,80,80]
   [-1, 6, C3, [256]],         #4   C3 通道变为253,尺寸不变,则[256,80,80]主要用于提取特征
  
   [-1, 1, Conv, [512, 3, 2]],  #5  卷积层 通道变为512,尺寸减半,则[512,40,40]
   [-1, 9, C3, [512]],          #6 C3 
   
   [-1, 1, Conv, [1024, 3, 2]], #7  卷积层 通道变为1024,尺寸减半,则[512,20,20]
   [-1, 3, C3, [1024]],         #8 C3 
   [-1, 1, SPPF, [1024, 5]],    #9 SPPF 将输入通过多个不同大小的MaxPool,然后做进一步融合,能在一定程度上解决目标多尺度问题
  ]
head:
#neck
  #[512,20,20]
  [[-1, 1, Conv, [512, 1, 1]],  #10  卷积层 通道变为512,尺寸不变,则[512,20,20]                     
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #11  上采样,通道数不变,尺寸翻倍,则[512,40,40] 
   [[-1, 6], 1, Concat, [1]],      #12 Concat 特征融合,将上一层与第六层连接起来。通道翻倍,尺寸不变[1024,40,40]
   [-1, 3, C3, [512, False]],      #13 C3,不进行short cut  只改变通道数 [512,40,40]            
   [-1, 1, Conv, [256, 1, 1]],     #14  卷积层 通道变为256,尺寸不变,则[256,40,40]                 
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #15  上采样,通道数不变,尺寸翻倍,则[256,80,80] 
   [[-1, 4], 1, Concat, [1]], #16 Concat 特征融合,将上一层与第4层连接起来。通道翻倍,尺寸不变[512,80,80]    
#自己加的
   [-1, 3, C3, [256, False]], #17  C3    不进行short cut  只改变通道数 [256,80,80]            
   [-1, 1, Conv, [128, 1, 1]], #18  卷积层 通道变为128,尺寸不变,则[128,80,80                  
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],   #19 上采样,通道数不变,尺寸翻倍,则[256,160,160]
   [[-1, 2], 1, Concat, [1]],  #20 Concat 特征融合,将上一层与第2层连接起来。通道翻倍,尺寸不变[512,160,160]            
#head
   [-1, 3, C3, [128, False]],  #21  C3    不进行short cut  只改变通道数 [128,160,160]
   [-1, 1, Conv, [128, 3, 2]], #22  卷积层 通道变为128,尺寸减半,则[128,80,80]               
   [[-1, 18], 1, Concat, [1]], #23  Concat 特征融合,将上一层与第18层连接起来。通道翻倍,尺寸不变[512,160,160]   
   [-1, 3, C3, [256, False]],  #24   C3    不进行short cut  只改变通道数 [256,160,160] 
   [-1, 1, Conv, [256, 3, 2]],  #25  卷积层 通道变为256,尺寸减半,则[256,40,40]                
   [[-1, 14], 1, Concat, [1]],  #26 Concat 特征融合,将上一层与第14层连接起来。通道翻倍,尺寸不变[512,160,160]  
   
   [-1, 3, C3, [512, False]],  #27 C3 不进行short cut  只改变通道数 [512,40,40]
   [-1, 1, Conv, [512, 3, 2]], #28  卷积层 通道变为512,尺寸减半,则[512,20,20] 
   [[-1, 10], 1, Concat, [1]],  #29  特征融合,将上一层与第10层连接起来。通道翻倍,尺寸不变[1024,20,20]            
   [-1, 3, C3, [1024, False]],  #30 C3 不进行short cut  只改变通道数 [1027,20,20]
   [[21, 24, 27, 30], 1, Detect, [nc, anchors]],  # 将21, 24, 27, 30传入检测头
  ]

将修改后的yaml路径传入train.py中的,训练即可

image-20230529164846619

参考:(100条消息) 【Yolov5】Yolov5添加检测层,四层结构对小目标、密集场景更友好_不会数分的程序员不是好会计的博客-CSDN博客

四层结构对小目标、密集场景更友好_不会数分的程序员不是好会计的博客-CSDN博客](https://blog.csdn.net/weixin_50006912/article/details/129122501)

(100条消息) YOLOv5的Backbone详解_yolov5 backbone_Marlowee的博客-CSDN博客

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐