ML-常见目标检测算法

版权声明:转载请注明出处 https://blog.csdn.net/weixin_42683993/article/details/83868331

概述

  • 目标检测作为计算机视觉学科下一个热门研究方向,近年来和深度学习相结合,使得检测准确性和实时性均获得巨大提升。传统的目标检测算法模型主要由两部分组成,第一部分是特征提取器,第二部分是分类器,这类算法的典型代表主要有三种:Haar特征+Adaboost算法,Hog特征+Svm算法,DPM算法。近年来,由于深度学习算法的不断进步,相继发展出多种基于深度学习的目标检测算法,算法也由曾经的特征提取与分类相分离发展为将特征提取和分类及目标检测边框回归融合到一个完整的卷积神经网络中。在早期的RCNN系列算法中,包括RCNN,Fast-RCNN,Faster-RCNN,之后又有人提出实时性能更为突出的YOLO系列算法,包括YOLO,YOLOv2,在此基础上研究人员又提出SSD算法。
  • 主流的目标检测算法主要是基于深度学习模型,其可以分成两大类:
    (1)two-stage检测算法,其将检测问题划分为两个阶段,首先产生候选区域(region proposals),然后对候选区域分类(一般还需要对位置精修),这类算法的典型代表是基于region proposal的R-CNN系算法,如R-CNN,Fast R-CNN,Faster R-CNN等;
    (2)one-stage检测算法,其不需要region proposal阶段,直接产生物体的类别概率和位置坐标值,比较典型的算法如YOLO和SSD。
  • 性能指标
    主要是准确度和速度。对于准确度,目标检测要考虑物体的定位准确性和分类准确度。一般情况下,two-stage算法在准确度上有优势,而one-stage算法在速度上有优势。不过,随着研究的发展,两类算法都在两个方面做改进。Google在2017年开源了TensorFlow Object Detection API,并对主流的Faster R-CNN,R-FCN及SSD三个算法在MS COCO数据集上的性能做了细致对比(见Huang et al. 2017),如下图所示。
    图
  • 近期,Facebook的FAIR也开源了基于Caffe2的目标检测平台Detectron,其实现了最新的Mask R-CNN,RetinaNet等检测算法,并且给出了这些算法的Baseline Results 。不得不说,准确度(accuracy)和速度(speed)是一对矛盾体,如何更好地平衡它们一直是目标检测算法研究的一个重要方向。

数据集

目标检测常用的数据集包括PASCAL VOC,ImageNet,MS COCO等数据集,这些数据集用于研究者测试算法性能或者用于竞赛。

  • PASCAL VOC(The PASCAL Visual Object Classification)是目标检测,分类,分割等领域一个有名的数据集。从2005到2012年,共举办了8个不同的挑战赛。PASCAL VOC包含约10,000张带有边界框的图片用于训练和验证。但是,PASCAL VOC数据集仅包含20个类别,因此其被看成目标检测问题的一个基准数据集。
  • ImageNet在2013年放出了包含边界框的目标检测数据集。训练数据集包含500,000张图片,属于200类物体。由于数据集太大,训练所需计算量很大,因而很少使用。同时,由于类别数也比较多,目标检测的难度也相当大。2014 ImageNet数据集和2012 PASCAL VOC数据集的对比在这里。
  • 另外一个有名的数据集是Microsoft公司(见T.-Y.Lin and al. 2015)建立的MS COCO(Common Objects in COntext)数据集。这个数据集用于多种竞赛:图像标题生成,目标检测,关键点检测和物体分割。对于目标检测任务,COCO共包含80个类别,每年大赛的训练和验证数据集包含超过120,000个图片,超过40,000个测试图片。测试集最近被划分为两类,一类是test-dev数据集用于研究者,一类是test-challenge数据集用于竞赛者。测试集的标签数据没有公开,以避免在测试集上过拟合。在COCO 2017 Detection Challenge中,旷视科技团队凭借提出的Light-Head R-CNN模型夺得冠军(AP为0.526 ),看来还是two-stage算法准确度更胜一筹。

参数指标

  • 精确率(Precision),也叫查准率,指在测试集上所有识别目标中某个指定目标所占比例;
  • 召回率(Recall),也叫查全率,指在测试集上某个指定目标中被正确识别的目标所占比例;
  • 交并比(Intersection-over-Union,IoU),指预测生成的候选边框和原始标记边框之间的交叠率,即交集和并集之间的比值;平均正确率(AP)。评估定位精度IoU(Intersection over Union,介于0到1之间),其表示预测框与真实框(ground-truth box)之间的重叠程度。IoU越高,预测框的位置越准确。因而,在评估预测框时,通常会设置一个IoU阈值(如0.5),只有当预测框与真实框的IoU值大于这个阈值时,该预测框才被认定为真阳性(True Positive, TP),反之就是假阳性(False Positive,FP)

