文章目录

改进目的

改进思路

1.增加小目标检测头

2.引入CBAM注意力模块

3.改进Neck中的PANet结构为BiFPN

4.完整的网络结构图

实现细节

1.在yolov5s.yaml中找到头部head添加小目标检测头并增加对应大小的anchors

2.在yaml文件的backbone中*P2*和*P3*层间加入CBAM模块

3.将Neck部分的PANet替换为BiFPN

4.在common.py文件中定义CBAM

5.在common.py文件中定义BiFPN

6.在yolo.py文件中注册CBAM和BiFPN

7.在train.py文件中添加BiFPN学习率

复现时遇到的问题

1.论文中对Concat特征融合有这样的描述:

2.关于CBAM的添加

最后,用第一套yolov5s改进的小目标检测网络训练的参数和效果如下(仅供参考)

改进目的

在自动驾驶仿真项目中,需要对一些小目标进行检测,比如:交通指示灯、标志牌等,如果用官方的yolov5网络会发现其训练的模型检测效果不是很好。正好浏览到了一篇很好的关于yolov5改进小目标检测的论文,论文地址: http://www.c-s-a.org.cn/html/2022/12/8835.html ,下面对论文里提到的改进方法做一个复现

改进思路

1.增加小目标检测头

在YOLOv5模型上通过P2层特征引出检测头结构如图,P2层检测头分辨率为160x160像素,相当于在主干网络只进行了2次下采样操作,含有目标更为丰富的底层特征信息。颈部网络中自上而下和自下而上得到的两个P2层特征与主干网络中的同尺度特征通过concat形式进行特征融合,输出的特征为3个输入特征的融合结果, 这样使得 P2层检测头应对微小目标时, 能够快速有效的检测。P2层检测头加上原始的3个检测头, 可以有效缓解尺度方差所带来的负面影响

2.引入CBAM注意力模块

CBAM是一种轻量的注意力模块, 其简单有效, 可以直接集成到CNN架构中, 并且可以端到端的对其进 行训练。在给定特征映射的情况下, CBAM会依次沿着通道和空间两个独立维度推导注意映射, 然后将注意映射与输入特征映射相乘, 进行自适应特征细化,CBAM结构如下:

3.改进Neck中的PANet结构为BiFPN

BiFPN网络是集成双向交叉连接和加权融合的一种高效的多尺度特征融合方法。采用跨连接去除PANet中对特征融合贡献度较小的节点, 在同一尺度的输入节点和输出节点间增加一个跳跃连接, 在不增加较多成本的同时, 融合了更多的特征.。在同一特征尺度上, 把每一个双向路径看作一个特征网络层, 并多次反复利用同一层, 以实现更高层次的特征融合。BiFPN结构如下图,如果需要详细了解该网络可以看原文: https://arxiv.org/abs/1911.09070

4.完整的网络结构图

实现细节

下面将按上面的步骤来一步一步实现:

1.在yolov5s.yaml中找到头部head添加小目标检测头并增加对应大小的anchors

按照原文的意思做出如下修改:

# 添加小目标检测头

anchors:

- [5, 6, 8, 14, 15, 11] # 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

head:

[[-1, 1, Conv, [512, 1, 1]], # 10

[-1, 1, nn.Upsample, [None, 2, 'nearest']], # 11

[[-1, 6], 1, Concat, [1]], # 12 cat backbone P4

[-1, 3, C3, [512, False]], # 13

[-1, 1, Conv, [512, 1, 1]], # 14

[-1, 1, nn.Upsample, [None, 2, 'nearest']], # 15

[[-1, 4], 1, Concat, [1]], # 16 cat backbone P3

[-1, 3, C3, [512, False]], # 17

[-1, 1, Conv, [256, 1, 1]], # 18

[-1, 1, nn.Upsample, [None, 2, 'nearest']], #19

[[-1, 2], 1, Concat, [1]], # 20 cat backbone P3

[-1, 3, C3, [256, False]], # 21

[-1, 1, Conv, [256, 3, 2]], # 22

[[-1, 18], 1, Concat, [1]], # 23 cat head P4

[-1, 3, C3, [256, False]], # 24

[-1, 1, Conv, [256, 3, 2]], # 25

[[-1, 14], 1, Concat, [1]], # 26

[-1, 3, C3, [512, False]], # 27

[-1, 1, Conv, [512, 3, 2]], # 28

[[-1, 10], 1, Concat, [1]], # 29 cat head P5

[-1, 3, C3, [1024, False]], # 30

[[21, 24, 27, 30], 1, Detect, [nc, anchors]], # Detect

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: