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

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

Yolo核心思想

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

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

Pr(Obj)IoU(pred,GT)

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

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

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

网络结构

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

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

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

Loss函数

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

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

置信度误差项中λnoobj设置为0.5,调低负样本置信度损失的权重

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

对比实验

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

重新画饼图主要是我想玩一下mermaid画图
72%9%4%14%2%Fast R-CNNCorrect 71.6%Loc 8.6%Sim 4.3%Background 13.6%Other 1.9%
66%19%7%5%4%YOLOCorrect 65.5%Loc 19.0%Sim 6.75%Background 4.75%Other 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


论文原文
YOLO解读
YOLO解读