1. YOLO V1简介
  2. 核心思想
  3. 算法流程
  4. 优缺点分析

arxiv: http://arxiv.org/abs/1506.02640

github: https://github.com/pjreddie/darknet

blog: https://pjreddie.com/publications/yolo/

github: https://github.com/gliese581gg/YOLO_tensorflow

github: https://github.com/tommy-qichang/yolo.torch

github: https://github.com/frischzenger/yolo-windows

早期的目标检测方法通常是通过提取图像的一些 robust 的特征(如 Haar、SIFT、HOG 等),使用 DPM (Deformable Parts Model)模型,用滑动窗口(silding window)的方式来预测具有较高 score 的 bounding box。这种方式非常耗时,而且精度又不怎么高。

后来出现了object proposal方法(其中selective search为这类方法的典型代表),相比于sliding window这中穷举的方式,减少了大量的计算,同时在性能上也有很大的提高。利用 selective search的结果,结合卷积神经网络的R-CNN出现后,Object detection 的性能有了一个质的飞越。基于 R-CNN 发展出来的 SPPnet、Fast R-CNN、Faster R-CNN 等方法,证明了 "Proposal + Classification" 的方法在 Objection Detection 上的有效性。但是依然没有实现端到端的输出。

一、YOLO V1简介

YOLO(You Only Look Once: Unified, Real-Time Object Detection),是Joseph Redmon和Ali Farhadi等人于2015年提出的基于单个神经网络的目标检测系统。

相比于 R-CNN 系列的方法,YOLO提供了另外一种思路,将 Object Detection 的问题转化成一个 Regression 问题。给定输入图像,直接在图像的多个位置上回归出目标的bounding box以及其分类类别。YOLO是一个可以一次性预测多个Box位置和类别的卷积神经网络,能够实现端到端的目标检测和识别,其最大的优势就是速度快。事实上,目标检测的本质就是回归,因此一个实现回归功能的CNN并不需要复杂的设计过程。YOLO没有选择滑动窗口(silding window)或提取proposal的方式训练网络,而是直接选用整图训练模型。这样做的好处在于可以更好的区分目标和背景区域,相比之下,采用proposal训练方式的Fast-R-CNN常常把背景区域误检为特定目标。

二、核心思想

目标检测:YOLOV1

  1. YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。
  2. faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了,而YOLO则采用直接回归的思路。

    目标检测:YOLOV1

YOLO检测网络包括24个卷积层和2个全连接层。(全连接层,计算速度和参数较多,比较难应用于工业种)

其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。

YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。