R-CNN(R. Girshick et al., 2014)

  • 是基于region proposal方法的目标检测算法系列开山之作,其先进行区域搜索,然后再对候选区域进行分类。
  • 对于一张图片,R-CNN基于selective search方法大约生成2000个候选区域,然后每个候选区域被resize成固定大小(227×227)并送入一个CNN模型中,最后得到一个4096-d的特征向量。然后这个特征向量被送入一个多类别SVM分类器中,预测出候选区域中所含物体的属于每个类的概率值。每个类别训练一个SVM分类器,从特征向量中推断其属于该类别的概率大小。
  • 选用Selective search方法(J.R.R. Uijlings and al. 2012)来生成候选区域,Selective search 算法根据目标纹理,边缘,颜色等多种特征找到可能存在的候选框,该算法会产生接近2000个候选框,相比于穷举方式已经大大减少,最终分类仍旧采用SVM,边框预测仍采用回归方式。这是一种启发式搜索算法。它先通过简单的区域划分算法将图片划分成很多小区域,然后通过层级分组方法按照一定相似度合并它们,最后的剩下的就是候选区域(region proposals),它们可能包含一个物体。
  • 具体是:step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
    step2:找出相似度最高的两个区域,将其合并为新集,添加进R
    step3:从S中移除所有与step2中有关的子集
    step4:计算新集与所有子集的相似度
    step5:跳至step2,直至S为空
    相似度考虑了颜色、纹理、尺寸和空间交叠这4个参数
  • 为了提升定位准确性,R-CNN最后又训练了一个边界框回归模型。训练样本为(P,G),其中P=(Px,Py,Pw,Ph)为候选区域,而G=(Gx,Gy,Gw,Gh)为真实框,G是与P的IoU最大的真实框(只使用IoU大于0.6的样本),回归器的目标值定义为: tx=(Gx−Px)/Pw, ty=(Gy−Py)/Ph tw=log(Gw/Pw), th=log(Gh/Ph)在做预测时,利用上述公式可以反求出预测框的修正位置。
  • R-CNN模型的训练是多管道的,CNN模型首先使用2012 ImageNet中的图像分类竞赛数据集进行预训练。然后在检测数据集上对CNN模型进行finetuning,其中那些与真实框的IoU大于0.5的候选区域作为正样本,剩余的候选区域是负样本(背景)。共训练两个版本,第一版本使用2012 PASCAL VOC数据集,第二个版本使用2013 ImageNet中的目标检测数据集。最后,对数据集中的各个类别训练SVM分类器
  • 总体来看,R-CNN是非常直观的,就是把检测问题转化为了分类问题,并且采用了CNN模型进行分类,但是效果却很好。最好的R-CNN模型在2012 PASCAL VOC数据集的mAP为62.4%(比第二名高出了22个百分点),在2013 ImageNet上的mAP为31.4%(比第二名高出7.1个百分点)。

SPP-net

  • SPP-net(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition, He et al. 2014)提出的起因是解决图像分类中要求输入图片固定大小的问题,但是SPP-net中所提出的空间金字塔池化层(Spatial Pyramid Pooling Layer, SPP)可以和R-CNN结合在一起并提升其性能。
  • 采用深度学习模型解决图像分类问题时,往往需要图像的大小固定(比如224×224),这并不是CNN层的硬性要求,主要原因在于CNN层提取的特征图最后要送入全连接层(如softmax层),对于变大小图片,CNN层得到的特征图大小也是变化的,但是全连接层需要固定大小的输入,所以必须要将图片通过resize, crop或wrap等方式固定大小(训练和测试时都需要)。但是实际上真实的图片的大小是各种各样的,一旦固定大小可能会造成图像损失,从而影响识别精度。为了解决这个问题,SSP-net在CNN层与全连接层之间插入了空间金字塔池化层来解决这个矛盾。
  • SPP层原理,假定CNN层得到的特征图大小为a×a(比如13×1313×13,随输入图片大小而变化),设定的金字塔尺度为n×n bins(对于不同大小图片是固定的),那么SPP层采用一种滑动窗口池化,窗口大小win_size=⌈a/n⌉,步为stride=⌊a/n⌋,采用max pooling,本质上将特征图均分为n×n个子区域,然后对各个子区域max pooling,这样不论输入图片大小,经过SPP层之后得到是固定大小的特征。一般设置多个金字塔级别。一般采用44,22,1*1这种类似金字塔结构的池化单元组成方式,经过这些不同大小的池化单元提取特征之后,将经过该层后输出的不同大小的池化结果组合为一维向量,该向量作为全连接层输入,因此得到的全连接层输入固定。添加具有多尺度的空间金字塔池化层可以允许多个尺寸大小不同的图片直接输入,不用经过裁剪。SPP-net只需要将图像输入CNN一次而不像RCNN需要多次重复输入图像SPP-net在ImageNet ILSVRC 2014图像分类大赛中夺得了第三名。
  • 那么SPP-net和R-CNN有什么关系呢?在R-CNN中,由于每个候选区域大小是不同,所以需要先resize成固定大小才能送入CNN网络,SPP-net正好可以解决这个问题。继续上前一步,就是R-CNN每次都要挨个使用CNN模型计算各个候选区域的特征,这是极其费时的,不如直接将整张图片送入CNN网络,然后抽取候选区域的对应的特征区域,采用SPP层,这样可以大大减少计算量,并提升速度。基于SPP层的R-CNN模型在准确度上提升不是很大,但是速度却比原始R-CNN模型快24-102倍。这也正是接下来Fast R-CNN所改进的方向。

