YOLO系列是=一阶段目标检测算法(其中YOLO v1—YOLO v5基于Anchor based,从YOLO v6开始基于Anchor Free)。与以Faster R-CNN为代表的二阶段算法相比,一阶段算法不需要region proposal阶段,直接产生物体的类别概率和位置坐标值。
因此,一阶段算法有更快的检测速度。但是一个网格(grid)只预测有限个bbox,覆盖率较低,精度相较于二阶段算法较低。
YOLO V1是该系列的基础,更高的网络皆由此做出改变,下面对YOLO V1进行总结:
✨1 网络结构
YOLO v1将图像划分成多个网格,然后为每一个网格同时预测边界框并给出相应概率(一个全卷积神经网络端到端实现检测物体)。
网络结构如图所示:
图1 网络结构
其中输入维度是448x448x3,输出7x7x30的特征图。具体结构件上图。
该网络中,存在参数量来十分巨大的问题。使用卷积实现7x7x1024维度到4096维度过程中,产生的参数量十分巨大。因此事实上作者是在中间加一层,使维度先由7x7x1024变化为256x1,最终形成4096x1。但是这样维度仍然很大,该问题在yolo v1中并没有得到解决。
✨2 检测原理
🐬2.1 网络输出
上图中,经过网络输出维度是7x7x30。相信很多人不明白这是如何来的和这代表着什么。
首先,7x7由原图448下采样64倍得到,代表着将图像7x7等分。接下来,我们会在7x7个得到每个网格中同时预测边界框并给出相应概率。
30是候选框的预测参数(20+2*(4+1)
):20代表类别数量,(这里以Pasical Voc数据集为例,该数据集共20个类别)。每个网格预测2个bounding bbox,每个bounding bbox包含一个置信度C,一个矩形框参数(Cx, Cy, w, h)。
💫 2.1.1 置信度C
置信度C分为两部分:
- 边界框是否含有目标,如果有Pr(Object)=1,如果没有为Pr(Object)=0。
- 边界框的准确定,这部分计算与真实框之间的IOU。
最终置信度C将两部分结合,公式如下:
🚵♀️ 2.1.2 矩形框参数
==C_x和C_y==是中心点相对网格的偏移,一般在0-1之间。 如果==w和h==采用原图中物体框的宽和高,那肯定远远大于1,这样在训练计算损失时,会导致计算C_x,C_y和w,h两部分差异过大。因此,我们取w和h为==原图中物体框的宽和高与原图宽和高的比==,公式如下:
🐬2.2 流程
测试时:
- 每个预测框根据类别置信度选取值最大的那个类别作为其预测标签,设置其值为
Pr(class)
- 根据矩形框参数计算每一个bbox的位置(此时共有7x7x2=98个bbox)(边界框回归)
- 计算每个bbox的score:
- 设置阈值,将小于该阈值的score排除。
- 对剩下的预测框进行nms处理(单独总结),得到结果
训练与预测不同,只需要根据预测的参数计算损失即可:
- 利用网络输出的特征图找到正样本和负样本。
- 利用正样本和负样本参数计算置信度损失、类别损失和边界框回归损失(负样本只参与置信度损失)
👻 2.3 边界框回归
假设有一个预测框K,其预测的置信度为C,矩形框参数,我们的目的是将预测参数映射成原图中bbox的坐标。
中心坐标计算公式:
其中,,, 如图3所示, stride是特征图相对于原图的下采样倍率
宽和高计算公式:
其中,是原图的宽和高。
✨3 损失函数
最后,再介绍一下损失函数,公式如下:
第一个是中心坐标误差,第二个高宽误差,第三个是包含目标的边界框的置信度误差,第四个是不包含目标的边界框的置信度误差,第五个是包含目标单元格的分类误差项。
所有的误差都采用均方差,但是不同的误差权重不同,如第一项和第二项的定位误差权重为5,第三项和第四项的置信度误差权重为0.5。
❤️ 3.1 中心坐标误差和高宽误差
其中代表第i个单元格的第j个预测的bbox存在该目标。
同时我们注意到这里的w和h都是带根号,这是因为较小的边界框的坐标误差应该要比较大的边界框要更敏感。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测。
=====================================================================
Pasical Voc中,训练集标注的是原图中检测物体的位置(xmin, ymin, xmax, ymax),与损失函数需要的不符,需要进行处理:
将(xmin, ymin, xmax, ymax)转化为center_x, center_y, w, h
原图中心点映射到特征图中
- 计算偏差,得到与矩形框参数对应的参数Cx, Cy
- 计算与矩形框对应的参数w和h:
- =====================================================================
🎄3.2 置信度误差
第三项是包含目标的边界框的置信度误差,很多地方说是预测框与真实框计算的IOU,但这这应该是从训练集label中生成的,感觉有些问题。
这里猜测是1,使我们预测的可以在优化中不断趋近1。
第四项是不包含目标的边界框的置信度误差,是0,使后面预测的趋近于0。
🍕3.3 包含目标单元格的分类误差项
第五项是包含目标单元格的分类误差项,其中为目标真实分类,是预测分类。
🥓 4 YOLO v1不足
- 当某个框内存在两个物体,预测结果只能存在一个。
- 精度较低,尤其对小目标预测效果差。
- 参数量大
- 没有采用BN层来防止梯度消失和梯度爆炸的问题
- 线性输出器可能导致输出的C_x, C_y不满足属于0到1的条件,或w和h不满足大于0的条件。