三、算法流程

  1. 将图像resize到448 * 448作为神经网络的输入

    直接将输入图像的大小resize为448 * 448,不管输入图像的原始尺寸,这样就应该注意在进行检测的时候输入不同长宽比的图像检测结果可能不一样,因为resize以后图像产生很大的变形。尽量维持训练数据与检测数据图像的尺寸相似。

  2. 运行神经网络,得到一些bounding box坐标、box中包含物体的置信度和class probabilities

    YOLO将输入图像划分为S*S的栅格(作者的是7*7,一共49个box),每个栅格负责检测中心落在该栅格中的物体。每一个栅格预测B个bounding boxes,以及这些bounding boxes的confidence scores。 这个 confidence scores反映了模型对于这个栅格的预测:该栅格是否含有物体,以及这个box的坐标预测的有多准。

    公式定义如下:

    目标检测:YOLOV1

    解释公式:如果这个栅格中不存在一个 object,则confidence score应该为0;否则的话,confidence score则为 predicted bounding box与 ground truth box之间的 IOU(intersection over union)。

    目标检测:YOLOV1

    YOLO对每个bounding box有5个predictions:x, y, w, h, and confidence:坐标x,y代表了预测的bounding box的中心与栅格边界的相对值。 坐标w,h代表了预测的bounding box的width、height相对于整幅图像width,height的比例。 confidence就是预测的bounding box和ground truth box的IOU值。

    每一个栅格还要预测C个 conditional class probability(条件类别概率):Pr(Classi|Object)。即在一个栅格包含一个Object的前提下,它属于某个类的概率。 我们只为每个栅格预测一组(C个)类概率,而不考虑框B的数量。

    注意:

    conditional class probability信息是针对每个网格的。 confidence信息是针对每个bounding box的。

    在测试阶段,将每个栅格的conditional class probabilities与每个 bounding box的 confidence相乘,这样既可得到每个bounding box的具体类别的confidence score。这乘积既包含了bounding box中预测的class的 probability信息,也反映了bounding box是否含有Object和bounding box坐标的准确度。

  3. 进行非极大值抑制,筛选出得分最高的Boxes

    简单说,就是最后选出多个框以后,只留最大的,其它的都为0.

    损失函数:YOLO v1全部使用了均方差(mean squared error)作为损失(loss)函数。由三部分组成:坐标误差、IOU误差和分类误差。

    目标检测:YOLOV1

    S:栅格的个数;

    B:每个栅格预测框的个数,这里是2(用于备用,取值更好的);

    C:目标类别id;

    坐标误差(coordErr) 设置权重λcoord=5;

    λnoobj = 0.5。

    输出张量总数:7*7(2*5+classNum),如下图所示:

    目标检测:YOLOV1

    考虑到每种loss的贡献率,YOLO v1给坐标误差(coordErr)设置权重λcoord=5。在计算IoU误差时,包含物体的格子与不包含物体的格子,二者的IOU误差对网络loss的贡献值是不同的。若采用相同的权值,那么不包含物体的格子的置信度值近似为0,变相放大了包含物体的格子的置信度误差,在计算网络参数梯度时的影响。为解决这个问题,YOLO 使用λnoobj=0.5修正(置信度误差)iouErr。(此处的'包含'是指存在一个物体,它的中心坐标落入到格子内)。

    损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。

    简单的全部采用了sum-squared error loss来做这件事会有以下不足:

    a) 8维的localization error和20维的classification error同等重要显然是不合理的。

    b) 如果一些栅格中没有object(一幅图中这种栅格很多),那么就会将这些栅格中的bounding box的confidence 置为0,相比于较少的有object的栅格,这些不包含物体的栅格对梯度更新的贡献会远大于包含物体的栅格对梯度更新的贡献,这会导致网络不稳定甚至发散。

    解决方案如下:

    更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 λcoord ,在pascal VOC训练中取5。对没有object的bbox的confidence loss,赋予小的loss weight,记为 λnoobj ,在pascal VOC训练中取0.5。有object的bbox的confidence loss 和类别的loss 的loss weight正常取1.

四、优缺点分析

4.1 当时的优点

  1. 具有开创意义,合并选框和检测
  2. YOLO执行速度很快(相比于其他检测系统,论文的最大亮点),因为它是一个端对端的网络(pipeline);
  3. YOLO在预测中对整张图的全局合理性把握得更好,因为YOLO在训练和测试中使用的是整张图片,这表明它在某种程度上编码了图片的类别和图片内容信息。作者在论文中提到,YOLO比Fast RCNN减少了将近一半的背景错误。这里的background error我理解为出现bounding box,里面没有所谓的前景物体;
  4. YOLO能够提取到目标通用的特征,作者用自然图片训练,用艺术图片测试,效果比DPM和R-CNN效果要好很多。

4.2YOLO 的缺点

  1. YOLOv1在精确度上落后于当前最好的检测系统,主要来源于坐标定位的不准确,因为这些坐标预测都是从标签bounding box数据中以一种新的宽高比率统计抽象出来,这个过程很容易出现定位不准确。
  2. 大的bounding box和小的bounding box对相同的小错误的敏感度相同。这与直觉逻辑不合,因为直觉告诉我们对于相同的小错误,小的bounding box应该更加敏感。虽然作者试图在损失函数中使用平方根来克服这个缺点,但是只能部分解决。
  3. YOLOv1对密集物体,重叠面积大的物体不好预测,作者在论文中提到,每个格子负责预测一个物体,但是如果一个格子内有两个或者多个物体,就必然会丢失物体。