Fast R-CNN

  • Fast R-CNN(Fast Region-based Convolutional Network, R. Girshick 2015)的提出主要是为了减少候选区域使用CNN模型提取特征向量所消耗的时间,其主要借鉴了SPP-net的思想。
  • 在R-CNN中,每个候选区域都要单独送入CNN模型计算特征向量,这是非常费时的,而对于Fast R-CNN,其CNN模型的输入是整张图片,然后结合RoIs(Region of Interests)pooling和Selective Search方法从CNN得到的特征图中提取各个候选区域的所对应的特征。
  • 对于每个候选区域,使用RoI pooling层来从CNN特征图中得到一个固定长和宽的特征图(长和宽是超参数,文中选用7×7),RoI pooling的原理很简单,其根据候选区域按比例从CNN特征图中找到对应的特征区域,然后将其分割成几个子区域(根据要输出的特征图的大小),然后在每个子区域应用max pooling,从而得到固定大小的特征图,这个过程是可导的。
  • RoI pooling层相比SPP层看起来主要是只使用一个金字塔级别。然后RoI pooling层得到的特征图送入几个全连接层中,并产生新的特征向量,这些特征向量分别用于一个softmax分类器(预测类别)和一个线性回归器上(用于调整边界框位置)来进行检测。
  • 在实现上是使用两个不同的全连接层,第一个全连接层有N+1个输出(N是类别总数,1是背景),表示各个类别的概率值;第二个全连接层有4N个输出,表示坐标回归值(tx,ty,tw,th),这个与R-CNN是一样的,每个类别都预测4个位置坐标值。
  • Fast R-CNN与R-CNN的另外的一个主要区别点是采用了softmax分类器而不是SVM分类器,而且训练过程是单管道的,最好的Fast R-CNN模型在2007 PASCAL VOC测试集上的mAp为70%,在2010 PASCAL VOC测试集上的mAP为68.8%,而在2012 PASCAL VOC测试集上的mAP为68.4%,准确度相比R-CNN略有提升,其实主要是速度更快。

Faster R-CNN

  • 对于Fast R-CNN,其仍然需要selective search方法来生产候选区域,这是非常费时的。为了解决这个问题,Faster R-CNN模型(The Faster Region-based Convolutional Network, S. Ren and al. 2016)引入了RPN (Region Proposal Network)直接产生候选区域。Faster R-CNN可以看成是RPN和Fast R-CNN模型的组合体,即Faster R-CNN = RPN + Fast R-CNN。
  • 对于RPN网络,先采用一个CNN模型(一般称为特征提取器)接收整张图片并提取特征图。然后在这个特征图上采用一个N×N(文中是3×3)的滑动窗口,对于每个滑窗位置都映射一个低维度的特征(如256-d)。然后这个特征分别送入两个全连接层,一个用于分类预测,另外一个用于回归。对于每个窗口位置一般设置k个不同大小或比例的先验框(anchors, default bounding boxes),这意味着每个位置预测k个候选区域(region proposals)。对于分类层,其输出大小是2k,表示各个候选区域包含物体或者是背景的概率值,而回归层输出4k个坐标值,表示各个候选区域的位置(相对各个先验框)。对于每个滑窗位置,这两个全连接层是共享的。因此,RPN可以采用卷积层来实现:首先是一个n×n卷积得到低维特征,然后是两个1×1的卷积,分别用于分类与回归。
  • 最好的Faster R-CNN模型在 2007 PASCAL VOC测试集上的mAP为78.8% ,而在2012 PASCAL VOC测试集上的mAP为75.9%。论文中还在 COCO数据集上进行了测试。Faster R-CNN中的某个模型可以比采用selective search方法的Fast R-CNN模型快34倍。可以看到,采用了RPN之后,无论是准确度还是速度,Faster R-CNN模型均有很大的提升。Faster R-CNN采用RPN代替启发式region proposal的方法,这是一个重大变革,后面的two-stage方法的研究基本上都采用这种基本框架,而且和后面算法相比,Faster R-CNN在准确度仍然占据上风。

