目标检测YOLOv5笔记 (1)

YOLOv5虽然貌似没有得到作者的认同,网络结构上创新似乎也不多,网上对其是否配上这个名称更是一直有非议,但我们在一些应用场景中测试YOLOv5的检测效果,比起V3,V4还是有推理速度更快,检测框更贴合目标的特点。
而且YOLOv5还在继续迭代,所以还是有学习意义的。

网络由四个主要部分组成:

  1. Input 输入层需要对图形进行处理,在训练时需要对数据集计算初始设定长宽的锚框。
  2. Backbone 在不同图像细粒度上聚合并形成图像特征的卷积神经网络。
  3. Neck 一系列混合和组合图像特征的网络层,并将图像特征传递到预测层。
  4. Output 对图像特征进行预测,生成边界框和并预测类别。

对于YOLOV5,无论是s,m,l还是x 这四部分都是一致。唯一的区别在与模型的深度和宽度设置。

1. Input

1.1 自适应锚框计算

在Yolo算法中,针对不同的数据集,都会有初始设定长宽的锚框。在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数。
因此初始锚框(anchor boxes)也是比较重要的一部分,

在Yolov3v4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。

Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。

当然,如果觉得计算的锚框效果不是很好,也可以在代码中将自动计算锚框功能关闭。

1.2 自适应图片缩放

在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。

Yolov5代码中对此进行了改进,也是加快Yolov5推理速度的一个技巧。

在项目实际使用时,很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。

因此Yolov5的letterbox函数是对原始图像自适应的添加最少的黑边。

比如长边固定为640,图片等比例缩放后,短边补齐到32的倍数。
为什么是32?因为Yolov5的网络经过5次下采样,而2的5次方,等于32,所以要32的倍数
填充的是灰边,即(114,114,114)

2. Backbone

先有个大概脉络:

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, BottleneckCSP, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, BottleneckCSP, [1024, False]],  # 9
  ]

2.1 Focus结构

Focus结构,在Yolov3v4中并没有这个结构,其中比较关键是切片操作

对图片进行切片操作,具体操作是在一张图片中每隔一个像素拿到一个值,类似于邻近下采样,这样就拿到了四张图片,四张图片互补,长的差不多,但是没有信息丢失,这样一来,将W、H信息就集中到了通道空间,输入通道扩充了4倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。

6a3f7b4f-a00f-472c-a4d1-520fa403a1ca.png

以yolov5s为例,原始的640 × 640 × 3的图像输入Focus结构,采用切片操作,先变成320 × 320 × 12的特征图,再经过一次卷积操作,最终变成320 × 320 × 32的特征图。

2.2 CSP结构

Yolov5中设计了两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。

3. Neck

Yolov5的Neck和Yolov4中一样,都采用FPN+PAN的结构

4. Output

(待更新)

添加新评论