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所属的类别。
2016年5月,Joseph Redmon, Santosh Divvalay, Ross Girshick等人在《You Only Look Once: Unified, Real-Time Object Detection》提出了YOLO v1,其增强版本GPU中能跑45fps,简化版本155fps。
YOLO v1算法分为三步:
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;第二项为预测的bounding box和实际的groundtruth之间的IoU值。
网络的输出为维度 S ∗ S ∗ ( B ∗ 5 + C ) S∗S∗(B∗5+C) S∗S∗(B∗5+C)的张量,其中,S为划分网格数,B为每个网格预测的bounding box个数,针对每个bounding box要预测 ( x , y , w , h ) (x, y, w, h) (x,y,w,h)和confidence共5个值,C为类别个数。
如,PASCAL VOC中图像输入为 448 × 448 448 \times 448 448×448,取 S = 7 S=7 S=7, B = 2 B=2 B=2,一共有20个类别( C = 20 C=20 C=20)。则输出就是 7 × 7 × 30 7 \times 7 \times 30 7×7×30的一个tensor。
YOLO v1采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GoogLeNet模型,包含24个卷积层和2个全连接层。
2016年12月,Joseph Redmon, Ali Farhadi在《YOLO9000 Better, Faster, Stronger》提出了YOLOv2,相对v1版本在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,又称之为YOLO9000。
为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练(Multi-Scale Training)策略,可以适应不同大小的图片,并且预测出很好的结果。使用联合训练算法:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。
(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 256×256 的图片上。而现在 YOLO 从 224 × 224 224\times224 224×224 增加到了 448 × 448 448\times 448 448×448,意味着网络需要适应新的输入分辨率。
为了适应新的分辨率,YOLO v2 的分类网络以 448 × 448 448\times 448 448×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 416×416 而不是 448 × 448 448\times 448 448×448。由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLO 的卷积层采用 32 这个值来下采样图片,所以通过选择 416 × 416 416 \times 416 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 的大小,所以距离度量的使用:
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) 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) (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 tx,ty,tw,th,t0,关系见下图:
假设一个网格单元对于图片左上角的偏移量是$ c_x、c_y$,Bounding Boxes Prior 的宽度和高度是 p w 、 p h p_w、p_h pw、ph,那么预测的结果为:
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} bx=θ(tx)+cx,by=θ(ty)+cy,bw=pwetw,bh=pheth
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) Pr(object)∗IOU(b,object)=σ(to)
因为使用了限制让数值变得参数化,也让网络更容易学习、更稳定。Dimension clusters和Direct location prediction,使 YOLO 比其他使用 Anchor Box 的版本提高了近5%。
(6) Fine-Grained Features
YOLO 修改后的特征图大小为 13 × 13 13 \times 13 13×13,这个尺寸对检测图片中尺寸大物体来说足够了,同时使用这种细粒度的特征对定位小物体的位置可能也有好处。Faster-RCNN、SSD 都使用不同尺寸的特征图来取得不同范围的分辨率,而 YOLO 采取了不同的方法,YOLO 加上了一个 Passthrough Layer 来取得之前的某个 26 × 26 26 \times 26 26×26 分辨率的层的特征。这个 Passthrough layer 能够把高分辨率特征与低分辨率特征联系在一起,联系起来的方法是把相邻的特征堆积在不同的 Channel 之中,这一方法类似与 Resnet 的 Identity Mapping,从而把 26 × 26 × 512 26 \times 26 \times 512 26×26×512 变成 13 × 13 × 2048 。 Y O L O 13 \times 13 \times 2048。YOLO 13×13×2048。YOLO 中的检测器位于扩展后(expanded )的特征图的上方,所以能取得细粒度的特征信息,这提升了 YOLO 1% 的性能。
(7)Multi-Scale Training
YOLOv2 能健壮地运行于不同尺寸的图片之上, 区别于之前的补全图片的尺寸的方法,YOLOv2 每迭代几次都会改变网络参数。每 10 个 Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是 32,所以输入图片大小选择一系列为32倍数的值: { 320 , 352 , . . . , 608 } \{320,352,...,608\} {320,352,...,608} ,输入图片最小为 320 × 320 {320 \times 320} 320×320 ,此时对应的特征图大小为 10 × 10 {10 \times 10} 10×10,而输入图片最大为 320 × 320 {320 \times 320} 320×320,对应的特征图大小为 19 × 19 {19 \times 19} 19×19 。,网络会自动改变尺寸,并继续训练的过程。
这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以你可以在 YOLOv2 的速度和精度上进行权衡。下图是在 voc2007 上的速度与精度
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 3×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 448×448分辨率上Fine Turnning 10个 epoches,初始学习率设置为0.001,这种网络达到达到76.5%top-1精确度,93.3%top-5精确度。
(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) Pr(Norfolkterrier)=Pr(Norfolkterrier∣terrier)∗Pr(terrier∣huntingdog)∗...∗∗Pr(mammal∣animal)∗Pr(animal∣physicalobject)
为了验证这一个方法,在 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 对动物的识别性能很好,但是对类别为“sungalsses”或者“swimming trunks”这些衣服或者装备的类别,它的识别性能不是很好,这跟数据集的数据组成有很大关系。
2018年,Joseph Redmon在《YOLOv3: An Incremental Improvement》中提出YOLO v3模型,YOLOv3主要是借鉴一些好的方案进行了融合,包括借鉴残差网络结构,形成更深的网络层次,以及多尺度检测,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力。
YOLOv3 在 Pascal Titan X 上处理 608 × 608 608 \times 608 608×608 图像速度可以达到 20FPS,在 COCO test-dev 上 mAP50 达到 57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,并且速度快 4 倍。
YOLO3主要的改进有:利用多尺度特征进行对象检测;调整了网络结构;对象分类用Logistic取代了softmax。
对于一个 416 × 416 416 \times 416 416×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 13×13×3+26×26×3+52×52×3=10647 个预测。每一个预测是一个 ( 4 + 1 + 80 ) = 85 (4+1+80)=85 (4+1+80)=85维向量,这个 85 85 85维向量包含边框坐标( 4 4 4个数值),边框置信度( 1 1 1个数值),对象类别的概率(对于COCO数据集,有 80 80 80种对象)。
相比之下,YOLO2采用 13 × 13 × 5 = 845 13 \times 13 \times 5 = 845 13×13×5=845个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以mAP以及对小物体的检测效果有一定的提升。
(1) 多尺度预测 (类FPN)
每种尺度预测 3 个 box, anchor 的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给 3 个尺度。
(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。
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 包含以下三部分:
具体而言,YOLO v4 使用了: