You Only Look Once[译]

作者: Zliang_hhh | 来源:发表于2017-04-22 19:47 被阅读359次

    *参考文章:
    原论文地址:https://pjreddie.com/media/files/papers/yolo_1.pdf
    深度学习检测方法梳理:http://www.cnblogs.com/venus024/p/5590044.html
    YOLO:实时快速目标检测:https://zhuanlan.zhihu.com/p/25045711
    Faster-RCNN详解:http://blog.csdn.net/u013832707/article/details/53641055

    写在前面(当然paper中是没有的)
    在YOLO出现之前还有一些常用的 Object Detection网络:RCNN -> Fast R-CNN -> Faster R-CNN,具体不同请参考博客

    RCNN解决的是,“为什么不用CNNclassification呢?”
    Fast R-CNN解决的是,“为什么不一起输出bounding box和label呢?”
    Faster R-CNN解决的是,“为什么还要用selective search呢?”

    Abstract

    我们提出了一种新的object detection方法,先前的object detection工作使用了执行检测的分类器。相反,我们将object detection作为回归问题,以在空间上分离的bounding boxes和相关的 class probabilities进行框架化。单个神经网络在一次评估中直接从完整图像预测边界框和类概率。由于整个检测流水线是单个网络,因此可以直接在检测性能上进行端对端优化。

    1. Introduction

    人类只需要瞄一眼图片就能够知道图片中的信息,因为人类的视觉系统非常的快和准确,让我们实现复杂的任务,例如不怎么费力的开车。用于object detection的快速和准确的算法将允许计算机无需专门的传感器来驱动汽车,使辅助设备能够将实时场景信息传达给人类用户。

    现在的检测系统重新使用了分类器来实现检测。为了检测一个对象,这些系统对该对象进行分类,并在测试图像中的各种位置和比例下进行评估。诸如可变形部件模型(DPM)的系统使用滑动窗口方法,其中分类器在整个图像上以均匀间隔的位置运行.

    更先进的一点的方法(例如R-CNN)使用region proposal的方法在一张图片上产生bounding boxes,然后在这些boxes上执行分类。分类后,后处理用于微调bounding boxes,和消除重复检测,并根据场景中的其他对象重新确定框。这些复杂的途径难以优化,因为每个单独的组件必须分开训练。

    我们把object detection视作一个单独的回归问题,直接从图像像素到bounding boxes坐标和类概率。使用我们的系统,您只需要看一眼就知道图片上有什么并且在哪里。(作者豪情万丈_

    *YOLO示意图*

    YOLO是非常简单的:如上图。一个单个卷积神经网络能够同时预测多个bounding boxes以及他们的概率。YOLO在完整的图像上训练,能够直接优化检测性能。这种统一的模型比传统的object detection方法有几个好处。

    1. 快,非常快。我们的基础版在Titan X GPU上可以达到45帧/s; 快速版可以达到150帧/s。因此,YOLO可以实现实时检测。
    2. YOLO采用全图信息来进行预测。与滑动窗口方法和region proposal-based方法不同,YOLO在训练和预测过程中可以利用全图信息。Fast R-CNN检测方法会错误的将背景中的斑块检测为目标,原因在于Fast R-CNN在检测中无法看到全局图像。相对于Fast R-CNN,YOLO背景预测错误率低一半。
      训练YOLO,然后采用艺术图像来预测。YOLO比其它目标检测方法(DPMR-CNN)准确率高很多。
       但是,YOLO的准确率没有最好的检测系统准确率高。YOLO可以快速识别图像中的目标,但是准确定位目标(特别是小目标)有点困难,我们将在实验中进行权衡。

    2. Unified Detection(统一检测)

    我们将object detection的单独组件统一为单个神经网络.我们的网络使用整个图像的特征来预测每个bounding boxes。他同时还可以预测所有的类的bounding boxes。YOLO的设计可实现端到端训练和实时检测,同时保持较高的平均精度。


    重点来了


    系统将输入的图片划分为S X S个小格子,如果物体的中心( 这里说的物体的中点应该是指ground truth box中的物体的中心 )落入到某一个小格中,则对应的小格负责检测这个物体。

    每个小格子预测B个bounding boxes以及对应的置信度(confidence scores),这些置信度反映了box包含物体的信心以及准确度(自己体会)。我们定义置信度为Pr(Object) ∗ IOUtruthpred.如果box中不存在物体,那么confidence scores0即意味着Pr(Object) =0),否则,我们希望预测的置信值和ground truth的intersection over union (IOU)相同(即意味着Pr(Object) =1)。
     每个bounding box由五个预测值组成:x,y,w,hconfidence(x,y)坐标表示相对于网格单元边界的框的中心。(w,h)为与全图信息相关的box的宽和高。confidence代表了predicted box和任何 ground truth box的IOU。
      每个网格单元还预测 C 条件类概率Pr(Classi|Object),这些概率适用于包含对象的网格单元格,概率值C代表了格子包含一个目标的概率,每个小格子只预测一组类概率,而不考虑框B的数量。在测试时,每个box通过类别概率和box置信度相乘来得到特定类别置信度:

    *特定类别的置信度*

    这个分数代表该类别出现在box中的概率和box和目标的合适度

    For evaluating YOLO on PASCAL VOC, we use S = 7, B = 2. PASCAL VOC has 20 labelled classes so C = 20.

    2.1 Network Design(网络结构)

    模型采用卷积神经网络结构。开始的卷积层提取图像特征,全连接层预测输出概率。模型结构类似于GoogleNet,如下图所示。我们还训练了YOLO的快速版本(fast YOLO)。Fast YOLO模型卷积层和filter更少。最终输出为7×7×30的tensor。

    *YOLO架构图*
    每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。 其中坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。 图片来自[知乎专栏](https://zhuanlan.zhihu.com/p/24916786)

    2.2 Training

    • 采用ImageNet 1000-class 数据集来预训练卷积层。预训练阶段,采用图2-2网络中的前20卷积层,外加average pooling层和全连接层。模型训练了一周,获得了top-5 accuracy为0.88(ImageNet2012 validation set),与GoogleNet模型准确率相当。

    • 将模型转换为检测模型。作者向预训练模型中加入了4个卷积层和两层全连接层,提高了模型输入分辨率(224×224-->448×448)

    • 最终层预测类概率和bounding boxes坐标。 通过图像宽度和高度将边界框宽度和高度归一化,使得它们落在0和1之间。我们将边界框x和y坐标参数化为特定网格单元位置的偏移,使得它们也在0和1之间 。

    • 顶层采用linear activation,其它层使用 leaky rectified linear。

    *Leaky rectified linear activation*
    • 使用sum-squared error,因为很容易优化,但它不完全符合我们的最大化平均精度的目标。预测概率的维数比预测bounding box的维数要高,把他们同等对待是不理想的。此外,在每个图像中,许多网格单元不包含任何对象。 这将这些网格单元的“置信度”为零,通常压倒包含对象的网格的梯度。 这可能导致模型不稳定,导致训练早期发散。为了弥补这一点,采用一个办法就是加权,赋予不同的权值,对于Pr(object)=0的格子令 λ_noobj = 0.5,对于Pr(object)=1的格子令 λ_coord = 5.
    • 对不同大小的bounding box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。因此预测边界框宽度和高度的平方根,而不是宽度和高度(因为平方根函数的图像随着x的增大会变得平缓).
    图片来自[知乎专栏](https://zhuanlan.zhihu.com/p/24916786)
    • loss function
    *The Loss Function*

    loss function由五部分组成:(其中1iobji表示如果对象出现在单元格 i 中,表示如果对象出现在单元格i中,1iobjij表示网络单元格 i 中的第 j 个 bounding box预测器对于该预测的
    objectresponsible
    )

    *Part 1 `(x,y)`的 `loss`* *Part 2 `(w,h)`的 `loss`* *Part 3 含预测的 `object`每个 `bounding box`的 `confindence`的 `loss`* *Part 4 不含预测的 `object`每个 `bounding box`的 `confindence`的 `loss`* *Part 5 `class probability`的 `loss`,是对每个 `grid`而言,而不是 `bounding box`*

    ![图片来自知乎专栏

    Note

    • 只有当某个网格中有object的时候才对classification error进行惩罚。
    • 只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。

    2.3 Inference

    对于PASCAL VOC数据集,模型需要对每张图片预测98个bounding box和对应的类别。对于大部分目标只包含一个box;其它有些面积大的目标包含了多个boxes,采用了Non-maximal suppression(非最大值抑制)来提高准确率。

    2.4 Limitations

    1. YOLO的每一个网格只预测两个boxes,一种类别。这导致模型对相邻目标预测准确率下降。因此,YOLO对成队列的目标(如 一群鸟)识别准确率较低。
    2. YOLO是从数据中学习预测bounding boxes,因此,对新的或者不常见角度的目标无法识别。
    3. YOLO的loss函数对small bounding boxeslarge bounding boxeserror平等对待,影响了模型识别准确率。因为对于小的bounding boxessmall error影响更大。

    3. Comparison to Other Detection Systems && Experiments

    挖个坑以后补上 _


    使用训练好的模型进行object detection(基于linux)

    • 安装Darknet
    git clone https://github.com/pjreddie/darknet.git  
    cd darknet
    make
    
    • 下载所需的权重文件
    cd darknet/
    wget http://pjreddie.com/media/files/yolo.weights
    
    • 测试,可以是data文件夹下的图,也可以是自己的图
    ./darknet detect cfg/yolo.cfg yolo.weights data/test.jpg
    
    测试图 效果图,棒棒哒

    才发现有一个ppt:强烈推荐
    未明白的问题:欢迎各位解答或者批评指正

    1. 通过图像宽度和高度将边界框宽度和高度归一化,使得它们落在0和1之间。
      但是是怎么将边界框x和y坐标归一化呢,在好像并没有具体的解释或者没太懂作者的解释。

    相关文章

      网友评论

        本文标题:You Only Look Once[译]

        本文链接:https://www.haomeiwen.com/subject/dpqlzttx.html