Yolo

  • YOLO(You Only Look Once: Unified, Real-Time Object Detection),是Joseph Redmon和Ali Farhadi等人于2015年提出的基于单个神经网络的目标检测系统。在2017年CVPR上,Joseph Redmon和Ali Farhadi又发表的YOLO 2,进一步提高了检测的精度和速度。
  • YOLO是一个可以一次性预测多个Box位置和类别的卷积神经网络,能够实现端到端的目标检测和识别,其最大的优势就是速度快。事实上,目标检测的本质就是回归,因此一个实现回归功能的CNN并不需要复杂的设计过程。YOLO没有选择滑动窗口(silding window)或提取proposal的方式训练网络,而是直接选用整图训练模型。这样做的好处在于可以更好的区分目标和背景区域,相比之下,采用proposal训练方式的Fast-R-CNN常常把背景区域误检为特定目标。

资料代码

1 Fast R-CNN

https://github.com/rbgirshick/fast-rcnn
https://github.com/precedenceguo/mx-rcnn
https://github.com/mahyarnajibi/fast-rcnn-torch
https://github.com/apple2373/chainer-simple-fast-rnn
https://github.com/zplizzi/tensorflow-fast-rcnn

2 Faster R-CNN

http://web.cs.hacettepe.edu.tr/~aykut/classes/spring2016/bil722/slides/w05-FasterR-CNN.pdf
Matlab
https://github.com/ShaoqingRen/faster_rcnn
Caffe
https://github.com/rbgirshick/py-faster-rcnn
MXNet
https://github.com/msracver/Deformable-ConvNets/tree/master/faster_rcnn
PyTorch
https://github.com//jwyang/faster-rcnn.pytorch
TensorFlow
https://github.com/smallcorgi/Faster-RCNN_TF
Keras
https://github.com/yhenon/keras-frcnn
C++
https://github.com/D-X-Y/caffe-faster-rcnn/tree/dev

3 SPP-Net(空间金字塔池化网络)

https://github.com/ShaoqingRen/SPP_net
http://zhangliliang.com/2014/09/13/paper-note-sppnet/

4 .YOLO模型
代码实现:

https://github.com/pjreddie/darknet
https://github.com/gliese581gg/YOLO_tensorflow
https://github.com/xingwangsfu/caffe-yolo
https://github.com/tommy-qichang/yolo.torch
https://github.com/nilboy/tensorflow-yolo

相关应用:

Darkflow:将darknet转换到tesorflow平台。加载训练好的权值,用tensorflow再次训练,再将导出计算图到C++环境中。
https://github.com/thtrieu/darkflow
使用你自己的数据训练YOLO模型。利用分类标签和自定义的数据进行训练,darknet支持Linux / Windows系统。
https://github.com/Guanghan/darknet
IOS上的YOLO实战:CoreML vs MPSNNGraph,用CoreML和新版MPSNNGraph的API实现小型YOLO。
https://github.com/hollance/YOLO-CoreML-MPSNNGraph
安卓上基于TensorFlow框架运行YOLO模型实现实时目标检测。
https://github.com/natanielruiz/android-yolo

5.YOLOv2模型

各种实现:

Keras
https://github.com/allanzelener/YAD2K
PyTorch
https://github.com/longcw/yolo2-pytorch
Tensorflow
https://github.com/hizhangp/yolo_tensorflow
Windows
https://github.com/AlexeyAB/darknet
Caffe
https://github.com/choasUp/caffe-yolo9000

相关应用:

Darknet_scripts是深度学习框架中YOLO模型中darknet的辅助脚本,生成YOLO模型中的参数anchors。
https://github.com/Jumabek/darknet_scripts
Yolo_mark:图形化标记用于训练YOLOv2模型的图像目标
https://github.com/AlexeyAB/Yolo_mark
LightNet:改进的DarkNet
https://github.com//explosion/lightnet
用于生成YOLOv2模型所需训练数据的边界框标记工具
https://github.com/Cartucho/yolo-boundingbox-labeler-GUI
Loss Rank Mining:基于实时目标检测的一种通用的困难样本挖掘方法。LRM是第一个高度适用于YOLOv2模型中的困难样本挖掘策略,它让YOLOv2模型能够更好的应用到对实时与准确率要求较高的场景中。
https://arxiv.org/abs/1804.04606

猜你喜欢

转载自blog.csdn.net/weixin_42683993/article/details/83868331