YOLO详解

原创博客,转载请注明出处!

YOLO(You Only Look Once)是2016年提出的一篇关于目标检测比较有名的文章。其以速度快和泛化能力强为优点。在YOLO之后,又改进出了YOLO-v2、YOLO-v3,v2、v3的精度相比v1有了很大的提升,这个后面再详细介绍。本文介绍的YOLO第一版。

1、直观理解YOLO

YOLO直接采用regression(回归)的方法进行坐标框的检测以及分类,使用一个end-to-end的简单网络,直接实现坐标回归与分类,意思是说训练出的YOLO当你输入一幅图像,它能直接输出包含物体的坐标框以及该物体是什么。如下图所示。

http://ww1.sinaimg.cn/large/87675bbbgy1frvpaorx8ij20d907cgny.jpg

2、YOLO是怎么做的?

首先把输入图像划分成S*S的格子grid cell),然后对每个格子都预测Bbounding boxes边界框),每个bounding box都包含5个预测值:x,y,w,h和confidence。x,y就是bounding box的中心坐标,即我们约定格子的左上角坐标为(0,0),格子右下角坐标为(1,1),那么x,y就是bounding box中心的坐标,因此x和y的值都是介于0到1之间的数,w和h分别代表边界框的宽和高相对于grid cell的占比,如果bounding box超出了grid cell的边界,那么w和h的值会有可能大于1(而不仅仅是0到1之间了)。

而confidence(置信度)代表了所预测的bounding box 中含有 object 的置信度和这个bounding box 预测的有多准这两重信息,其值计算方式如下图:

如果grid cell里面没有object,那么第一项就是0,也就是confidence是0;如果有object,那么就是1,confidence就直接等于bounding box和ground truth(真实框)的IOU值。注意:YOLO定义的grid cell里有无object依据是object的中心点是否落在该grid cell上即如果某个object 的中心点落在A格子上,那么它就只归A格子负责,而其它格子无论里面含有多大比例的object 都不归它负责。

同时 ,每个格子还要预测C个类别的概率,表示一个grid cell在包含object的条件下属于某个类别的概率。

 

在本文中作者取S=7,B=2,C=20(因为PASCAL VOC有20个类别),每个bounding box具有5个参数,B个bounding box就是B*5个,同时要预测C个类别的概率,因此每个格子要预测的参数就是B*5 + C个,所以共有7*7*30个tensor张量)。如下图。

YOLO详解_第1张图片

注意:confidence 信息是针对每个 bounding box 的,类别概率是针对grid cell的

 

 

整个网络结构如下图所示: 

网络方面主要采用GoogLeNet,卷积层主要用来提取特征,全连接层主要用来预测类别概率和坐标。最后的输出是7*7*30。有些细节的实现根据实际可以不一样,比如对inception的改动,最后几层的全连接层的改动等等,但是重点在于最后一层的输出是7*7*30。

 

在 预测(test)的时候,每个网格预测的类别(class)概率的信息和 bounding box 预测的 confidence信息相乘,就得到每个 bounding box 属于哪一类的confidence score (class-specific confidence score)。

等式左边第一项就是每个网格预测的类别信息,第二、三项就是每个 bounding box 预测的 confidence。这个乘积即 encode(编码) 了预测的 box 属于某一类的概率,也有该 box 准确度的信息。

 

得到class-specific confidence score之后,也就是说最后会得到20*(7*7*2)=20*98的score矩阵,括号里面是bounding box的数量,20代表类别。接下来的操作都是20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0,然后再按得分从高到低排序。最后再用NMS(非极大值抑制法)算法去掉重复率较大的bounding box,最后每个bounding box的20个score取最大的score,如果这个score大于0,那么这个bounding box就是这个socre对应的类别(矩阵的行),如果小于0,说明这个bounding box里面没有物体。

另外两个小细节:

①作者先在ImageNet数据集上预训练网络,而且网络只采用fig3的前面20个卷积层,输入是224*224大小的图像。然后在检测的时候再加上随机初始化的4个卷积层和2个全连接层,同时输入改为更高分辨率的448*448。

②Relu层改为pRelu,即当x<0时,激活值是0.1*x,而不是传统的0。

注意:

①由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率

②虽然每个格子可以预测 B 个 bounding box,但是最终只选择只选择 IOU 最高的 bounding box 作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这也是 YOLO 方法的一个缺陷

 

3、YOLO的损失函数

作者采用sum-squared error(损失总平方和)的方式把localization error(bounding box的坐标误差)和classificaton error整合在一起。如下图可以看出二者的权重不一致,如果不这样做,即8维的 localization error 和20维的 classification error 同等重要,这样显然是不合理的,另外因为很多grid cell是不包含物体的,这样的话很多grid cell的confidence score为0,这会导致网络不稳定甚至发散。

所以采用设置不同权重方式来解决,一方面提高localization error的权重,另一方面降低没有object的box的confidence loss权值,loss权重分别是5和0.5。而对于包含object的box的confidence loss权值还是原来的1。

YOLO详解_第2张图片

这里详细讲一下loss function。在loss function中,前面两行表示localization error(即坐标误差),

第一行是box中心坐标(x,y)的预测,

第二行为宽和高的预测。这里注意用宽和高的开根号代替原来的宽和高,这样做主要是因为相同的宽和高误差对于小的目标精度影响比大的目标要大。举个例子,原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,其实前者的误差要比后者小,但是如果不加开根号,那么两者损失都是一样了,但是加上根号后,变成0.15和0.7,显然更准确。

第三、四行表示bounding box的confidence损失,就像前面所说的,分成grid cell包含与不包含object两种情况。这里注意下因为每个grid cell包含两个bounding box,所以只有当ground truth 和该网格中的某个bounding box的IOU值最大的时候,才计算这项

第五行表示预测类别的误差,注意前面的系数只有在grid cell包含object的时候才为1。

 

4、具体的实现过程:

训练的时候:输入N个图像,每个图像包含M个objec,每个object包含4个坐标(x,y,w,h)和1个label。然后通过网络得到7*7*30大小的三维矩阵。每个1*30的向量前5个元素表示第一个bounding box的4个坐标和1个confidence,第6到10元素表示第二个bounding box的4个坐标和1个confidence。最后20个表示这个grid cell所属类别。注意这30个都是预测的结果。然后就可以计算损失函数的第一、二 、五行。至于第三、四行,confidence可以根据ground truth和预测的bounding box计算出的IOU和是否有object的0,1值相乘得到。真实的confidence是0或1值,即有object则为1,没有object则为0。 这样就能计算出loss function的值了。

测试的时候:输入一张图像,跑到网络的末端得到7*7*30的三维矩阵,这里虽然没有计算IOU,但是由训练好的权重已经直接计算出了bounding box的confidence。然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。

 

5、YOLO的缺点

①YOLO 方法模型训练依赖于物体识别标注数据,因此,对于非常规的物体形状或比例,YOLO 的检测效果并不理想。

②位置精确性差,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟。

③YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低。

④YOLO 的损失函数中,大物体 IOU 误差和小物体 IOU 误差对网络训练中 loss 贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的 IOU 误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。

 

6、常见问题

①如果两个物体的中心点都落在同一个网格里怎么办?

答:解决方法是用anchor box

anchor box的大概思路是这样:预先定义两(或者多个)个不同形状的anchor box,你要做的是把预测结果和这两个anchor box关联起来。每个对象都和之前一样分配到对象中点所在的格子中,以及分配到和对象形状交并比(IOU)最高的anchor box中。所以这里有两个anchor box,你就取这个对象,观察哪一个anchor box和实际边界框的交并比更高,不管选的是哪一个,这个对象不只分配到一个格子,而是分配到一对,即(grid cell,anchor box)对,这就是对象在目标标签中的编码方式。详情请查阅anchor box相关文献。

②在测试阶段,没有了ground truth信息,怎么判断由哪一个grid cell来负责预测物体?

答:这是训练时的概念,测试时就是直接用训练好的权重和网络直接输出预测结果并作NMS了,没有所谓grid cell负责物体这个步骤了。

③同一个网格输出B个Box,而这B个Box的训练目标是一样的,为什么要回归出B个Box而不是1个Box就够了呢?

答:作者用两个bounding boxes 意味着网络有两个角度去拟合到真实情况. 比如说预测的两个bounding box都有目标,但是其中一个更准确,这样其实是类似于一种竞争机制。

 

参考:

https://blog.csdn.net/u014380165/article/details/72616238

https://blog.csdn.net/guleileo/article/details/80581858

 

你可能感兴趣的:(深度学习,YOLO,卷积神经网络,深度学习,目标检测)