这篇综述是我统计信号处理的做业,在这里分享一下,将介绍计算机视觉中的目标检测任务,论述自深度学习以来目标检测的常见方法,着重讲yolo算法,而且将yolo算法与其余的one-stage以及two-stage方法进行比较。git
目标检测在现实中的应用很普遍,咱们须要检测数字图像中的物体位置以及类别,它须要咱们构建一个模型,模型的输入一张图片,模型的输出须要圈出图片中全部物体的位置以及物体所属的类别,见图1。在深度学习浪潮到来以前,目标检测精度的进步十分缓慢,靠传统依靠手工特征的方法来提升精度已经是至关困难的事。而ImageNet分类大赛出现的卷积神经网络(CNN)——AlexNet[1]所展示的强大性能,吸引着学者们将CNN迁移到了其余的任务,这也包括着目标检测任务,近年来,出现了不少目标检测的方法,这里将介绍YOLO[2]-[4],RCNN[5]-[7],SSD[8],RetinaNet[9]系列的方法,其中YOLO,SSD,RetinaNet都是one-stage方法,原始RCNN事multi-stage方法,它的延伸FastRCNN以及FasterRCNN则是two-stage方法。RCNN系列方法是先生成候选框,而后根据候选框来进行坐标回归预测,而YOLO,SSD,RetinaNet则是直接进行回归生成坐标回归,没有通过候选框这一步。
github
这一节将开始详细地叙述YOLO三部曲,先介绍YOLOv1,更好更简单地了解YOLO的原理和思想,而后分别介绍YOLOv2以及YOLOv3,看看这两个模型是使用那些技巧来提高性能。算法
流程:首先YOLOv1会把图像当作一个sxs的栅格,这里的s是等于7,每一个栅格预测2个bounding boxes以及栅格含有对象的置信度,同时每一个栅格仍是预测栅格所属的对象类别,而后经过一些处理方式获得最后的结果,这个处理方式后面会讲到。
npm
架构:而后,咱们来看看YOLOv1的架构,YOLOv1由24层卷积层,4个最大池化层和2个全链接层组成,常规操做,咱们关注最后的输出是7x7x30,这里是7x7表明输入图像的7x7栅格,一一对应,30的前十个表明2个bounding boxes的坐标以及对象的置信度,后20个表明VOC数据集的20个类别。
网络
标签订义:YOLOv1是一个监督式的网络,有监督那就有标签,来看看标签是怎样定义,首先看狗,它被一个框框起来了,这个框就是真实的标签,框对应的中心在哪一个栅格,就表明当前栅格是狗所在的栅格,这个栅格里就会记录狗的标签信息,自行车和小车和狗相似。
架构
损失函数:首先,这个λ是bounding box坐标损失的权重,外层求和是多少个栅格,内层求和是每一个栅格的B个Boxes,这个像一的符号,它表明当前box中是否含有真实标签对象,坐标预测咱们只计算有对象的栅格,其余的栅格不进行计算,这个Ci表明当前栅格含有对象的几率,不光要计算含有对象的,也要计算没有含有对象的,最后的类别,只计算含有对象的栅格,没有包含对象的不考虑。根据这个损失进行反向传播,一步步优化YOLOv1模型。
ide
交并比(IOU): 这是一个评价两个bounding box相互重合程度的指标,这个指标等于两个bounding box的交集面积除以它们并集的面积。当两个bounding box没有任何交集时,IoU为0,即IoU的最小取值,当两个bounding box彻底重合时,IoU为1,即IoU的最大取值,因此IoU的取值范围是[0,1]。
函数
推断:给定一张图,运行YOLO后,总共有98个bounding box输出出来,能够经过非极大值抑制算法获得最后可靠的结果。大体分两步,第一步根据阈值去除那些置信度低的bounding box,而后进入一个循环,首先挑选出最大置信度的bounding box做为预测输出,而后去除那些与这个最大置信度的bounding box的IoU超过0.5的bounding box,由于咱们能够看到一个对象有不少bounding box,它们不少是相交的,这样一个对象的bounding box就肯定好了,而后,咱们再进入循环,找出下一个对象的bounding box,最后直到没有剩余的bounding box,循环结束。性能
从三个方面开始介绍YOLOv2,Better,Faster,Stronger。
Better:批归一化,高分辨分类器,锚盒,维度聚类,细粒度特征以及多尺度训练。学习
批归一化[14](Batch Normalization)的效果则是将数据分布映射到相对紧凑的分布,让网络能够更快以及更好地学习,避免过拟合,使用批归一化这一操做提高了2%mAP。
YOLOv2采用了高分辨率的分类器,在YOLOv1中,将在imagenet预训练好的网络迁移到目标检测网络中,而训练imagenet数据集的输入的大小和目标检测网络的输入尺寸是不一致的,这意味目标检测网络须要同时取学习目标检测并且还要去适应新的分辨率输入,因此YOLOv2使用目标检测输入的分辨率微调了分类网络,而后迁移到目标检测网络中去,这样,目标检测网络就能够专攻学习目标检测了,经过这一技巧,使mAP上升了4%。
在YOLOv1中,最后是使用全链接层来生成bounding box的坐标,然而使用全链接的缺点在于丢失了特征图的空间信息,形成定位不许,做者借鉴了Faster Rcnn中锚框的思想,利用锚框直接在卷积特征图滑窗采样,由于卷积不须要Reshape,因此很好的保留的空间信息,最终使特征图的每一个特征点和原图的每一个栅格一一对应。另外,与YOLOv1不一样的是,YOLOv2是预测的是坐标相对于栅格左顶点的偏移量,经过变换公式获得最后的预测坐标。既然锚框是手动精选的先验框,设想可否一开始就选择了更好的、更有表明性的先验Boxes维度,那么网络就应该更容易学到准确的预测位置。因此做者经过K-means聚类算法将数据集中的ground truth进行了聚类。最后对模型复杂度和召回率的平衡,选择5个聚类中心,挑选了5个最具表明性的bounding box。一块儿提高了5%mAP。
细粒度特征对于检测小物体是有很大的影响,随着图像尺寸的一步步缩小,图片中的某些小物体的特征是会因为特征图的不断缩小而发生信息丢失,做者经过引入了一个Passthrough Layer,把浅层特征图链接到深层特征图,也就是图中这个26x26x512的特征图经过隔行隔列采样,变换成13x13x2048的特征图,而后和13x13x1024的特征图进行按通道concat,经过这一操做,可使mAP提高一个百分点。
而后使为了让YOLOv2对不一样尺寸图片的具备鲁棒性,引入了多尺寸的训练,每10batch,选择新的图像尺寸对网络进行训练,最后使精度提高了2个百分点。
经过一系列的改进,YOLOv2相比于YOLOv1,一会儿提升了15个点。
Faster:YOLOv2简化了网络,只使用了19卷积层和5个池化层(Darknet-19),不只经过一系列的改进使精度高了,速度方面依然比YOLOv1还要快。
Stronger:强大之处体如今YOLO9000,YOLO9000是在YOLOv2的基础上提出的一种能够检测超过9000个类别的模型,其主要贡献点在于提出了一种分类和检测的联合训练策略。对于检测数据集,能够用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集能够仅用来学习分类,可是其能够大大扩充模型所能检测的物体种类。可是遇到的一个问题是两个数据集的类别不是彻底互斥的,好比ImageNet光狗的品种就有100多种,它们与COCO数据集中狗的类别产生冲突,二者是包含关系,针对这一问题,做者提出了一种层级分类方法,主要思路是根据各个类别之间的从属关系创建一种树结构,也就是WordTree。
论文中给出了COCO数据集和ImageNet数据集联合生成的树结构,蓝色的是COCO数据集的类别,橘色的是imageNet的类别,图15给出一个例子,好比imagenet有这两种不一样类型的小猎狗,它们输入小猎狗这一分支,也属于猎狗分支,还属于COCO数据集中狗这一分支,还属于犬类这一分支。这就是wordtree的构造形式。
每一个节点的子节点都属于同一子类,因此能够对它们分类型进行softmax处理。这样就解决了原始分类的冲突问题。在训练时,若是是检测样本,按照YOLOv2的loss计算偏差,而对于分类样本,只计算分类偏差。在预测时,YOLOv2给出的置信度是根结点的置信度 ,同时会给出边界框位置以及一个树状几率图。在这个几率图中找到几率最高的路径,当达到某一个阈值时中止,就用当前节点表示预测的类别。
YOLOv3给出的是一个科技报告,在保持实时性的基础上,对YOLOv2进行了几点改进,主要有三点:采用逻辑回归预测置信度和进行分类,从三个尺度上预测b-box的坐标以及特征提取器发生变化。
逻辑回归的使用:在YOLOv2中,每一个cell是直接经过网络回归预测b-box坐标和置信度的,YOLOv3则将置信度和坐标分开预测,坐标预测仍是经过网络进行预测,而置信度则是单独经过逻辑回归进行预测。在分类上,没有使用softmax多分类,做者也指出softmax最终对性能也没有提高,并且softmax假设是每一个box只有一个类,这对迁移到更大有多种类别标签的数据集是没有好处的,因此做者使用多个逻辑回归来预测分类,使用二元交叉熵计算分类损失。
特征提取器:YOLOv3从新训练了一个新的特征提取器——DarkNet-53,使用了残差网络,相比最早进的特征提取器,性能至关,但浮点数运算更少,速度更快,下采样没有使用池化操做,而是经过卷积步长来实现。图18是DarkNet-53的结构图。
多尺度预测坐标:做者借由FPN的思想,引用中间层的输出与后层输出进行融合,进行三个尺度预测,每一个尺度的每一个cell预测3个坐标,以上面为例,下采样32倍,最后一块儿的输出是8x8x1024,经过卷积层和逻辑回归获得8x8x255(255=3x(5+80),5是坐标加置信度,80是coco类别),这就是第一个尺度的预测输出,第二个尺度是8x8x1024经过上采样与卷积经过缩放变成16x16x512,而后与上一个stage的16x16x512进行concat,而后经过类似的方式生成16x16x255,相似的操做获得,获得32x32x255。
R-CNN:将深度学习应用到目标检测的开创性工做之一,处理过程如图19所示,具体有四步,第一步是使用选择性搜索对输入图像提取不一样尺寸不一样形状大小的候选区域,第二步是选取一个预训练好的深度学习分类模型,将输出层截取掉,将候选区域形变为网络输入须要的固定形状,获得每一个候选区域的特征图。第三步是将特征图与类别标签联合,经过多个SVM分类器来进行分类。第四步是将特征图与位置标签联合,经过线性回归模型预测真实边界框。
FastRCNN:RCNN是很慢的,每一个候选区域都要经过前向传播,许多候选区域是相互重叠的,FastRCNN仍是经过选择性搜索获得候选框,但FastRCNN是将输入图像直接经过预训练模型,将候选框映射到特征图中进行提取感兴趣区域,而后不一样大小的区域经过RoI Pooling层获得相同大小的特征向量,最后经过两个全链接层获得类别和边界框的预测。具体以下图20所示。
FasterRCNN:FastRCNN须要经过选择性搜索获得许多候选框,才能获得较准确的精度,FasterRCNN针对这一问题,提出将选择性搜索替换成区域候选网络(RPN),经过网络自动学习提取好的候选区域,从而能够减小候选区域的数目,提升速度并保证了精度。具体作法是将特征提取的网络输出经过一个填充为1的3x3的卷积层变换为通道为512的特征图,这样特征图的每一个单元都有512维的特征向量,以每一个单元为中心,生成9个不一样的锚盒(3个大小,3个不一样高宽比)并标注它们,使用单元的特征向量预测锚框的二元类别(foreground-background)以及位置坐标,最后使用非极大值抑制去除类似重复的目标边界框。RPN的大体流程如图20所示。
SSD:SSD全称是单发多框检测,它的具体流程如图21所示。首先仍是经过截断全链接层的VGG网络提取特征,获得Conv6特征图,其中VGG中间层Conv4_3的特征图后面会用到,而后将Conv特征图不断地减半,获得了5个不一样大小的特征图,这样,分别在Conv4_3的特征图以及这5个特征图生成锚盒,预测类别与边界框,方法与FasterRCNN相似,对于宽高大的特征图,感觉野小,锚框多,适合检测小的物体,而对于宽高小的特征图,感觉野大,锚框少,则适合检测大的物体,因此SSD仍是一种多尺度的目标检测网络。
RetinaNet:上面介绍了one-stage的检测器(SSD,YOLO)以及two-stage的检测器(RCNN系列),但每每two-stage的检测器性能要强于one-stage,但速度要慢,RetinaNet这篇文章就指出one-stage性能差的一个重要缘由是由b-box的foreground-background类别不平衡问题引发的。Two-stage方法会筛选b-box(RPN减小了background的数目)而且训练过程会设置foreground-background的比例,类别不平衡的问题要轻许多,而one-stage的方法则是直接回归最后的边界框预测,对于一个二分类器来说,某一个类别数目过大,会致使分类器偏向数目大的类别(也就是忽略了重要有物体的foreground,偏向图像的背景),这个问题会致使目标检测的精度很低。针对这一问题,这篇文章提出了Focal Loss,经过简单的loss函数改变,来解决类别不平衡的问题。公式如图22所示。由标准的交叉熵损失修改而成。α_t和γ参数减小了好分类的样本的损失,并让分类器更集中解决更困难样本。
目标检测算法通常是在VOC[10]和COCO[11]数据集中进行测试的,下表1给出上述算法在这两个数据集中的测试结果。限于篇幅,还有不少方法没有讲,特别是更先进的two-stage算法,同时期的two-stage 方法是要比one-stage方法在性能上是要强的,这里只介绍最基本的two-stage方法。
对于目标检测这一任务而言,若是更关注性能指标,则能够参考two-stage系列的方法,而若是更关注实时性的要求,则能够关注one-stage的方法,这篇报告特别讲述了one-stage的YOLO算法,YOLO是以实时性为基础的快速目标检测算法,这种方法很快,也有许多工做,面向GPU和CPU实时性的目标检测算法都有人作出来,YOLO的含义也颇有意思,YOLO——you only look once,其实还有一种说法,you only live once,别犹豫了,用起来吧。
若有发现错误,还请指出,十分感谢!转载请注明本文地址,谢谢!
[1] Krizhevsky A , Sutskever I , Hinton G . ImageNet Classification with Deep Convolutional Neural Networks[J]. Advances in neural information processing systems, 2012, 25(2).
[2] Redmon J , Divvala S , Girshick R , et al. You Only Look Once: Unified, Real-Time Object Detection[J]. 2015.
[3] Redmon J , Farhadi A . [IEEE 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) - Honolulu, HI (2017.7.21-2017.7.26)] 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) - YOLO9000: Better, Faster, Stronger[C]// IEEE Conference on Computer Vision & Pattern Recognition. IEEE, 2017:6517-6525.
[4] Redmon, J., and Farhadi, A.: 2016, arXiv e-prints, arXiv:1612.08242.
[5] Girshick R , Donahue J , Darrell T , et al. Region-Based Convolutional Networks for Accurate Object Detection and Segmentation[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2015, 38(1):142-158.
[6] Girshick R . Fast R-CNN[J]. Computer Science, 2015.
[7] Ren S , He K , Girshick R , et al. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks[J]. 2015.
[8] Liu W , Anguelov D , Erhan D , et al. SSD: Single Shot MultiBox Detector[J]. 2015.
[9] Lin T Y , Goyal P , Girshick R , et al. Focal Loss for Dense Object Detection[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2017, PP(99):2999-3007.
[10] Everingham M , Eslami S M A , Van Gool L , et al. ThePascalVisual Object Classes Challenge: A Retrospective[J]. International Journal of Computer Vision, 2015, 111(1):98-136.
[11] Lin T Y , Maire M , Belongie S , et al. Microsoft COCO: Common Objects in Context[J]. 2014.
[12] http://cs231n.stanford.edu/slides/2018/cs231n_2018_lecture11.pdf
[13] http://www.javashuo.com/article/p-bwjysbwu-bw.html
[14] Ioffe S , Szegedy C . Batch normalization: accelerating deep network training by reducing internal covariate shift[C]// International Conference on International Conference on Machine Learning. JMLR.org, 2015.
[15] https://towardsdatascience.com/training-object-detection-yolov2-from-scratch-using-cyclic-learning-rates-b3364f7e4755
[16] http://ethereon.github.io/netscope/#/gist/d08a41711e48cf111e330827b1279c31