*参考文章:
原论文地址: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
解决的是,“为什么不用CNN
做classification
呢?”
Fast R-CNN
解决的是,“为什么不一起输出bounding bo
x和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是非常简单的:如上图。一个单个卷积神经网络能够同时预测多个bounding boxes
以及他们的概率。YOLO在完整的图像上训练,能够直接优化检测性能。这种统一的模型比传统的object detection
方法有几个好处。
- 快,非常快。我们的基础版在
Titan X GPU
上可以达到45帧/s; 快速版可以达到150帧/s。因此,YOLO可以实现实时检测。 - YOLO采用全图信息来进行预测。与滑动窗口方法和
region proposal-based
方法不同,YOLO在训练和预测过程中可以利用全图信息。Fast R-CNN
检测方法会错误的将背景中的斑块检测为目标,原因在于Fast R-CNN在检测中无法看到全局图像。相对于Fast R-CNN
,YOLO背景预测错误率低一半。
训练YOLO,然后采用艺术图像来预测。YOLO比其它目标检测方法(DPM
和R-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 scores
为0
(即意味着Pr(Object) =0),否则,我们希望预测的置信值和ground truth的intersection over union (IOU)相同(即意味着Pr(Object) =1)。
每个bounding box
由五个预测值组成:x,y,w,h
和confidence
。(x,y)
坐标表示相对于网格单元边界的框的中心。(w,h)
为与全图信息相关的box的宽和高。confidence
代表了predicted box
和任何 ground truth box
的IOU。
每个网格单元还预测 C 条件类概率Pr(Classi|Object),这些概率适用于包含对象的网格单元格,概率值C代表了格子包含一个目标的概率,每个小格子只预测一组类概率,而不考虑框B的数量。在测试时,每个box通过类别概率和box置信度相乘来得到特定类别置信度:
这个分数代表该类别出现在box中的概率和box和目标的合适度
2.1 Network Design(网络结构)
模型采用卷积神经网络结构。开始的卷积层提取图像特征,全连接层预测输出概率。模型结构类似于GoogleNet,如下图所示。我们还训练了YOLO的快速版本(fast YOLO)。Fast YOLO模型卷积层和filter更少。最终输出为7×7×30的tensor。
每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。 其中坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。
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。
- 使用
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的增大会变得平缓).
- loss function
loss function
由五部分组成:(其中1iobji表示如果对象出现在单元格 i 中,表示如果对象出现在单元格i中,1iobjij表示网络单元格 i 中的第 j 个 bounding box
预测器对于该预测的
object
是 responsible
的)
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
- YOLO的每一个网格只预测两个boxes,一种类别。这导致模型对相邻目标预测准确率下降。因此,YOLO对成队列的目标(如 一群鸟)识别准确率较低。
- YOLO是从数据中学习预测
bounding boxes
,因此,对新的或者不常见角度的目标无法识别。 - YOLO的loss函数对
small bounding boxes
和large bounding boxes
的error
平等对待,影响了模型识别准确率。因为对于小的bounding boxes
,small 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:强烈推荐
未明白的问题:欢迎各位解答或者批评指正
- 通过图像宽度和高度将边界框宽度和高度归一化,使得它们落在0和1之间。
但是是怎么将边界框x和y坐标归一化呢,在好像并没有具体的解释或者没太懂作者的解释。