0.背景
此前“two-stage"目标检测算法由于需要先选定候选区域,再进行后续的回归预测任务,分成两个阶段,速度较为缓慢。
且如果对模型进行分析,既然”two-stage"的候选区域没办法完全拟合最终的检测框,还需要回归调整,那为什么不直接对候选区域简单处理(对于任意图片都统一划定候选区域),依靠后续的回归直接进行调整呢?因而正是在此基础上,"one-stage"的目标检测模型YOLOV1应运而生,从输入图片,到生成检测框结果,YOLOV1只用一步完成。
1.预测阶段
作为“one-stage"模型,YOLOV1可以实现输入一张图片,直接在图像上输出检测框以及其类别判断。它的过程分析如下:
根据YOLO的设计,输入图像被划分为7×7的网格(grid cell),输出张量中的7×7就对应着输入图像的7×7网格或者说输出就是7×7=49个30维向量。对于一个格子,实际对应着一个向量,有30个特征组成。其中输出两个boundding box(初步得到的预测框),每个框包含其其中心坐标,框的长宽,置信度得分。(置信度得分越高,一般认为该框内是物体的概率越大,也可以理解为和真实物体的重合度越大,iou越大,即预测更为准确)。除了上述2×5=10个特征,剩下20个特征就是类别(这里不包含背景,因为置信度得分confidence已经包含了对于其是否是背景的判断,相当于这里各类别的概率是条件概率,在确定框内是物体条件下属于某个类别的概率)。
当49个格子都输出这30维的特征时,可以理解为每个格子都生成了两个预测框(bounding box),一共图像中会显示2×49=98个预测框。显然这些预测框有些并不准确,且有些可能指向的是同一个待检测的物体。因此这里和”two-stage"一样,我们需要进行常见的目标检测后处理。首先根据confidence×class_max计算出每个bounding box对应最大类别的概率(因为需要首先不是背景,即条件概率,得乘上置信度得分。)设定一定阈值,把最大类别概率低于这个值的框都丢弃掉。
对于剩下的框,再逐类别做NMS处理,最终确定剩余符合条件的预测框。
2.训练阶段
YOLOV1实现的就是输入到输出,所以核心是我们怎样打标签。
对于每个网格,若物体中心落在这个网格,这个网格的类别就取这个物体的类别。如果没有任何物体,则所有类别全部取0。
对于bounding box的值的标定,(在YOLOV1)中每个格子标定两个bounding-box:
1. 一般对于含有物体的格子,其中一个bounding box按ground truth来标,即大小范围完美框住物体,置信度得分设为1;另一个bounding box一般取另外一个尺寸,要么远大于物体,要么远小于物体,一般让它和ground truth的iou较小,则confidence置信度得分可以标为0。可以理解为负样本。
2. 对于不含物体中心的格子,则选定两个不同尺寸的bounding box,因为没包含物体,其confidence标为0。
把打好标签的图片送入网络训练(训练过程不需要NMS处理)
通过巧妙设置损失函数,可以得到更准确的结果。
3.总结与思考
关于模型为什么要采用两个(甚至可以更多)bounding box,笔者认为是可以输出不同尺度的预测框,以利用NMS选出更佳的预测框,增加了对于不同尺度物体的把握能力。
YOLOV1存在的一个明显问题,对于一个网格只能输出一个类别,那要是很多物体的中心都落在同一个网格中呢?因此YOLOV1在小目标和密集性目标识别性能较差。
注意:因为confidence置信度得分已经考虑了框内是不是背景,所以20个类别的分类与fast r-cnn不同,就没有包含背景类别了。这里更多是采用条件概率的思想,置信度得分乘上在物体条件下属于某个类别的概率,才是真正的属于某个类别的概率。