AI大视觉(二) | Yolo v1 为何只要看一眼就够了?

 本文来自公众号“AI大道理”

RCNN系列属于候选区域/窗 + 深度学习分类的两步走方法。

即使是该系列最好的模型还是无法达到实时检测目标的效果,获取region proposal, 再对每个proposal分类计算量还是较大。

灵魂的拷问:两步走无法再进一步了,那能否一步到位?

YOLO,you only look once,就是一步到位的算法。

它去掉了获得候选区域的这一步。

那它是怎么去掉的呢?去掉后性能又会有怎么样的影响呢?

​YOLO v1的思想

YOLO创造性的将物体检测任务直接当作回归问题(regression problem)来处理,将候选区和检测两个阶段合二为一。

只需一眼就能知道每张图像中有哪些物体以及物体的位置。

(AI大视觉:RCNN是撒小渔网,YOLO V1是撒大渔网,一个和鱼塘一样大的渔网撒下去,看每个区域里有没有鱼)

YOLO 把一张图片划分成了 SxS 个格子。

S 取值为 7,所以整张图片被分割成 7*7=49 个格子(Cell)。

这些 Cell 每个 Cell 都会预测 B 个 bbox。

若 B 取值为 2则一张图片经 YOLO 跑一遍,就会产生 98 个 bbox。

图片中有狗、自行车、汽车 3 个目标,但是预测到的 bbox 有 98 个之多,最终肯定只能从 98 个 bbox 中选择 3 个。

在上面的图片中,1,2,3等这些 cell 不包含任何的目标,所以它们的 P r ( O b j ) Pr(Obj)Pr(Obj) 为0,所以 Confidence 也为 0。

8 和 23 两个 cell 因为包含了自行车和狗的一部分,所以它们的 P r ( O b j ) Pr(Obj)Pr(Obj) 为 1,它们的 Confidence 实质上就是 bbox 和 groundtruth 的 IOU。

另外怎么判断某个 cell 中有没有包含 Object 呢?

这其实是通过 label 中的 groundtruth 在线算出来的。

因此,一张图片经过 YOLO 跑一遍后,除了预测出 98 个 bbox,还会给出 49 个 cell 的 confidence。

一个 Object 可能覆盖很多个 Cell,还需要从中选择一个 Cell,作为代表,这个 Cell 就负责(responsible)此 Object 的预测。

Object 的中心落在哪个 cell,就决定了那个 cell 的核心地位。

灵魂的拷问:YOLO V1真的去掉候选区域了吗?

YOLO并没有真正去掉候选区,而是采用了预定义候选区的方法,也就是将图片划分为7*7个网格,每个网格允许预测出2个边框,总共49*2个bounding box,可以理解为98个候选区域,它们很粗略地覆盖了图片的整个区域。

但这样所谓的候选区域是简单明了的给出来的,不是靠选择性搜索或者神经网络学习到的,所以不算单独的一步。

可以说去掉了获得候选区域的算法和步骤,而没有去掉候选区域的思想。

候选区域从2000个降低到98个,精度肯定会有所下降。

​YOLO  v1的网络结构

YOLO v1 的模型结构受 GoogLeNet 启发。

YOLO 采用了 1x1 和 3x3 的序列组合替代 Inception 模块。

总共 24 个卷积层加上 2 个全连接层。

输出层正是前面提到过的 7x7x30 的 tensor,用来预测最终的结果。

7x7 对应图像分割成 49 个 cell。

30 包含了 2 个 bbox 的数据,及 20 个 class 的概率。

​yolo v1 的损失函数

(1)预训练。采用前20个卷积层、平均池化层、全连接层进行了大约一周的预训练;

(2)输入。输入数据448*448大小的图像;

(3)采用相对坐标。通过图像宽度和高度来规范边界框的宽度和高度,使它们落在0和1之间;边界框x和y坐标参数化为特定网格单元位置的偏移量,边界也在0和1之间;

(4)损失函数

训练中损失函数的分析,YOLO算法将目标检测看成回归问题,所以采用的是均方差损失函数,包括区分定位误差和分类误差。

 Loss 要计算:

  • 中心点的 Loss

  • 宽高的 Loss

  • 置信度的 Loss

  • 目标类别的 Loss

其中:

边界框的大小和位置用4个数值来表示,(x, y, w, h),其中(x,y)是边界框的中心坐标,而w和h是边界框的宽与高。

中心坐标的预测值(x,y)是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的。

边界框的w和h预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在[0,1]范围。

对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。

而sum-square error loss中对同样的偏移loss是一样。

为了缓和这个问题,将box的width和height取平方根代替原本的height和width。

每个边界框的预测值实际上包含5个元素:(x,y,w,h,c),其中前4个表征边界框的大小与位置,而最后一个值是置信度。

如果有object的中心落在一个网格里面,*的前第一项取1,否则取0。第二项是预测的边界框和ground-truth之间的IoU值。

IOU(交并比):

IoU是两个区域重叠的部分除以两个区域的集合部分得出的结果,通过设定的阈值,与这个IoU计算结果比较。

​yolo v1 的训练

YOLOv1在预训练时采用的是224*224的输入(在ImageNet数据集上进行),然后在检测的时候采用448*448的输入。

在训练之前,先在ImageNet(用于图像分类的数据集合)上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。

预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。

由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。

​yolo v1 的预测

训练好的YOLO网络,输入一张图片,将输出一个 7*7*30 的张量(tensor)来表示图片中所有网格包含的对象(概率)以及该对象可能的2个位置(bounding box)和可信程度(置信度)。

对于每个预测框选取置信度最大的那个类别作为其预测标签,得到各个预测框的预测类别及对应的置信度值,其大小都是[7,7,2]。

一般情况下,会设置信度阈值,就是将置信度小于该阈值的box过滤掉,剩余的是置信度比较高的预测框,对预测框使用NMS算法,最后留下来的就是检测结果。

NMS是区分每个类别分别使用NMS。

NMS方法并不复杂,其核心思想是:

选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。

NMS步骤如下:

  • 设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)

  • 遍历每一个对象类别

  • 遍历该对象的98个得分

  • 找到Score最大的那个对象及其bounding box,添加到输出列表

  • 对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的bounding box的IOU

  • 根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)

  • 如果所有bounding box要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象

  • 输出列表即为预测的对象



​总结

YOLO V1检测物体速度非常快,其增强版GPU中能跑45fps(frame per second),简化版155fps。

YOLO V1精度低于其它state-of-the-art的物体检测系统,容易产生定位错误。

对小物体检测效果不好,尤其是密集的小物体,因为一个栅格只能检测一个物体。

由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体处理上还有待加强。

一个grid cell只能预测一个class,当一个grid cell中同时出现多个类时,就无法检测出所有类。

基于这些问题,如何进行改进呢?

YOLO V2给出了答案。

 

   

 ——————

浅谈则止,细致入微AI大道理

扫描下方“AI大道理”,选择“关注”公众号

—————————————————————

​     

—————————————————————

投稿吧   | 留言吧

萍水相逢逢萍水,浮萍之水水浮萍!
原文地址:https://www.cnblogs.com/AIBigTruth/p/14689142.html