星D裤子 - 2021年3月
type: channel
link: https://test.newdecode.com/index.php/2021/03/
description: Only if you can speak MEOW ...
items: 目标检测YOLOv5笔记 (1)

目标检测YOLOv5笔记 (1)
type: item
date: 2021-03-07T21:13:00+08:00
description: YOLOv5虽然貌似没有得到作者的认同，网络结构上创新似乎也不多，网上对其是否配上这个名称更是一直有非议，但我们在一些应用场景中测试YOLOv5的检测效果，比起V3，V4还是有推理速度更快，检测框更贴合目标的特点。而且YOLOv5还在继续迭代，所以还是有学习意义的。网络由四个主要部分组成：Input 输入层需要对图形进行处理，在训练时需要对数据集计算初始设定长宽的锚框。Backbone 在不同图像细粒度上聚合并形成图像特征的卷积神经网络。Neck 一系列混合和组合图像特征的网络层，并将图像特征传递到预测层。Output 对图像特征进行预测，生成边界框和并预测类别。对于YOLOV5，无论是s，m，l还是x 这四部分都是一致。唯一的区别在与模型的深度和宽度设置。1. Input1.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个通道，最后将得到的新图片再经过卷积操作，最终得到了没有信息丢失情况下的二倍下采样特征图。以yolov5s为例，原始的640 × 640 × 3的图像输入Focus结构，采用切片操作，先变成320 × 320 × 12的特征图，再经过一次卷积操作，最终变成320 × 320 × 32的特征图。2.2 CSP结构Yolov5中设计了两种CSP结构，以Yolov5s网络为例，CSP1_X结构应用于Backbone主干网络，另一种CSP2_X结构则应用于Neck中。3. NeckYolov5的Neck和Yolov4中一样，都采用FPN+PAN的结构4. Output（待更新）