yolo2 要点解析
虽然网络上各路大神对yolo2的主要特性和结构做了详细说明,但就程序的实现来说,很多未曾点明的细节仍然不是很清楚。本章不会对yolo2的结构和特性进行说明,只涉及一些yolo2的关键细节和概念,同时也是对自己不了解的部分做一个梳理。
边界框
边界框以(x, y, w, h)的方式表示它在图像中的位置,(x, y)表示边界框的中心点位于图像坐上角的相对位置,(w, h)是相对于图像大小的相对位置。即它们的范围都是[0, 1]。
先验框(锚框)
Yolo2引入了边界框先验(bounding box prior)的概念。我们不再期望模型为每张新图像直接生成唯一的边界框描述量,而是定义一个边界框集合,其中的边界框有不同的宽高比,这些宽高比嵌入了某些关于我们预计会检测到的目标的形状的先验信息。Redmond 提供了一种用于发现最佳宽高比的方法,即在你的训练数据集中的所有边界框上执行 k-均值聚类(使用一个自定义的距离度量)。
作用
我们不再直接预测边界框的尺寸,而是重新形式化了我们的任务,从而只需简单预测与我们的边界框先验尺寸的偏移量,这样我们就可以优化我们的预测边界框尺寸了。这种处理方式能让这一预测任务更容易学习。
更容易学习的意思是,模型最终的输出均为[0, 1]之间,按照归一化的思想,使得梯度下降更容易。
先验框与真值框的转换
模型最后输出的位置特征实际上是先验框和真值框之间的偏移量的预测值,它们之间的转换公式如下:
其中为预测的偏移量,为实际预测的边界框的位置, 为边界框的中心所在的格点的位置, 为先验框的宽和高。将的值限制在[0, 1]之间,实际上表达的是中心点相对于当前格点左上角的位移,再加上 后就变成了相对于特征图左上角的位移。
注意:以上的所有坐标的范围(除外)均为[0, conv_width],其中conv_width 为模型最终输出的特征图的宽度(设conv_width=conv_height)
损失函数
在计算损失时,需要知道的是模型最后输出的特征图的维度为:
(batch, conv_height, conv_width, num_anchors, 5 + num_classes)
最后一维的前5项分别是 tx, ty, th, tw, pc。
后面的num_classes分别是各类别的概率。
模型损失函数的计算包括以下几部分:
- 置信度损失(confidence_loss)
- 坐标损失(coordinates_loss)
- 分类损失(classification_loss)
总损失的计算公式为:
置信度损失
置信度表示了当前的锚框中存在物体的概率,因此置信度损失包含了物体实际存在与不存在时的条件损失,故此置信度损失的计算公式如下:
- 当物体实际不存在时,损失为(向量形式):
- 当物体实际存在时,损失为(向量形式):
总损失为条件损失之和
这里x5是为了罚重物体存在时的置信度损失。
坐标损失
模型最后得到的是预测的先验框和真值框之间的偏移,因此我们需要预先将正确的偏移量计算出来,然后再与预测值进行比较。
注意:坐标损失只针对物体实际存在的情况,物体不存在时损失为0。
预先求得正确的偏移量
为了计算正确的偏移量,我们首先需要获得真值框和与之匹配的先验框。但是一个图像中有多个真值框,并且先验框的数量同样有多个,那么我们怎样确定与真值框匹配的先验框呢?答案是,选择与真值框IOU值最大的那个先验框。
以一张图中的所有真值框为例,步骤如下:
- 取所有的真值框中的下一个真值框
- 将真值框大小缩放为最终模型生成的特征图的大小
- 以该真值框的中心为原点,并将所有的先验框移至原点
- 计算出真值框与所有先验框的IOU值
- 选择IOU值最大的先验框
- 按照转换公式(1) - (4)计算出实际的偏移量
- 返回第1步,直到遍历完所有的真值框
分类损失
分类损失直接使用预测的分类概率值与实际的分类概率值进行比较,计算公式为(向量形式):
注意:分类损失只针对物体实际存在的情况,物体不存在时损失为0。