介绍
本篇博客将对目标检测发展过程中的经典算法:YOLO系列算法进行介绍。目标检测是计算机视觉中的经典任务,最开始针对的目标主要是人脸,之后开始关注其他的目标,这其中,诞生了很多经典的方法,比如深度学习提出来之前的DPM方法。以及使用深度学习的RCNN系列方法和YOLO系列方法等。这其中,YOLO方法可以说的上是比较另类的方法,YOLO方法刚提出来的时候,方法非常的简单粗暴,是典型的暴力美学方法,笔者也是从看了YOLO之后,才意识到原来CNN这么不讲理(当然现在用CNN做各种不讲理任务的论文现在是很多了)。而且YOLO系列发展到现在,已经实现了速度和精度的一个很好的均衡。
YOLOv1
论文地址:https://pjreddie.com/media/files/papers/yolo_1.pdf
代码地址:https://pjreddie.com/
总体思路
YOLOv1发表在CVPR 2016上,那个时候,使用CNN进行目标检测才刚刚起步,效果最好的是RCNN,是使用ss+CNN分类的方式,速度非常慢。YOLO的提出首先是想解决速度上的问题,首先RCNN之所以速度慢就是因为使用了ss+CNN分类的思路,ss方法会产生非常多的候选框,然后CNN对每一个候选框分类,这个过程是包含大量的冗余计算的。为了提高速度,就需要尽可能降低CNN冗余计算的规模,最理想的效果是对于一张图片,只需要CNN提取依次特征就可以了(这个后续在RCNN的基础上发展而来的Fast-RCNN和Faster-RCNN),一个直接的思路就是,直接使用CNN提取出来的特征 ϕ \phi ϕ进行预测,比如对每一个像素都预测出来一堆框,然后利用某种方式对相似的框进行合并,YOLO就是利用了这种方式。但是作者不是针对每一个像素进行预测,而是将图像分为了 S × S S\times S S×S的格子(cells),每个格子最终会产生 B B B个候选框,之后利用非极大值抑制方法去除相似的候选框,便可以得到最终的预测结果。值得一提的是,无论是回归候选框的尺寸还是预测类别,作者都是使用均方误差作为损失函数,非常的干脆。
Unified Detection
YOLO把对边界框的预测和类别的预测统一到了一个网络中,而且对于一张图片,只需要计算一次(这也是YOLO这个名字的由来,只需要看一次)。这个过程用下面的图表示:
细分下来,网络的输出分为三个部分:
- 对于每一个cell,预测 B B B个候选框的位置
- 对于每一个cell中的 B B B个候选框,输出其是目标的概率,表示为 P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object)*IOU_{pred}^{truth} Pr(Object)∗IOUpredtruth,如果有中心点落在了这个cell里,那么标签就是1,否则就是0
- 3)对于每一个cell,预测类别 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(Classi∣Object)。注意这里,对于位置的预测是针对候选框的,但是对于类别的预测是针对cell的。
最终预测的时候,每一个候选框的分数表示为:
P
r
(
C
l
a
s
s
i
∣
O
b
j
e
c
t
)
∗
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
=
P
r
(
C
l
a
s
s
i
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
Pr(Class_i|Object)*Pr(Object)*IOU_{pred}^{truth}=Pr(Class_i)*IOU_{pred}^{truth}
Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
对于VOC数据,最终网络的输出是S=7,B=2,C=20,所以输出的维度是 S × S × ( B ∗ 5 + C ) = 7 × 7 × 30 S\times S\times(B*5+C)=7\times 7\times 30 S×S×(B∗5+C)=7×7×30
网络结构
作者在文中提到网络结构是受GoogleNet的启发,采用了以下的结构:
需要注意的是网络输出的特征是
7
×
7
7\times 7
7×7的,这和图像分的cell是一样的,在特征图像,每个cell最终都是用一个像素点表示。
损失函数
网络的损失函数如下:
损失函数分为三个部分,在图中用红蓝绿三种颜色表示,红色部分表示的是边界框回归的部分。蓝色部分是预测该边界框是否包含目标,对应着之前讨论的
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
Pr(Object)*IOU_{pred}^{truth}
Pr(Object)∗IOUpredtruth,如果包含目标标签就是1,否则就是0。绿色部分是类别预测,也是采用了均方误差。
YOLOv2
论文地址:https://pjreddie.com/media/files/papers/YOLO9000.pdf
代码地址:http://pjreddie.com/yolo9000/
总体思路
YOLOv1虽然速度很快,但是精度上和后面的fasterRCNN之类的方法差的比较大,因此作者在次年的CVPR上又提出了YOLOv2,文章的题目叫:《YOLO9000:Better,Faster,Stronger》。通过名字就可以看出来,YOLOv2实现了更好,更快的检测,stronger指的是作者提出了YOLO9000的方法,可以使用ImageNet和目标检测数据集联合训练。
Better
作者在YOLOv1的基础上,吸收了那段时期目标检测方法的有点,对其进行了改进。实际上创新不多,但是提升了精度。作者主要采取的策略如下:
Batch Normalization。加入了BN层,可以提升近2%的mAP的提升。
High Resolution Classifier。这一部分是对ImageNet预训练模型进行了改进,ImageNet中图像大小是224224,但是YOLO训练输入图像的尺寸是448448。作者在这部分按照448448的大小重新训练了预训练网络,提升了
4%的mAP。
Convolutional With Anchor Boxes。吸收了Faster-RCNN的优点,作者在YOLOv2中引入了anchor机制,但是YOLOv2对anchor的使用是“部分的”,这个后面会说
Dimension Clusters。确定anchor尺寸的时候,使用了k-means进行挑选,不是手动设定的。
Direct location prediction。这部分就体现出了YOLOv2中对anchor的使用是部分的。在Faster-RCNN或者SSD中,边界框的回归是相对于anchor而言的,但是在YOLov2中,只有对于边界框长宽的回归是相对于anchor的,但是对于位置(x,y)的预测还是基于cell的。
Fine-Grained Features。这部分的功能和后来的FPN层类似,都是为了融合底层和高层的特征,但是作者提出的这个方法只使用了前一层2626的特征。
Multi-Scale Training。训练的时候,输入图像要是多尺度的,也是后面常用的一个策略。
Faster
作者在这部分主要是提出了一个更快的基准网络Darknet-19。结构如下:
YOLOv3
论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf
代码地址:https://pjreddie.com/yolo/
YOLOv3并不是作者发表的一篇论文,而是一个技术报告。YOLOv3本身的创新有限,是作者综合了当时不同的方法,给出的最好版本。主要的策略有以下三个:
- 提出了新的网络结构,Darknet-53,在Imagenet上分的分类精度和Resnet101差不多,但是速度快得多。
- 使用类似FPN的结构提高了检测效果。
- 使用logistic预测类别,而不是softmax,因此可以做多标签的分类
YOLOv4
论文地址:https://arxiv.org/pdf/2004.10934.pdf
代码地址:https://github.com/AlexeyAB/darknet
YOLOv4应该是目前综合效果最好的目标检测方法,虽然方法本身创新比较少,但是作者综合了当前各种的trick,进行了大量的实验,确定了效果最好的模型,对于工程来说是非常有用的。YOLOv4中提到或使用的策略实在是太多了,接下来我会新开一篇博客介绍(希望能尽快弄完)