1、训练-training
将输入图像划分为S*S个grid cell,每个grid cell预测((x,y,w,h,conf)*B+num_class)个值;计算该“长方体”(7*7*30)与真值“长方体”(7*7*30)的损失函数,根据loss调整网络参数。
其中B为每个grid cell预测的bbx个数,num_class为数据集的class数量。为表示方便,依照原论文取S=7,B=2,num_class=20。
1.1 真值
真值“长方体”,初始全设为0(7*7*30)。
对于负责预测物体的grid cell(obj真值框中心落在该grid cell内),2个bbx的x,y都为obj中心点相对于该grid cell左上角的偏移量,2个bbx的w,h都为真值框宽高相对于图像宽高的比值,2个bbx的conf都设为1,有了预测框后改为真值框分别与2个预测框的IOU;后20个class值为one-hot编码,真值框对应的obj类别处设为1。
其它值处保持为0。
1.2 损失函数
负责预测物体的grid cell中预测了两个bbx,取与真值框IOU大的bbx作为“负责预测物体的bbx”。
损失分为三部分:
第一部分为位置误差,对于负责预测物体的bbx,计算x,y,w,h的平方和误差,其中w,h进行根号处理,对于相同大小的误差,对小框的惩罚比大框要重;乘以lmd_coord=5提高权重。
第二部分为置信度误差,对于负责预测物体的bbx,使conf逼近IOU;对于其它框(包括不含obj中心的grid cell中的框和含obj中心的grid cell中IOU较小的框),使conf逼近0,由于其它框很多,乘以lmd_noobj=0.5降低权重。都使用平方和误差计算损失以逼近。
第三部分为分类误差,对于负责预测物体的grid cell,使用平方和误差计算损失以逼近one-hot真值。
综上,对于负责预测物体的bbx,需要计算位置以及置信度误差损失,其它bbx则只需要计算置信度误差损失;分类损失只需要考虑负责预测物体的grid cell。没考虑的部分损失忽略了。
2、预测-inference
输入图像经过网络后预测出了一个7*7*30的长方体,对每个grid cell,将2个bbx的conf分别与20个类条件概率相乘,得到40个class score,依此进行非极大值抑制筛选出最终的预测框,并在图像上可视化(x,y,w,h+class+class score)。
2.1 非极大值抑制(Non-maximal suppression,NMS)
① 求出所有的class score,共7*7*2*20个,按照bbx排列为98列(20*98):
② 对于每一行(即每一个类),筛去小于score阈值的bbx,令其score=0;对该类的score从大到小排序:
③ 从第一个框开始设为bbx_max,计算它与其后面的所有非0框的IOU,IOU大于阈值的设score=0(即重合度很高的两个bbx,取score大的那个)筛去与其重合度高的框。
④ 再设第二大的非0框为bbx_max(上一步保留下来的),计算它与其后面的所有非0框的IOU,IOU大于阈值的设score=0。如此往后不断重设bbx_max,直到其后没有bbx计算IOU,剩下的框即为该类所有的bbx。
⑤ 对20个类都进行②③④步操作,得到一个20*98的稀疏矩阵(很多0),获取其中score不为0的bbx+class+class score。
3、网络
YOLO v1的网络架构受GoogLeNet分类网络启发,含有24个卷积层,4个maxpool层降采样,和2个全连接层预测输出长方体。
其中,卷积层多使用1*1Conv.降维后紧接3*3Conv.提取特征,能加快特征提取效率;由于含有FC层,FC层有确定大小,所以输入图像需要限定尺寸,若只有卷积层则任意大小的图像都可以直接输入网络。
4、优缺点
4.1 优点
① 快,简单
② 根据图像全局信息作预测,不像那些使用region proposal或者滑动窗口的,只考虑框框内的信息,不联系上下文。
③ 对新领域的图片或意想不到的输入更难崩坏。比如在自然图像上训练,却输入艺术图像进行测试,YOLO比其它检测算法表现更好(具体什么表现不知道)。
4.2 缺点
① 空间限制(spatial contraints),对成群的小物体预测能力较差,例如鸟群,一个grid cell只能预测一个物体,7*7的网格最多预测49个物体,可能一个grid cell中就有十几只鸟。
② 由于是从训练集数据中学习模型,若物体呈现训练集中没出现过的长宽比,则泛化能力较差。
③ 有好几层下采样层,提取的特征比较粗糙,导致精度低。
④ 定位误差大。