YOLO 论文笔记

YOLO全称You Only Look Once: Unified, Real-Time Object Detection,CVPR 2016的一篇论文,paper的项目主页:http://pjreddie.com/darknet/yolo/。

1、解决什么问题

  • (1)将检测问题变为一个 regression problem,解决了classification-based和R-CNN的region proposals方法检测物体过于复杂的问题。
  • (2)实现神经网络端到端的学习,能很好利用图片空间上下文的信息。

2、使用什么方法

  • (1)检测方法的进化过程
    旧的方法
    之前的检测系统(detection systmes)都是重新调整分类(classification)和定位(localization)系统,在此基础之上达到detection的目的。这些方法是将一张图片分成多个位置和尺度,然后将模型应用于这些不同的位置和尺度的区域,其中分数高的区域被认为是检测目标。如昨天看的论文OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks、DPM等
    改进的方法
    R-CNN、Fast R-CNN 则、采用的是 region proposals 的方法,先生成一些可能包含待检测物体的 potential bounding box,再通过一个 classifier 去判断每个 bounding box 里是否包含有物体,以及物体所属类别的 probability 或者 confidence。这种方法的 pipeline 需要经过好几个独立的部分,所以检测速度很慢,也难以去优化,因为每个独立的部分都需要单独训练。
    YOLO提出的新方法
    将整张图片放入网络,网络将图片分割成多个区域,并为每个区域预测边框和概率,这些边框由预测的概率加权计算。
    总结:
    之前的方法将检测问题转化为分类问题,而YOLO将检测问题变为一个 regression problem,YOLO 从输入的图像,仅仅经过一个 neural network,直接得到 bounding boxes 以及每个 bounding box 所属类别的概率。正因为整个的检测过程仅仅有一个网络,所以它可以直接 end-to-end 的优化。新的方法弃用了滑动窗口这种低效率的方式,直接在图片上划分相等大小的块状区域,然后根据每个区域边框的权值,来确定哪些区域包含哪些物体,这中间具体如何实现?继续往下看。
  • (2)YOLO检测物体的过程
    YOLO 系统如图看了一眼图像就能 predict 是否存在物体,他们在哪个位置,所以叫 You Only Look Once。
    如图:单张图片输入网络,输出图片中物体的检测结果,是一种end-to-end的方法,也即成为YOLO:
    YOLO 论文笔记_第1张图片

  • (3)对全局图像的理解
    YOLO 在做 predict 的时候,使用的是全局图像,能够结合图像的空间上下文信息做处理。与 sliding window 和 region proposals 这类方法不同,YOLO 一次“看”一整张图像,所以它可以将物体的整体(contextual)的 class information 以及 appearance information 进行 encoding。
    目前最快最好的 Fast R-CNN ,较容易误将图像中的 background patches 看成是物体,因为它一次只能处理图像的部分内容,无法理解上下文信息。YOLO 的 background errors 比 Fast R-CNN 少一半多。

  • (4)算法实现过程:统一检测(Unified Detection)
    YOLO 检测系统,先将输入图像分成S*S个grid(栅格),如果一个物体的中心掉落在一个 grid cell 内,那么这个 grid cell 就负责检测这个物体。
    每一个 grid cell 预测B个 bounding boxes,以及这些 bounding boxes 的confidence score。这个 score 反应了这个 grid cell 中包含某个物体的可能性。
    confidence score的公式:
    这里写图片描述
    如果这个 cell 中不存在object,则 score 应该为0;否则的话,score 则为 predicted box 与 ground truth 的 IoU(intersection over union)值。
    本文中的每一个 bounding box 包含了5个 predictions:x,y,w,h,confidence。坐标(x,y)代表了 bounding box 的中心与 grid cell 边界的相对值。width、height 则是相对于整幅图像的预测值。confidence 就是预测的box与groundtruth box的 IoU 值。
    每一个 grid cell 还要预测c个 conditional class probability(条件类别概率):
    这里写图片描述
    这个 基于 gird cell 包含了哪个物体(所以为 conditional probabilities)。不管 grid cell 中包含的 boxes B的值是多少 ,每个 grid cell 只 predict 一组类别的 conditional probabilities(所有类别的概率)(即取所有box中值最大的那个?)。
    在测试阶段:
    将每个 grid cell 的 conditional class probabilities 与每个 bounding box 的 confidence 相乘:
    这里写图片描述
    对于这个公式的个人理解:等号左边第一项是指该网格中的物体属于某一类的概率,第二项第三项是指包含某个物体的概率,乘积可以表示为每个box包含特定类别物体的概率。
    将 YOLO 用于 PASCAL VOC 数据集时,令S=7, B=2。PASCAL 数据集中有20个类别,所以C=20。因此预测的结果是一个7*7*30的tensor
    YOLO 论文笔记_第2张图片

  • (5)YOLO网络设计
    YOLO 仍是 CNN 的经典形式,开始的卷积层用于提取特征,后面的全连接层用于预测结果,预测值为:probabilities 以及 coordinates。
    YOLO 的 CNN 结构取自两篇论文:GoogLeNet、Network in Network. YOLO 有 个卷积层,随后就是全连接层。不像 GoogLeNet 中使用的 inception modules,YOLO 采用了 Network in Network 中的结构,在3*3卷积层之后,跟着一个1*1的层(该层的作用是什么?)。如下图 Figure 3 所示:
    YOLO 论文笔记_第3张图片
    还有一个fast版本,使用9个卷积层而不是24个。

  • (6)YOLO网络的训练
    在 ImageNet 1000-class 的分类任务数据集 上进行预训练。预训练的网络是 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个卷积层以及2个全连接层,这新加的层的参数是随机初始化的。因为要用于 detection,本文在 detection 的 fine-grained 阶段,将图像的输入分辨率从224*224调整至448*448。
    最后输出的为 class probabilities 以及 bounding box coordinates。但在输出时,根据图像的 width、height 将 bounding box 的 width、height 进行归一化,将值归一化到 0~1 的区间。(输入图盘的分辨率一样,为什么还要归一化?)
    同样将 bounding box 中的坐标通过 grid cells 的 offset 归一化到 0~1 之间。
    模型的最后一层,本文使用一个线性激活函数,其余的层则使用的是 leaky rectified linear activation:
    这里写图片描述
    本文使用的是 sum-squared error 来作为优化目标。
    另外,每一张图像中,很多 grid cells 并没不包含物体,使得这些 cells 的 confidence 值为 0,这些不包含物体的 grid cells 的梯度更新,将会以压倒性的优势,覆盖掉包含物体的 grid cells 进行的梯度更新。这些问题会使得模型不稳定,甚至造成网络的发散。
    为了避免上述的问题,本文将 localization error 以及 classification error 的 loss 重新用权重衡量。以平衡上述的失衡问题。简单的说,就是增加 bounding box coordinate 的 loss,减少不包含物体 grid cells 的 confidence 的 loss。
    large box 与 small box 对于偏移的敏感性不同。
    Sum-squared error loss 中还将 large box 与 small box 的 loss 同等对待。因为相比较于大的 box 与 groundtruth 的偏离,小的 box 的偏离一点,结果差别就很大,而大的 box 偏离大一点,对结果的影响较小。为了解决这个问题,用了一个很巧妙的 trick,即最后并不是直接输出 bounding box 的 width、height,而是 width、height 的 square root。
    在 YOLO 中,每个 grid cell 预测多个 bounding box,但在网络模型的训练中,每一个物体,只想要一个 bounding box predictor 来负责预测。因此, 当前哪一个 predictor 预测的 prediction 与 groundtruth 的 IoU 最大 ,这个 predictor 就负责 predict object。这会使得每个 predictor 可以专门的负责特定的物体检测。随着训练的进行,每一个 predictor 对特定的物体尺寸,长宽比,物体的类别的预测会越来越好。
    训练中,总共进行了 135 轮 epoches,训练、验证集来自 PASCAL 2012、2007。当在 VOC 2012 数据集上测试时,训练集包括了 VOC 2007 的测试集。训练中,bacthsize 为 64,momentum 为 0.9,decay 为 0.0005.
    Learning rate 的设置:
    (1)在第一轮 epoch 中,learning rate 逐渐从0.001增加到0.01。如果训练时从一个较大的 learning rate 开始,通常因为不稳定的梯度,而使得模型发散。
    (2)之后,保持 learning rate 为0.01直到 epoch = 75;
    (3)再接下的 30 轮 epoch,learning rate 为0.001 ;
    (4)最后 30 轮 epoch,learning rate 为0.0001。
    预处理:
    在训练中,为了避免 overfitting,使用了 dropout 技术,并使用了数据集增强技术。在第一层全连接层后面增加了一个 dropout=0.5的全连接层。 对于数据增强,对原始图像进行范围20%内的随机缩放和translation(?)。还在HSV颜色空间中1.5倍范围内随机调整图像的曝光和饱和度。在训练好 YOLO 网络模型后,在 PASCAL VOC 数据集上进行 inference,每一张图像得到 98 个 bounding boxes,以及每个 bounding box 的所属类别概率。
    当图像中的物体较大,或者处于 grid cells 边界的物体,可能在多个 cells 中被定位出来。可以用 Non-Maximal Suppression(NMS,非极大值抑制)进行去除重复检测的物体,可以使最终的 mAP 提高23%,但非最大抑制相对于R-CNN和DPM的性能并不重要。

