DeepLearning-L10-目标检测:YOLO成长记,从v1到v4

YOLO(You Only Look Once)算法名称颇为文艺,中文可译作一见倾心。

Faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了。

YOLO则采用直接回归的思路,相对于R-CNN系列的"看两眼":物体类别(分类问题),物体位置即bounding box(回归问题),YOLO只需要Look Once。其核心思想就是将整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别

1. YOLO v1

2016年5月,Joseph Redmon, Santosh Divvalay, Ross Girshick等人在《You Only Look Once: Unified, Real-Time Object Detection》提出了YOLO v1,其增强版本GPU中能跑45fps,简化版本155fps。

1.1 算法步骤

YOLO v1算法分为三步:

  • 将输入图像调整到448×448
  • 在图像上运行卷积网络
  • 通过模型的置信度对结果NMS

  • YOLO v1网络入口为 448 × 448 448 \times 448 ,图片进入网络先经过resize,然后将输入图像分成 S × S S \times S 个网格(Grid Cell),每个格子负责检测“落入”该格子的物体。若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。
  • 每个单元格会预测B个边界框(bounding box)以及边界框的置信度(confidence score)。该置信度计算如下:

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}

如果有物体落在一个网格中,则第一项取1,否则取0;第二项为预测的bounding box和实际的groundtruth之间的IoU值。

网络的输出为维度 S S ( B 5 + C ) S∗S∗(B∗5+C) 的张量,其中,S为划分网格数,B为每个网格预测的bounding box个数,针对每个bounding box要预测 ( x , y , w , h ) (x, y, w, h) 和confidence共5个值,C为类别个数。

如,PASCAL VOC中图像输入为 448 × 448 448 \times 448 ,取 S = 7 S=7 B = 2 B=2 ,一共有20个类别( C = 20 C=20 )。则输出就是 7 × 7 × 30 7 \times 7 \times 30 的一个tensor。

1.2 网络结构

YOLO v1采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GoogLeNet模型,包含24个卷积层和2个全连接层。

1.3 损失函数

1.4 缺点

  • 不管一个单元格预测多少个边界框,其只预测一组类别概率值:虽然每个格子可以预测B个bounding box,最终只选择只选择IoU最高的bounding box作为物体检测输出,即当每个格子包含多个物体时,只预测出一个物体。对于物体占画面比例较小,如图像中包含畜群或鸟群时,或者相互靠的很近的物体,检测效果不好。YOLO v2以及Yolo9000把类别概率预测值与边界框是绑定在一起。
  • 由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。
  • 同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱。
  • YOLO loss函数中,大物体IoU误差和小物体IoU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性(定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强)。

2. YOLO v2

2016年12月,Joseph Redmon, Ali Farhadi在《YOLO9000 Better, Faster, Stronger》提出了YOLOv2,相对v1版本在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,又称之为YOLO9000。

为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练(Multi-Scale Training)策略,可以适应不同大小的图片,并且预测出很好的结果。使用联合训练算法:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。

2.1 Better

(1) Batch Normalization
使用 Batch Normalization 对网络进行优化,让网络提高了收敛性,同时还消除了对其他形式的正则化(regularization)的依赖。通过对 YOLO 的每一个卷积层增加 Batch Normalization,最终使得 mAP 提高了 2%,同时还使模型正则化。使用 Batch Normalization 可以从模型中去掉 Dropout,而不会产生过拟合。

(2) High resolution classifier
目前业界标准的检测方法,都要先把分类器(classifier)放在ImageNet上进行预训练。从Alexnet开始,大多数的分类器都运行在小于 256 × 256 256 \times 256 的图片上。而现在 YOLO 从 224 × 224 224\times224 增加到了 448 × 448 448\times 448 ,意味着网络需要适应新的输入分辨率。

