目标检测(Object Detection
)是在图像中对一类或多类感兴趣的目标进行查找和分类,确定它们的类别和位置。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域具有挑战性的问题。
计算机视觉中关于图像识别有四大类任务:
(1)分类(Classification
):解决“是什么”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
(2)定位(Location
):解决“在哪里”的问题,即定位出这个目标的的位置。
(3)检测(Detection
):解决“在哪里,是什么”的问题,即定位出这个目标的位置并且知道目标物是什么。
(4)分割(Segmentation
):分为实例的分割(Instance-level
)和场景分割(Scene-level
),解决“每一个像素属于哪个目标物或场景”的问题。
因此,我们可以发现目标检测网络是一个多任务的网络,它不仅要进行一个分类还要进行定位回归,如下图1所示。
目标检测中需解决的问题:
(1)分类问题:即图片(或某个区域)中的图像属于哪个类别。
(2)定位问题:目标可能出现在图像的任何位置。
(3)大小问题:目标有各种不同的大小。
(4)形状问题:目标可能有各种不同的形状。
近年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal
的R-CNN
系列算法(R-CNN
,Fast R-CNN
, Faster R-CNN
等),它们属于two-stage
算法,需要算法先产生目标候选框,也就是目标位置,然后再对候选框做分类与回归。而另一类是YOLO
,SSD
这类one-stage
算法,其仅仅使用一个主干卷积神经网络CNN
直接预测不同目标的类别与位置。第一类方法是识别精度较高,但是速度慢,第二类算法是速度较快,但识别精度较低,如下图2所示。
传统的目标检测流程如下图3所示。首先输入图像,然后通过输入候选框,对候选框进行特征的提取,再利用分类器对候选框进行判断属于目标还是背景,最后利用非极大值抑制对候选框进行合并,删除冗余的候选框,最终得到目标输出的结果。
基于深度学习的Two-stage
的目标检测算法流程如图4所示。将候选框、特征提取和分类器判断通过RPN
网络来完成候选框的推荐,取代手动设计特征滑动窗口的方式。
基于深度学习的One-stage
的目标检测算法直接采用特征提取与回归的方式对感兴趣目标区域进行提取,如下图5所示。
传统的目标检测算法与基于深度学习的目标检测方法的区别主要取决于是否采用手动设计特征的方式还是采用卷积神经网络的方式。
在Two-stage
网络中,Img
为输入的图像,Conv&Pooling
为深度卷积神经网络,不代表只有一个卷积层,而是代表主干基础网络(如GooleNet
、ResNet
等)。通过主干网络进行深度特征的提取,再将输出的特征图(Feature Map
)经过RPN
网络完成原有通过滑动窗口完成的任务,即产生候选区域。候选区域提取的同时完成区域分类的任务,区分是背景还是目标,还会对目标位置进行初步的预测,即区域分类和位置粗修两个环节,在得到候选框后,后续会进一步精确地定位。Roi_Pooling
层可以理解为一个抠图的过程,得到候选框特征后再通过全连接FC
层对特征进行表示,最后通过分类与回归完成对候选目标位置的分类和精修,Lcls
识别出目标的种类,Lreg
得到目标的位置坐标。在One-stage
中,通过输入图像Img
,然后主干网络进行深度特征的提取,接着直接进行区域的回归与分类,完成目标检测任务。
YOLO
(You Only Look Once
)是继RCNN
,FAST-RCNN
和FASTER-RCNN
之后,Ross Girshick
针对深度学习目标检测速度问题提出的另一种框架,其核心思想是将整张图片作为网络的输入(类似于Faster-RCNN
),直接在输出层对Bounding Box
的位置和所属类别进行回归。
基于Region Proposal
的R-CNN
系算法首先需要产生大量可能包含待检测物体的先验框, 然后用分类器判断每个先验框对应的边界框里是否包含待检测物体,以及物体所属类别的概率或者置信度,同时需要后续处理修正边界框,最后基于一些准则过滤掉置信度不高和重叠度较高的边界框,进而得到检测结果。这种基于先产生候选区再检测的方法虽然有相对较高的检测准确率,但运行速度较慢。而YOLO
创造性的将物体检测任务直接当作回归问题(regression problem
)来处理,将候选区和检测两个阶段合二为一。只需一眼就能知道每张图像中有哪些物体以及物体的位置。下图展示了各网络目标检测流程简图。
实际上,YOLO
并没有真正去掉候选区,而是采用了预定义候选区的方法,也就是将图片划分为7*7
个网格,每个网格允许预测出2
个边框,总共49*2
个bounding box
,可以理解为98
个候选区域,它们很粗略地覆盖了图片的整个区域。YOLO
以降低mAP
为代价,大幅提升了时间效率。
图8是将一幅图像划分为7*7
(S×S
)个网格,其中的红点代表的是Ground Truth
,即物体的中心,包含有Ground Truth
的格子用来预测狗这个目标,橙色的这个格子在训练过程中是用来预测外面包含狗的这个红色Bounding Box
的,而绿色和白色的格子在训练过程中仅作为分类的依据,并不参与狗的这个Bounding Box
的预测。
每个格子用来预测B个Bounding Box
及其置信度,以及C个类别的概率,其中每个Bounding Box
包含 [ x , y , w , h , c ] [x,y,w,h,c] [x,y,w,h,c] 5个参数新, ( x , y ) (x,y) (x,y)坐标表示中心点相对于网格的偏移量,宽度 w w w和高度 h h h是相对于整张图像预测的比例,置信度 c c c预测表示预测框与实际边界框之间的IOU
。因此,每幅图像所输出的向量长度为 S × S × ( 5 × B + C ) S×S×(5×B+C) S×S×(5×B+C),如图9所示。置信度分数反映了该模型对框是否包含目标的可靠程度,以及它预测框的准确程度。置信度定义为:
P r ( O b j e c t ) ∗ I O U p r e d t r u t h , 其 中 P r ( O b j e c t ) ∈ { 0 , 1 } Pr(Object)*IOU_{pred}^{truth}, \quad其中Pr(Object)∈\left\{0,1\right\} Pr(Object)∗IOUpredtruth,其中Pr(Object)∈{0,1}
如果该单元格中不存在目标,则置信度分数应为零。否则,我们希望置信度分数等于预测框与真实值之间联合部分的交集(IOU
)。每个网格单元还预测 C C C个类别条件概率 P r ( C l a s s i ∣ O b j i e c t ) Pr(Class_i|Objiect) Pr(Classi∣Objiect)。
下图可以更清晰看到YOLO v1
的预测过程,对于每一个网格预测2个Bounding Box
,每个Bounding Box
包含有5个与测量和20个类别概率,即最终输出了1470个向量。通过NMS
对Bounding Box
的合并,并过滤掉冗余的候选框得到相应的检测结果。
YOLO v1
网络结构有24个卷积层,后面是2个全连接层。仅使用1×1
卷积降维层,后面是3×3
卷积层,如下图所示。
20
个卷积层、平均池化层、全连接层进行了大约一周的预训练;224×224
和448×448
大小的图像。dropout
和数据增强来避免过拟合。(1)优点
YOLO
检测物体速度较快,其增强版GPU中能跑45fps
(frame per second
),简化版155fps
。YOLO
在训练和测试时都能看到一整张图的信息(而不像其它算法看到局部图片信息),因此YOLO
在检测物体是能很好利用上下文信息,从而不容易在背景上预测出错误的物体信息。YOLO
可以学到物体泛化特征(2)缺点
YOLO v2
相对v1
版本,在继续保持处理速度的基础上,从预测更准确(Better
),速度更快(Faster
),识别对象更多(Stronger
)这三个方面进行了改进。在精度上利用一些列训练技巧,在速度上应用了新的网络模型DarkNet19
,在分类任务上采用联合训练方法,结合wordtree等方法,使YOLO v2
的检测种类扩充到了上千种,作者在论文中称可以检测超过9000个目标类别,所以也称YOLO 9000
。 YOLO v2
模型可以以不同的尺寸运行,从而在速度和准确性之间提供了一个简单的折衷,在67fps
时,YOLO v2
在VOC 2007
上获得了mAP=76.8 %
;在40fps
时,YOLO v2
获得了mAP=78.6%
,比使用ResNet
的Faster R-CNN
和SSD
等先进方法表现更出色,同时仍然运行速度显著更快。
YOLO v2
相对YOLO v1
采取了很多改进措施,以提高模型mAP
,如下图所示:
批归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch
分别进行归一化的时候,起到了一定的正则化效果(YOLO v2
不再使用dropout
),从而能够获得更好的收敛速度和收敛效果,mAP
提升2.4%
。
通常,一次训练会输入一批样本(batch
)进入神经网络。批规一化在神经网络的每一层,在网络(线性变换)输出后和激活函数(非线性变换)之前增加一个批归一化层(BN
),BN
层进行如下变换:① 对该批样本的各特征量(对于中间层来说,就是每一个神经元)分别进行归一化处理,分别使每个特征的数据分布变换为均值0,方差1。从而使得每一批训练样本在每一层都有类似的分布,这一变换不需要引入额外的参数。② 对上一步的输出再做一次线性变换,假设上一步的输出为Z
,则Z1=γZ + β
。这里γ
、β
是可以训练的参数。增加这一变换是因为上一步骤中强制改变了特征数据的分布,可能影响了原有数据的信息表达能力。增加的线性变换使其有机会恢复其原本的信息。
(2)高分辨率图像分类器(High resolution classifier)
YOLO v1
在预训练的时候采用的是224×224
的输入(这是因为一般预训练的分类模型都是在ImageNet
数据集上进行的),然后在detection
的时候采用448×448
的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。而YOLO v2
则将预训练分成两步:先用224×224
的输入从头开始训练网络,大概160个epoch
(表示将所有训练数据循环跑160次),然后再将输入调整到448×448,再训练10个epoch
。注意这两步都是在ImageNet
数据集上操作。最后再在检测的数据集上微调(fine-tuning
),也就是detection
的时候用448×448
的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高mAP 3.7%
。
(3)带Anchor Boxes的卷积(Convolutional With Anchor Boxes)
YOLO v1
利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。YOLO v2
去掉了YOLO v1
中的全连接层,使用Anchor Boxes
预测边界框,同时为了得到更高分辨率的特征图,YOLO v2
还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,若特征图恰好有一个中心位置,利用这个中心位置预测中心点落入该位置的物体,对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。YOLO v2
通过缩减网络,使用416×416
的输入,模型下采样的总步长为32,最后得到13×13
的特征图,然后对13×13
的特征图的每个cell
预测5个anchor boxes
,对每个anchor box
预测边界框的位置信息、置信度和一套分类概率值。使用anchor boxes
之后,YOLO v2
可以预测13×13×5=845
个边界框,模型的召回率由原来的81%
提升到88%
,mAP
由原来的69.5%
降低到69.2%
,召回率提升了7%
,准确率下降了0.3%
。
(4)维度聚类(Dimension Clusters)
在Faster R-CNN
和SSD中,先验框都是手动设定的,带有一定的主观性。YOLO v2
采用k-means
聚类算法对训练集中的边界框做了聚类分析,选用boxes
之间的IOU
值作为聚类指标。综合考虑模型复杂度和召回率,最终选择5个聚类中心,得到5个先验框,发现其中中扁长的框较少,而瘦高的框更多,更符合行人特征。通过对比实验,发现用聚类分析得到的先验框比手动选择的先验框有更高的平均IOU
值,这使得模型更容易训练学习。
(5)直接定位预测(Direct location Prediction)
Faster R-CNN
使用anchor boxes
预测边界框相对先验框的偏移量,由于没有对偏移量进行约束,每个位置预测的边界框可以落在图片任何位置,会导致模型不稳定,加长训练时间。YOLO v2
沿用YOLO v1
的方法,根据所在网格单元的位置来预测坐标,则Ground Truth
的值介于0到1之间。网络中将得到的网络预测结果再输入sigmoid
函数中,让输出结果介于0到1之间。设一个网格相对于图片左上角的偏移量是 c x c_x cx, c y c_y cy,先验框的宽度和高度分别是 p w p_w pw和 p h p_h ph,则预测的边界框相对于特征图的中心坐标 ( b x , b y ) (b_x, b_y) (bx,by)和宽度 b w b_w bw, b h b_h bh的计算公式如下图所示。其中,σ为sigmoid函数, t x t_x tx, t y t_y ty是预测的坐标偏移值(中心点坐标), t w t_w tw, t h t_h th是尺度缩放,分别经过sigmoid,输出0-1之间的偏移量,与 c x c_x cx, c y c_y cy相加后得到bounding box
中心点的位置。
(6)细粒度特征(Fine-Grained Features)
YOLO v2
借鉴SSD
使用多尺度的特征图做检测,提出pass through
层将高分辨率的特征图与低分辨率的特征图联系在一起,从而实现多尺度检测。YOLO v2
提取Darknet-19
最后一个max pool
层的输入,得到26×26×512
的特征图。经过1×1×64
的卷积以降低特征图的维度,得到26×26×64
的特征图,然后经过pass through
层的处理变成13×13×256
的特征图(抽取原特征图每个2×2
的局部区域组成新的channel
,即原特征图大小降低4倍,channel
增加4倍),再与13×13×1024
大小的特征图连接,变成13×13×1280
的特征图,最后在这些特征图上做预测。使用细粒度特征(Fine-Grained Features
),YOLO v2
的性能提升了1%
。
(7)多尺度训练(Multi-Scale Training)
YOLO v2
中使用的Darknet-19
网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。YOLO v2
采用多尺度输入的方式训练,在训练过程中每隔10个batches
,重新随机选择输入图片的尺寸,由于Darknet-19
下采样总步长为32,输入图片的尺寸一般选择32的倍数{320,352,…,608}(最小的选项是320×320
,最大的是608×608
。我们调整网络的尺寸并继续训练)。采用多尺度训练(Multi-Scale Training
), 可以适应不同大小的图片输入,当采用低分辨率的图片输入时,mAP
值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高mAP
值,但速度有所下降。
ImageNet
分类数据集上训练Darknet-19
,此时模型输入为224×224
,共训练160轮。448×448
,继续在ImageNet
分类数据集上训练细调模型,共10轮,此时分类模型top-1
准确率为76.5%
,而top-5
准确度为93.3%
。Darknet-19
分类模型为检测模型,并在检测数据集上继续细调网络。(1)优点
YOLO v2
使用了一个新的分类器作为特征提取部分,较多使用了3×3
卷积核,在每次池化后操作后把通道数翻倍。网络使用了全局平均池化,把1×1
卷积核置于3×3
卷积核之间,用来压缩特征。也用了batch normalization
稳定模型训练。Darknet-19
,包含19个卷积层,5个最大池化层,- 运算次数55.8亿次,top-1
图片分类准确率72.9%
,top-5
准确率91.2%
。YOLO v2
比VGG16
更快,精度略低于VGG16
。(2)缺点
YOLO v2
检测准确率不够,比SSD
稍差。YOLO v3
总结了在YOLO v2
的基础上做了一些尝试性的改进,有的尝试取得了成功,而有的尝试并没有提升模型性能。其中有两个值得一提的亮点,一个是使用残差模型,进一步加深了网络结构;另一个是使用FPN
架构实现多尺度检测。
(1)引入FPN
(特征金字塔网络),实现多尺度预测 。
(2)使用新网络结构darknet-53
(类似于ResNet
引入残差结构)。
(3)分类器不在使用Softmax
,分类损失采用二分类交叉损失熵(binary cross-entropy loss
)。主要考虑因素有两个:
Softmax
使得每个框分配一个类别(score
最大的一个),而对于Open Images
这种数据集,目标可能有重叠的类别标签,因此Softmax
不适用于多标签分类。Softmax
可被独立的多个logistic
分类器替代,且准确率不会下降。YOLO v3
在基本特征提取器上添加几个卷积层,其中最后一个卷积层预测了一个三维张量——边界框,目标和类别预测。 在COCO
实验中,为每个尺度预测3个框,4个边界框偏移量,1个目标预测和80个类别预测,张量的大小为 N × N × [ 3 × ( 4 + 1 + 80 ) ] N×N×[3 ×(4 + 1 + 80)] N×N×[3×(4+1+80)]。
YOLO v3
还从主干网络层中获取特征图,并使用按元素相加的方式将其与上采样特征图进行合并。这种方法能够从上采样的特征图中获得更有意义的语义信息,同时可以从更前的层中获取更细粒度的信息。然后,再添加几个卷积层来处理这个组合的特征图,并最终预测出一个类似的张量。
每种尺度预测3个box
, anchor
的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给3个尺度。
13×13
特征层信息。13×13
卷积层上采样(x2
)后与主干网络26x26
大小的特征图相堆叠,再通过卷积后输出26×26
特征层信息。52×52
特征层信息。YOLO v3
在之前Darknet-19
的基础上引入了残差块,并进一步加深了网络,改进后的网络有53个卷积层,取名为Darknet-53
,网络结构如下图所示(以256×256
的输入为例):
从YOLO v1
到YOLO v2
再到YOLO9000
、YOLO v3
,YOLO
经历三代变革,在保持速度优势的同时,不断改进网络结构,同时汲取其它优秀的目标检测算法的各种trick
,先后引入anchor box
机制、引入FPN
实现多尺度检测等。
每个网络都使用相同的设置进行训练,并在256×256
的图像上进行单精度测试。 运行时间是在Titan X
上用256×256
图像进行测量的。因此,Darknet-53
可与最先进的分类器相媲美,浮点运算更少,速度更快。 Darknet-53
比ResNet-101
更好,且速度快1.5倍。 Darknet-53
与ResNet-152
具有相似的性能,但速度快2倍。
Darknet-53
也实现了最高的每秒浮点运算测量。 这意味着网络结构可以更好地利用GPU
,使它的评测更加高效,更快, 这主要是因为ResNet
的层数太多,效率不高。
(1)兼顾速度与准确率。在COCO
数据集上,mAP
指标与SSD
模型相当,但速度提高了3倍;mAP
指标比RetinaNet
模型差些,但速度要高3.8倍。
(2)小目标检测有所提升,但中等和更大尺寸的物体上的表现相对较差。
YOLO v4
的特点是集大成者,类似综述,但有实验的过程。YOLO v4
在COCO
数据集上,可达 AP 43.5%
,速度高达65fps
,最终达到这么高的性能,一定是不断尝试、不断总结、不断调参的结果。主要包括以下方面:
(1)提出了一种高效而强大的目标检测模型。可以使用1080 Ti
或2080 Ti GPU
训练超快速和准确的目标检测器。
(2)在检测器训练期间,验证了SOTA
的Bag-of Freebies
和Bag-of-Specials
方法的影响。
(3)改进了SOTA
的方法,使它们更有效,更适合单GPU
训练,包括CBN [89],PAN [49],SAM [85]等。文章将目前主流的目标检测器框架进行拆分:input、backbone、neck 和 head,如下图所示。
(4)对于GPU
,作者在卷积层中使用:CSPResNeXt50 / CSPDarknet53
(5)对于VPU
,作者使用分组卷积,但避免使用(SE)块-具体来说,它包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3
作者的目标是在输入网络分辨率,卷积层数,参数数量和层输出(filters
)的数量之间找到最佳平衡。
YOLO v4
框架:
CSPDarknet53
SPP,PAN
YOLO v3
其中YOLO v4
用到相当多的技巧:
backbone
的BoF
:CutMix
和Mosaic
数据增强,DropBlock
正则化,Class label smoothingbackbone
的BoS
:Mish
激活函数,CSP
,MiWRC
BoF
:CIoU-loss
,CmBN
,DropBlock
正则化,Mosaic
数据增强,Self-Adversarial
训练,消除网格敏感性,对单个ground-truth
使用多个anchor
,Cosine annealing scheduler
,最佳超参数,Random training shapes
Bos
:Mish
激活函数,SPP
,SAM
,PAN
,DIoU-NMS
YOLO v4
实验的充分性:
具体试验结果数据详见论文原文。
2020年2月YOLO
之父Joseph Redmon
宣布退出计算机视觉研究领域,2020 年 4 月 23 日YOLO v4
发布,YOLO V4
是YOLO
系列一个重大的更新,其在COCO
数据集上的平均精度(AP
)和帧率精度(FPS
)分别提高了10%
和12%
,并得到了Joseph Redmon
的官方认可,被认为是当前最强的实时对象检测模型之一。正当计算机视觉的从业者们正在努力研究YOLO V4
的时候,6月25日,Ultralytics
发布了YOLO V5
的第一个正式版本,其性能与YOLO V4
不相伯仲,同样也是现今最先进的对象检测技术,并在推理速度上是目前最强。
YOLO v5
按从小到大分为四个模型YOLO v5s
、YOLO v5m
、YOLO v5l
、YOLO v5x
,这四个模型的表现见下图(v4.0
版):
YOLO v5 v5.0
版本新增四个模型,加入了P6
层,因此模型名后面加了个6,四个模型效果分别为:
大家对YOLO v5
命名是争议很大,因为YOLO v5
相对于YOLO v4
来说创新性的地方很少。不过它的性能应该还是有的,现在kaggle上active
检测的比赛小麦检测前面的选手大部分用的都是YOLO v5
的框架。
YOLO
系列目标检测目前已有5个版本,其核心思想大同小异,由于时间仓促,加之小编水平有限,文中难免疏漏及不足之处,敬请广大读者批评指正,不吝赐教,谢谢!