3、相关工作

Deformable parts models(DPM)
R-CNN
Other Fast Detectors Fast and Faster R-CNN
Deep MultiBox
OverFeat (不能处理空间上下文信息,需要后期处理实现连贯的预测)
MultiGrasp

4、效果


- 模型接受整个图像的输入,所以能够获取整个图片上下文的信息;
- 在 Titan X 上,不需要经过批处理,标准版本的 YOLO 系统可以每秒处理 45 张图像;YOLO 的极速版本可以处理 150 帧图像。这就意味着 YOLO 可以以小于 25 毫秒延迟的处理速度,实时地处理视频。同时,YOLO 实时检测的 mean Average Precision(mAP) 是其他实时检测系统的两倍。
- 使用单一网络评估预测,比R-CNN快1000倍以上,比Fast R-CNN快100倍。

5、还存在什么问题


- (1)因为每个 grid cell 中只能预测两个 boxes,以及有一个类别。这种太强的空间约束,限制了 YOLO 对于相邻物体的检测能力,一旦相邻的物体数量过多,YOLO 就检测不好了。如对于一群鸟儿,这种相邻数量很多,而且又太小的物体,YOLO 难以进行很好的检测。(一个cell中有多个物体,但只能预测出一个)
- (2)对于图像中,同一类物体出现新的、不常见的长宽比时,YOLO 的泛化能力较弱。
- (3)loss functions 中对于 small bounding boxes,以及 large bounding boxes 的误差,均等对待。尽管正如前面提到的,大尺寸 bounding box 的 error 与小尺寸 bounding box 的 error,其影响是不同的。即使用了平方根的技巧优化了这个问题,但是这个问题还得得到更好的解决。
- (4)YOLO 中最主要的误差仍是定位不准造成的误差。

-(5)YOLO改进版本YOLOv3 在下一篇中介绍。

你可能感兴趣的:(深度学习与计算机视觉)