赞
踩
在自动驾驶仿真项目中,需要对一些小目标进行检测,比如:交通指示灯、标志牌等,如果用官方的yolov5网络会发现其训练的模型检测效果不是很好。正好浏览到了一篇很好的关于yolov5改进小目标检测的论文,论文地址: http://www.c-s-a.org.cn/html/2022/12/8835.html ,下面对论文里提到的改进方法做一个复现
在YOLOv5模型上通过P2层特征引出检测头结构如图,P2层检测头分辨率为160x160像素,相当于在主干网络只进行了2次下采样操作,含有目标更为丰富的底层特征信息。颈部网络中自上而下和自下而上得到的两个P2层特征与主干网络中的同尺度特征通过concat形式进行特征融合,输出的特征为3个输入特征的融合结果, 这样使得 P2层检测头应对微小目标时, 能够快速有效的检测。P2层检测头加上原始的3个检测头, 可以有效缓解尺度方差所带来的负面影响
CBAM是一种轻量的注意力模块, 其简单有效, 可以直接集成到CNN架构中, 并且可以端到端的对其进 行训练。在给定特征映射的情况下, CBAM会依次沿着通道和空间两个独立维度推导注意映射, 然后将注意映射与输入特征映射相乘, 进行自适应特征细化,CBAM结构如下:
BiFPN网络是集成双向交叉连接和加权融合的一种高效的多尺度特征融合方法。采用跨连接去除PANet中对特征融合贡献度较小的节点, 在同一尺度的输入节点和输出节点间增加一个跳跃连接, 在不增加较多成本的同时, 融合了更多的特征.。在同一特征尺度上, 把每一个双向路径看作一个特征网络层, 并多次反复利用同一层, 以实现更高层次的特征融合。BiFPN结构如下图,如果需要详细了解该网络可以看原文: https://arxiv.org/abs/1911.09070
下面将按上面的步骤来一步一步实现:
按照原文的意思做出如下修改:
# 添加小目标检测头 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。