基于深度学习的目标检测算法:YOLO
之前学习的RCNN系列的目标检测算法都是先提取出候选区域,然后利用分类器识别这些区域,并对候选区域进行位置修正。这类方法流程复杂,存在着速度慢、训练困难等缺点。
YOLO算法将检测问题看做是回归问题,采用单个神经网络,利用整个图像的信息来预测目标的边框、识别目标的类别,实现端到端的目标检测,如图所示。YOLO相比于之前的算法有如下优点:
1)非常快。YOLO的流程简单,速度很快,可以实现实时检测。
2)YOLO采用全图信息进行预测。与滑动窗口、region proposals不同,YOLO在训练、预测过程中利用全图信息。Fast R-CNN方法错误地将背景块检测为目标,原因在于Fast R-CNN方法在检测时无法看到全局图像。相比于Fast R-CNN,YOLO可以将背景预测错误率降低一半
3)YOLO可以学习到目标的概括信息。我们采用自然图像训练YOLO,然后采用艺术图像来预测,YOLO比其他目标检测算法的准确率高很多。
YOLO:
该方法将图像划分为S*S个格子。如果一个目标的中心落入某个格子中,那么该格子负责检测该目标。每个格子预测B个bounding boxes,以及这些bounding boxes 的置信值(confidence scores)。关于置信值,我当时看论文的时候没看懂,后来是这么理解的:YOLO模型预测出每个bounding box时,也预测出了该bounding box的置信值,可以定义为,该值表明了该bounding
box包含目标的可信度,以及该bounding box的可信度;在训练模型时,如果对应的格子中不包含目标时,我们希望该置信值等于0,否则,我们希望该置信值等于predicted box与ground truth的IOU。
每个bounding box包含有5个值:x,y,w,h,confidence。(x,y)表示bounding box的中心,(w,h)表示bounding box的宽、高,confidecne表示bounding box与ground truth的IOU,注意,该值是预测出来的,而不是实际计算得到的。
每个格子预测出C个条件概率。
在测试的时候,我们可以将bounding box的置信度与类别概率相乘,得到特定类的置信分数,这个分数代表了该类别出现在bounding box的概率,也代表了bounding box吻合目标的程度。
YOLO算法采用的网络结构,与GoogLeNet有点类似,有24个卷积层,2个全连接层,如下图所示。在训练该模型时,首先用ImageNet 1000-class数据集来预训练卷积层。在预训练阶段,采用图中的前20卷积层,外加a average-pooling layer and a fully connected layer。然后,将模型转为检测模型,作者向预训练模型中加入了4个卷积层和2个全连接层,并且提高了模型的输入分辨率(224*224 -> 448*448)。其中,最后一层输出类别概率、bounding box。
For evaluating YOLO on PASCALVOC, we use S = 7,B= 2. PASCALVOC has 20 labelled classes so C= 20.Our final prediction is a7 × 7× 30 tensor .
每个格子预测出多个bounding box。但是,在训练时,我们只希望一个bounding box predictor 来负责一个目标,所以,根据bounding box与ground truth的IOU来选取合适的bounding box predictor 。在训练过程中,采用的损失函数如下:
然而,YOLO算法也存在着一些缺点:
1)每个格子只能预测出两个bounding box、一种类别,这导致模型对相邻目标的检测准确率下降。因此,YOLO对成堆目标的检测准确率较低。
2)loss函数对small bounding box、large bounding box的error平等对待,这将影响目标检测的准确率。因为对于small bounding box,small error 的影响更大。