本文来自公众号“AI大道理”
RCNN系列属于候选区域/窗 + 深度学习分类的两步走方法。
即使是该系列最好的模型还是无法达到实时检测目标的效果,获取region proposal, 再对每个proposal分类计算量还是较大。
灵魂的拷问:两步走无法再进一步了,那能否一步到位?
YOLO,you only look once,就是一步到位的算法。
它去掉了获得候选区域的这一步。
那它是怎么去掉的呢?去掉后性能又会有怎么样的影响呢?
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 的模型结构受 GoogLeNet 启发。
YOLO 采用了 1x1 和 3x3 的序列组合替代 Inception 模块。
总共 24 个卷积层加上 2 个全连接层。
输出层正是前面提到过的 7x7x30 的 tensor,用来预测最终的结果。
7x7 对应图像分割成 49 个 cell。
30 包含了 2 个 bbox 的数据,及 20 个 class 的概率。
(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计算结果比较。
YOLOv1在预训练时采用的是224*224的输入(在ImageNet数据集上进行),然后在检测的时候采用448*448的输入。
在训练之前,先在ImageNet(用于图像分类的数据集合)上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。
预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。
由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。
训练好的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大道理”,选择“关注”公众号
—————————————————————
—————————————————————
AI大视觉(二) | Yolo v1 为何只要看一眼就够了?
原文:https://www.cnblogs.com/AIBigTruth/p/14689142.html