YOLO v_1

YOLO v_1

2. Unified Detection

将输入图像划分为SxS网格,如果对象的中心中心落入网格单元,则该网格单元负责检测该对象。

每个网格单元预测B bounding boxes和这些框的置信度分数。这些置信度分数反映了模型对box包含一个物体的信心,也反映了它认为box所预测的准确程度,我们将置信度定义为
YOLO v_1
如果该单元格中不存在对象,则置信度分数为0,否则,我们希望置信度分数等于预测box和ground truth之间的IoU。

每个bounding box包括5个预测值x, y, w, h, and confidence。宽度和高度都是相对于整个图像进行预测的,最后,置信度预测表示预测box和ground truth box之间的IoU。

每个网格单元还预测Pr(Classi | Object)。这些概率取决于包含对象的网格单元的可能性。无论方框B的数目,每个网格单元都有一组类概率,即对所有B类预测一个概率。

在测试时,我们将条件类概率和单个box置信度相乘。
YOLO v_1
这给了我们每个box特定类别的置信分数,这些分数既编码了该类出现在框中的概率,也表示了预测的框对象的合适程度。
YOLO v_1

2.1. Network Design

网络的初始卷积层从图像中提取特征,全连接层通过预测输出概率额和坐标。

收到 GooLeNet 启发,我们的网络有24个卷积层,然后是两个FC层。与 GooLeNet 的 inception 不同,我么只使用1x1的简化层,然后是3x3的卷积层如图三
YOLO v_1
我们还训练了一个快速版本的YOLO,是为了加快目标检测边界的速度,Fast YOLO 使用了9个卷积层,其他参数和 YOLO 完全一样。我们的网络最终输出是预测的 7x7x30 的 tensor。

2.2. Training
先在ImageNet上进行pretrain,前20层卷积层,然后是一个平均pool层和一个全连接层。在预先训练的网络中增加卷积层和连接层可以提高性能。我们添加了4个卷积层和两个具有初始化权值的全连接层。检测通常需要细粒度的视觉信息,因此我们将网络的输入分辨率从224x224提高到448x448。

我们用图像的高度和宽度来normalize bounding box 的高度和宽度,将bounding box的x和y坐标参数化为特定网格单元位置的偏移,因此他们也在0和1之间有界。

我们对最后一层使用ReLU,而所有其他层使用leaky ReLU:

YOLO v_1
我们使用了和平方误差,因为它很好优化,但它并不符合我们的目标最大化平均精度。它对定位误差和分类误差的权重相等,这可能不太理想。而且,在每个图像中,很多网格单元不包括任何对象,这将会把这些cell的置信分数推至0,通常会超过物体cell的梯度。这可能导致模型不稳定,导致早期的训练出现分歧。

为了弥补这一点,我们增加了bounding box 坐标预测的损失,并减小了对不包含对象的置信度预测所造成的损失,我们使用两个参数λcoord = 5and λnoobj = .5来完成这一任务.

在平方误差中,大box和小box同样重要,我们的误差因该反映出大box中的小偏差比小box的小偏差更重要,所以,我们预测边框宽度和高度的平方根。

每个网格单元预测多个边界框,在训练时,我们只需要一个bounding box负责一个对象,根我们指定一个预测器负责预测一个对象,根据该对象的预测具有最大的IoU和groud truth,这导致了bounding box predictors 之间的专业化,每个预测去都能更好的预测特定大小、纵横比或对象类,从而提高总体回忆能力。

在训练过程中,我们优化了一下多部分损失函数:
YOLO v_1
YOLO v_1
表示是否有对象出现在单元格i中,
YOLO v_1
表示单元格i中的jth边框预测器对该预测负责。

损失函数只惩罚网格单元中存在对象的分类错误。如果该预测器对 ground truth box 负责,它也只惩罚边框坐标误差(即在网格单元中所有预测器中有最高的IoU)。

网络预测

在说明Yolo算法的预测过程之前,这里先介绍一下非极大值抑制算法(non maximum suppression, NMS),这个算法不单单是针对Yolo算法的,而是所有的检测算法中都会用到。NMS算法主要解决的是一个目标被多次检测的问题,如图11中人脸检测,可以看到人脸被多次检测,但是其实我们希望最后仅仅输出其中一个最好的预测框,比如对于美女,只想要红色那个检测结果。那么可以采用NMS算法来实现这样的效果:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。Yolo预测过程也需要用到NMS算法。
YOLO v_1
下面就来分析Yolo的预测过程,这里我们不考虑batch,认为只是预测一张输入图片。根据前面的分析,最终的网络输出是7×7×30,但是我们可以将其分割成三个部分:类别概率部分为[7,7,20],置信度部分为[7,7,2],而边界框部分为[7,7,2,4](对于这部分不要忘记根据原始图片计算出其真实值)。然后将前两项相乘(矩阵[7,7,20]乘以[7,7,2]可以各补一个维度来完成[7,7,1,20]×[7,7,2,1])可以得到类别置信度值为[7,7,2,20],这里总共预测了7∗7∗2=98个边界框。

所有的准备数据已经得到了,那么我们先说第一种策略来得到检测框的结果,我认为这是最正常与自然的处理。首先,对于每个预测框根据类别置信度选取置信度最大的那个类别作为其预测标签,经过这层处理我们得到各个预测框的预测类别及对应的置信度值,其大小都是[7,7,2][7,7,2]。一般情况下,会设置置信度阈值,就是将置信度小于该阈值的box过滤掉,所以经过这层处理,剩余的是置信度比较高的预测框。最后再对这些预测框使用NMS算法,最后留下来的就是检测结果。一个值得注意的点是NMS是对所有预测框一视同仁,还是区分每个类别,分别使用NMS。Ng在deeplearning.ai中讲应该区分每个类别分别使用NMS,但是看了很多实现,其实还是同等对待所有的框,我觉得可能是不同类别的目标出现在相同位置这种概率很低吧。
YOLO v_1