YOLO:You Only Look Once: Unified, Real-Time Object Detection
摘要
YOLO 将目标检测问题看作 bbox 回归和分类问题。在预测中,由一个网络完成 bbox预测 和 类别预测。
YOLO 的检测速度极快,每秒可处理45张图片(Titan X)。Fast YOLO(更小的YOLO)每秒可以处理155张照片。
1. 简介
R-CNN 首先在图片上计算产生很多潜在的 bbox,然后在这些潜在的 bbox 上运行分类器。在分类器后,后处理被使用去修正 bbox,消除重复的检测,根据场景中其它的object,对 bbox 进行重新打分。整个检测过程很慢、很难去优化,因为每一个部件需要单独进行训练。
YOLO 将目标检测看作一个回归问题,直接从图像的像素计算 bbox 和 类别概率。
下图是YOLO的架构图:
从图中可以看出,YOLO 使用单个卷积网络来预测 bbox 和 类别概率(simultaneously)。YOLO 在所有的图片上进行训练,直接优化检测性能。
YOLO相比传统检测算法,有以下几个优点:
- YOLO 非常快。
- YOLO 根据整张图片做出预测。不像sliding window 和 region proposal-based 技术,YOLO 训练和测试时将整张图片作为输入,这使得它可以对语境信息进行处理。Fast R-CNN 将背景误判为object,因为它不能感知图片的语境。YOLO对于背景误判的数量比Fast R-CNN少一半。
- YOLO 学习 object 的泛化的表示。YOLO 的性能比DPM、R_CNN高许多。因为 YOLO 的泛化性能很好,所以在应用于新的数据集时,性能不会有太大的下降。
YOLO 仍然落后于当前的 state of art 检测算法。虽然它能快速的识别图片中的 object,但是它很难精确定位一些 object,尤其是一些小物体。
YOLO 的训练和测试代码是开源的。并且作者开源了很多预训练好的模型。
2. 单步检测(同时检测位置和类别:Unifed Detection)
YOLO 将检测的定位和识别过程合二为一。YOLO 基于整张图片的特征来预测每一个 bbox。它能够同时预测所有类的 bbox。这意味着YOLO的预测是基于整张图片和图片中的所有目标的。同时,单步检测使得 YOLO 的检测速度非常快。
YOLO 将输入图像划分为 S × S S \times S S×S 的网格。如果一个 object 的中心落入一个网格单元内,则该网络单元负责检测该 object。
每一个网格单元预测 B B B 个 bbox 以及这些 bbox 的概率。这些概率反映该 box 包含 object 的概率,同时也反映预测 box 的概率。作者将这个概率定义为: Pr(Object)*IoU pred truth \text{Pr(Object)*IoU}_{\text{pred}}^{\text{truth}} Pr(Object)*IoUpredtruth。如果一个网格单元不包含 object,则该网格单元对应的概率为0。否则,我们我们令该网格单元的概率等于预测的 box 和 ground truth box 的 IoU。
每一个 bbox 包含5个预测: x , y , w , h x, y, w, h x,y,w,h 和 confidence。 ( x , y ) (x,y) (x,y) 为 bbox 的中心网格单元。 w w w 和 h h h 表示相对于整个网络的宽度和高度。最后,confidence 表示预测的 box 和 ground truth box 的 IoU。
每个网络单元还预测 C C C 条件概率。 Pr ( Class i ∣ Object ) \text{Pr}(\text{Class}_{i}|\text{Object}) Pr(Classi∣Object)。计算网格单元包含一个 object 的情况下各类的条件概率。无论boxes B B B 的数量有多少,每一个网格单元只进行一次分类概率计算。
在测试时,YOLO 将 box 的概率和网格单元上的条件概率相乘, Pr ( Class i ∣ Object ) ∗ Pr ( Object ) ∗ IoU truth pred = Pr ( Class i ) ∗ IoU truth pred \text{Pr}(\text{Class}_{i}|\text{Object})*\text{Pr}(\te