目录
1 Yolo1算法解析
1.1 网络结构
YOLO结构就是单纯的卷积 + 池化 + 全连接层,只是最后的输出层用线性函数做激活函数,因为需要预测bounding box的位置(数值型),而不仅仅是对象的概率。YOLO结构如下:
1.2 输入和输出映射关系
1.2.1 输入:固定448*448
因为YOLO的网络中,卷积层最后接了两个全连接层,全连接层要求固定大小的向量作为输入,所以倒推回去也就是448*448。
1.2.2 输出:7*7*30
7*7网格:输入图像被划分为 7*7 的网格(grid),输出张量中的 7*7近乎对应着输入图像的 7*7 网格。
要注意的是,并不是说一个网格内的信息被映射到一个30维向量。经过神经网络对输入图像信息的提取和变换,网格周边的信息也会被识别和整理,最后编码到那个30维向量中。
30维向量:20个对象的概率 + 2个bbox * 4个坐标 + 2个bbox的置信度
(1)20个对象分类的概率
因为YOLO支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率(条件概率)。
(2)2个bounding box的位置
每个bounding box需要4个数值来表示其位置(Center_x,Center_y,width,height),2个bounding box共需要8个数值来表示其位置。
(3)2个bounding box的置信度
bbox的置信度 = 该bbox内存在对象的概率 * 该bbox与该对象实际bbox的IOU,公式如下:
Pr是bbox内存在对象的概率,并不管是哪个对象,是有对象或没有对象的概率。
IOU是预测的bbox与对象真实的bbox的IOU在值。(仅在训练阶段计算此IOU,在inference阶段不需要也无法计算IOU了。)
置信度的物理意义:是否包含对象且位置准确的程度。
1.2.3 重点
(1)一张图片最多只可以检测出49个对象。
(2)总共有 49*2=98 个候选区。
(3)2个bbox的作用
YOLO的2个bbox事先并不知道会在什么位置,只有经过前向计算,网络才会输出2个bbox。这两个bbox与样本中对象实际的bbox计算IOU,IOU值大的那个作为负责预测该对象的bbox。
训练开始阶段,网络预测的bbox可能都是乱来的,但总是选择IOU相对好一些的那个。随着训练的进行,每个bbox会逐渐擅长对某些情况的预测(可能是对象大小、宽高比、不同类型的对象等)。所以,这是一种进化或者非监督学习的思想。
(4)一个Object只由一个grid来进行预测
在设置训练样本的时候,样本中的每个Object归属到且仅归属到一个grid,即便有时Object跨越了几个grid,也仅指定其中一个。具体就是计算出该Object的bounding box的中心位置,这个中心位置落在哪个grid,该grid对应的输出向量中该对象的类别概率是1(该gird负责预测该对象),所有其它grid对该Object的预测概率设为0(不负责预测该对象)。
同样,虽然一个grid中会产生2个bbox,但我们会选择其中一个作为预测结果,另一个会被忽略。
(5)网格数量、bbox数量可调。
1.3 样本和label的处理
YOLO的标注就是简单的标个矩形框,以及该矩形框内目标的类型。但是,从上面我们已经知道YOLO1输出是7*7*30维度的向量,那么训练样本也要制作成此维度,这样才能够通过损失函数去做监督学习。
一张样本图片如下:
上图的标签7*7*30维度数据处理后的最终结果形态:
20个对象分类的概率
计算人工标注时的矩形框中心点坐标,判定该坐标落在7*7哪一个网格内,比如上图的自行车,其中心点在黄色圆点位置(第24个网格),所以,此网格对应的30维向量中,自行车的概率就是1,其他对象的概率全是0。而且,除此之外的48个网格的30维向量,全部是0值。
这就是所谓的"中心点所在的网格对预测该对象负责"。狗和汽车的分类概率也是同样的方法填写。
2个bbox的位置
标签的两个bbox,填左右哪一个?这个将在训练过程中动态决定。上面讨论过,在训练过程中等网络输出以后,比较两个预测的bbox与自行车实际位置的IOU,如果IOU大的那个预测bbox出现在左边,那么标签的bbox也与之对应放在“左边”,右边坐标填0。
所以,要在训练过程中才能动态决定label到底填哪一个bbox。
2个bbox的置信度
label的bbox坐标知道填哪一个了,那么置信度也就知道填哪一个了。label的两个置信度一个填1,另一个填0。
1.4 损失函数
标签和模型预测输出形态如下:
损失函数的公式
边框回归Loss:
置信度Loss:
总的来说,就是用网络输出与样本标签的各项内容的误差平方和作为一个样本的整体误差。 损失函数中的几个项是与输出的30维向量中的内容相对应的。
损失函数的解释
(1)对象 分类 误差
公式第5行,带有,意味着存在对象的网格才计入误差。
(2) bbox的 坐标 误差
- 公式第1,2行,都带有,意味着只有"负责"(IOU比较大)预测的那个bbox的数据才会计入误差。
- 第2行公式宽度w和高度h取了平方根原因:减少大物体的预测框和真实框的像素差及其loss计算结果远比小物体大的多问题。取平方根可以降低这种尺度的差异导致的loss计算不公平问题。(我:直接计算预测和标签w,h的百分比差不更平衡吗?)(这种开根号方式理论上不错,但实际上并没提升多大效果,在yolo3中把根号改成了log())
- 乘以调节bounding box位置误差的权重(相对分类误差和置信度误差)。默认设置为5,即调高位置误差占比的权重。
(3) bbox的 置信度 误差
- 公式第3行含义:存在对象的bbox的置信度误差。意味着只有"负责"(IOU最大的)预测的那个bounding box的置信度才会计入误差。
- 公式第4行含义:不存在对象的bbox的置信度误差。当你让网络去学习N类物体时,它实际上需要学习N+1类物体,这个1就是“背景”类。不存在对象的bbox应该老老实实的说"我这里没有对象",也就是输出尽量低的置信度。如果它不恰当的输出较高的置信度,会与真正"负责"该对象预测的那个bbox产生混淆。其实就像对象分类一样,正确的对象概率最好是1,所有其它对象的概率最好是0。
- 此外,乘以调节不存在对象的bbox的置信度的权重(相对其它误差)。默认设置为0.5(因为“背景类”太多了,所以此超参数设小点),即调低不存在对象的bbox的置信度误差的权重。
1.5 NMS
NMS核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。
Yolo1中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处理下一种对象
- 遍历该对象的98个得分
- 输出列表即为预测的对象
疑惑解答:
- 为什么要设定2个bbox?
- 答:一个可能不稳定,这是anchor的雏形,yoloV3时变成了9个!
- 为什么最后特征图大小是7*7?
- 答:没奇特,yolo2中变成了13*13。
- 如果2个物体中心都落在同一个7*7格子中怎么办?
- 答:Yolo1也处理不了这种情况。。。(我:如果是训练阶段,这种2个GT标签的哪个设为GT?)
主要参考
基于上述文章,自己绘制了更细致的图形来解释原理和标签自作。