前      言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是在处理一些复杂背景问题的时候,还是容易出现错漏检的问题。此后的系列文章,将重点对YOLOv5的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。

解决问题:加入BIFPN加权双向金字塔结构,提升不同尺度的检测效果。


2023.1.8更新

有朋友问在添加小目标检测层,四个检测层的基础上如何改进特征融合网络,改进方法其他不变,需要修改yaml文件,有需要可关注私信我。部分yaml内容如下所示:

# parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# anchors
anchors:- [ 19,27,  44,40,  38,94 ]  # P3/8- [ 96,68,  86,152,  180,137 ]  # P4/16- [ 140,301,  303,264,  238,542 ]  # P5/32- [ 436,615,  739,380,  925,792 ]  # P6/64# 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 ] ],  #4[ -1, 1, Conv, [ 512, 3, 2 ] ],  # 5-P4/16[ -1, 9, C3, [ 512 ] ], #6[ -1, 1, Conv, [ 768, 3, 2 ] ],  # 7-P5/32[ -1, 3, C3, [ 768 ] ], #8[ -1, 1, Conv, [ 1024, 3, 2 ] ],  # 9-P6/64[ -1, 3, C3, [ 1024 ] ],[ -1, 1, SPPF, [ 1024, 5 ] ], # 11]
# BIFPN garph
#
# p6     ----------------- --------Concat_bifpn----> P6(out)
#      /                  \                         \       \
#      /-------------------------------------------->
#     /                Upsample              Concat_bifpn   Concat_bifpn
#    /                    |                          \      |
# p5 ---Concat_bifpn---> head 5 ---Concat_bifpn----> P5(out)
#                        \                                  \
#                      Upsample                              Concat_bifpn
#       ----------------  | ----------------------->        /
#     /                   \                         \       \
#    /                    |                  Concat_bifpn   |
#   /                     \                          \     |
# p4 ---Concat_bifpn---> head 4 ---Concat_bifpn--->  P4(out)
#                        \                                 \
#                         ----Upsample---->                Concat_bifpn
#                                          \               /
# p3 ---Concat_bifpn------------------------------>  P3(out)# YOLOv5 head
head:                                                                       [ [ -1, 1, Conv, [ 768, 1, 1 ] ],    # 12 head                                  [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],                           [ [ -1, 8 ], 1, Concat_bifpn, [ 384,384] ],  # cat backbone P5                [ -1, 3, C3, [ 768, False ] ],  # 15[ -1, 1, Conv, [ 512, 1, 1 ] ],[ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],[ [ -1, 6 ], 1, Concat_bifpn, [ 256,256] ],  # cat backbone P4[ -1, 3, C3, [ 512, False ] ],  # 19

添加方法(以下改进步骤方法为在三个检测层的基础上):

第一步:common.py构建Concat_BIFPN模块

class Concat_bifpn(nn.Module):# Concatenate a list of tensors along dimensiondef __init__(self, c1, c2):super(Concat_bifpn, self).__init__()self.w1 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True)self.w2 = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)# self.w3 = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)self.epsilon = 0.0001self.conv = Conv(c1, c2, 1 ,1 ,0 )self.act= nn.ReLU()def forward(self, x): # mutil-layer 1-3 layers #ADD or Concat #print("bifpn:",x.shape)if len(x) == 2:w = self.w1weight = w / (torch.sum(w, dim=0) + self.epsilon)x = self.conv(self.act(weight[0] * x[0] + weight[1] * x[1]))elif len(x) == 3: w = self.w2weight = w / (torch.sum(w, dim=0) + self.epsilon)x = self.conv(self.act (weight[0] * x[0] + weight[1] * x[1] + weight[2] * x[2]))# elif len(x) == 4:    #     w = self.w3#     weight = w / (torch.sum(w, dim=0) + self.epsilon)#     x = self.conv(self.act(weight[0] * x[0] + weight[1] * x[1] + weight[2] *x[2] + weight[3]*x[3] ))return x

第二步:yolo.py中注册Concat_BIFPNt模块

        elif m is Concat_bifpn:c2 = max([ch[x] for x in f])

第三步:修改yaml文件,需要修改head(特征融合网络)

# parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# anchors
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# 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, SPPF, [1024, 5]],]# YOLOv5 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1,6], 1, Concat_bifpn, [256,256]],  # cat backbone P4[-1, 3, C3, [512, False]],  # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat_bifpn, [128,128]],  # cat backbone P3[-1, 3, C3, [256, False]],  # 17 (P3/8-small)[-1, 1, Conv, [512, 3, 2]],   # 320, 640 # [[-1, 6, 13], 1, Concat_bifpn, [256,256]],  # cat head P4[-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [1024, 3, 2]], # 640, 1280 # [[-1, 9], 1, Concat_bifpn, [512, 512]],  # cat head P5  cat 20,20 #22[-1, 3, C3, [1024, False]],  # 25 (P5/32-large) # 1280, 1280  #23[[17, 20, 23], 1, Detect, [nc, anchors]] # Detect(P3, P4, P5)]

第四步:将train.py中改为本文的yaml文件即可,开始训练

 结    果:本人在多个数据集上做了大量实验,针对不同的数据集效果不同,同一个数据集的不同添加位置方法也是有差异,需要大家进行实验。有效果有提升的情况占大多数。

预告一下:下一篇内容分享增加小目标检测层。有兴趣的朋友可以关注一下我,有问题可以留言或者私聊我哦

PS:,不仅仅是可以添加进YOLOv5,也可以添加进任何其他的深度学习网络,不管是分类还是检测还是分割,主要是计算机视觉领域,都可能会有不同程度的提升效果。

最后,四个检测层的基础上改进特征融合网络为BIFPN的话,需要修改yaml文件,有需要可关注私信我。

[YOLOv7/YOLOv5系列算法改进NO.5]改进特征融合网络PANET为BIFPN(更新添加小目标检测层yaml)相关推荐

  1. TensorRT+yolov5:yolov5添加小目标检测层2--TensorRT部署

    前面我们在yolov5添加了小目标检测层,进行了训练,但是训练的次数也不是很多,接下来我们使用tensorrt进行四个检测头的yolov5部署.具体如何添加小目标检测层可以查看我上一篇文章. Tens ...

  2. YOLOV7改进--增加小目标检测层

    YOLOV7改进--增加小目标检测层 说明 代码 原始p5配置 添加小目标检测层 说明 yolov7来啦!!!因为项目需要,尝试跑了下yolov7,感觉还不错. 由于现在使用的数据集大部分都是&quo ...

  3. YOLOv8/YOLOv7/YOLOv5系列算法改进【NO.6】增加小目标检测层,提高对小目标的检测效果

    前 言:作为当前先进的深度学习目标检测算法YOLO,已经集合了大量的trick,但是在处理一些复杂检测问题的时候,还是容易出现错漏检的问题.此后的系列文章,将重点对YOLOv8.YOLOv7以及YOL ...

  4. 目标检测算法——YOLOv5改进|增加小目标检测层

    关注"PandaCVer"公众号 >>>深度学习Tricks,第一时间送达<<< 小目标检测一直以来是CV领域的难点之一,那么,YOLOv5该如 ...

  5. 目标检测算法——YOLOv7改进|增加小目标检测层

    >>>深度学习Tricks,第一时间送达<<< 小目标检测一直以来是计算机CV领域的难点之一,那么,刚出炉的YOLOv7该如何增加小目标检测层呢? 目录 1.YOL ...

  6. yolov5增加一层小目标检测层

    1.原始YOLOv5模型 # YOLOv5 head head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest' ...

  7. YOLOv5增加小目标检测层

    采用增加小目标检测层的方式来使YOLOv5能够检测小目标,只需要修改models下的yaml文件中的内容即可. 主要改变如下: 原yaml: # parameters nc: 80 # number ...

  8. YOLOv7 tiny 新增小目标检测层

    YOLOv7 tiny 新增小目标检测层 YOLOv7 tiny 新增小目标检测层 修改yolov7-tiny.yaml文件 YOLOv7 tiny 结构图 调用 models/yolo.py验证 Y ...

  9. [YOLOv7/YOLOv5系列算法改进NO.33]引入GAMAttention注意力机制

     前 言:作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法.此后的系列文章,将重点对YOLOv7 ...

最新文章

  1. 人物关系 人脸识别_原因解密:格里兹曼宣布终止与华为合作,不只是因为人脸识别系统...
  2. 织梦添加新变量和删除新变量的方法
  3. 编译器原理笔录(2)-符号表示法的形式化
  4. 组件化h5活动模板的实现
  5. .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  6. 日历视图的XML属性
  7. Struts 2读书笔记-----使用Struts 2的输入校验
  8. 计算机创业计划书800字大全,创业计划书范文800字
  9. 液晶驱动原理 c语言,基于STM8S的LCD驱动电路和LCD显示原理分析
  10. 【二分法】凸多边形外接圆的半径
  11. 编译原理-回溯法及其优化的思考
  12. Xtrabackup 数据备份工具使用方法
  13. 为什么《百家讲坛》上的中学教师收视率最高?
  14. 前端面试复盘:vue技术面没有难倒我,hr面却是一把挂
  15. C++判断一个数字是几位数
  16. 市面上的长距离激光测距仪的小知识?TFN LR20KI带你走近长距离激光测距的世界。
  17. NAS映射网络驱动器如何操作?
  18. 前端程序员用css动画给女朋友一个惊喜
  19. jquery通过id显示隐藏
  20. 顶级AI科学家裴健入职京东 携手共探大数据与智慧供应链领域

热门文章

  1. TCP/IP 之 大明王朝邮差
  2. 玩转「Wi-Fi」系列之测试工具(三)
  3. java并发知识汇总
  4. 全球政策 | 区块链:达沃斯年会上不可忽视的声音
  5. 2016晔子小跟班行走城市第一站深圳仙湖植物园游记
  6. 令我怀念不已,每每想起都热泪盈眶的大学生活
  7. 关闭hadoop安全模式
  8. java 咖啡 典故,探秘咖啡的神秘起源
  9. multiboot之ICAP
  10. 利用计算机设计轴对称图案,“轴对称图形”信息技术应用设计与分析