【背景】
目标检测相比分类任务更复杂的计算机视觉任务之一,目标检测系统要能够识别出图片的目标并给出其位置。
【算法类别】
比较流行的算法可以分为两类:
一类如DPM系统,要使用一个滑窗(sliding window)在整张图像上均匀滑动,用分类器评估是否有物体。
另一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归。
本文介绍的是Yolo算法则是one-stage类算法,其仅仅使用一个CNN网络直接预测不同目标的类别与位置。其他使用这类算法的如SSD。
two-stage方法是准确度高一些,但是速度慢,但是one-stage算法是速度快,但是准确性要低一些。
【YOLO及算法对比】
You Only Look Once——只需要一次CNN运算
Unified——统一的框架,提供end-to-end的预测
Real-Time Object Detection——体现Yolo算法可实现实时性
【设计理念】
将一幅图像分成 SxS 个网格(grid cell),如果某个 object 的中心落在这个网格中,则这个网格就负责预测这个object。
每一个栅格预测B个bounding boxes,以及这些bounding boxes的confidence scores(该栅格是否含有物体,以及这个box的坐标的预测准确度)。
如果这个栅格中不存在一个 object,Pr(Object)=0;否则, Pr(Object)=1。
YOLO对每个bounding box有5个predictions:x, y, w, h, and confidence。
每一个栅格还要预测C个 conditional class probability(条件类别概率):Pr(Class|Object)。即在一个栅格包含一个Object的前提下,它属于某个类的概率。
只为每个栅格预测一组(C个)类概率,而不考虑框B的数量。
YOLO算法流程图:
【网络设计】
检测网络有24个卷积层,后面是2个全连接层。其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。
YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。
【Training】
首先利用ImageNet 1000-class的分类任务数据集Pretrain卷积层。使用上述网络中的前20 个卷积层,加上一个 average-pooling layer,最后加一个全连接层,作为 Pretrain 的网络。训练大约一周的时间,使得在ImageNet 2012的验证数据集Top-5的精度达到 88%,这个结果跟 GoogleNet 的效果相当。
将Pretrain的结果的前20层卷积层应用到Detection中,并加入剩下的4个卷积层及2个全连接。同时为了获取更精细化的结果,将输入图像的分辨率由 224* 224 提升到 448* 448。
将所有的预测结果都归一化到 0~1, 使用 Leaky RELU 作为激活函数。
Leaky RELU可以解决RELU的梯度消失问题。
【损失函数】
损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。 简单的全部采用了sum-squared error loss来做这件事会有以下不足:
a) 8维的localization error和20维的classification error同等重要显然是不合理的。
b) 如果一些栅格中没有object(一幅图中这种栅格很多),那么就会将这些栅格中的bounding box的confidence 置为0,相比于较少的有object的栅格,这些不包含物体的栅格对梯度更新的贡献会远大于包含物体的栅格对梯度更新的贡献,这会导致网络不稳定甚至发散。
一个网格预测多个bounding box,在训练时希望每个object只有一个bounding box专门负责。具体做法是与ground true box的IOU最大的bounding box 负责该ground true box的预测。
【测试输出处理】
在测试阶段,将每个栅格的conditional class probabilities与每个 bounding box的 confidence相乘:
对每一个网格的每一个bbox执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)
获取Object Detect 结果
采用非极大抑制进行处理。
【YOLO优点】
•速度快,YOLO将物体检测作为回归问题进行求解,整个检测网络pipeline简单。在titan x GPU上,在保证检测准确率的前提下(63.4% mAP,VOC 2007 test set),可以达到45fps的检测速度。
•背景误检率低。YOLO在训练和推理过程中能‘看到’整张图像的整体信息,而基于region proposal的物体检测方法(如rcnn/fast rcnn),在检测过程中,只‘看到’候选框内的局部图像信息。因此,若当图像背景(非物体)中的部分数据被包含在候选框中送入检测网络进行检测时,容易被误检测成物体。测试证明,YOLO对于背景图像的误检率低于fast rcnn误检率的一半。
•通用性强。YOLO对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。
【YOLO局限性】
•每个 grid cell 只预测一个类别的 Bounding Boxes,而且最后只取置信度最大的那个 Box。这就导致如果多个不同物体(或者同类物体的不同实体)的中心落在同一个网格中,会造成漏检。
•预测的 Box 对于尺度的变化比较敏感,在尺度上的泛化能力比较差。
•识别物体位置精准性差
•recall率低
【算法对比】
【YOLO与Fast R-CNN融合】
【YOLO测试输出样式】