总体结构如上图,就是通过一个卷积神经网络,直接对目标检测预测框的 类别、x、y、w、h 直接进行回归。
卷积部分其实就是一个特征图提取和计算的过程,如上图红色框部分。
个人理解就是能实现很复杂计算的一个特征提取部分,将输入的图片转换成特征图层,并基于这个卷积部分提取的特征图层,结合后面的全连接层进行anchor的(x, y, w, h)、置信度、和各个类别分数的回归。
全连接层部分就是将特征图层转换成我们想要的 7×7×30,上图红色框部分。
为什么是 7×7×30 呢,原因如下图:
我们可以看到 7×7×30 里包含了两个anchor框的位置大小信息(x, y, w, h),两个anchor框置信度(是目标还是背景),还有二十个类别的预测分数。
我们仔细来看这一部分,就会发现特征图层在这一部分前面是 7×7×1024,原论文是这样处理的,
先将特征图层 flatten() 展平,然后接一个 4096 的全连接层,后面再接一个 1470 的全连接层。1470 = 7×7×30
这样,直接通过一个 reshape 将全连接层转换成 7×7×30 的预测特征图层,7×7×30里面的每个1×1×30就包含了前面提到的:
box1(x, y, w, h) + confidence1 + box2(x, y, w, h) + confidence2 + 20个类别预测分数
这里的anchor的置信度是判断目标框还是背景框,起着去除多余框的作用,如下图,如果没有置信度来判断目标框还是背景框,根据(x, y, w, h)画出来的预测框是下图这个样子的,有很多黑框,但是只有加粗的黑框才是有用的。
因此我们加入置信度,判断黑框是否是目标框,就可以去除掉背景框的预测,如下图。
训练时,回归的是 中心点落在这个像素位置范围内的 Ground Truth 框的(x, y, w, h)。
x, y:框中心点的 x, y;
w, h:框的宽(width)和高(height)
由于YOLOv1论文使用的数据集只有20各类别,因此,是用20个数值来表示各类别的预测分数;如果是30各类别,则需要30个数值,就需要转换成 7×7×40 的 tensor 进行回归训练。
这里损失中用了权重系数来进行平衡,对于不同的损失用不同的权重。
L(obj)(ij) 表示第i个网格中的第j个预测框是否负责obj这个物体的预测,只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值,和ground truth box的IoU是不是在那个网格的所有box中最大。
入coord 表示权重参数,取5。
蓝色为预测框,两个红色框则分别表示两个ground truth框,如果不采用均方差,我们会发现A与B、B与C的损失是一样的。
但是从面积上看,B框是A框的25倍,C框是B框的81/25倍。B框跟A框的大小偏差更大,所以不应该有相同的loss。如果W和h加上平方根,那么B对A的位置loss约为3.06,B对C的位置loss约为1.17,B对A的位置loss的值更大,这更加符合我们的实际判断。所以,算法对位置损失中的宽高损失加上了平方根。
L(obj)(ij) 表示第i个网格中的第j个预测框负责obj这个物体的预测,当 负责 obj这个物体预测的时候置为 1;
L(noobj)(ij) 表示第i个网格中的第j个预测框不负责obj这个物体的预测,当不负责 obj这个物体预测的时候置为 1;
入(noobj) 的作用是在对没有object的box的confidence loss,赋予小的loss weight,在pascal VOC训练中取0.5;而有object的box的confidence loss和类别的loss的loss weight正常取1。
L(obj)(i) 表示第i个网格是否需要进行类别预测。
(pi© - pi©)^2就是通过平方差计算损失,这里用交叉熵进行计算或许更好。
YOLOv1就是通过卷积神经网络提取图片中的特征信息,并将特征图层转换成我们想要的7×7×30,直接对预测框的 置信度、位置大小、类别分数 进行训练回归。
有什么补充或者问题,欢迎交流。
如有错误,恳请各位大佬指正。