论文链接
You Only Look Once: Unified, Real-Time Object Detection
https://arxiv.org/abs/1506.02640
1.Object Detection
Object Detection目标是,输入一张图片,输出图片中包含的所有Object以及每个Object的位置(包围该Object的Bounding Box)。
在YOLO之前,RCNN系列(RCNN/Fast RCNN/Faster RCNN)都是采用两阶段的处理模式:先提出候选区域(Region Proposals),再识别候选区中的Object。YOLO创造性的将候选区(Region Proposals)选择和Object检测两个阶段合二为一,看一眼图片就可以知道Object是什么以及它们的位置。
2.YOLO的实现方案
YOLO中没有了直接提取候选区(Region Proposal)的步骤,取而代之的是将图片划分成S x S 个网格(Grid Cell),论文中S = 7;每个Grid Cell负责预测Object中心点落在该Cell内的Object;每个Cell生成B个Bounding Box,论文中B=2。
图片来源【1】
没有候选区(Region Proposal)之后,YOLO的结构非常直接,就是单纯的卷积、池化最后加了两层全连接。
粗略的说,YOLO的整个结构就是将大小为448 x 448 x 3的输入图片经过神经网络的变换得到一个大小为7 x 7 x 30的输出张量(Tensor),7 x 7是输入图片的划分的Grid Cell数量。30维向量包含的信息如下:
图片来源【1】
20个对象分类的概率
,之所以是20是由于YOLO V1支持识别20种不同的对象(人、鸟、猫、汽车、椅子等)。
2个Bounding Box的位置
YOLO中使用(x, y, w, h)来表示一个Bounding Box,(x, y)表示BBox的中心,(w, h)表示BBox的宽高。
注意,(x,y)是相对于Grid Cell左上角坐标的偏移量,并使用Grid Cell的宽高做归一化处理;(w,h)是相对于整个图片的宽和高的比例;这样(x,y,w,h)的数值都在[0,1]范围内。如下图:
图片来源【1】
2个bounding box的置信度
Bounding Box的置信度 = Bounding Box中存在Object的概率 * Bounding Box与Object实际Bounding Box的IOU。
IOU是在训练阶段计算的,因为在Inference阶段并不知道真实对象在哪里,只能完全依赖于网络的输出,这时已经不需要也无法计算IOU了。
Bounding Box的置信度Confidence表示它是否包含对象且位置准确的程度。置信度高表示这里存在一个对象且位置比较准确;置信度低表示可能没有对象或者即便有对象也存在较大的位置偏差。
3. 损失函数
损失函数的设计是Yolo 算法的比较核心的部分。
图片来源【1】
公式中:
图片来源【1】
4. YOLO训练
YOLO先把前20层卷积网络层 平均池化层(Average-pooling Layer) 全连接层(Fully Connected Layer)在ImageNet数据集上进行预训练。
YOLO的最后一层采用线性激活函数(Linear Activation Function),其它层都是Leaky ReLU:
除此之外,训练中还采用了Drop Out和数据增强(Data Augmentation)来防止过拟合。更多细节请参考原论文。
5.YOLO预测(inference)
训练好的YOLO网络,输入一张图片,输出一个7x7x30的张量(tensor)来表示图片中所有网格(Grid Cell)包含Object的概率以及该Object可能的2个Bounding Box位置和其置信度。为了从中提取出最有可能的Object和Bounding Box,YOLO采用NMS(Non-maximal suppression,非极大值抑制)算法。
NMS(非极大值抑制)
NMS算法的核心思想是:选择得分(Score)最高的作为输出,与该输出重叠比较大的Inference Objects去掉,不断重复这一过程直到所有Inference Objects处理完。
它的步骤如下:
1)根据置信度得分进行排序;YOLO的Score计算方法如下:
设置一个阈值,过滤掉Score低于阈值的候选对象;
2)遍历每一类Object,找到该类内Score最大的Object及其Bounding Box,并添加到输出列表。
3)计算其它Object的Bounding Box与Score最大的Object的Bounding Box的IOU,根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉。
4)重复上述步骤,直至所有分类的Object都处理完毕。
最后输出列表中的就是YOLO检测出的Objects。