论文笔记:You Only Look Once: Unified, Real-Time Object Detection

论文笔记:You Only Look Once: Unified, Real-Time Object Detection

简述

这是YOLO算法的第一个版本。
作者先简单介绍了之前对目标识别的相关算法,比如利用滑动窗口的算法,还有R-CNN算法。 但是作者说,这两种方法都太慢,并且难以优化。
作者认为YOLO算法十分简单,将目标检测问题处理成回归问题,用一个卷积神经网络结构就可以从输入图像直接预测bounding box和类别概率。因此YOLO算法具有以下优点:1. 十分迅速 2.当进行预测时,考虑全局图像 ,不想窗口滑动算法和R-CNN算法 3. 学习的物体的一般特性。但是对于小目标的识别,此算法还是较为吃力。

算法流程与思想

以下是算法的流程图:

这里写图片描述

首先,将输入图片resize到448*448的大小,然后,使用模型来处理图片,最后通过置信度(confidence)来筛选检测结果。

作者指出,这种网络使用从整张图片(entire image)来获取的特征(features)来预测边界框(bounding box)。这就意味着我们的算法是考虑到图片的全局的,并确保了端到端的训练与较高的即时检测的准确度。

算法的步骤:

这里写图片描述

算法首先把输入图像划分成S*S的格子(在上图狗的图像中,分成了7*7的格子),每个格子(grid cell)都预测B个bounding boxes,每个bounding box都包含5个预测值:x,y,w,h和confidence。

其中:
(x,y)— bounding box 的中心坐标(图中的bx,by)
(w,h)— bounding box 的宽度和高度(图中的bw,bh)
confidence — 置信度,用来表征此grid cell 中存有目标的概率,如果没有物体,则confidence为0。(图中的Pc)

这里写图片描述

从上图中可以看出,下层的一个grid cell 有2个紫色的bounding boxes,负责检测两个物体。对于一个grid cell来说,他还负责对C个假定类别的预测,用C1,C2,C3来表示类别的概率,所以张量表示形式为:

这里写图片描述

那么一个grid cell 中含有B个bounding boxes(举例为:B=2)时,此时张量(y-label)表示为:

这里写图片描述

在本文中作者取S=7,B=2,C=20(因为PASCAL VOC有20个类别),所以最后有7*7*30个tensor。(由
S × S × (B ∗ 5 + C) tensor 计算出),可以看出C类别是针对grid cell来说的,不是对于bounding cell,故只有一组类别C的概率。

算法中,对参数x,y,w,h这些参数都进行了相应的处理,使其变化范围在0-1之间易于以后的计算。

对于x,y参数,转换为相对于当前grid cell的偏移值。例如,坐标为(x,y),则相对于这个grid cell来讲,偏移了(x*宽,y*长)

对于w,h参数,转换为相对于整幅图像的预测值。例如:如果包含目标(狗)的框的预测w 和h 是 (0.3, 0.8),那么对于7*7划分的图片的实际宽和高是 (7x 0.3, 7x 0.8)。

confidence反映当前bounding box是否包含物体以及物体位置的准确性,计算方式为:confidence = P(object)* IOU

  • 其中,若bounding box包含物体,则P(object) = 1;否则P(object) = 0. IOU(交并比)为预测bounding
    box与物体真实区域的交集面积除以并集的面积。下面是IoU的图像解释:

这里写图片描述
以上就是对每个grid cell中参数含义和方法计算的介绍,之后便放入实际的模型中进行运行。

在实际测试中,如果一个object的ground truth的中心点坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就由该grid cell负责。 每个grid cell具有(B ∗ 5 + C)的维度,都预测C个类别概率,表示一个grid cell在包含object的条件下属于某个类别的概率。然后将每个bounding box的confidence和每个类别的score相乘,得到每个bounding box属于哪一类的confidence score。

这里写图片描述

这里写图片描述

也就是说最后会得到20*(7*7*2)=20*98的score矩阵,括号里面是bounding box的数量,20代表类别。接下来的操作都是20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0,然后再按得分从高到低排序。最后再用NMS算法去掉重复率较大的bounding box(NMS:针对某一类别,选择得分最大的bounding box,然后计算它和其它bounding box的IOU值,如果IOU大于0.5,说明重复率较大,该得分设为0,如果不大于0.5,则不改;这样一轮后,再选择剩下的score里面最大的那个bounding box,然后计算该bounding box和其它bounding box的IOU,重复以上过程直到最后)。最后每个bounding box的20个score取最大的score,如果这个score大于0,那么这个bounding box就是这个socre对应的类别(矩阵的行),如果小于0,说明这个bounding box里面没有物体,跳过即可。

GoogLeNet网络

网络方面主要采用GoogLeNet,卷积层主要用来提取特征,全连接层主要用来预测类别概率和坐标。最后的输出是7*7*30的张量。
这里写图片描述

并且应该注意到:

  • 作者先在ImageNet数据集上预训练网络,而且网络只采用前面20个卷积层,输入是224*224大小的图像。然后在检测的时候再加上随机初始化的4个卷积层和2个全连接层,同时输入改为更高分辨率的448*448
  • 最后一层使用线性激活层,其它层使用leaky 激活函数来激活:
    这里写图片描述

损失函数

作者这里采用了sum-squared error ,原因是优化较为简单,但是提升整体的准确度效果不是很好。在具体的操作中,整合了 localization errorclassification error,同时考虑了这两种误差,但是如果二者的权值一致,容易导致模型不稳定,训练发散。因为很多grid cell是不包含物体的,这样的话很多grid cell的confidence score为0。所以采用设置不同权重方式来解决,对于没有物体的cell,一方面提高localization error的权重,另一方面降低没有object的box的confidence loss权值loss权重分别是5和0.5。而对于包含object的box的confidence loss权值还是原来的。

这里写图片描述

从公式中看出,前面两行表示localization error(即坐标误差),第一行是box中心坐标(x,y)的预测,第二行为宽和高的预测。

注意:宽和高是采取了开根号的方式,因为相同的宽和高误差对于小的目标精度影响比大的目标要大。
举个例子,原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,其实前者的误差要比后者小,但是如果不加开根号,那么损失都是一样:4+4=8,但是加上根号后,变成0.15和0.7。

第三、四行表示bounding box的confidence损失。
就像前面所说的,分成grid cell包含与不包含object两种情况。这里注意下因为每个grid cell包含两个bounding box,所以只有当ground truth 和该网格中的某个bounding box的IOU值最大的时候,才计算这项。

第五行表示预测类别的误差,注意前面的系数只有在grid cell包含object的时候才为1。

总结

训练的流程:

  • 输入N个图像,每个图像包含M个objec,每个object包含4个坐标(x,y,w,h)和1个label。然后通过网络得到7*7*30大小的三维矩阵,这是预测的结果。
  • 使用预测结果与真实值来计算损失函数,之后不断的重复训练即可

测试流程: 输入一张图像,跑到网络的末端得到7*7*30的三维矩阵,这里虽然没有计算IOU,但是由训练好的权重已经直接计算出了bounding box的confidence。然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。