为了适应新的分辨率,YOLO v2 的分类网络以 448 × 448 448\times 448 的分辨率先在 ImageNet上进行微调,微调 10 个 epochs,让网络有时间调整滤波器(filters),好让其能更好的运行在新分辨率上,还需要调优用于检测的 Resulting Network。最终通过使用高分辨率,mAP提升了4%。

(3) Convolution with anchor boxes
YOLO v1包含有全连接层,从而能直接预测 Bounding Boxes 的坐标值。 Faster R-CNN 的方法只用卷积层与 Region Proposal Network 来预测 Anchor Box 偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。

所以最终 YOLO 去掉了全连接层,使用 Anchor Boxes 来预测 Bounding Boxes。作者去掉了网络中一个池化层,这让卷积层的输出能有更高的分辨率。收缩网络让其运行在 416 × 416 416 \times 416 而不是 448 × 448 448\times 448 。由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLO 的卷积层采用 32 这个值来下采样图片,所以通过选择 416 × 416 416 \times 416 用作输入尺寸最终能输出一个$ 13 \times 13$ 的特征图。 使用 Anchor Box 会让精确度稍微下降,但用了它能让 YOLO 能预测出大于一千个框,同时 recall 达到88%,mAP 达到 69.2%

(4) Dimension clusters
之前 Anchor Box 的尺寸是手动选择的,所以尺寸还有优化的余地。 为了优化,在训练集的 Bounding Boxes 上跑一下 k-means聚类,来找到一个比较好的值。

如果用标准的欧式距离的 k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高 IOU 分数,这依赖于 Box 的大小,所以距离度量的使用:

d ( b o x , c e n t r o i d ) = 1 I O U ( b o x , c e n t r o i d ) d(box,centroid) = 1- IOU(box,centroid)

通过分析实验结果,左图:在模型复杂性与 high recall 之间权衡之后,选择聚类分类数 K=5。右图:是聚类的中心,大多数是高瘦的 Box。

下表说明用 K-means 选择 Anchor Boxes 时,当 Cluster IOU 选择值为 5 时,AVG IOU 的值是 61,这个值要比不用聚类的方法的 60.9 要高。选择值为 9 的时候,AVG IOU 更有显著提高。总之就是说明用聚类的方法是有效果的。

(5) Direct location prediction
用 Anchor Box 的方法,会让 model 变得不稳定,尤其是在最开始的几次迭代的时候。大多数不稳定因素产生自预测 Box 的 x , y (x,y) 位置的时候。按照之前 YOLO的方法,网络不会预测偏移量,而是根据 YOLO 中的网格单元的位置来预测坐标,这就让 Ground Truth 的值介于 0 到 1 之间。而为了让网络的结果能落在这一范围内,网络使用一个 Logistic Activation 来对于网络预测结果进行限制,让结果介于 0 到 1 之间。 网络在每一个网格单元中预测出 5 个 Bounding Boxes,每个 Bounding Boxes 有五个坐标值 t x t y t w t h t 0 t_x,t_y,t_w,t_h,t_0 ,关系见下图:

假设一个网格单元对于图片左上角的偏移量是$ c_x、c_y$,Bounding Boxes Prior 的宽度和高度是 p w p h p_w、p_h ,那么预测的结果为:

b x = θ ( t x ) + c x ,      b y = θ ( t y ) + c y ,      b w = p w e t w ,      b h = p h e t h b_x = \theta(t_x)+c_x, \;\;b_y = \theta(t_y)+c_y, \;\;b_w = p_we^{t_w}, \;\;b_h = p_he^{t_h}

P r ( o b j e c t ) I O U ( b , o b j e c t ) = σ ( t o ) Pr(object)*IOU(b,object) = \sigma(t_o)

因为使用了限制让数值变得参数化,也让网络更容易学习、更稳定。Dimension clusters和Direct location prediction,使 YOLO 比其他使用 Anchor Box 的版本提高了近5%。

