三、One-stage的代表—从YOLO到SSD
3.1 YOLO系列算法
尽管之前提到的Faster-RCNN系列算法大幅提高了目标检测的速度和准确度,但是其检测速度大概是10FPS左右,离实时视频检测还有一定距离。于是在2016年CVPR会议上,RGB提出了一种全新的目标检测框架,YOLO(You Only Look At Once)算法。尽管YOLO算法的精度不及Faster-RCNN,但是其速度要远远快于Faster-RCNN,而且YOLO算法经过不断的发展,已经有三个版本的YOLO算法,YOLOv3已经基本能够达到和Faster-RCNN算法差不多精度的同时实现实时检测的任务。下面我们就来一一介绍YOLO系列算法的原理。
3.1.1 YOLO v1算法
3.1.1.1 YOLO v1算法原理
YOLOv1论文原文在这里。
作者在论文中指出,RCNN算法之所以速度较慢的原因是其将目标检测分为两部分,首先生成候选框后再对候选框分类回归得到预测框。为了改善算法的检测速度,作者抛弃掉了RCNN中Region proposal方案,YOLO模型能够直接将图像的原始像素作为输入,直接输出目标的bounding boxes和类别,没有生成候选框的步骤,也就所谓的one-stage方法。
YOLO算法首先会将图像缩放成固定大小,然后再将图像分解成 S ∗ S S*S S∗S的网格(论文中S=7),并且每个网格预测 B B B个bounding boxes和这些bounding boxes的置信度(confidence)。其中置信度表示当前bounding
box包含目标的概率,当该网格内存在object时 Pr ( object ) = 1 \Pr\left( \text{object} \right) = 1 Pr(object)=1,否则为0,置信度的计算如下
C o n f i d e n c e = Pr ( object ) ∗ I o U p r e d t r u t h Confidence = \Pr\left( \text{object} \right)*IoU_{pred}^{truth} Confidence=Pr(object)∗IoUpredtruth
除了bounding boxes的置信度外,YOLO还要求每个网格输出检测目标的类别概率 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_{i}|Object) Pr(Classi∣Object),这是一个条件概率,表示每个当前物体是某个类别的概率。注意这里的类别概率是针对网格的,而不是针对网格预测的bounding boxes的(虽然这样做简化了类别概率的计算,但对于检测小目标物体很不利)。其计算如下:
S c o r e = Pr ( Clas s i ∣ object ) ∗ C o n f i d e n c e = Pr ( Clas s i ∣ object ) ∗ Pr ( object ) ∗ I o U p r e d t r u t h {Score = \Pr\left( \text{Clas}s_{i} \middle| \text{object} \right)*Confidence}= \Pr\left( \text{Clas}s_{i} \middle| \text{object} \right)*\Pr\left( \text{object} \right)*IoU_{pred}^{truth} Score=Pr(Classi∣object)∗Confidence=Pr(Classi∣object)∗Pr(object)∗IoUpredtruth
这样,对每个网格,其需要预测B个bbox值 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)以及其对应的置信度和 C C C个对应的类别概率, C C C为类别的数量,也就是一副图像需要预测 S ∗ S ∗ ( B ∗ ( 4 + 1 ) + C ) S*S*(B*\left(4 + 1 \right) + C) S∗S∗(B∗(4+1)+C)个值,以VOC数据集为例,YOLO算法每个网格需要预测 7 ∗ 7 ∗ ( 2 ∗ 5 + 20 ) = 7 ∗ 7 ∗ 30 7*7*\left(2*5 + 20 \right) = 7*7*30 7∗7∗(2∗5+20)=7∗7∗30</