系列文章地址
YOLO系列基础(一)卷积神经网络原理详解与基础层级结构说明-CSDN博客
YOLO系列基础(二)Bottleneck瓶颈层原理详解-CSDN博客
YOLO系列基础(三)从ResNet残差网络到C3层-CSDN博客
YOLO系列基础(四)归一化层(BN层)的前世今生!-CSDN博客
YOLO系列基础(五)从神经元共适应性到模型Dropout层-CSDN博客
YOLO系列基础(六)YOLOv1原理详解原理如此清晰-CSDN博客
YOLO系列基础(七)从数据增强到图像线性变换-CSDN博客
YOLO系列基础(八)从坐标直接预测到锚框偏移量-CSDN博客
目录
背景
随着YOLOv11版本的发布,YOLO算法在视觉检测领域独领风骚,本系列旨在从小白出发,给大家讲解清楚视觉检测算法的前世今生,并讲清楚YOLOv11版本算法的所有模块功能!
在YOLO(You Only Look Once)系列算法的演进中,YOLOv1作为开山之作,奠定了实时目标检测的基础框架。本文将从YOLOv1中检测框坐标的直接预测讲起,探讨其原理、存在的缺陷,进而引出Fast R-CNN中的锚框(Anchor Box)设计,以及锚框如何优化目标检测任务。
YOLOv1检测框坐标直接预测
YOLOv1将目标检测视为一个单一的回归问题,直接从输入图像中预测出边界框的坐标、置信度和类别概率。
虽然我们在之前的博客中已经重点讲解过YOLOv1的原理内容,但是在此,我们还是简要提一嘴。
具体而言,YOLOv1将输入图像划分为一个7x7的网格(对于448x448的输入图像),每个网格负责预测中心落在该网格内的目标。每个网格预测两个边界框,每个边界框包含5个值:x, y, w, h, 和 confidence。
其中,x和y是边界框中心相对于网格单元左上角的偏移(归一化到0-1之间),w和h是边界框的宽度和高度相对于整个图像宽度的比例(同样归一化到0-1之间),confidence表示边界框内存在目标的概率以及预测的准确度(即目标的存在性置信度乘以预测框与真实框的IOU)。
综上所诉,YOLOv1的检测框检测采用的思路为通过最后的两层全连接层来直接预测检测框的坐标值。
这实际上很不合适,因为物体在不同的距离下大小往往区别甚大,坐标值也大相径庭,而卷积和池化操作本身就是在尽量解耦全局坐标值(每卷积or池化一次,特征图片的size都会大不一样),也就是说针对YOLOv1的网络结构,每一个检测框会输出5个值:x, y, w, h, confidence,其中x,y和confidence都是合理的预测内容,因为随着卷积操作的进行,上诉的3个值都和图片的size和全局坐标脱钩了(x和y是预测的当前cell的偏移量),而问题就在于w和h,这两个值和符号在图像中的大小强相关,而且是直接预测的全局坐标的归一化值。
这也就造成了,YOLOv1在检测框预测上很不准确,就连YOLOv2的官方论文也提出了此点问题:
翻译如下
2. 更好的措施
与最先进的检测系统相比,YOLO 存在多种缺陷。对 YOLO 与Fast R-CNN 的误差分析表明,YOLO 存在大量定位误差。
当然,还有其他的一些理由造成上诉问题:
- 坐标预测精度:由于直接预测归一化后的坐标值,对于大尺寸或小尺寸目标的定位精度有限。
- 每个网格预测数量限制:每个网格仅预测两个边界框,对于密集场景或目标尺寸差异大的情况,可能无法有效覆盖所有目标。
Fast R-CNN的锚框(Anchor Box)详解
Fast R-CNN引入了锚框的概念,锚框是一组预设的、具有不同尺寸和宽高比的边界框,它们作为边界框预测的起点,允许模型在每个位置预测多个不同形状和尺寸的边界框。
原理说明
从上面的分析我们可得,我们最重要的是使得w和h对全局坐标值解耦,让最终的w和h是通过最后的计算得出,而非直接预测。其实我们直接有一个现成的设计思路,那就是x和y的预测,x和y的预测就是直接预测的和cell左上角坐标的偏移量,在此理论之下,我们就有了锚框的思路。
即:通过设计一个锚框,在训练过程中,目标值是人为画出的检测框和锚框之间的w、h、宽高比之间的偏移量,也就是说我们最终预测输出的也就是这个偏移量。最终再通过计算获取真实值。
YOLOv2论文中对锚框、预测框的示意图如下:
锚框在训练过程中是不会发生变化的,从一开始就固定了。
由于锚框本身的大小是固定的,这就带来了一个问题:
如果真实检测框和锚框的w和h很不一致怎么办呢?神经网络是根据学习率不断调整参数的,如果差别很大,这意味着偏移量也很大,也就意味着模型需要花很大的代价来拟合偏移量。
这就引出了多锚框设计思路
即通过多锚框方法(每个锚框具有不同的尺寸和宽高比),让真实检测框仅需要和最近的锚框进行拟合。详细来说,有两部分:训练阶段和推理阶段的多锚框设计
训练阶段
1. 锚框初始化
在训练开始前,根据数据集中物体的统计特性(如尺寸、比例等),在特征图的每个位置上预设K个锚框。这些锚框具有不同的尺寸和宽高比,以覆盖不同形状和大小的目标。
这里的K个锚框采用的是聚类方法,针对所有的人工标记的检测框,聚类为K个类别,并取类别平均为锚框的大小和横纵比。YOLOv2中采用的是K-mean聚类的算法。
YOLOv2中对K锚框的kmean描述:
2. 标签分配
对于每个真实边界框,需要从所有锚框中选择一个与其最匹配的锚框进行标签分配。这里通过计算锚框与真实边界框的交并比(IoU)来实现,选择与真实边界框IoU最高的锚框作为匹配对象。一旦确定了匹配关系,就可以为锚框分配类别标签(即真实边界框所属的类别)和偏移量标签(即真实边界框相对于锚框的偏移量)。
3. 模型训练
模型通过前向传播计算每个锚框的预测偏移量和类别概率。然后反向传播优化模型参数,使预测结果更接近真实标签。在训练过程中,模型会逐渐学习到如何根据输入图像和锚框来预测物体的位置和类别。
推理阶段
锚框生成
在推理过程中,模型会为输入图像生成与训练阶段相同的K个锚框。这些锚框将作为模型预测物体位置和类别的起点。
预测和调整
模型会为每个锚框预测一个偏移量和类别概率。使用预测的偏移量来调整锚框的位置和大小,以获得预测的边界框。根据预测的类别概率来确定边界框中物体的类别。
后处理——非极大值抑制(NMS)
由于阈值和锚框数量的问题,同一个目标可能会输出多个相似的预测边界框。为了解决这个问题,常用的措施是使用非极大值抑制(NMS)来筛选需要输出的预测边界框。NMS通过比较预测边界框的置信度和IoU来去除冗余的边界框,保留最佳的预测结果。
总结
从YOLOv1直接预测检测框坐标到Fast R-CNN引入锚框,目标检测算法在精度和泛化能力上取得了显著进步。锚框的引入不仅解决了YOLOv1在边界框预测上的局限性,也为后续的目标检测算法(如YOLOv2及以后版本)提供了重要的启示。在YOLOv2及后续版本中,锚框的概念得到了进一步的优化和应用,使得YOLO系列算法在保持实时性的同时,不断提升检测精度和泛化能力。
其实本文还有很多没有说明清楚,例如在训练过程中YOLOv2针对锚框的输出格式是啥样的,选定锚框之后目标值又是啥样的,其他锚框需不需要进行训练……
本文暂时不讲解此部分的内容,后续内容将放于YOLOv2原理详解中进行补充
随着YOLOv11的发布,YOLO算法已经发展成为一个高度成熟且强大的目标检测框架。理解YOLOv1中的基础概念及其演进过程中的关键改进,对于深入理解YOLO系列算法具有重要意义。在接下来的文章中,我们将继续探讨YOLO系列算法的其他关键模块和功能。