YOLO:实时目标检测
基本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略逊一筹