论文原文:https://arxiv.org/pdf/1506.02640.pdf
1 网络结构
1)结构
YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的CNN对象分类网络几乎没有本质的区别,最大的差异是最后输出层用线性函数做激活函数,因为需要预测bounding box的位置(数值型),而不仅仅是对象的概率。
2)输入和输出的映射关系
3)输入
输入就是原始图像,唯一的要求是缩放到448*448的大小。主要是因为YOLO的网络中,卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入,所以倒推回去也就要求原始图像有固定的尺寸。那么YOLO设计的尺寸就是448*448。
4)输出
输出是一个 7*7*30 的张量(tensor)。
4.1)7*7网格
根据YOLO的设计,输入图像被划分为 7*7 的网格(grid),输出张量中的 7*7 就对应着输入图像的 7*7 网格。输入图像中的每个网格对应输出一个30维的向量。
4.2)30维向量
具体来看每个网格对应的30维向量中包含了哪些信息。
2 训练
损失函数
简单的全部采用了sum-squared error loss会有以下不足:
a) 8维的localization error和20维的classification error同等重要显然是不合理。
b) 如果一些网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的bounding box的confidence 置为0,相比于较少的有object的网格,这些不包含物体的网格对梯度更新的贡献会远大于包含物体的网格对梯度更新的贡献,这会导致网络不稳定甚至发散。
为了解决这些问题,YOLO的损失函数的定义如下:
更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 λcoord ,在pascal VOC训练中取5。(上图蓝色框)
对没有object的bbox的confidence loss,赋予小的loss weight,记为 λnoobj ,在pascal VOC训练中取0.5。(上图橙色框)
有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。
对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏相同的尺寸对IOU的影响更大。而sum-square error loss中对同样的偏移loss是一样。
为了缓和这个问题,作者用了一个巧妙的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。
3 测试
Test的时候,每个网格预测的class信息 相乘,就得到每个bounding box的class-specific confidence score。
NMS(非极大值抑制)
NMS核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。
YOLO的NMS计算方法如下。
网络输出的7*7*30的张量,在每一个网格中,对象位于第j个bounding box的得分:
它代表着某个对象存在于第j个bounding box的可能性。
每个网格有:20个对象的概率*2个bounding box的置信度,共40个得分(候选对象)。49个网格共1960个得分。Andrew Ng建议每种对象分别进行NMS,那么每种对象有 1960/20=98 个得分。
NMS步骤如下:
1)设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)
2)遍历每一个对象类别
2.1)遍历该对象的98个得分
2.1.1)找到Score最大的那个对象及其bounding box,添加到输出列表
2.1.2)对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的bounding box的IOU
2.1.3)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)
2.1.4)如果所有bounding box要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象
3)输出列表即为预测的对象
参考:
1. YOLO v1深入理解