参考文献: Redmon J , Divvala S , Girshick R , et al. You Only Look Once: Unified, Real-Time Object Detection[J]. 2015.
项目主页: http://pjreddie.com/darknet/yolo/
You Only Look Once
Redmon J , Divvala S , Girshick R , et al.
1 Introduction
现在的 detection systems 将物体检测问题,最后会转变成一个分类问题。在检测中,detection systems 采用一个 classifier 去评估一张图像中,各个位置一定区域的 window 或 bounding box 内,是否包含一个物体?包含了哪种物体?
一些 detection systems,如 Deformable Parts Models(DPM),采用的是 sliding window 的方式去检测。
最近的 R-CNN、Fast R-CNN 则采用的是 region proposals 的方法,先生成一些可能包含待检测物体的 potential bounding box,再通过一个 classifier 去判断每个 bounding box 里是否包含有物体,以及物体所属类别的 probability 或者 confidence。这种方法的 pipeline 需要经过好几个独立的部分,所以检测速度很慢,也难以去优化,因为每个独立的部分都需要单独训练。
本文将 object detection 的框架设计为一个 regression problem。直接从图像像素到 bounding box 以及 probabilities。这个 YOLO 系统如图看了一眼图像就能 predict 是否存在物体,他们在哪个位置,所以叫 You Only Look Once。
YOLO 的 idea 十分简单,如 Figure 1:
将图像输入单独的一个 CNN 网络,就会 predict 出 bounding boxes,以及这些 bounding boxes 所属类别的概率。YOLO 用一整幅图像来训练,同时可以直接优化 detection performance。
这样的统一的架构,对比之前如 R-CNN、Fast R-CNN 的 pipeline,有以下几点好处:
a. YOLO 检测系统非常非常的快。受益于将 detection 架构设计成一个 regression problem,以及简单的 pipeline。在 Titan X 上,不需要经过批处理,标准版本的 YOLO 系统可以每秒处理 45 张图像;YOLO 的极速版本可以处理 150 帧图像。这就意味着 YOLO 可以以小于 25 毫秒延迟的处理速度,实时地处理视频。同时,YOLO 实时检测的mean Average Precision(mAP,平均精度)是其他实时检测系统的2倍。
b. YOLO 在做 predict 的时候,YOLO 使用的是全局图像。与 sliding window 和 region proposals 这类方法不同,YOLO 一次“看”一整张图像,所以它可以将物体的整体(contextual)的 class information 以及 appearance information 进行 encoding。目前最快最好的Fast R-CNN ,较容易误将图像中的 background patches 看成是物体,因为它看的范围比较小。YOLO 的 background errors 比 Fast R-CNN 少一半多。
c. YOLO 学到物体更泛化的特征表示。当在自然场景图像上训练 YOLO,再在 artwork 图像上去测试 YOLO 时,YOLO 的表现优于 DPM、R-CNN 。
2 Unified Detection(统一检测)
YOLO 检测系统首先将输入图像分成S*S个 grid(小格),如果一个物体的中心掉落在一个 grid cell 内,那么这个 grid cell 就负责检测这个物体。
每个 grid cell 预测B个 bounding boxes,每个 bounding box 包含了5个predictions:Center_x,Center_y表示bounding box 的中心点坐标;width,height表示bounding box宽度高度;confidence表示置信度, confidence = P(object)* IOU,其中, 若bounding box包含物体,则P(object) = 1;否则P(object) = 0;IoU 值(intersection over union, IOU=交集部分面积/并集部分面积,2个box完全重合时IOU=1,不相交时IOU=0)。
每个 grid cell 预测C个conditional class probability(条件类别概率),指grid cell包含物体条件下,物体出现的概率。不管 grid cell 包含了多少bounding boxes,每个 grid cell 只 predict 每个类别的 conditional probabilities。
在测试阶段,将每个 grid cell 的 conditional class probabilities 与每个 bounding box 的 confidence 相乘得到每个bounding box的具体类别的 confidence score,以此把bounding box 中预测的 class 的 probability,以及 bounding box 与 object 的契合度,都进行了 encoding。
综上,网络将一张图像分为S * S个grid cells,每一个 grid cell 预测B个 boxes(每个 box 是 5个数值),检测C个类别,最后输出的tensor为S * S*(B*5+C)。
3 Network Design(网络设计)
YOLO 仍是 CNN 的经典形式,开始是 convolutional layers 提取特征,再是 fully connected layers 进行 predict 结果:probabilities 以及 coordinates。
YOLO 的 CNN 结构取自两篇论文:GoogLeNet、Network in Network. YOLO 有24个卷积层,随后就是2个全连接层。不像 GoogLeNet 中使用的 inception modules, 而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。如下图 Figure 3 所示:
可以看到,YOLO以448 * 448 * 3为固定输入,输出的 Tensor 为7 * 7 * 30, 对应了 7*7个 grid cells,30 对应了预测值。其中,8 维是回归的bounding box坐标,2 维是 bounding box 的 confidence,20 维是检测类别。
论文中还给出一个更轻快的检测网络fast YOLO,它只有9个卷积层和2个全连接层。使用titan x GPU,fast YOLO可以达到155fps的检测速度,但是mAP值也从YOLO的63.4%降到了52.7%,但却仍然远高于以往的实时物体检测方法(DPM)的mAP值。(mAp60%+,这大概是YOLO没有大力推广的原因。。。)
4 Training
YOLO在ImageNet 1000-class 的分类任务数据集上进行pretraining。预训练的网络是Figure 3中网络的前 20 层卷积层,加上一个average-pooling layer,最后是一个 fully connected layer。此预训练的网络大约训练了一个星期,在 ImageNet 2012 的 validation dataset 上的 top-5 精度为88%,本文的 training 以及 inference 都是用 Darknet 卷积网络框架完成的。
把预训练的model用于detection,Ren et al., Object Detection Networks on Convolutional Feature Maps 指出了在预训练的model上增加convolution layer以及connected layer可以增加model的performance。因此,在预训练的 model 上,本文增加了4个 convolutional layers 以及2个 connected layers,这新加的层的参数是随机初始化的。因为要用于detection,本文在detection的fine-grained 阶段,将图像的输入分辨率从224*224调整至448 * 448。
网络最后输出的为 class probabilities 以及 bounding box coordinates。但在输出时,根据图像的 width、height 将 bounding box 的 width、height 进行归一化,归一化到 0~1 的区间。将 bounding box 中的坐标(x,y)通过grid cells 的offset归一化到 0~1 之间。
模型的最后一层,本文使用一个线性**函数,其余的层则使用的是 leaky rectified linear activation:
本文使用的是 sum-squared error 来作为优化目标。虽然 sum-squared error 较容易去优化,但是对于本问题,直接使用 sum-squared error 却不是那么合适。因为将 localization error 以及 classification error 在优化求解中,相等的去衡量优化,本身就不合理。另外,每一张图像中,很多 grid cells 并没不包含物体,使得这些 cells 的 confidence 置为 0,这些不包含物体的 grid cells 的梯度更新,将会以压倒性的优势,覆盖掉包含物体的 grid cells 进行的梯度更新。这些问题会使得模型不稳定,甚至造成网络的发散。
为了避免上述的问题,本文将 localization error 以及 classification error 的 loss 重新用权重衡量。以平衡上述的失衡问题。简单的说,就是增加 bounding box coordinate 的 loss,减少不包含物体 grid cells 的 confidence 的 loss。通过设置两个参数:λcoord = 5 和 λnoobj =0 .5。
Sum-squared error loss 中还将 large box 与 small box 的 loss 同等对待。因为相比较于large box 与 groundtruth 的偏离,small box 偏离一点,结果差别就很大,而large box偏离大一点,对结果的影响较小。为了解决这个问题,用了一个很巧妙的 trick,即最后并不是直接输出 bounding box 的 width、height,而是 width、height 的square root,平方根。
如下图所示,当 bounding box 的 width、height 越小时,发生偏移后,其反应在 Y 轴上的变化越大,这样就正确反映了 large box 与 small box 对于偏移的敏感性不同。这图哪儿说明啦?
在 YOLO 中,每个 grid cell 预测多个 bounding box,但在网络模型的训练中,每一个物体,只想要一个 bounding box predictor 来负责预测。因此, 当前哪一个 predictor 预测的 prediction 与 groundtruth 的 IoU 最大 ,这个 predictor 就负责 predict object。这会使得每个 predictor 可以专门的负责特定的物体检测。随着训练的进行,每一个 predictor 对特定的物体尺寸,长宽比,物体的类别的预测会越来越好。
训练时,需要优化的目标函数(loss function)如下:
训练中,总共进行了 135 轮 epoches,训练、验证集来自 PASCAL 2012、2007。当在 VOC 2012 数据集上测试时,训练集包括了 VOC 2007 的测试集。训练中,bacthsize 为 64,momentum 为 0.9,decay 为 0.0005.
Learning rate 的设置:
(1)在第一轮 epoch 中,learning rate逐渐从10e-3增加到10e-2。如果训练时从一个较大的 learning rate 开始,通常因为不稳定的梯度,而使得模型发散。
(2)之后,保持 learning rate 为10e-2直到 epoch = 75;
(3)再接下的 30 轮 epoch,learning rate 为10e-3 ;
(4)最后 30 轮 epoch,learning rate 为 10e-4。
在训练中,为了避免 overfitting,使用了 dropout 技术,在第一层全连接层后面增加了一个 dropout layer,随机置零的 。为了防止 overfitting,也使用了 data augmentation 技术。
5 Inference(推理)
在训练好 YOLO 网络模型后,在 PASCAL VOC 数据集上进行 inference,每一张图像得到 98 个 bounding boxes,以及每个 bounding box 的所属类别概率。
当图像中的物体较大,或者处于 grid cells 边界的物体,可能在多个 cells 中被定位出来。可以用Non-Maximal Suppression(NMS,非极大值抑制,抑制不是极大值的元素,保留最好的) 进行去除重复检测的物体,可以使最终的 mAP 提高。
6 优缺点
优点:
a. YOLO 结构十分的快,标准的 YOLO 版本每秒可以实时地处理 45 帧图像。一个较小版本:Fast YOLO,可以每秒处理 155 帧图像,它的 mAP(mean Average Precision,平均精度) 依然可以达到其他实时检测算法的2倍。
b. YOLO 有更少的 false-positive,文章这里提到了一个词:background errors,背景误差。这里所谓的背景误差即是指 False Positive。
c. YOLO 可以学习到物体的更加泛化的特征,在将 YOLO 用到其他领域的图像时(如 artwork 的图像上),其检测效果要优于 DPM、R-CNN 这类方法。
缺点:
a. 相比较于其他的 state-of-art detection systems,YOLO 的定位更容易出错,这里的定位出错,即是指 coordinate errors。
b. 不擅长特别密集的场景,因为YOLO把图像分成了小格,每个 grid cell 中只能预测两个 boxes,以及一个类别。这种太强的空间约束,限制了 YOLO 对于相邻物体的检测能力,一旦相邻的物体数量过多,YOLO 就检测不好了。如对于一群鸟儿,这种相邻数量很多,而且又太小的物体,YOLO 难以进行很好的检测。
c. 对于图像中,同一类物体出现新的、不常见的长宽比时,YOLO 的泛化能力较弱。
d. 最后,loss functions 中对于 small bounding boxes,以及 large bounding boxes 的误差,均等对待。尽管正如前面提到的,大尺寸 bounding box 的 error 与小尺寸 bounding box 的 error,其影响是不同的。即使用了平方根的技巧优化了这个问题,但是这个问题还得得到更好的解决。