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

简介: 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


20200621193247566.png


YOLO v1网络入口为448 × 448 ,图片进入网络先经过resize,然后将输入图像分成S × S 个网格(Grid Cell),每个格子负责检测“落入”该格子的物体。若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。

每个单元格会预测B个边界框(bounding box)以及边界框的置信度(confidence score)。该置信度计算如下:


image.png

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

20200622204752877.png


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


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



20200622204804982.jpg


1.2 网络结构


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



20200622204818890.jpg



1.3 损失函数

20200622204833798.png



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 ),用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。


20200622205819388.png


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 256256×256 的图片上。而现在 YOLO 从 224 × 224 224\times224224×224 增加到了 448 × 448 448\times 448448×448,意味着网络需要适应新的输入分辨率。


为了适应新的分辨率,YOLO v2 的分类网络以 448 × 448 448\times 448448×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  而不是448 × 448。由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLO 的卷积层采用 32 这个值来下采样图片,所以通过选择416 × 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 的大小,所以距离度量的使用:


image.png

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

20200622205917254.png


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


20200622205936411.png

(5) Direct location prediction

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

关系见下图:


20200622205949488.png

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


image.png


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


(6) Fine-Grained Features

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


(7)Multi-Scale Training

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


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

image.png



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 33×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 448448×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 的概率,则进行如下计算:


image.png


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


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

20200622210453856.png

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


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


(2)Datasets combination with wordtree

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



20200622210516761.png


作者的目的是:训练一个 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 图像速度可以达到 20FPS,在 COCO test-dev 上 mAP50 达到 57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,并且速度快 4 倍。


20200622211017883.png


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


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


相比之下,YOLO2采用13 × 13 × 5 = 845 1个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以


20200622211035836.png




(1) 多尺度预测 (类FPN)

每种尺度预测 3 个 box, anchor 的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给 3 个尺度。


尺度1: 在基础网络之后添加一些卷积层再输出box信息。

尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个 16 × 16 大小的特征图相加,再次通过多个卷积后输出 box 信息,相比尺度1变大两倍.

尺度3: 与尺度2类似,使用了 32 × 32  大小的特征图



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


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


20200622211107257.png


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


20200622211117531.png


(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训练。



20200622211150276.png


YOLOv4 包含以下三部分:

骨干网络:CSPDarknet53

Neck:SPP、PAN

Head:YOLOv3


20200622211206974.png


具体而言,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。

相关文章
|
3月前
|
机器学习/深度学习 测试技术 定位技术
YOLOPoint开源 | 新年YOLO依然坚挺,通过结合YOLOv5&SuperPoint,成就多任务SOTA
YOLOPoint开源 | 新年YOLO依然坚挺,通过结合YOLOv5&SuperPoint,成就多任务SOTA
64 0
|
12月前
|
数据挖掘 测试技术 Go
超越YOLOv7 | YOLOv6论文放出,重参+自蒸馏+感知量化+...各种Tricks大放异彩(一)
超越YOLOv7 | YOLOv6论文放出,重参+自蒸馏+感知量化+...各种Tricks大放异彩(一)
185 0
|
12月前
|
异构计算
超越YOLOv7 | YOLOv6论文放出,重参+自蒸馏+感知量化+...各种Tricks大放异彩(二)
超越YOLOv7 | YOLOv6论文放出,重参+自蒸馏+感知量化+...各种Tricks大放异彩(二)
130 0
|
12月前
|
自然语言处理 数据可视化 计算机视觉
全领域涨点 | Transformer携Evolving Attention在CV与NLP领域全面涨点(文末送书)(二)
全领域涨点 | Transformer携Evolving Attention在CV与NLP领域全面涨点(文末送书)(二)
80 0
|
12月前
|
机器学习/深度学习 自然语言处理 计算机视觉
全领域涨点 | Transformer携Evolving Attention在CV与NLP领域全面涨点(文末送书)(一)
全领域涨点 | Transformer携Evolving Attention在CV与NLP领域全面涨点(文末送书)(一)
121 1
|
12月前
|
机器学习/深度学习 计算机视觉 网络架构
【前沿经典模型】ResNet最强改进之ResNeSt(附源码)(一)
【前沿经典模型】ResNet最强改进之ResNeSt(附源码)(一)
1137 0
|
12月前
|
计算机视觉
【前沿经典模型】ResNet最强改进之ResNeSt(附源码)(二)
【前沿经典模型】ResNet最强改进之ResNeSt(附源码)(二)
403 0
|
12月前
|
机器学习/深度学习 数据采集 算法
深度学习实战(二):AlexNet实现花图像分类
原论文中用的双GPU,我的电脑只有一块GPU,代码只使用了一半的网络参数,相当于只用了原论文中网络结构的下半部分,但是如果使用完整网络跑一遍,发现一半参数跟完整参数的训练结果精度相差无几。
87 0
|
12月前
|
机器学习/深度学习 编解码 固态存储
深度学习论文阅读目标检测篇(五)中英对照版:YOLOv2《 YOLO9000: Better, Faster, Stronger》
摘要我们引入了一个先进的实时目标检测系统YOLO9000,可以检测超过9000个目标类别。首先,我们提出了对YOLO检测方法的各种改进,既有新发明的一些东西,也参考了前人的工作。改进后的模型YOLOv2在PASCALVOC和COCO等标准检测任务上性能是最好的。使用一种新颖的、多尺度训练方法,同样的YOLOv2模型可以以不同的尺度运行,从而在速度和准确性之间获得了良好的权衡。以67FPS的检测速度,YOLOv2在VOC2007上获得了76.8mAP。
86 0
|
12月前
|
机器学习/深度学习 编解码 固态存储
深度学习论文阅读目标检测篇(五)中文版:YOLOv2《 YOLO9000: Better, Faster, Stronger》
 与分类和标记等其他任务的数据集相比,目前目标检测数据集是有限的。最常见的检测数据集包含成千上万到数十万张具有成百上千个标签的图像[3][10][2]。分类数据集有数以百万计的图像,数十或数十万个类别[20][2]。
121 0
深度学习论文阅读目标检测篇(五)中文版:YOLOv2《 YOLO9000: Better, Faster, Stronger》