搞懂YOLO v1看这篇就够了

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

高能预警,前方将会有大量图片来袭!

一、what’s YOLO

TOLO检测结果示例
根据 YOLO官网 对它的解释,YOLO:Real-Time Object Detection. You Only Look Once(YOLO)是一个最先进的实时的目标检测系统。在Pascal Titan X上面处理图像能够达到30FPS,在COCO test-dev上具有57.9%的 mAP

1.1 目标检测

说起目标检测系统,就要先明白,图像识别、目标定位和目标检测的区别。图像识别也可以说成是目标分类,顾名思义,目的是为了分类出图像中的物体是什么类别。目标定位是不仅仅要识别出是一种什么物体,还要预测出物体的位置,并使用bounding box框出。目标检测就更为复杂,它可以看作是图像识别+多目标定位,即要在一张图片中定位并分类出多个物体。

目标检测对于人类来说极为简单,经过上万年的进化,人类天生具有复杂的感知与视觉系统,这是机器无可比拟的,我们可以只对图片看一眼,即分辨出物体的种类和它相应的位置,根据先前的知识进行归纳,适应不同图像环境都是人类专属技能。但是对于计算机来说,一张图片只是具有无数RGB像素点的矩阵,它本身并不知道猫狗动物,大小形状的概念,如果再给它一张具有复杂自然场景背景的图片,想要检测出物体更是难上加难。但是是问题,总会有解决的办法。问题是由人类提出来的,当然还要靠人类的智慧来处理。面对这样的计算机难题,很多研究学者蜂拥而至,从此目标检测领域变成了非常热门的研究方向,当然也诞生出了许多的解决方法。
目标检测对比

图1.1 2015年之前目标检测方法在Pascal VOC 2007数据集上测试的FPS和mAP结果对比

传统的目标检测方法大致分为三个步骤,先使用不同的方法(滑动窗口,区域候选)提取区域的特征图,然后再使用分类器进行识别,最后回归预测。大多数方法都较为复杂,速度较慢,训练耗时。

传统的方法可以按照检测系统分为两种:1

  1. DPM,Deformatable Parts Models,采用sliding window检测
  2. R-CNN、Fast R-CNN。采用region proposal的方法,生成一些可能包含待检测物体的potential bounding box,再通过一个classifier(SVM)判断每个bbox里是否真的包含物体,以及物体的class probability。

目前深度学习相关的目标检测方法大致可以分为两派:2
1、基于区域提名的(regin proposal)的,比如R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN、R-FCN。
2、基于端到端(end to end)的,无需候选区域,如YOLO、SSD。
二者发展都很迅速,区域提名准确率较好、端到端的方法速度较快。

本文着重于介绍一下目标检测系统:YOLO

1.2 YOLO 核心思想

  • 将整张图片作为网络的输入,直接在输出层对bounding box的位置和所属类别进行回归。与Faster R-CNN网络相比,虽然后者也是使用整张图片作为输入,但是它采用了RCNN那种区域预测+分类的思想,把提取proposal的步骤放在了CNN中实现,而YOLO则采用直接回归的思路,将目标定位和目标类别预测整合于在单个神经网络模型中。
    YOLO三步走
图 1.2 YOLO检测系统
  • 直接在输出层回归bbox的位置和所属类别。

按照 YOLO:Unified,Real-Time Object Detection 中所说,YOLO检测系统简单直接,可以看做只有三步:

  1. YOLO检测系统先将输入图像调整到448×448;
  2. 在图像上运行卷积网络;
  3. 通过模型的置信度对结果进行阈值。

1.2.1 YOLO实现细节

1、将一幅图像分成 S×S 个网格(Grid Cell),如果某个object的中心落在某个网格中(通过ground-truth框确定),则这个网格就负责预测这个object。
2、每个网格要预测B个bounding box,每个box除了要回归自身的位置之外,还要附带预测一个confidence值。这个值代表了所预测的bounding box中是否含有object和若有object,这个object预测得有多准的两重信息,计算方式:
P r ( O b j e c t ) ∗ I o U t r u t h p r e d Pr(Object) * IoU \frac{truth}{pred} Pr(Object)IoUpredtruth
如果有object的中心落在一个网格里面,*的前第一项取1,否则取0。第二项是预测的边界框和ground-truth之间的IoU值。

3、每个网格单元针对20种类别预测bboxes属于单个类别的条件概率 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i | Object) Pr(ClassiObject),属于同一个网格的B个bboxes共享一个条件概率。在测试时,将条件概率分别和单个的bbox的confidence预测相乘:
P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I o U t r u t h p r e d = P r ( C l a s s i ) ∗ I o U t r u t h p r e d Pr(Class_i | Object) * Pr(Object) * IoU \frac{truth} {pred} = Pr(Class_i) * IoU \frac{truth}{pred} Pr(ClassiObject)Pr(Object)IoUpredtruth=Pr(Classi)IoUpredtruth

4、在Pascal VOC中,YOLO检测系统的图像输入为448×448,S=7,B=2,一共有20个class(C=20),输出就是7×7×30的一个tensor。这个是怎么算出来的呢?看下面详解。

1.3 YOLO 网络设计

YOLO网络

图 1.3 YOLO网络结构

YOLO使用了24个级联卷积层和最后2个全连接层,交替的1×1卷积层降低了前面层的特征空间。在ImageNet分类任务上使用分辨率的一半(224×224输入图像)对卷积层进行预训练,然后将分辨率加倍进行目标检测。
YOLO网络图解

图 1.4 YOLO网络概览图

YOLO网络借鉴了GoogleNet的思想,但与之不同的是,为了更好的性能,它增加额外的4层卷积层(conv)。YOLO一共使用了24个级联的卷积层和2个全连接层(fc),其中conv层中包含了1×1和3×3两种kernel,最后一个fc全连接层后经过reshape之后就是YOLO网络的输出,是长度为S×S×(B×5+C)=7×7×30的tensor,最后经过识别过程得到最终的检测结果。

YOLO网络图解

图 1.5 1x1x30 tensor解释

上文说到每个bounding box要预测(x,y,w,h,confidence)五个值,一张图片共分为S×S个网格,每个网格要预测出B个bounding box和一个网格负责的object的类别信息,记为C。

则输出为 S ∗ S ∗ ( 5 ∗ B + C ) S*S*(5*B+C) SS(5B+C)的tensor张量,(x,y)表示bounding box相对于网格单元的边界的offset,归一化到(0,1)范围之内,而w,h表示相对于整个图片的预测宽和高,也被归一化到(0,1)范围内。c代表的是object在某个bounding box的confidence。
使用下图更形象的说明,7×7×30的Tensor中的一个1×1×30的前10维的所代表的含义。

1.3.1 归一化

下面解释如何将预测坐标的x,y用相对于对应网格的offset归一化到0-1和w,h是如何利用图像的宽高归一化到0-1之间。
每个单元格预测的B个(x,y,w,h,confidence)向量,假设图片为S×S个网格,S=7,图片宽为 w i w_i wi高为 h i h_i hi:

  1. (x,y)是bbox的中心相对于单元格的offset
    对于下图中蓝色单元格,坐标为( x c o l = 1 , y r o w = 4 x_col=1, y_row=4 xcol=1,yrow=4),假设它的预测输出是红色框bbox,设bbox的中心坐标为( x c , y c x_c,y_c xc,yc),那么最终预测出来的(x,y)是经过归一化处理的,表示的是相对于单元格的offset,公式:
    x = x c w i ∗ S − x c o l , y = y c h i ∗ S − y r o w x = \frac {x_c} {w_i} *S- x_{col},y = \frac {y_c}{h_i}*S - y_{row} x=wixcSxcoly=hiycSyrow
    借用网友图片
  2. (w,h)是bbox相对于整个图片的比例
    预测的bbox的宽高为w_b, h_b,(w,h)表示的是bbox相对于整张图片的占比,公式:
    w = w b w i , h = h b h i w = \frac {w_b}{w_i}, h = \frac{h_b}{h_i} w=wiwb,h=hihb

