YOLO(You Only Look Once: Unified, Real-Time Object Detection)是一种2016年提出的用于视觉检测的算法,与之前的算不同,YOLO改变了检测的过程将检测转化为了一个回归问题,输出目标的bbox和p(概率)。相较于之前的算法,YOLO的执行速度很快,base YOLO可以达到45fps而fast YOLO可以达到155fps,基本可以满足实时的检测和输出,延时也将小于25ms。从结果上看,YOLO的局部检测效果较差,但也很少出现FP现象,同时YOLO对于大型目标的检测相对效果好且不易误判为背景。(对于检测结果存在四种可能:TP,FP,FN,TN)
YOLO的设计思想来源于人眼的单次观看识别,将图像整体作为YOLO的输入,经过resize,run cnn,NMS三个步骤即可得到输出。
网络特点:1.由于网络的结构十分简单,因此网络的识别速度很快,相较于同期的实时算法YOLO达到了两倍以上的准确率。
2.由于检测以整个图像作为输入,内部数据联系紧密,降低了背景的错误识别。
3.网络的适应性较好,在测试集与训练集不完全一致时仍能有较好效果。
网络将采用来自整张图片的特征同时对所有的目标进行检测和bbox预测,网络是一种端到端的结构,对于输入的图片可以直接输出bbox和p。对于输入图片将划分成SS个网格区域,检测目标的中心与所在网格关联。每个划分的网格都将产出B个bbox和score,score=P(Object)IoU,每个bbox都对应5个数据:坐标(x,y,w,h)和score。YOLO在检测时,同时预测网格是否包含目标中心和目标基于存在目标时属于各个种类的概率,最终可以计算目标属于各分类的概率。所以对于此设定下的YOLO网络,单个图片将输出规模为(SS(B5+C))的张量。
YOLO检测网络包括24个卷积层和2个全连接层,如图所示:
值得注意的是最终的输出一定是7730的张量(30=(2*5+20),2个bbox:坐标+置信率,20种分类概率)
损失函数方面,采用均方差的方式把localization error(bounding box的坐标误差)和classificaton error整合在一起。但是如果二者的权值相等,容易导致模型不稳定,训练发散。因为很多grid cell是不包含物体的,这样的话很多grid cell的confidence score为0。所以采用设置不同权重方式来解决,一方面提高localization error的权重,另一方面降低没有object的box的confidence loss权值,loss权重分别是5和0.5。而对于包含object的box的confidence loss权值还是原来的1。详见下面的原文解释和loss function函数。
网络的学习率是随着训练的次数变化的开始采用0.01,随着次数增加减为0.001,最后减为0.0001。
YOLO网络同样存在着缺陷,由于单个网格只存在两个bbox预测的数量受限,对于较小或者分布密集的目标难以识别