目标检测(Object Detection)入门概要


本文首先介绍目标检测的任务,而后介绍主流的目标检测算法或框架,重点为Faster R-CNN,SSD,YOLO三个检测框架。本文内容主要整理自网络博客,用于普及性了解html

ps:因为以后可能会有一系列对象检测的论文阅读笔记,在论文阅读以前,先大体了解一下目前的研究现状,目标检测的各类主流方法的大体原理,以助于后面能更顺畅看懂论文,后续再经过论文阅读进行细节学习。因为还没有阅读相关论文原文,如有问题,欢迎指出!先献上一个RCNN系列的图(来自知乎:iker peng)。git

这里写图片描述


Objection Detection Tasks

目前计算机视觉(CV,computer vision)与天然语言处理(Natural Language Process, NLP)及语音识别(Speech Recognition)并列为人工智能(AI,artificial intelligence)·机器学习(ML,machine learning)·深度学习(DL,deep learning)方向的三大热点方向 。github

而计算机视觉又有四个基本任务(关于这个任务,说法不一,好比有些地方说到对象检测detection、对象追踪tracking、对象分割segmentation,不用拘泥),即图像分类,对象定位及检测,语义分割,实例分割。图示以下:web

  • a)图像分类:一张图像中是否包含某种物体
  • b)物体检测识别:若细分该任务可获得两个子任务,即目标检测,与目标识别,首先检测是视觉感知得第一步,它尽量搜索出图像中某一块存在目标(形状、位置)。而目标识别相似于图像分类,用于判决当前找到得图像块得目标具体是什么类别。
  • c)语义分割:按对象得内容进行图像得分割,分割的依据是内容,即对象类别。
  • d)实例分割:按对象个体进行分割,分割的依据是单个目标。

这里写图片描述
这里写图片描述

无论什么任务,目标检测应该是计算机视觉领域首先须要掌握的算法


Methods

传统的计算机视觉问题的解决思路:图像——预处理——人工特征(hand-crafted features)提取——分类。大部分研究集中在人工特征的构造和分类算法上,涌现了不少杰出的工做。但存在的问题是人工设计的特征可能适用性并不强,或者说泛化能力较弱,一类特征可能针对某类问题比较好,其余问题就效果甚微。网络

目前主流的深度学习解决思路:经过深度学习算法,进行端到端的解决,即输入图像到输出任务结果一步完成。但其实内部它仍是分stages的,一般是图像——特征提取网络——分类、回归。架构

这里特征提取网络即各类深度神经网络结构,针对这一算法的研究不少,好比说各层的设计细节(激活函数,损失函数,网络结构等)、可视化等,为了能提取更增强壮有效的特征,研究者考虑各类问题,如尺度不变性问题(一般用于解决小目标的检测,如特征金字塔网络,Feature Pyramid Network,FPN),整个网络实际上是分做两类的,前N个层为第一部分,用于特征的提取,输入的图片,输出的是特征图,这与传统的人工特征提取本质上没有太大区别,只是提取特征的算法变成了神经网络算法。而网络的后K层是做为第二部分,完成具体的分类或者回归任务,任务的输入是前一个部分获得的特征图,输出是任务的结果。因此显而后一部分实际上是能够被替代的,也确实有不少框架的第二部分采用其余机器学习的算法替代,如SVM。app

因此须要对本身有个认识!是作算法的研究(一般深度学习就是研究神经网络算法,如何让它特征提取更强大、分类更准确、速度更快,从网络结构、loss function、activation function等入手,须要强大的数学理论)?仍是解决某个具体的问题(用已有的优秀的神经网络算法,侧重于研究解决问题的框架,固然不少时候须要对已有的算法作些微调)?框架

我粗浅的认为前者更纯理论,后者每每以工程为依托。机器学习

针对你的任务,如何设计网络? 当面对你的实际任务时,若是你的目标是解决该任务而不是发明新算法,那么不要试图本身设计全新的网络结构,也不要试图从零复现现有的网络结构。找已经公开的实现和预训练模型进行微调。去掉最后一个全链接层和对应softmax,加上对应你任务的全链接层和softmax,再固定住前面的层,只训练你加的部分。若是你的训练数据比较多,那么能够多微调几层,甚至微调全部层。


Algorithms

