【论文阅读】YOLOv1-You Only Look Once: Unified, Real-Time Object Detection Joseph

1. 动机

​ YOLOv1版本发表于2016年,当时流行的一些目标检测算法有DPM(Deformable Parts Models)和R-CNN,这些方法的原理通常是从图片中首先找到一些可能是目标的区域(boxes),然后再训练一个分类器去检测这些区域,这就是典型的two-stage的方法。比如在DPM中就是采用滑动窗口的方式来生成可能的区域,R-CNN则首先产生一些Region proposal bounding boxes,然后再通过一个分类器去验证这些bounding boxes。通过进一步的处理,微调这些boxes,并删除重复的检测,并基于图片中的其他目标给boxes重新打分。这些方法的问题就是太慢且复杂,因为要先生成一些可能的区域,然后再去检测。所以YOLO的目标就是简化这个步骤,直接构建一个端到端的模型,即输入一张图片,然后经过一个网络模型,直接输出目标的区域(bounding boxes)及其对应的分类。去掉了这些复杂的步骤,这种one-stage的方案比two-stage的方案要快很多。YOLO的这个版本甚至可以直接用于实时(real-time)目标检测。

2. 方法

2.1 网络结构

【论文阅读】YOLOv1-You Only Look Once: Unified, Real-Time Object Detection Joseph
​ 整体的网络结构没有什么特别的地方,有24层卷积层和2层全连接层,而在Fast YOLO中也只是减少了卷积层的数量和卷积核的个数而已,它只有9层卷积层,但是检测速度很快,毕竟参数少,做推理的时候速度当然快。【网络结构图中还有两小问题,前两层的卷积核数量对应不上】。网络的输入是一个448x448x3的图片,输出是一个7x7x30的tensor,原因稍后会解释。

​ 那么,YOLO在网络结构上没有什么特别的地方,那他能有这么好的性能的原因无非就是在网络的操作Loss的设计上。

2.2 模型成功关键因素

2.2.1 图片网格化(gird)

​ YOLO首先将输入的图片分成7x7的网格,其基本想法是如果某个目标的中心落在某个网格中,就由该网格进行这个目标的检测。而每个网格又会预测2个bounding boxes(x,y,w,h)及其对应的置信度©,并且对每个bounding boxes中的目标进行分类,这样会得到一个分类结果的向量,YOLO使用的是Pascal VOC的数据集,所以最后预测分类的向量长度为20。

【论文阅读】YOLOv1-You Only Look Once: Unified, Real-Time Object Detection Joseph

然后我们就可以理解了最后的输出为什么是7x7x30了。对于每个网格,需要预测两个bounding box,每个bounding boxes有x,y,w,h四个坐标数据,1个置信度,所以关于bounding boxes的长度为2x5=10,然后还有一个长度为20的类别向量。因此最终的预测结果是7x7x30的tensor。至于为什么不是2*20的分类向量,每个网格不是有两个bounding box吗,因为为了方便优化,每次只使用置信度高的那个box用于预测分类。

【关于为什么每个网格会生成两个Bounding box】 存在一些grid有可能会成为不同的目标的中心,那么grid中的两个bounding box可以用于检测不同的目标。

2.2.2 训练中的一些神操作

  1. 预训练

    ​ YOLO先采用ImageNet的分类任务去预训练卷积层,然后再将其改造成YOLO的检测网络继续训练,由于是卷积操作,输入的大小其实都无所谓,ImageNet的图片是224x224的,后面继续训练的时候,输入的size为448x448也不会有多大的影响。之所以采用448x448其实是Pascal VOC的数据集的图片大小基本上就在这个size附近。

  2. 归一化

    ​ 在训练之前,YOLO对数据集中的标签做了一系列的归一化操作。首先将标签中bounding box的w,h与原图的w,h进行相比,得到了一个0到1之间的相对长度;然后利用图片中某个特定的位置为基础,一般就是(0,0)这个点,确定x,y相对原图长宽的相对位置,也是一个0到1之间的量。

    ​ 因为数据集中图片的大小并不是统一的448x448,必然要做一些resize操作,这样就会导致原图标签中的目标位置大小信息不准确,如果采用相对位置,那么resize的时候就不会产生影响。

  3. 训练技巧

    Our learning rate schedule is as follows: For the first epochs we slowly raise the learning rate from 10−3 to 10−2. If we start at a high learning rate our model often diverges due to unstable gradients. We continue training with 10−2 for 75 epochs, then 10−3 for 30 epochs, and finally 10−4 for 30 epochs.​

    作者设定了学习率的方案,比如在前75轮采用0.01,中间30轮采用0.001,最后30轮采用0.0001轮。这种手动的方式不知道会不会更方便观察模型的训练情况~

