基本YOLO模型能够以每秒45帧实时处理图像,较小版本fastyolo每秒处理155帧,同时仍能达到其它实时探测器2倍的mAP

YOLO的意思就是You only look at once,从名字上听起来就非常快,在RCNN系列的网络中采用的是two-stage方法,即先生成候选框,然后对候选框进行分类,而以YOLO为代表的one-stage方法则是直接回归到类别概率和物体坐标

Yolo核心思想

Yolo的思想非常简单,就是将输入的图像划分成$S\times S$的格子,如果检测物体的中心在某个格子内,那个这个格子就负责检测这个物体

每个格子会预测B个bbox以及其对应的置信度(confidence scores),置信度表示bbox包含一个物体的确定程度和bbox的准确度,所以其计算公式为

$Pr(Obj) \cdot IoU(pred,GT)$

公式的含义是,若格子中有物体,则置信度为$IoU(pred,GT)$,否则为0

每个bbox由5个预测组成:x、y、w、h和置信度。(x,y) 坐标表示长方体相对于网格单元边界的中心。w和h对图像的宽度和高度进行了预测。置信度预测表示预测框和任何GT之间的IoU

此外,每个格子预测C个分类,所以输出量为$S\times S \times (5*B+C)$

网络结构

网络类似GoogleNet,包含24层卷积层和2层全连接层,用$3 \times 3$卷积层接$1\times 1$还原层(reduction layers)替代了GoogleNet的初始模块,这种方式降低了计算量,同时提升了模型的非线性能力

输入图像的尺寸为$448\times 448$,输出为$7\times 7 \times 30$的tensor $(S=7,B=2,C=20)$

这里我们可以发现,对于一个格子的两个bbox,其实是共用一份类别预测的,也就是说,YOLO会对于一个格子预测两个框,然后选择IoU更高的一个来使用这个类别预测,整张图最多只能检测出$S\times S$个物体

Loss函数

YOLO使用均方和误差作为loss函数来优化模型参数,Loss函数分为三个部分,坐标误差,置信度误差和类别误差,具体见下图 (图源自CSDN,链接见文末)

坐标误差项计算的是正样本中心坐标的损失,$\lambda_{coord}$设置为5,提高位置损失的权重,而w和h做了开方处理,这是因为,小的bbox的偏移比大的bbox的偏移更不能被接受,而开方之后,较小的bbox的偏差对loss会有更大的影响 (横轴值较小,偏移时,反映到纵轴上较大)

置信度误差项中$\lambda_{noobj}$设置为0.5,调低负样本置信度损失的权重

类别误差项计算正样本的类别损失

对比实验

查看下图对比可以知道YOLO的背景图像的误检率是低于Fast R-CNN (这是因为YOLO相比RCNN系列获得更多的全局信息),但是在定位上比Fast R-CNN略逊一筹

重新画饼图主要是我想玩一下mermaid画图
pie title Fast R-CNN "Correct 71.6%" : 71.6 "Loc 8.6%" : 8.6 "Sim 4.3%" : 4.3 "Background 13.6%" : 13.6 "Other 1.9%" : 1.9
pie title YOLO "Correct 65.5%" : 65.5 "Loc 19.0%" : 19.0 "Sim 6.75%" : 6.75 "Background 4.75%" : 4.75 "Other 4.0%" : 4.0

Correct: correct class and IOU > .5
Localization: correct class, .1 < IOU < .5
Similar: class is similar, IOU > .1
Other: class is wrong, IOU > .1
Background: IOU < .1 for any object