目标检测的基本思路:同时解决定位(localization) + 检测(detection)。
多任务学习,带有两个输出分支。一个分支用于作图像分类,即全链接+softmax判断目标类别,和单纯图像分类区别在于这里还另外须要一个“背景”类。另外一个分支用于判断目标位置,即完成回归任务输出四个数字标记包围盒位置(例如中心点横纵坐标和包围盒长宽),该分支输出结果只有在分类分支判断不为“背景”时才使用。

Region Proposal

为何要有候选区域?既然目标是在图像中的某一个区域,那么最直接的方法就是滑窗法(sliding window approach),就是遍历图像的全部的区域,用不一样大小的窗口在整个图像上滑动,那么就会产生全部的矩形区域,而后再后续排查,思路简单,但开销巨大。

候选区域生成算法一般基于图像的颜色、纹理、面积、位置等合并类似的像素,最终能够获得一系列的候选矩阵区域。这些算法,如selective searchEdgeBoxes,一般只须要几秒的CPU时间,并且,一个典型的候选区域数目是2k,相比于用滑动窗把图像全部区域都滑动一遍,基于候选区域的方法十分高效。另外一方面,这些候选区域生成算法的查准率(precision)通常,但查全率(recall)一般比较高,这使得咱们不容易遗漏图像中的目标。


Segmentation as selective search for object recognition ”,ICCV,2011.

Selective search for object recognition.” International journal of computer vision ,2013

论文应该是有两部份内容,一部分是Selective Search的方法寻找候选区域,第二部分为该区域上的特征提取及后续的分类。因为目前特征提取和分类都采用了深度学习方法,因此只是借鉴其候选区寻找算法Selective Search。

将图像划分红不少的小区域(regions)

如何将图像划分红不少的小区域? 划分的方式应该有不少种,好比:

  • 1)等间距划分grid cell,这样划分出来的区域每一个区域的大小相同,可是每一个区域里面包含的像素分布不均匀,随机性大;同时,不能知足目标多尺度的要求(固然,能够用不一样的尺度划分grid cell,这称为Exhaustive Search, 计算复杂度太大)!
  • 2)使用边缘保持超像素划分;
  • 3)使用本文提出的Selective Search(SS)的方法来找到最可能的候选区域;

其实这一步能够看作是对图像的过度割,都是过度割,本文SS方法的过人之处在于预先划分的区域什么大小的都有(知足目标多尺度的要求),并且对过度割的区域还有一个合并的过程(区域的层次聚类),最后剩下的都是那些最可能的候选区域,而后在这些已通过滤了一遍的区域上进行后续的识别等处理,这样的话,将会大大减少候选区域的数目,提供了算法的速度.

下图说明目标的多尺度:

这里写图片描述

整体思路:假设如今图像上有n个预分割的区域,表示为R={R1, R2, …, Rn}, 计算每一个region与它相邻region(注意是相邻的区域)的类似度,这样会获得一个n*n的类似度矩阵(同一个区域之间和一个区域与不相邻区域之间的类似度可设为NaN),从矩阵中找出最大类似度值对应的两个区域,将这两个区域合二为一,这时候图像上还剩下n-1个区域; 重复上面的过程(只须要计算新的区域与它相邻区域的新类似度,其余的不用重复计算),重复一次,区域的总数目就少1,知道最后全部的区域都合并称为了同一个区域(即此过程进行了n-1次,区域总数目最后变成了1).算法的流程图以下图所示:

这里写图片描述

  • step0:生成区域集R,具体参见论文《Efficient Graph-Based Image Segmentation》,基于图的图像分割,也就是说起点仍是图像分割
  • step1:计算区域集R里每一个相邻区域的类似度S={s1,s2,…}
  • step2:找出类似度最高的两个区域,将其合并为新集,添加进R
  • step3:从S中移除全部与step2中有关的子集
  • step4:计算新集与全部子集的类似度
  • step5:跳至step2,直至S为空

类似度计算:论文从四个方面考虑类似度度量——颜色、纹理、尺寸和空间交叠


EdgeBoxes

Edge Boxes: Locating Object Proposals from Edges ,ECCV2014

文章没有涉及到“机器学习”,采用的是纯图像的方法。

研究方法:利用边缘信息(Edge),肯定box内的轮廓个数和与box边缘重叠的edge个数(知道一个box内彻底包含的轮廓个数,那么目标有很大可能性,就在这个box中),基于此对box进行评分,进一步根据得分的高低顺序肯定proposal信息(由大小,长宽比,位置构成)。然后续工做就是在proposal内部运行相关检测算法。

