1、YoLo算法
YoLo 算法采用一个单独的CNN模型实现端到端的目标检测,利用整张图作为网络的输入,直接在输出层回归bounding box的位置及其所属的类别,结构如下图所示:
- 图片resize成固定大小
- 送入CNN网络,进行分类回归任务
YoLo算法和R-CNN算法不同之处就是YoLo算法是一个整体的框架(one-stage),而R-CNN是two-stage,需要提取候选框和目标分类回归两个步骤。
1.1 算法思想
YoLo是You Only Look Once,不同于R-CNN之处就是将候选区域提取和目标分类回归合二为一,你仅仅看一眼就知道图片中有哪些对象以及它们的位置。
YoLo模型采用与定义预测区域的方法来完成目标检测,就是将原始图像划分为个grid,如果某个object的中心落在这个网格内,则这个grid就负责预测这个object。每个网格要预测B个bounding box,每个bounding box除了要预测位置之外,还要附带预测一个confidence值。每个网格还要预测C个类别的分数。
通过得到这98个目标的分类和回归结果,再进行NMS就可以得到最终的目标检测结果。
1.2 YoLo的网络结构
YoLo的结构比较简单,通过卷积-池化-全连接,基本上和CNN分类网络没有本质上的区别,最大的不同就是输出层用线性函数作为激活函数,目的是为了预测bounding box的位置。简单的说,YoLo的结构就是输入图片经过神经网络的变换得到一个输出的张量,如下图所示:
1.2.1 网络输入
网络输入为原始图像,需要resize为448x448。因为最后的卷积层后接了两个全连接层,而全连接层需要固定的向量所为输入。因此YoLo的输入图像大小为448x448
1.2.2 网络输出
YoLo的输出是一个7x7x30的张量。根据YoLo的设计,输入图像被划分为7x7的grid,输出张量中的7x7对应着输入图像的7x7网格。或者我们把7x7x30的张量看作是49个30维的向量,也就是输入图像中的每个网格对应输出一个30维的向量。如下图所示:
其中,30维的向量包含2个bounding box的位置和confidence以及该网格属于20个类别的概率(使用的是VOC数据集,因此是20个类别(猫,狗,鸟……)。如果使用的是COCO数据集,则为80个类别)
- 2个bounding box 的位置,中心点坐标和bbox的宽度和高度
- 2个bounding box 的置信度confidence
- 20个对象的分类概率(属于该类别的概率)
bounding box的置信度=该bounding box内存在对象的概率*该bounding box与该对象实际bounding box的IOU,公式如下:
是bounding box内存在对象的概率
1.3 YoLo模型训练
1.3.1 构建训练样本
将一幅图片送入到YoLo模型中,对应输出的是7x7x30的张量,构建标签label时对于原图像中的每一个grid都需要构建一个30维的向量。
1. 20个对象的概率
对于输入图像中过的每一个对象,先找到中心点(真实标签值)。如上图的自行车,其中心点在黄色圆点位置,中心点落在黄色网格内,所以这个黄色网格对应的30维向量中,自行车的概率是1,其他对象的概率是0。所有其他48个网格的30维向量中,该自行车的概率都是0。这就是“中心点所在的网络对预测该对象负责”。狗和汽车的分类概率也是同样的方法。
2. 2个bounding box的位置
训练样本的bounding box位置应该是该对象真实位置的bounding box,但是一个对象对应了2个bounding box,需要根据网络输出的bounding box与对象实际的bounding box的IOU来决定,因此要在训练过程中动态决定到底用哪一个bounding box。
3. 2个bounding box的confidence
根据以上可知,预测置信度公式:是利用网络输出的2个bounding box与对象真实bounding box计算出来的。通过对比这两个bounding box的IOU,较大的负责预测该对象,即该bounding box的
,同时对象真实bounding box的位置填入该bounding box。另一个不负责预测的bounding box的
,也就是置信度与IOU值直接相关,而
判断改变框是否负责该对象。
上图中自行车所在的grid对应的结果如下图所示:
1.3.2 损失函数
损失就是网络实际输出和样本标签间的偏差:
损失函数:
其中表示目标是否出现在网格单元
中,
表示单元格
中的第
个边界框预测器负责该预测,YoLo设置
即调低不存在对象的bounding box的置信度误差的权重。
计算边框高度、宽度误差损失用开方的说明:
的变化率逐渐趋于平缓,而
的变化率是1,假设小框预测的宽度与真实宽度的差值等于大框预测的宽度与真实宽度的差值,那么
,而
,也就是损失将会相同,这即是加上开方的原因,让损失差异化。
拿上图中右边的举个例子:
假设小图尺寸是3x3个像素,大图尺寸是10x10个像素。如果小图和大图预测的宽高误差都是一个像素,则小图的IOU是28.57%,而大图的IOU是68.07%,显然在宽高差值同等的情况下,损失是完全不同的。
1.3.3 模型训练
YoLo先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练。
YoLo的最后一层采用线性激活函数,其它层都是Leaky ReLU。训练中采用了drop out和数据增强(data augmentation)来防止过拟合。
1.4 模型预测
将图片resize为448x448的大小,送入到YoLo网络中,输出一个 7x7x30 的张量(tensor)来表示图片中所有网格包含的对象(概率)以及该对象可能的2个位置bounding box和置信度。在采用NMS算法选出最有可能是目标的结果。
1.5 总结
优点
- 速度非常快,处理速度可以达到45fps,其快速版本(网络较小)甚至可以达到155fps。
- 训练和预测可以端到端的进行,非常简便。
缺点
- 准确率会打折扣
- 对于小目标和靠的很近的目标检测效果并不好