(6) Fine-Grained Features
YOLO 修改后的特征图大小为 13 × 13 13 \times 13 ,这个尺寸对检测图片中尺寸大物体来说足够了,同时使用这种细粒度的特征对定位小物体的位置可能也有好处。Faster-RCNN、SSD 都使用不同尺寸的特征图来取得不同范围的分辨率,而 YOLO 采取了不同的方法,YOLO 加上了一个 Passthrough Layer 来取得之前的某个 26 × 26 26 \times 26 分辨率的层的特征。这个 Passthrough layer 能够把高分辨率特征与低分辨率特征联系在一起,联系起来的方法是把相邻的特征堆积在不同的 Channel 之中,这一方法类似与 Resnet 的 Identity Mapping,从而把 26 × 26 × 512 26 \times 26 \times 512 变成 13 × 13 × 2048 Y O L O 13 \times 13 \times 2048。YOLO 中的检测器位于扩展后(expanded )的特征图的上方,所以能取得细粒度的特征信息,这提升了 YOLO 1% 的性能。

(7)Multi-Scale Training
YOLOv2 能健壮地运行于不同尺寸的图片之上, 区别于之前的补全图片的尺寸的方法,YOLOv2 每迭代几次都会改变网络参数。每 10 个 Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是 32,所以输入图片大小选择一系列为32倍数的值: { 320 , 352 , . . . , 608 } \{320,352,...,608\} ,输入图片最小为 320 × 320 {320 \times 320} ,此时对应的特征图大小为 10 × 10 {10 \times 10} ,而输入图片最大为 320 × 320 {320 \times 320} ,对应的特征图大小为 19 × 19 {19 \times 19} 。,网络会自动改变尺寸,并继续训练的过程。

这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以你可以在 YOLOv2 的速度和精度上进行权衡。下图是在 voc2007 上的速度与精度

在这里插入图片描述

2.2 Faster

YOLO 使用的是 GoogLeNet 架构,比 VGG-16 快,YOLO 完成一次前向过程只用 85.2 亿次运算,而 VGG-16 要 306.9 亿次,但是 YOLO 精度稍低于 VGG-16。

(1)Draknet19
YOLO v2 基于一个新的分类模型,有点类似于 VGG。YOLO v2 使用 3 × 3 3 \times 3 的 filter,每次池化之后都增加一倍 Channels 的数量。YOLO v2 使用全局平均池化,使用 Batch Normilazation 来让训练更稳定,加速收敛,使模型规范化。

最终的模型–Darknet19,有 19 个卷积层和 5 个 maxpooling 层,处理一张图片只需要 55.8 亿次运算,在 ImageNet 上达到 72.9% top-1 精确度,91.2% top-5 精确度。

(2)Training for classification
在训练时,把整个网络在更大的 448 × 448 448 \times 448 分辨率上Fine Turnning 10个 epoches,初始学习率设置为0.001,这种网络达到达到76.5%top-1精确度,93.3%top-5精确度。

2.3 Stronger

(1) Hierarchical classification
WordNet 的结构是一个直接图表(directed graph),而不是树型结构。因为语言是复杂的,狗这个词既属于‘犬科’又属于‘家畜’两类,而‘犬科’和‘家畜’两类在 WordNet 中则是同义词,所以不能用树形结构。

作者希望根据 ImageNet 中包含的概念来建立一个分层树,为了建立这个分层树,首先检查 ImagenNet 中出现的名词,再在 WordNet 中找到这些名词,再找到这些名词到达他们根节点的路径(在这里设为所有的根节点为实体对象(physical object)。在 WordNet 中,大多数同义词只有一个路径,所以首先把这条路径中的词全部都加到分层树中。接着迭代地检查剩下的名词,并尽可能少的把他们添加到分层树上,添加的原则是取最短路径加入到树中。

为了计算某一结点的绝对概率,只需要对这一结点到根节点的整条路径的所有概率进行相乘。所以比如你想知道一个图片是否是 Norfolk terrier 的概率,则进行如下计算:

P r ( N o r f o l k t e r r i e r ) = P r ( N o r f o l k      t e r r i e r t e r r i e r ) P r ( t e r r i e r h u n t i n g      d o g ) . . . P r ( m a m m a l a n i m a l ) P r ( a n i m a l p h y s i c a l      o b j e c t ) Pr(Norfolk terrier) = Pr(Norfolk\;\;terrier \mid terrier) \\ *Pr(terrier \mid hunting\;\; dog) \\ *...* \\ *Pr(mammal \mid animal) \\ *Pr(animal \mid physical \;\;object)

为了验证这一个方法,在 WordTree 上训练 Darknet19 的模型,使用 1000 类的 ImageNet 进行训练,为了建立 WordtTree 1K,把所有中间词汇加入到 WordTree 上,把标签空间从 1000 扩大到了 1369。在训练过程中,如果有一个图片的标签是“Norfolk terrier”,那么这个图片还会获得”狗“(dog)以及“哺乳动物”(mammal)等标签。总之现在一张图片是多标记的,标记之间不需要相互独立。

如下图所示,之前的 ImageNet 分类是使用一个大 softmax 进行分类。而现在,WordTree 只需要对同一概念下的同义词进行 softmax 分类。

使用相同的训练参数,这种分层结构的Darknet19达到71.9%top-1精度和90.4% top-5 精确度,精度只有微小的下降。

这种方法的好处:在对未知或者新的物体进行分类时,性能降低的很优雅(gracefully)。如看到一个狗的照片,但不知道是哪种种类的狗,那么就高置信度(confidence)预测是”狗“,而其他狗的种类的同义词如”哈士奇“”牛头梗“”金毛“等这些则低置信度。

(2)Datasets combination with wordtree
用 WordTree 把数据集合中的类别映射到分层树中的同义词上,如图所示,WordTree 混合 ImageNet 与 COCO。

作者的目的是:训练一个 Extremely Large Scale 检测器。所以训练的时候使用 WordTree 混合了 COCO 检测数据集与 ImageNet 中的 Top9000 类,混合后的数据集对应的 WordTree 有 9418 个类。另一方面,由于 ImageNet 数据集太大了,作者为了平衡一下两个数据集之间的数据量,通过过采样(oversampling) COCO 数据集中的数据,使 COCO 数据集与 ImageNet 数据集之间的数据量比例达到 1:4。

YOLO9000 的训练基于 YOLO v2 的构架,但是使用 3 priors 而不是 5 来限制输出的大小。当网络遇到检测数据集中的图片时则正常地反方向传播,当遇到分类数据集图片的时候,只使用分类的 loss 功能进行反向传播。同时作者假设 IOU 最少为 0.3。最后根据这些假设进行反向传播。

(3)Joint classification and detection
使用联合训练法,YOLO9000 使用 COCO 检测数据集学习检测图片中的物体的位置,使用 ImageNet 分类数据集学习如何对大量的类别中进行分类。

为了评估这一方法,使用 ImageNet Detection Task 对训练结果进行评估。

  • YOLO9000 取得 19.7 mAP。 在未学习过的 156 个分类数据上进行测试, mAP 达到 16.0。
  • YOLO9000 的 mAP 比 DPM 高,而且 YOLO 有更多先进的特征,YOLO9000 是用部分监督的方式在不同训练集上进行训练,同时还能检测 9000个物体类别,并保证实时运行。

虽然 YOLO9000 对动物的识别性能很好,但是对类别为“sungalsses”或者“swimming trunks”这些衣服或者装备的类别,它的识别性能不是很好,这跟数据集的数据组成有很大关系。

3. YOLO v3

2018年,Joseph Redmon在《YOLOv3: An Incremental Improvement》中提出YOLO v3模型,YOLOv3主要是借鉴一些好的方案进行了融合,包括借鉴残差网络结构,形成更深的网络层次,以及多尺度检测,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力。

YOLOv3 在 Pascal Titan X 上处理 608 × 608 608 \times 608 图像速度可以达到 20FPS,在 COCO test-dev 上 mAP50 达到 57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,并且速度快 4 倍。

YOLO3主要的改进有:利用多尺度特征进行对象检测;调整了网络结构;对象分类用Logistic取代了softmax。

对于一个 416 × 416 416 \times 416 的输入图像,在每个尺度的特征图的每个网格设置3个先验框,总共有 13 × 13 × 3 + 26 × 26 × 3 + 52 × 52 × 3 = 10647 13 \times 13 \times 3 + 26 \times 26 \times 3 + 52 \times 52 \times3 = 10647 个预测。每一个预测是一个 ( 4 + 1 + 80 ) = 85 (4+1+80)=85 维向量,这个 85 85 维向量包含边框坐标( 4 4 个数值),边框置信度( 1 1 个数值),对象类别的概率(对于COCO数据集,有 80 80 种对象)。

相比之下,YOLO2采用 13 × 13 × 5 = 845 13 \times 13 \times 5 = 845 个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以mAP以及对小物体的检测效果有一定的提升。
(1) 多尺度预测 (类FPN)
每种尺度预测 3 个 box, anchor 的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给 3 个尺度。

  • 尺度1: 在基础网络之后添加一些卷积层再输出box信息。
  • 尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个 16 × 16 16 \times 16 大小的特征图相加,再次通过多个卷积后输出 box 信息,相比尺度1变大两倍.
  • 尺度3: 与尺度2类似,使用了 32 × 32 32 \times 32 大小的特征图

(2)更好的基础分类网络(类ResNet)和分类器 darknet-53

图像特征提取方面,YOLO3采用了称之为Darknet-53的网络结构(含有53个卷积层),它借鉴了残差网络residual network的做法,在一些层之间设置了快捷链路(shortcut connections)。

darknet-53 与 ResNet-101 或 ResNet-152 准确率接近,但速度更快,对比如下:

(3)对象分类改为logistic
Softmax 使得每个框分配一个类别(得分最高的一个),不适用于多标签分类。改成使用logistic的输出进行预测,这样能够支持多标签对象(比如一个人有Woman 和 Person两个标签),分类损失采用 binary cross-entropy loss。

4. YOLO v4

2020年,Alexey Bochkovskiy等人在《YOLOv4: Optimal Speed and Accuracy of Object Detection》提出了YOLO v4,YOLOv4 在COCO上,可达43.5% AP,速度高达 65 FPS。

该论文提出了一种高效而强大的目标检测模型,使每个人都可以用1080 Ti或2080 Ti GPU 训练超快速和准确的目标检测器;在检测器训练期间,验证了SOTA的Bag-of Freebies 和Bag-of-Specials方法的影响;改进了SOTA的方法,使它们更有效,更适合单GPU训练。

YOLOv4 包含以下三部分:

  • 骨干网络:CSPDarknet53
  • Neck:SPP、PAN
  • Head:YOLOv3

具体而言,YOLO v4 使用了:

  • 用于骨干网络的 Bag of Freebies(BoF):CutMix 和 Mosaic 数据增强、DropBlock 正则化和类标签平滑(Class label smoothing);
  • 用于骨干网络的 Bag of Specials(BoS):Mish 激活、CSP 和多输入加权残差连接(MiWRC);
  • 用于检测器的 Bag of Freebies(BoF):CIoU-loss、CmBN、DropBlock 正则化、Mosaic 数据增强、自对抗训练、消除网格敏感性(Eliminate grid sensitivity)、针对一个真值(ground-truth)使用多个锚(anchor)、余弦退火调度器(Cosine annealing scheduler)、优化超参数和随机训练形状(andom training shapes);
  • 用于检测器的 Bag of Specials(BoS):Mish 激活、SPP 块、SAM 块、PAN 路径聚合块和 DIoU-NMS。

猜你喜欢

转载自blog.csdn.net/apr15/article/details/106889869