matlab 代码:https://github.com/pdollar/edges

建议参考博客:《Edge Boxes: Locating Object Proposals from Edges》读后感 :https://blog.csdn.net/wsj998689aa/article/details/39476551


R-CNN

“Rich feature hierarchies for accurate object detection and semantic segmentation.” CVPR 2014

卷积神经网络进入目标识别的里程碑,R-CNN,直接看图了解其结构!
这里写图片描述
这里写图片描述

流程:原图——Selective Search获得2K Proposal Regions —— Warpped image region(?) —— ConvNet —— 分类(svm) + 回归(bounding box regression)

这里的Warpped Image Region应该是一种相似resize的操做,将不一样大小的proposal region统一到相同的尺寸,用以输入相同的ConvNet,上面的Convnet是相同的,但SVM分类器是针对每个类别单独训练好的,是不一样的分类器。

R-CNN,是基于这样一种很是简单的想法,对于输入图像,经过selective search方法,先肯定出例如2000个最有可能包含物体的窗口,对于这2000个窗口,咱们但愿它可以对待检测物体达到很是高的召回率。而后对这2000个中的每个去用CNN进行特征提取和分类。对这2000个区域都要去跑一次CNN,那么它的速度是很是慢的,即便每次只须要0.5秒,2000个窗口的话也是须要1000秒,为了加速2014年的时候何凯明提出了SPP-net,其作法是对整个图跑一次CNN,而不须要每个窗口单独作,可是这样有一个小困难,就是这2000个候选窗口每个的大小都不同,为了解决这个问题,SPP-net设计了spatial pyramid pooling,使得不一样大的小窗口具备相同维度的特征。这个方法使得检测时不须要对每个候选窗口去计算卷积,可是仍是不够快,检测一张图像仍是须要几秒的时间。

存在的不足:

1)多个候选区域对应的图像须要预先提取,占用较大的磁盘空间;

2)针对传统CNN须要固定尺寸的输入图像,crop/warp(归一化)产生物体截断或拉伸,会致使输入CNN的信息丢失;

3)每个ProposalRegion都须要进入CNN网络计算,上千个Region存在大量的范围重叠,重复的特征提取带来巨大的计算浪费。


SPP-Net

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition,ECCV 2014,Kaiming He

各个Proposal Region大小不一,全图只卷积一次的话,就不须要通过Wrapp,在特征图上找这些Region的时候仍是存在大小不一的问题,因为维度不一样,后面的全链接层FC的输入没法统一,故采用SPP,空间金字塔池化,这样不一样尺寸的Region经过不一样金字塔池化层,从而获得统一维度的输出,加速算法同时,兼顾了尺度问题。

在R-CNN中,要求输入固定大小的图片,所以须要对图片进行crop、wrap变换,改变尺寸引发的形变影响检测效果。此外,对每个图像中每个proposal进行一遍CNN前向特征提取,若是是2000个propsal,须要2000次前向CNN特征提取,这无疑将浪费不少时间。

该论文对R-CNN中存在的缺点进行了改进,基本思想是,输入整张图像,提取出整张图像的特征图,而后利用空间关系从整张图像的特征图中,在spatial pyramid pooling layer提取各个region proposal的特征。

这里写图片描述

1)取消了crop/warp图像归一化过程,解决图像变形致使的信息丢失以及存储问题;

2)采用空间金字塔池化(SpatialPyramid Pooling )替换了 全链接层以前的最后一个池化层(上图top),翠平说这是一个新词,咱们先认识一下它。

SPP主要有两个特色:

  • 结合空间金字塔方法实现CNNs的对尺度输入。
    通常CNN后接全链接层或者分类器,他们都须要固定的输入尺寸,所以不得不对输入数据进行crop或者warp,这些预处理会形成数据的丢失或几何的失真。SPP Net的第一个贡献就是将金字塔思想加入到CNN,实现了数据的多尺度输入。

    以下图所示,在卷积层和全链接层之间加入了SPP layer。此时网络的输入能够是任意尺度的,在SPP layer中每个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。

    这里写图片描述

  • 只对原图提取一次卷积特征

    在R-CNN中,每一个候选框先resize到统一大小,而后分别做为CNN的输入,这样是很低效的。 因此SPP Net根据这个缺点作了优化:只对原图进行一次卷积获得整张图的feature map,而后找到每一个候选框在feature map上的映射patch,将此patch做为每一个候选框的卷积特征输入到SPP layer和以后的层。节省了大量的计算时间,比R-CNN有一百倍左右的提速。

    这里写图片描述

