《You Only Look Once: Unified, Real-Time Object Detection》
论文地址
“We frame object detection as a regression problem to spatially separated bounding boxes and associated class probabilities.”
从R-CNN到Fast R-CNN一直采用的思路是先生成region proposal,然后再对proposal进行分类和回归,精度已经很高,但是速度还不行。 YOLO提供了另一种更为直接的思路: 直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。
input: 448×448
output: S × S × (B * 5 + C)
把图片分为S × S个grid,每个grid里面有B个(YOLOv1中B为2)bounding box和C个类别,每个bounding box 由5个参数构成,分别是p,x,y,w,h
p: These confidence scores reflect how confident the model is that the box contains an object and also how accurate it thinks the box is that it predicts.
P = P r ( O b j e c t ) ∗ I O U p r e d t r u t h P = Pr(Object)*IOU_{pred}^{truth} P=Pr(Object)∗IOUpredtruth
P r ( O b j e c t ) Pr(Object) Pr(Object): bounding box中有目标的时候为1,没有为0
I O U p r e d t r u t h IOU_{pred}^{truth} IOUpredtruth: predict 的 bounding box 与 ground truth的IOU
x , y x,y x,y :bounding box的中心坐标,在某个grid中,所以是相对每个grid的,grid的左上角为(0,0),右下角为(1,1)
w , h w,h w,h:bounding box的长宽,是相对整张图的
所以 x , y , h , w x,y,h,w x,y,h,w都是0~1之间的
eg :下图把图片分为 7×7 个grid,每个grid两个bounding box 是 25,二十个类别是20
output: 7×7×(25+20) = 7×7×30
预训练分类网络: 在 ImageNet 1000-class competition dataset上预训练一个分类网络,这个网络是图The architecture of network中的前20个卷机网络+average-pooling layer+ fully connected layer (此时网络输入是224*224)。
训练检测网络:转换模型去执行检测任务,《Object detection networks on convolutional feature maps》提到说在预训练网络中增加卷积和全链接层可以改善性能。在他们例子基础上添加4个卷积层和2个全链接层,随机初始化权重。检测要求细粒度的视觉信息,所以把网络输入也又224224变成448448。见图The architecture of network。
损失函数的设计目标就是让坐标**(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。简单的全部采用了sum-squared error loss**来做这件事会有以下不足:
解决方案如下:
更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 λ c o o r d \lambda_{coord} λcoord ,在pascal VOC训练中取5。(上图蓝色框)
对没有object的bbox的confidence loss,赋予小的loss weight,记为$ \lambda_{noobj} $,在pascal VOC训练中取0.5。(上图橙色框)
有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。
对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。
Test的时候,每个网格预测的class信息 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i | Object) Pr(Classi∣Object) 和bounding box预测的confidence信息$Pr(Object) \ast IOU^{truth}_{pred} $相乘,就得到每个bounding box的class-specific confidence score。
等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。
对每一个网格的每一个bbox执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)
得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
这里看一下Yolo算法在PASCAL VOC 2007数据集上的性能,这里Yolo与其它检测算法做了对比,包括DPM,R-CNN,Fast R-CNN以及Faster R-CNN。其对比结果如表所示。与实时性检测方法DPM对比,可以看到Yolo算法可以在较高的mAP上达到较快的检测速度,其中Fast Yolo算法比快速DPM还快,而且mAP是远高于DPM。但是相比Faster R-CNN,Yolo的mAP稍低,但是速度更快。所以。Yolo算法算是在速度与准确度上做了折中。
为了进一步分析Yolo算法,文章还做了误差分析,将预测结果按照分类与定位准确性分成以下5类:
可以看到,Yolo的Correct的是低于Fast R-CNN。另外Yolo的Localization误差偏高,即定位不是很准确。但是Yolo的Background误差很低,说明其对背景的误判率较低。
“YOLO makes far fewer background mistakes than Fast R-CNN. By using YOLO to eliminate background detections from Fast R-CNN we get a significant boost in performance.”
v1 每个 box 只能预测一类,而 v2 每个 box能预测所有类
图片来源 YOLO v3网络结构分析
参考
【1】图解YOLO by 晓雷
【2】YOLO算法的原理与实现 by 叶虎
【3】YOLO详解 by 赵丽丽
【4】YOLO实时目标检测系统 by 黄月红
【5】《You Only Look Once: Unified, Real-Time Object Detection》