搞目标检测,绕不开的一个框架就是yolo,而且更糟糕的是,随着yolo的发展迭代,yolo网络可以做的事越来越多,语义分割,关键点检测,3D目标检测。。。这几天决定把YOLO系列彻底梳理一下,在进入大模型时代前,我们欣赏一下这个CNN时代最具影响力的作品。
前YOLO时代
在YOLO出现之前,目标检测已经大部迈向了CNN时代。从RCNN到FastRCNN, 再到FasterRCNN。可以看到,模型的速度越来越快,网络结构越来越简洁,启发式的方法论在一步步被抛弃。
但是,基于RCNN的方法需要预先通过region proposal network选择锚框,在保证了精度的同时,也大大耽误了速度。显然,目标检测的发展遇到了瓶颈。此时,YOLO,SSD等one stage方法孕育而生。
而经过多年的发展,YOLO系列在保持自己原来的快速的特点的基础上,在性能上也逐步提升,成为了目标检测在工业上落地的最优选择。
YOLO论文
YOLO1
论文题目:You Only Look Once: Unified, Real-Time Object Detection
会议: CVPR2016
链接:https://arxiv.org/pdf/1506.02640.pdf
作者:Joseph Redmon,Santosh Divvala,Ross Girshick,Ali Farhadi
YOLO v1实现了从原始图像到检测框的单一网络端到端设计。将图片分割为SxS个方块,每个方块包含2个Bbox的预测。
这里的潜在问题是:如果一个区域包含2个以上的小物体,该怎么办呢?
网络结构
网络包含24个卷积层和2个全连接层(全链接层明显开销会比较大)。此外,作者还提到了精简版的FastYOLO,包含9个卷积层,模型的输出是 7 x 7 x 30 的预测。
训练
模型训练首先采用imagenet数据进行前20个卷积层的训练(作为分类任务),随后,通过4个卷积层和2个全链接层进行检测任务的训练。
局限性
YOLO的局限性在于每一个grid最多只能输出两个物体和一种物体类别。
YOLO2
发表于: CVPR2017
论文标题:YOLO9000: Better, Faster, Stronger
论文链接:https://arxiv.org/pdf/1612.08242.pdf
作者:Joseph Redmon,Ali Farhadi
YOLOv2的网络架构优化
其实,在YOLOv1种就已经提到,YOLO对于多物体的检测能力有限,尤其是当一个grid出现多个物体时。此外,作者还提到,锚框的位置不够准确,recall较低。面对这些问题,在YOLOv2中,作者给出了解决方式,包括,1. 引入batch normalization,2. 采用高分辨率的图像训练分类器(感觉这个创新点很一般)3. 引入锚框,
这其中,比较值得一说的就是锚框,在YOLO1中通过全连接层进行猫框的预测,但是,在v2中,作者放弃这一设计,转而借鉴Faster-RCNN中提出的先验猫框的概念,通过anchor box的引入,支持的猫框数量大大增加,mAP略微下降,但是recall大大增加,总之,替换的利大于弊。
既然使用锚框,就要提供锚框先验的维度信息,作者没有使用人工选择的方式,而是选择使用K-means的方式,基于数据集找到了5个最优的大小。
此外,YOLO对于检测框位置预测的不精准,主要由于对于物体x,y位置估计的不准确,因此,我们选择预测物体位置与对应网格的相对距离。对于每个特征图的每个网格,我们会获取5个检测框的预测,基于这样的修改,我们可以保证检测框的精度进一步提升。
此外,通过passthrough layer,作者还提高了特征图的分辨率,来保证物体检测的精度(这一步其实没有太明白)。。
YOLOV2的训练策略优化
为了保证网络具有多尺度检测的能力,作者在训练的过程中,还将不同分辨率的图片,作为输入。对于低分辨率的图像,采用更轻量的检测器,可以大大提高帧率。
为了保证backbone的效率,作者认为采用vgg-16.可以,但没必要,因此选择参考googlenet。
为了让训练更高效,作者还利用目标检测数据集和分类数据集,微调网络结构,分别进行训练。
此外,还有其他技巧,这里没有全部展示。
总结
YOLOV2中,作者对于网络结构,和训练策略都做了调整和改进。对于网络架构的修改,有效的弥补了YOLO的短板,而关于训练策略的优化,作者展示了统一目标检测和分类这两类任务的雄心。此外,也提到了在物体分割领域的应用可能。
此外,作者的笔风也逐渐飘逸,说实话better,stonger,faster作为小标题,并不利用读者梳理论文的框架。
YOLOv3
标题:YOLOv3: An Incremental Improvement
作者:Joseph Redmon, Ali Farhadi
发表于:CVPR2018
YOLOV3的论文基本是以技术报告的形式展现。
这里整理一下我认为比较重要的几个创新点
1. Backbone的改进
在V2中,作者提到backbone的设计借鉴了googleNet,而在V3中,作者则借鉴了resnet的残差设计,网络层数也大大加深,从YOLOv2的Darknet-19 变为了Darknet-53。
2。 引入多尺度信息
YOLOv3在三个尺度进行特征提取。然后通过上采样的方式进行特征融合,通过类似v2中K-means的方法获得了9个先验的尺度信息,然后分布在3个特征提取层中。
总结
Yolov3的创新点给人一种重剑无锋的感觉,没有太多冗余的更新,但是backbone优化,和多尺度信息引入又大大的改进了YOLOv2的效果。而作者开源的YOLOv3 c++推理代码也为YOLO的黄金时代画下了一个完美的句号。
多尺度预测,残差网络的运用