存在的不足:

1)和RCNN同样,训练过程仍然是隔离的,提取候选框 | 计算CNN特征| SVM分类 | Bounding Box回归独立训练,大量的中间结果须要转存,没法总体训练参数;

2)SPP-Net在没法同时Tuning在SPP-Layer两边的卷积层和全链接层,很大程度上限制了深度CNN的效果;

3)在整个过程当中,Proposal Region仍然很耗时。


Fast R-CNN

“Fast r-cnn.” ICCV 2015. Girshick, Ross.

R-CNN的进阶版Fast R-CNN就是在RCNN的基础上采纳了SPP Net方法,对RCNN做了改进,使得性能进一步提升。

Fast R-CNN借鉴了SPP-net的作法,在全图上进行卷积,而后采用ROI-pooling获得定长的特征向量,例如无论窗口大小是多少,转换成7x7这么大。Fast R-CNN还引入了一个重要的策略,在对窗口进行分类的同时,还会对物体的边框进行回归,使得检测框更加准确。前面咱们说候选窗口会有很是高的召回率,可是可能框的位置不是很准,例如一我的体框多是缺胳膊缺腿,那么经过回归就可以对检测框进行校准,在初始的位置上求精。Fast R-CNN把分类和回归放在一块儿来作,采用了多任务协同窗习的方式。

这里写图片描述

