0. 写在前面
YOLO系列博客,紧接上一篇Yolo系列算法-理论部分-YOLOv4-CSDN博客
1. YOLOv5-美而全的产品
YOLOv5的诞生,直接将目标检测算法向终局推进,Ultralytics团队在COCO数据集上预训练的目标检测架构和模型直接开源,其中包含了经过数千小时的研究和开发而形成的经验教训和最佳实践。
2. 网络结构
YOLOv5是YOLOv4的升级改进版本,官方版本一共有5个,按模型的大小排序分别是YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,让开发者能再精度和速度中得到一个权衡,以YOLOv5s来说明整体网络结构。
2.1 Input
图像预处理部分,对输入的图像进行Mosaic数据增强,通过随记缩放、随记裁剪、随记排布的方式对不同图像进行拼接;
采用Mosaic数据增强的方法,从增加检测目标的背景丰富度和提高小目标检测两个方向提升检测效果;并且在BN计算的时候一次性会处理四张图片。
2.2 Backbone
主干网络部分,主要采用:Fcous结构+CSP结构 。首次引入Fcous结构,用于直接处理输入的图片,通过降维和压缩输入特征图 ,从而减少计算量和提高感受野 ,同时提高目标检测的精度和模型的表达能力。
Fcous重要的是切片操作,将4×4×3的图像切片之后变成2×2×12的特征图。
以YOLOv5s的结构为例,原始608×608×3的图像输入Focus结构,采用切片操作,先变成304×304×12的特征图,再经过一次32个卷积核的卷积操作,最终变成304×304×32的特征图。
2.3 Neck
网络的颈部,采用的是FPN+PAN结构,结构和YOLOv4是一样的,可以参考上一篇博文Yolo系列算法-理论部分-YOLOv4-CSDN博客:主要通过融合高低层特征 提升目标检测的效果,尤其可以提高小尺寸的检测效果。
2.4 Head
对于网络的输出部分,与YOLOv4一样采用三个不用的输出Head,进行多尺度预测;随着YOLOv5的逐渐工业落地,Head部分也可以修改为输出一个结果,便于后续终端的移植工作,详细内容可参考:
- Yolo系列算法-理论部分-YOLOv4-CSDN博客;
- 详细介绍 Yolov5 转 ONNX模型 + 使用ONNX Runtime 的 Python 部署(包含官方文档的介绍)_yolov5转onnx-CSDN博客
3. 改进方向
3.1 自适应锚框计算
在YOLOv5之前的系列中,对最佳Anchors的获取都是通过K-Means的方法获得,这部分操作需要在网络训练之前单独运行。YOLOv5的创新点就是将此功能嵌入到整体代码中,每次训练时,自适应计算不同训练集中的最佳锚框值,并给用户开放接口,可以关掉自动计算功能。
3.2 自适应灰度填充
为了应对输入图片尺寸不一的问题,通常做法事将原图直接resize成统一的大小,但是这样会造成目标的变形,为了避免这种情况的发生,YOLOv5采用了灰度填充的方式统一输入尺寸,避免目标变形的问题,灰度填充的核心思想就是将原图的长宽等比缩放对应统一尺寸,然后对空白部分用灰色填充。
3.3 损失函数
- 分类用交叉熵损失函数 (BEC Loss),边界框回归用CIoU Loss;
- CIoU将目标与anchor之间的中心距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中的发散等问题;惩罚因子把预测框长宽比拟合目标框的长宽比考虑进去。
4. 性能表现
在COCO数据集上,当输入原图的尺寸是:640×640时,从YOLOv5n到YOLOv5s**,检测精度逐渐上升,检测速度逐渐下降,非常适合工程实践**,实现精度与速度的完美匹配。