YOLO V1损失函数的理解
网络输出格式回顾
首先回顾一下 YOLO V1 网络设计的输出[1]:
输入图像经过卷积神经网络后输出 7×7×1024 的特征图,经全连接层1输出为 4096 长度的特征向量,再经过全连接层2输出为 1470 长度的特征向量,最后经过resize操作,重塑成 7×7×30 的张量。
这里输出张量的尺寸大小是设计好的,主要利用的是感受野的概念[2],即输入图像的某块区域,在多次卷积和池化后,会映射到最后的特征图上某块特定的区域,这种概念启发作者可以将高维特征网格化,从而与原图局部区域产生关联,最终产生分而治之的效果。
具体地,将原图划分成 \(S \times S\) 的网格大小,那么通过设计网络结构,令输出张量的尺寸为 \(S \times S \times N\) 。当目标物的矩形框中心落在某个图像单元格内时,则相应的找到输出张量中对应的单元格张量(\(1 \times 1 \times N\) ,\(N=5B+C\) ),对于该单元格张量,输出 \(B\) 个矩形框及其置信度信息;同时给出用于分类的 \(C\) 长度的列向量。即输出两个同类别的不同大小的矩形框作为该单元格的预测结果。
论文中 \(S=7, B=2, C=20\),因此输出张量尺寸为 7×7×30 。
损失函数理解
原论文中给出的损失函数定义如下:
为方便理解,我们将上式拆成三部分,即定位损失 \(L_{lo}\)、置信度损失 \(L_{co}\)、分类损失 \(L_{cl}\):
其中 $ \lambda_{coord} = 5$ ,即需要重点关注定位损失。
公式中存在三个0-1 型的变量 \(\mathbb{1}_{ij}^{obj}\)、\(\mathbb{1}_{ij}^{noobj}\) 、\(\mathbb{1}_{i}^{obj}\) ,应这样理解:
结合上述变量的定义分析可知,只有网格中存在目标物时,才会计算定位损失、置信度损失以及分类损失,而网格中不存在目标物时,仅计算置信度损失。下面分析这三种损失具体怎么关联到网络输出和真值标签的。
定位损失
这里真值边界框中心点 \((\hat{x},\hat{y})\) 、以及边界框宽高 \(\hat{w}\) 、\(\hat{h}\) 都是归一化的。设原始图像的宽度为 \(w_s\),高度为 \(h_s\) ,网格设置为 \(S \times S\) ,边界框中心点在原图中的位置为 \((x_b,y_b)\) ,宽度为 \(w_b\),高度为 \(h_b\) ,则:
网格大小为:
边界框中心点相对于当前网格的归一化坐标为:
边界框相对于整张图的归一化宽高为:
因此在网络输出的边界框中心点 \((x,y)\) 、以及边界框宽高 \(w\) 、\(h\) 后,若该网格中存在目标物体,则中心点坐标计算平方误差,而对于边界框的高度和宽度,考虑到当产生同样长度的偏移量误差时,小的边界框应该比大的边界框更敏感才合理,因此在计算误差损失时,先进行开方处理,再求平方误差。
注意这里是对网格里的每一个预测的边界框都计算误差。
置信度损失
其中 $ \lambda_{noobj} = 0.5$ 。
这里是 \(C_i\) 表示的是置信度,\(\hat{C}_i\) 是置信度真值。根据论文描述,置信度由下式定义:
其中
从这里可以看出,置信度描述的是当前预测的边界框与真实边界框的重叠程度,当前网格有目标物出现(\(\mathbb{1}_{ij}^{obj} = 1, \mathbb{1}_{ij}^{noobj} = 0\)),才会考虑置信度。因此当网格中不存在目标物时(\(\mathbb{1}_{ij}^{obj} = 0, \mathbb{1}_{ij}^{noobj} = 1\)),预测的置信度要接近于 0 才对,因此也要给相应的惩罚,但图像网格中通常大多数是不存在物体的,如果全参与计算,会影响收敛,为了不影响整体,于是给了一个 $ \lambda_{noobj} = 0.5$ 。从分析可知,这里的真值是一个动态值,比较特殊。
由于一个网格一共预测了 B 个边界框,当网格中存在目标物时,会产生 B 个预测的结果,对应 B 个置信度,这时置信度最大的那个边界框真值就是自身的IOU值,该框作为正样本。而剩下的边界框作为负样本,置信度真值需要置为 0 。
同样的,当网格中不存在目标物时,所有的边界框都是负样本,因此对应的置信度真值都为 0 [3]。
以上置信度计算发生在训练阶段,是能够知道真值的,而在测试阶段(推理),上述置信度直接为网络输出的 \(C\) ,但此时,网格的类别概率也可以计算出来(\(Pr(Class_i |Object)\)),作者将置信度又重新定义为:
将二者相乘即可得到最终能够描述类别和边界框的置信度值。这个置信度通常叫 score,也就是输出的边界框包含所预测的类别的置信程度。而这个值,将会作为后续推理阶段的非极大值抑制的筛选参考值(例如 score > 0.5 的保留),从而滤除一些重叠率高的低置信度边界框。
分类损失
这里的分类损失和常规的多分类网络的处理方式一样,对于输出的列向量 \(\vec{p} = [p1,p2,\cdots,p_n]\),首先经过 softmax 函数处理成0~1的概率值,得到每个类的概率值 \(p_i(c)\) ,而对于 \(\hat{p}_i(c)\) 实际上对应的是 one-hot 处理过的类别向量(即只有目标类的下标元素值为1,其他的全为0)。能产生分类损失的前提当然是得有目标物体,因此只有 \(\mathbb{1}_{i}^{obj} = 1\) 时才参与计算。
预测与真值对齐
根据上数分析,则可以绘制出单个网格预测的张量与真值的对齐示意图[4][5]:
总结
通过上面的分析,可以总结出 YOLO V1 设计的局限性:
- 全连接层设计不太合理。网络最后的两层全连接,实际上破坏了特征的空间分布,从而引发检测精度问题。但是这主要可能是受当时的分类网络的惯性思维影响,并且全连接参数较多,所以通过两层来缓和。
- 漏检与小目标检测效果差。正是因为 YOLO V1 一个网格只预测一个类别的 B 个边界框,因此当同时有多个目标物体落到同一个网格中时,这时候由于前面的设计局限性,导致必然有些类无法预测,从而引发漏检。而 7×7 的网格划分也相对粗糙,整个网络最多输出 7×7×2 = 49 个边界框,因此当图像的物体分布为密集型的小目标时,预测效果不会太好。