ROI Pooling(region of interest pooling

兴趣区域汇合旨在由任意大小的候选区域对应的局部卷积特征提取获得固定大小的特征,这是由于下一步的两分支网络因为有全链接层,须要其输入大小固定。其作法是,先将候选区域投影到卷积特征上,再把对应的卷积特征区域空间上划分红固定数目的网格(数目根据下一步网络但愿的输入大小肯定,例如VGGNet须要7×7的网格),最后在每一个小的网格区域内进行最大汇合,以获得固定大小的汇合结果。和经典最大汇合一致,每一个通道的兴趣区域汇合是独立的。
这里写图片描述


Faster R-CNN

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks,NIPS 2015

这里写图片描述

以前的Fast R-CNN已经基本实现端到端的检测,而主要的速度瓶颈是在Selective Search算法实现的Region Proposal,故到了Faster R-CNN,主要是解决Region Proposal问题,以实现Real-Time检测。Faster R-CNN的主要思路是,既然检测工做是在卷积的结果Feature Map上作的,那么候选区域的选取是否也能在Feature Map上作?因而RPN网络(Region Proposal Network)应运而生。

候选框提取不必定要在原图上作,特征图上一样能够,低分辨率特征图意味着更少的计算量,基于这个假设,MSRA的任少卿等人提出RPN(RegionProposal Network),总体架构以下图所示

这里写图片描述

经过添加额外的RPN分支网络,将候选框提取合并到深度网络中,这正是Faster-RCNN里程碑式的贡献 !

RPN引入了所谓anchor box的设计,具体来讲,RPN在最后一个卷积层输出的特征图上,先用3x3的卷积获得每一个位置的特征向量,而后基于这个特征向量去回归9个不一样大小和长宽比的窗口,若是特征图的大小是40x60,那么总共就会有大约2万多个窗口,把这些窗口按照信度进行排序,而后取前300个做为候选窗口,送去作最终的分类 。

Faster实现了端到端的检测,而且几乎达到了效果上的最优,但小物体的识别还存在问题,故SSD算法诞生;速度方向的改进仍有余地,因而YOLO诞生了。


SSD

SSD算法是一种直接预测目标类别和bounding box的多目标检测算法。与faster rcnn相比,该算法没有生成 proposal 的过程,这就极大提升了检测速度。针对不一样大小的目标检测,传统的作法是先将图像转换成不一样大小(图像金字塔),而后分别检测,最后将结果综合起来(NMS)。而SSD算法则利用不一样卷积层的 feature map 进行综合也能达到一样的效果。算法的主网络结构是VGG16,将最后两个全链接层改为卷积层,并随后增长了4个卷积层来构造网络结构。对其中5种不一样的卷积层的输出(feature map)分别用两个不一样的 3×3 的卷积核进行卷积,一个输出分类用的confidence,每一个default box 生成21个类别confidence;一个输出回归用的 localization,每一个 default box 生成4个坐标值(x, y, w, h)。此外,这5个feature map还通过 PriorBox 层生成 prior box(生成的是坐标)。上述5个feature map中每一层的default box的数量是给定的(8732个)。最后将前面三个计算结果分别合并而后传给loss层。

这里写图片描述


YOLO

2015年出现了一个名为YOLO的方法,其最终发表在CVPR 2016上。这是一个蛮奇怪的方法,对于给定的输入图像,YOLO无论三七二十一最终都划分出7x7的网格,也就是获得49个窗口,而后在每一个窗口中去预测两个矩形框。这个预测是经过全链接层来完成的,YOLO会预测每一个矩形框的4个参数和其包含物体的信度,以及其属于每一个物体类别的几率。YOLO的速度很快,在GPU上能够达到45fps。

YOLO的处理步骤为:把输入图片缩放到448×448大小;运行卷积网络;对模型置信度卡阈值,获得目标位置与类别。对VOC数据集来讲,YOLO就是把图片统一缩放到448×448,而后每张图平均划分为7×7=49个小格子,每一个格子预测2个矩形框及其置信度,以及20种类别的几率。舍弃了Region proposal阶段,加快了速度,可是定位精度比较低,与此同时带来的问题是,分类的精度也比较低。在各种数据集上的平均表现大概为54.5%mAP。


总结一下RCNN系列算法的步骤:
这里写图片描述

RCNN

  1. 在图像中肯定约1000-2000个候选框 (使用选择性搜索)
  2. 每一个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取
  3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
  4. 对于属于某一特征的候选框,用回归器进一步调整其位置

Fast RCNN

  1. 在图像中肯定约1000-2000个候选框 (使用选择性搜索)
  2. 对整张图片输进CNN,获得feature map
  3. 找到每一个候选框在feature map上的映射patch,将此patch做为每一个候选框的卷积特征输入到SPP layer和以后的层
  4. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
  5. 对于属于某一特征的候选框,用回归器进一步调整其位置

Faster RCNN

  1. 对整张图片输进CNN,获得feature map
  2. 卷积特征输入到RPN,获得候选框的特征信息
  3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
  4. 对于属于某一特征的候选框,用回归器进一步调整其位置

三者比较

方法 创新 缺点 改进
R-CNN (Region-based Convolutional Neural Networks) 一、SS提取RP; 二、CNN提取特征; 三、SVM分类; 四、BB盒回归。 一、 训练步骤繁琐(微调网络+训练SVM+训练bbox); 二、 训练、测试均速度慢 ; 三、 训练占空间 一、 从DPM HSC的34.3%直接提高到了66%(mAP); 二、 引入RP+CNN
Fast R-CNN (Fast Region-based Convolutional Neural Networks) 一、SS提取RP; 二、CNN提取特征; 三、softmax分类; 四、多任务损失函数边框回归。 一、 依旧用SS提取RP(耗时2-3s,特征提取耗时0.32s); 二、 没法知足实时应用,没有真正实现端到端训练测试; 三、 利用了GPU,可是区域建议方法是在CPU上实现的。 一、 由66.9%提高到70%; 二、 每张图像耗时约为3s。
Faster R-CNN (Fast Region-based Convolutional Neural Networks) 一、RPN提取RP; 二、CNN提取特征; 三、softmax分类; 四、多任务损失函数边框回归。 一、 仍是没法达到实时检测目标; 二、 获取region proposal,再对每一个proposal分类计算量仍是比较大。 一、 提升了检测精度和速度; 二、 真正实现端到端的目标检测框架; 三、 生成建议框仅需约10ms。

references

计算机视觉入门系列(一) 综述:https://blog.csdn.net/wangss9566/article/details/54618507
目标检测–Selective Search for Object Recognition(IJCV, 2013)(https://www.cnblogs.com/zhao441354231/p/5941190.html)
选择性搜索(selective search)https://blog.csdn.net/guoyunfei20/article/details/78723646
目标检测-RCNN系列 : https://blog.csdn.net/linolzhang/article/details/54344350
基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN : https://www.cnblogs.com/skyfsm/p/6806246.html
基于深度学习的目标检测技术进展与展望:https://zhuanlan.zhihu.com/p/23770994
深度学习笔记(七)SSD 论文阅读笔记简化 : https://www.cnblogs.com/xuanyuyt/p/7447111.html