论文:You Only Look Once: Unified, Real-Time Object Detection
代码:https://pjreddie.com/darknet/yolo/
作者:Joseph Redmon
时间:2016.05
一、 背景
在 YOLO 提出之前,目标检测其实是按照分类的方法来重写了回归分支,来实现检测。并且需要复杂的后处理来得到最终的检测结果。这样会导致检测过程耗时长且复杂。
YOLOv1 提出将目标检测任务定义为单个回归问题,直接从输入图像上得到框的位置和类别。
YOLOv1 是 Joseph Redmon 提出来的,后面他又提出了改进版本 v2 和 v3,此外后续的其他 YOLO 方法都不是该作者的工作,而是其他人接力的。
二、 方法
2.1 主要结构
YOLOv1 的结构如图 1 所示,该模型使用一个卷积网络来直接预测框和对应类别,是一个统一的模型结构。
结构介绍:YOLOv1 使用全图作为输入,输出框位置和类别
- 输入:将图像分为 S × S S\times S S×S 的网格(7x7),如果目标的中心点落入了对应网格,则由该网格负责预测该目标
- 每个网格预测 B 个 bbox 和每个 bbox 中包含目标的概率,定义 confidence 为 P r ( o b j e c t ) × I o U p r e d t r u t h Pr(object) \times IoU_{pred}^{truth} Pr(object)×IoUpredtruth
- 如果某个网格没有目标落入,则对应 confidence 为 0,否则期望 confidence score = IoU
- 每个 bbox 的预测包含五个参数: ( x , y , w , h , c o n f i d e n c e ) (x, y, w, h, confidence) (x,y,w,h,confidence), ( x , y ) (x, y) (x,y) 为框的中心点和网格边界的距离(相对当前网格的偏移值), ( w , h ) (w, h) (w,h) 是宽高和全图比(相当于归一化了),confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息。
- 每个网格也会预测类别 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(Classi∣Object),也就是每个框会预测其对应类别。
- 测试时,对每个框预测的类别如下,该类别包含了这个 bbox 中该类别的概率和位置匹配的准确性: P r ( c l a s s i ∣ o b j e c t ) ∗ P r ( O b j e c t ) ∗ I o U p r e d t r u t h = P r ( C l a s s i ) ∗ I o U p r e d t r u t h Pr(class_i|object)*Pr(Object)*IoU_{pred}^{truth}=Pr(Class_i)*IoU_{pred}^{truth} Pr(classi∣object)∗Pr(Object)∗IoUpredtruth=Pr(Classi)∗IoUpredtruth
- 在 PASCAL VOC 测试时,作者使用 S=7,B=2,C=20,最终得到 7x7x30 的向量
为什么每个网格输出 30 维向量:
30维向量 = 20个目标的类别概率(VOC 类别) + 2个bounding box * 4个坐标 + 2个bounding box 包含目标的置信度 confidence(前、背景)
注意, 2 个是否包含目标的置信度是如何使用的呢?
- 在训练时:不使用该置信度,使用预测的框和 gt 框的 IoU 来剔除掉一个 IoU 低的框,每个 grid 保留一个框
- 在测试时:使用该置信度,在 NMS 的时候,对每个 grid,剔除掉置信度低的那个框,每个 grid 保留一个框,然后,使用该置信度对所有的框来排序,剔除掉和置信度最大的框 IoU>阈值的框,对保留下的框重复进行 NMS,直到最后
网络结构如图 3:
- 标准结构:24 conv layers + 2 fully connected layers
- Fast 结构:9 conv layers + 2 fully connected layers
- 输出:7x7x30 tensor
训练:
- 输入 448x448 的图像
- 输出每个网格中的每个框的 ( x , y , w , h , c o n f i d e n c e ) (x, y, w, h, confidence) (x,y,w,h,confidence)
- 虽然每个网格中可能预测多个 bbox,在训练阶段,只期望对每个目标预测一个框,故此处指保留和 gt 的 IoU 最大的框。
Loss 函数:
- 1 i o b j 1_i^{obj} 1iobj 是第 i i i 个网格中存在目标
- 1 i j o b j 1_{ij}^{obj} 1ijobj 是第 i i i 个网格中的第 j j j 个 bbox 存在目标
- 可以看出该 Loss 函数只对出现在该网格中的目标进行分类约束,也只对出现在该网格中的 IoU 最大的框进行约束。
推理:
- 在每个图像中预测 98 个bbox(49 个网格,每个网格预测两个框)
- 在每个网格中,剔除掉得分低的框,每个网格保留一个框(这个得分是只是否包含目标的那个得分,而非具体的类别得分,此外,因为推理的时候不知道 gt 的信息,不能像训练时候一样使用 IoU 来判断了)
- 每个网格剔除掉一个低分 bbox 后,在全图使用 NMS,剔除掉重叠率高的框
如何进行 NMS:
因为我们对一个网格要预测两个bbox,所以最后我们能得到个 7x7x2=98 个bbox。
首先,将这 98 个 bbox 中置信度低的框去掉,然后再根据置信度对剩下的bbox排序,使用 NMS 算法,把重复度高的框的置信度设为 0。
对于留下的框,再根据分类概率得到它们的类别,这里注意得到的框的大小都是相对于原图大小的,都是 0~1 之间的值,所以输出的时候还需要还原,才能得到真实的bbox的尺寸大小。
和 SOTA 方法效果对比:
为了更好的对比 YOLO v1 和 SOTA 方法的效果,作者对比了 YOLO v1 和 Fast RCNN 在 VOC 2017 上的效果:
- Correct:corrent class and IoU>0.5
- Localization:correct class,0.1<IoU<0.5
- Similar:class is similar, IoU>0.1
- Other:class is wrong,IoU>0.1
- Background:IoU<0.1 for any object
从图 4 可以看出:
- YOLO v1 定位错误较多,定位的错误高于其他所有错误的总和
- Fast RCNN 定位错误的很少,但有很多背景误识别,13.6% 的检测结果是假正,即不包含任何目标,约是 YOLO v1 背景误识别的 3 倍。
2.2 优势和不足
优势如下:
- YOLOv1 很快!由于不需要复杂的 pipeline,在 Titan X GPU 上能达到 45fps,能够实时处理视频流,且准确率是当时实时系统的 2 倍。
- YOLOv1 在推理的时候在全图上进行,在训练和测试时都将全图看做一个整体,没有 RPN 等操作,比 Fast R-CNN 对背景的误检少了一半(Fast RCNN 由于无法看到全局的信息,所有很多背景的误检)。
- YOLOv1 能够学习到目标更泛化的特征。
- YOLOv1 虽然比当时 SOTA 的方法效果差些,但速度很快。
YOLO v1 的不足:
- YOLO v1 在每个网格中预测两个框,并且属于同一个类别,这种空间约束限制了对距离近的目标的预测,会导致漏检,如多个小目标共现的区域
- YOLO v1 模型是从训练数据中学习到的目标纵横比,所以难以泛化到少见的纵横比目标上,导致边界不准。
- YOLO v1 的 loss 函数将大目标和小目标同等对待,大目标的小错误是可以容忍的,但小目标的小错误对 IoU 影响较大,会导致对小目标定位不准
- 使用全连接层,参数量巨大,而且也因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率。
- 一个网格只能预测一个物体。
- anchor-free的方法没有anchor-based的准确。
三、 效果
在手工绘图的数据集上体现了 YOLO v1 的泛化性能: