Yolov1目标检测算法详细分析

  1. Yolov1介绍
    这是继RCNN,fast-RCNN 和 faster-RCNN之后,rbg(Ross Girshick)大神挂名的又一大作,起了一个很娱乐化的名字:YOLO。
    虽然目前版本还有一些硬伤,但是解决了目前基于DL检测中一个大痛点,就是速度问题。 其增强版本GPU中能跑45fps,简化版本155fps。

YOLO主要特点是
第一,速度快,能够达到实时的要求。在 Titan X 的 GPU 上 能够达到 45 帧每秒。
第二,使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。
第三,泛化能力强
Yolov1目标检测算法详细分析

  1. 目标检测

目标检测就是要找出图片中物体的bounding box(边界框),并判断框内物体的类别。
Yolov1目标检测算法详细分析
比如图中有一只猫,就将这只猫用bounding box框出来(bounding box 可以用左上角坐标(x,y)和举行的宽高(w,h)来表示)。

做法是,用深度学习神经网络训练出bounding box的xywh四个值就可以了。如果图片除了猫以外,还有一条狗,甚至更多的物体,都要框出来,这时候神经网络就不仅仅要输出猫的预测,还要输出其它物体的预测。模型的输出难度是没有办法固定的,图片存在的物体越多,模型输出的难度越大。

  1. Yolov1的原理分析

能不能设计一个固定唯独大小的输出,并且输出的唯独足够大,足以攘括图像中的所有物体呢?答案是肯定的!yolov1就是这么做的。Yolov1固定唯独的办法是,把模型的输出划分成网格形状,每个网格中的cell(格子)都可以输出物体的类别和bounding box的坐标,如图所示(yolov1实际上可以预测多个bounding box的类别和confidence)。
Yolov1目标检测算法详细分析
如何知道cell需要预测的图片中的哪个物体呢?取决于怎么去设置模型的训练目标,要告诉它去训练预测哪个目标。

Yolov1的做法是这样的:将输入图像按照模型的输出网格(比如7*7大小)进行划分,划分之后就有很多小cell了。预测图片中心落在哪个cell里面,这个cell就负责预测这个目标。下图中,狗的中心落在了红色的cell内,这个cell负责预测狗。
Yolov1目标检测算法详细分析
这个过程分为两个阶段:

1) 训练阶段。在训练阶段,如果目标中心落在这个cell,那么就给这cell打上这个目标的label(包括xywh和类别)。通过这种方法来设置训练label教会cell预测哪个目标。

2) 测试阶段。在训练阶段已经教会了cell去预测中心落在cell的目标,cell在测试中也是这么做的。

以上就是yolov1的最核心的思想。
Yolov1目标检测算法详细分析
4. Yolov1的核心思想

·
Yolov1的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。

·
faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了。

  1. Yolov1网络模型
    Yolov1目标检测算法详细分析
    可知,yolov1网络的输出是7*7的,输出的channel数为30。一个cell内,前20个元素是类别概率值,2个元素是边界框confidence,最后8个元素是边界框的(x,y,w,h)。
    Yolov1目标检测算法详细分析
    oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1amlhbmluZ18xMTAxMTc=,size_16,color_FFFFFF,t_70)
    每个cell有两个predictor,每个predictor分别预测一个bounding box的xywh和对应的confidence。但分类部分的预测却是共享的,这样的话,一个cell是没有办法预测多个目标的。

两个问题:

第一, 假设类别不是共享的,cell中两个predictor都有各自的类别预测,能否在一个cell中预测两个目标?

第二, 为何要预测两个bounding box?

第一个问题的答案是否定的。如果一个cell要预测两个目标,这两个predictor如何分工预测这两个目标?没办法预测。而像faster rcnn这类算法,可以根据anchor与ground truth的IOU大小来安排anchor负责哪一个目标,所以,yolov2也采用了anchor的私下,同一个cell能预测多个目标。

对于第二个问题,既然cell只能预测一个目标,为何还要预测两个bounding box(或者更多)?需要从训练阶段怎么给两个predictor设计训练目标说起。训练中在线计算predixtor预测的bounding box和ground truth的IOU,计算出来的IOU大的哪个predictor负责预测这个目标,另外一个抛弃。实际上有两个predictor一起来进行预测,旋转预测的更好的哪个predictor(IOU大的)来进行预测。

  1. 模型输出的意义

6.1 confidence预测

首先看cell预测的bounding box中的confidence这个唯独。confidence表示:cell预测bounding
box包含一个目标物体的置信度和bounding box预测的准确度,用公式表示为:Yolov1目标检测算法详细分析。两个阶段:

第一, 训练阶段,给bounding box的confidence标注label,label的计算方法是,如果一个中心没有落在cell内,每个bounding box的Yolov1目标检测算法详细分析,IOU就没有计算的必要了。因为Yolov1目标检测算法详细分析=0,confidence的label=0了。如果目标的中心落在了这个cell之内,这个时候Yolov1目标检测算法详细分析,confidence=Yolov1目标检测算法详细分析。这个IOU是在训练过程中不断计算出来的,网络在训练过程中预测的bounding box每次都不一样,所以,ground truth计算出来的IOU每次也会不一样。

第二, 预测阶段,网络只输出一个confidence值,实际上隐含了Yolov1目标检测算法详细分析

在测试阶段,输出的confidence如何计算?如果用Yolov1目标检测算法详细分析的话,测试阶段没有ground truth,如何计算IOU?

实际上,测试阶段,网络只是输出了confidence,已经包含了Yolov1目标检测算法详细分析,并不需要分别计算Pr(object)和IOU(也没有办法算)。训练阶段在给confidence标注label时,给的是Yolov1目标检测算法详细分析,测试时,网络算出来的也是这个值。

Bounding box预测

bounding box的预测包括xywh四个值。xy表示bounding box的中心相对于cell左上角坐标偏移,宽高是相对于整张图片的宽高进行归一化的,偏移的计算方法如下:
Yolov1目标检测算法详细分析
假设grid的size 为SS ,原始图片的宽高:width,height。某目标中心的坐标为(x,y),所在的 cell在左上角(5,0)。
则坐标的偏移值计算为:(x
S/width-5,y*S/height,0)。

xywh这种表述,实际上是归一化了,它们均在0-1之间。通常做回归的时候,都会输出进行归一化,否则,可能导致各个输出维度的取值范围差别很大,进而导致训练的时候,网络更关注数值大的维度。数值大的维度,计算loss相应也比较大,为了使这个loss减少,网络就会尽量训练,让这个维度loss变小,最终导致区别对待。

6.2 类别预测

目标类别是一个条件概率Yolov1目标检测算法详细分析。分为两个阶段看:

第一, 训练阶段,也就是标注label阶段。对于一个cell,如果目标中心落在了这个cell,那么就标注上这个目标的类别label,并设置概率为1。这个概率是是存在一个条件的,就是cell存在目标。

第二, 测试阶段,网络直接输出Yolov1目标检测算法详细分析,代表有目标存在的条件下类别概率,测试阶段还把这个概率乘上了confidence。

计算公式:
Yolov1目标检测算法详细分析
预测的条件概率还要乘上confidence。对预测阶段某个cell,即使这个cell不存在目标(confidence=0),也有这种状况:输出的条件概率p(class/object)=0.9,但将confidence和p(class/object)相乘就变成0了。因为要确保cell中有目标(confidence),计算类别概率才有意义。

可以看到网络的最后输出为是边界框的预测结果。这样,提取每个部分是非常方便的,这会方面后面的训练及预测时的计算。
Yolov1目标检测算法详细分析

  1. 网络模型训练

在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。整个网络的流程如下图所示:

Yolov1目标检测算法详细分析

  1. Yolov1,yolov2和yolov3三种模型训练阶段的loss对比。

8.1 Yolov1 Loss函数公式
Yolov1目标检测算法详细分析
关于loss需要特别注意的是,需要计算loss的部分。并不是网络的输出都算loss。

第一, 有目标中心落入的cell需要计算分类loss两个predictor都要计算confidence
loss,预测的bounding box与ground
truth IOU相比,较大的那个predictor需要计算xywh
loss。

第二, 特别注意:没有目标的中心落入的cell,只需要计算confidence loss。

第三, 每一项loss的计算都是 L2 loss,是分类问题,所以,yolov1是把分类问题转化为了回归问题。

8.2 Yolov2 Loss函数公式
Yolov1目标检测算法详细分析
负责预测目标的anchor:

第一项:负责预测目标的anchor的坐标损失(包括中心定位和边界定位)。仅计算负责预测目标的那个anchor的坐标损失。(此项在yolov1中边界定位是采用根号下的差值的平方)——衡量目标定位准确度。

第三项:负责预测目标的anchor的confidence损失。负责预测物体的anchor需要计算confidence损失,confidence的目标就是让预测置信得分去逼近的预测bbox和Ground Truth的IOU。——衡量可能有目标的准确度。

第五项:负责预测目标的anchor的类别损失。每个类别的输出概率0-1之间,计算的是L2损失。也就是说分类问题也把它当做了回归问题。且yolo-V2中类别预测没有预测背景,因为置信得分值低于阈值就代表不存在目标。(此项与yolov1一致,只是因为不同anchor可同时预测不同目标了)——衡量目标分类的准确度。

不负责预测目标的anchor:

第二项:不负责预测目标的anchor的坐标损失。加了限制,希望直接回归到自身anchor box。

第四项:不负责预测目标的anchor的confidece损失。(只计算那些与Groud Truth的IOU小于IOU阈值的anchor box)。首先,如果与Groud Truth的IOU大于IOU阈值,且不负责预测目标,这种情况是很正常的,不予惩罚。但是,如果anchor box小于阈值说明本身就无意预测,那么我们干脆加上限制让你就回归到完全不预测的情况,即回归到与Ground Truth的IOU=0(此项在yolo-v1中没有)。

8.3 Yolov3 Loss函数公式

Yolov1目标检测算法详细分析

Yolov1目标检测算法详细分析:表示是该cell中存在目标时就是1,否则就是0。

一共分为三大块:坐标做损失(中心坐标xy+宽高wh)+类做损失(class)+置信度做损失(confidence)。

Wx+b表示sigmoid**函数,添加非线性归一化,得到预测值predict,SSE得到,得到Loss。其实就是平方和(SSE),每一块都是,再加起来,找出它的最小值,就是最小Loss,效果才能最好。这个是用SSE(有平方),构造的损失函数,还可以改成TSE,或者将平方换成绝对值(抗干扰性更好),还可能用平方和绝对值混合的计算方法。