1.3.2 Inference

YOLO网络图解

图 1.6 1x1x30 前10维解释

每个grid cell对应的两个bounding box的5个值在tensor中体现出来,组成前十维。每个单元格负责预测一个object,但是每个单元格预测出2个bounding box,如图。

YOLO网络图解

图 1.7 1x1x30 Tensor的30维解释

每个grid cell有30维,其中8维是两个预测回归bboxes的坐标信息,2维是bboxes的confidences,还有20维是与类别相关的信息。
YOLO网络图解

图 1.8 20维中每个值表示此object在此bbox中的时候属于class_i的概率分数

YOLO网络图解
YOLO网络图解

图 1.9 类别预测分数的计算

每个单元格预测一个属于类别 c l a s s i class_{i} classi的条件概率 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_{i} | Object) Pr(ClassiObject)。要注意的是,属于一个网格的2个bboxs共享一套条件概率值,因为这两个box都是为了一个grid cell服务,最终预测出一个object类别。在测试时,将条件概率和单个bbox的confidence预测相乘:
P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I o U t r u t h p r e d = P r ( C l a s s i ) ∗ I o U t r u t h p r e d Pr(Class_{i} | Object) * Pr(Object) * IoU \frac {truth} {pred} = Pr(Class_{i}) * IoU \frac {truth} {pred} Pr(ClassiObject)Pr(Object)IoUpredtruth=Pr(Classi)IoUpredtruth如上式所述,每个网格预测的类别概率乘以每个bbox的预测confidence,得到每个bbox的class-specific confidence score分数。对每个格子的每一个bounding box进行此运算,最后会得到7×7×2=98个scores,设置一个阈值,滤掉得分低的bboxes,对保留的bboxes进行NMS(Non Maximum Suppression)处理,最终得到目标检测结果。

YOLO网络图解

图 1.10 图像中第一个网格中两个bboxes经过计算后的结果

YOLO网络图解
YOLO网络图解

图1.11 依次计算最终得到98个附带有score的tensors

1.4 预测框的定位

YOLO Detection Procedure

图 1.12 得到7×7×30的张量之后,经过检测过程处理的到定位框

score位置

图 1.13 假设得到的每个20x1的tensor的第一维为预测为dog的score

scores处理图解

图 1.14 通过设定阈值过滤掉score低的冗余bboxes

NMS
NMS
NMS
NMS
NMS
NMS

图 1.15 根据得到的98个bboxes中对dog的预测分数经过阈值后进行从大到小排序

最后得到第一个为最大的score值,找出针对dog这个种类预测出的对应框,记为bbox_max。然后将它与其他分数较低的但不是0的框作对比,这种框记为bbox_cur。将bbox_maxbbox_cur分别做IoU计算,如果 IoU(bbox_max, bbox_cur) > 0.5,那么将bbox_cur对应的score设为0。例如:
NMS

图 1.16 IoU > 0.5的分数较小的框的score归零

然后接着遍历下一个score,如果它不是最大的且不为0,就和最大的score对应的框座IoU运算,若结果大于0.5则,同上。否则它的score不变,继续处理下一个bbox_cur……直到最后一个score,如图:
NMS

图 1.17 IoU < 0.5, 继续下一个score与max score对应框做IOU计算

计算完一轮之后,假如得到score序列:0.5、0、0.2、0.1 … 0、0、0、0
那么进行下一轮循环,从0.2开始,将0.2对应的框作为bbox_max,继续循环计算后面的bbox_cur与新的bbox_max的IoU值,大于0.5的设为0,小于0.5的score不变。再这样一直计算比较到最后一个score。
得到新的的score序列为:0.5、0、0.2、0 … 0、0、0、0
即最后只得到两个score不为0的框,如图:
NMS

图 1.18 多次循环 完毕的结果

NMS

图 1.19 98个框对下一类别cat的score的NMS处理

NMS

图 1.20 对98个框的针对其他类别预测的score依次进行NMS处理

1.5 再筛选bounding box

经过这些NMS算法的处理,会出现很多框针对某个class的预测的score为0的情况。
最后,针对每个bbox的20×1的张量,对20种class的预测score进行判断。例如,
1)先取出针对bbox3的所有20个scores,按照类别的默认顺序找出score最大的那个score的index索引号(根据此index可以找出所属的类别)记为class
2)然后找出bbox3的最大score分数,记为score
3)判断score是否大于0,如果是,就在图像中画出标有class的框。否则,丢弃此bbox。

如图:
删选bbox

图 1.21 筛选bbox的过程示例

接下来进行下一个bbox的筛选,如图,则是bbox1,流程同上。一直到最后一个bbox97,
bbox筛选

图 1.22 判断每个bbox是否能在图像中最后保留

最后得到的框如图:
筛选结果

图 1.23 遍历完毕,得到带有预测框的图像

1.6 YOLO Key Points

关键点

二、损失函数

2.1 损失函数解析

论文中损失函数的形式,一共分为四个部分,笔者分别对各个部分作了解析说明。
Loss

图 2.1 Loss Function

在此损失函数中,只有某个网格中有object的中心落入的时候才对classification loss进行惩罚。只有当某个网格i中的bbox对某的ground-truth box负责的时候,才会对box的coordinate error进行惩罚。哪个bbox对ground-truth box负责就看ground-truth box和bbox的IoU最大。

Loss相关解释:

  1. 8维的localization error和20维的classification error同样重要显然是不合理的,应该更重视8维的坐标预测,所以作者给这个损失前加了个权重,记为: λ c o o r d \lambda_{coord} λcoord,在Pascal VOC训练中取5。
  2. 对于不存在object的bbox的confidence loss,赋予了更小的损失权重,记为 λ n o o b j \lambda_{noobj} λnoobj,在Pascal VOC中取0.5。若没有任何物体中心落入边界框中,则 C i ^ \widehat{C_i} Ci 为0,此时我们希望预测含有物体的置信度 C i C_i Ci越小越好。然而,大部分bbox中都没有object,积少成多,造成loss的第2部分与第3部分的不平衡,因此,在loss的三部分增加权重 λ n o o b j \lambda_{noobj} λnoobj=0.5。
  3. 对于存在object的bbox的confidence loss和类别的loss,权重取常数1。对于每个格子而言,作者设计只能包含同种物体。若格子中包含物体,我们希望希望预测正确的类别的概率越接近于1越好,而错误类别的概率越接近于0越好。loss第4部分中,若 p i ^ ( c ) \widehat{p_i}(c) pi (c)为0中c为正确类别,则值为1,若非正确类别,则值为0。3
  4. 对于第二行中为什么对 w i w_i wi h i h_i hi平方根处理,原因是:对于一个图像中存在的不同大小的object,小物体的预测框偏离一点和大的相比肯定更严重,而sum-square error loss中对大小object的偏移loss是一同处理的。为了缓和,作者使用开方的方法,将bbox的width和height去平方根代替width和height。我们可以这样理解,假如预测出的小物体(width=10, height=10)的宽比实际大了10pixel,大物体(width=100,height=100)的宽度比实际预测大了10pixel。显然对于小物体,预测大了一倍,我们接受不了,而对大物体来说就影响不大。所以我们就要加大惩罚措施,让小物体预测大了10pixel的后果对于损失函数的值贡献更大,我们通过取平方根: 20 − 10 ≈ 3.4 \sqrt{20}-\sqrt{10}\approx3.4 20 10 3.4 > 110 − 100 ≈ 0.5 \sqrt{110}-\sqrt{100}\approx0.5 110 100 0.5,这样也算达到了目的吧。

三、实验

3.1 与其他检测方法对比

实验数据比较好理解,详情见论文

3.1.1 在Pascal VOC 2007上的测试结果

compare

表 3.1 在Pascal VOC 2007 上与其他检测方法的对比

Fast YOLO在Pascal数据集上速度最快,达到155FPS,而UOLO的mAP是最高的。

3.1.2 VOC 2007错误分析

比较了YOLO和Faster R-CNN的错误情况,结果如图所示。

预测结果包括以下几类:
正确:类别正确,IOU>0.5
定位:类别正确,0.1<IOU<0.5
类似:类别相似,IOU>0.1
其它:类别错误,IOU>0.1
背景:任何物体,IOU<0.1
在这里插入图片描述

图 3.2 YOLO定位错误率高于Fast R-CNN;Fast R-CNN背景预测错误率高于YOLO

3.2 组合Fast R-CNN 和 YOLO

在这里插入图片描述

表 3.3 模型组合在VOC 2007上的实验结果对比

3.3 在Pascal VOC 2012上测试结果

在这里插入图片描述

表 3.4 mAP排序

3.4 通用性

在这里插入图片描述

图 3.5 通用性(Picasso 数据集和 People-Art数据集)YOLO都具有很好的检测结果

四、merits and drawbacks

4.1 优点

  1. 假阳性(FP)错误率低。YOLO网络将整个图像的全部信息作为上下文,在训练的过程中使用到了全图信息,能够更好的区分目标个背景区域。
  2. 端到端(end-to-end)的方法,速度快,如官网所说,具有实时性,45fps,在YOLO-tiny上可以达到155fps。
  3. 通用性强,可以学到物体的generalizable-representation。对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。

4.2 不足之处

  1. 性能表现比当前最先进的目标检测技术低。
  2. 定位准确性差,对于小目标或者密集型群体object的定位效果不好。虽然每个格子可以预测出B个bounding box,但是最终只选择一个score最高的作为输出,即每个格子最多只得出一个box,如果多个物体的中心落在同一个格子,那么最终可能只预测出一个object。
  3. YOLO的loss函数中,大物体的IoU误差和小物体的IoU的误差对训练中的loss贡献值接近,造成定位不准确。作者采用了一个去平方根的方式,但还不是最好的解决方法。
  4. 输入尺寸固定。由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。其他分辨率需要缩放成此固定分辨率大小。
  5. 采用了多个下采样层,网络学到的物体特征并不精细,因此对检测效果会有影响。

五、总结与展望

YOLO v1只是最初始的版本,定然有许多不足之处,现在已经发展到了YOLO v3,针对这些不足之处都有所改进。只希望本篇文章能够对入门者有所启发,接下来可能还会写有关YOLO v2,v3的讲解博客。

编写整理本文着实费了我不少时间,网上有很多讲解YOLO的资料,但大多比较混乱,所以想自己整理一份YOLO入门资料。一方面为了巩固梳理这几天学习的知识,记录下来以便以后回顾查找;另一方面是出于知识共享的想法,希望此文也能给别人带来好的帮助。为了更容易更形象的理解YOLO的网络与原理,本博客放入了大量的图片,图片出处在参考文档第一项给了出来。我参考了很多资料,也都一一列了出来,文中有些借鉴的地方甚至还用上标标注出。

庐山烟雨浙江潮,在深度学习的路上我还有很漫长的路要走,深知此文还有许多地方需要修正,以后有时间还会慢慢补充,现在YOLO已经发展了很多版本,接下来还得继续学习,路漫漫其修远兮,fighting!

PS:如有发现错误或不当之处,敬请指正,不胜感激。

六、参考文档

[0]. You Only Look Once: Unified, Real-Time Object Detection
[1]. Google Doc
[2]. YOLO文章详细解读
[3]. YOLO算法详解
[4]. 目标检测YOLO原理
[5]. 目标检测(九)–YOLO v1,v2,v3
[6]. yolo报告
[7]. yolov1原文地址以及论文翻译
[8]. YOLO:实时快速目标检测


  1. yolo报告 ↩︎

  2. 基于深度学习的目标检测 ↩︎

  3. 目标检测YOLO原理 ↩︎

  • 114
    点赞
  • 525
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 39
    评论
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Antrn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值