2.2.3 LOSS的设计

  1. 置信度

    ​ 作者设计了一个能综合考虑分类类别和预测准确率的置信度,其实就是两个量相乘:
    Confidience=Pr(Classi)IOUpredtrue Confidience = Pr(Class_i)*IOU_{pred}^{true}
    这也是一个0-1之间的变量。

  2. 基于误差平方和(Sum-square Error, SSE)的损失函数

    ​ 在看作者设计的损失函数之前,我们完全可以设想一下应该有那些loss。必然有bounding box的位置的误差,置信度误差和分类误差了。但是由于采用的SSE作为损失函数,会导致网络认为bounding box的预测误差和分类误差是等同的,而实际上我们更希望网络能在预测bounding box上具有更高的准确度。另一方面,图片中通常没有目标的区域占大多数,而这些区域的置信度会趋向于0,在前期训练的时候会导致误差很小,导致模型训练不稳定,甚至发散。所以很容易就能想到我们给bounding box误差和分类误差不同的权值,给有目标的区域和没有目标的区域不同的权值。作者提出了两个权值:
    λcoord=5λnoobj=0.5 \lambda_{coord}=5 \\ \lambda_{noobj}=0.5
    这两个权值的是提升有目标区域bounding box的误差权重,降低没有目标区域的分类权重,因为没有目标,也就不存在bounding box的误差了。于是就可以看到如下误差函数:
    Loss=λcoord i=0S2j=0B1ijobj [(xix^i)2+(yiy^i)2+(wiw^i)2+(hih^i)2]+i=0S2j=0B1ijobj (CiC^i)2+λnoobj ji=0S2j=0B1ijnoobj (CiC^i)2+i=0S21iobj cclasses(pi(c)p^i(c))2 Loss = \lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B}\mathbb{1}_{i j}^{\text {obj }}[(x_{i} \hat{x}_{i})^{2}+(y_{i}-\hat{y}_{i})^{2}+(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}})^{2}+(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}})^{2}] \\ + \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left(C_{i}-\hat{C}_{i}\right)^{2} \\+ \lambda_{\text {noobj } j} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B}\mathbb{1}_{i j}^{\text {noobj }}\left(C_{i}-\hat{C}_{i}\right)^{2} \\+ \sum_{i=0}^{S^{2}} \mathbb{1}_{i}^{\text {obj }} \sum_{{c\in classes}}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2}
    可以清晰的看到,除了置信度误差外,误差函数的最后一行是分类误差,为什么有了置信度误差还要有分类误差,置信度里面不是已经包含了分类误差了吗?这里我个人的理解是置信度是某种意义上的加权分类概率,但它只是一个值,计算分类误差的时候,是需要那个长度为20的向量来计算的,因此会有一个分类误差在里面。此外,由于每个网格都有两个bounding box,计算分类误差的时候,只使用那个具有更高IOU的bounding box作为代表用于计算。

    ​ 同时也可以清楚的看到w,h在计算误差的时候采用的是平方根来计算。由于采用的是SSE,会将大小box的误差等同看待,但是作者希望这个误差可以更多的考虑大box中的小偏差,由于w和h都是小于1的量,那么开方之后,这两个量会变大。如果这个box越大,那么反映出来的误差也就越大。

3. YOLO的优缺点

3.1 优点

【1】非常快(extreme fast)

因为构建了一个end-to-end的一个架构,直接可以由输入图片到目标区域及目标的分类,所以速度会很快。一个基础的YOLO模型速度可达45fps(frames per second),fast-YOLO甚至可以达到150fps。

【2】基于全局推理

YOLO在训练的时候没有提前给出一些可能的目标区域,是基于整张图来生成的,因此它隐性的编码了类别和边界的上下文信息。

【3】可以学习更一般的表达

YOLO在自然的图片上进行训练,然后使用艺术图片进行测试,也能取得很好的效果。证明了该模型的泛化能力很强,即便应用到一个新的领域,也不会轻易的崩溃。

3.1 缺点

YOLO牺牲了精度来提高检测的速度,相较于State-of-the-art的目标检测模型,YOLO在bounding boxes的准确率上还存在一定的差距,尤其是在检测小目标的时候。