热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

目标检测概览

https:cloud.tencent.comdevelopernews281788https:blog.csdn.netzhang_canarticledetails794907

https://cloud.tencent.com/developer/news/281788
https://blog.csdn.net/zhang_can/article/details/79490735

一、目标检测常见算法

object detection,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别。
  • 物体的尺寸变化范围很大
  • 摆放物体的角度,姿态不定
  • 可以出现在图片的任何地方
  • 物体还可以是多个类别
目前学术和工业界出现的目标检测算法分成3类
    1. 传统的目标检测算法:Cascade + HOG/DPM + Haar/SVM以及上述方法的诸多改进、优化;

p.s.DPM可以看做是HOG(Histogrrams of Oriented Gradients)的扩展,大体思路与HOG一致。先计算梯度方向直方图,然后用SVM(Surpport Vector Machine )训练得到物体的梯度模型(Model)。有了这样的模板就可以直接用来分类了,简单理解就是模型和目标匹配。DPM只是在模型上做了很多改进工作。

    1. 候选区域/框 + 深度学习分类:通过提取候选区域,并对相应区域进行以深度学习方法为主的分类的方案,如:

R-CNN(Selective Search + CNN + SVM)

SPP-net(ROI Pooling)

Fast R-CNN(Selective Search + CNN + ROI)

Faster R-CNN(RPN + CNN + ROI)

R-FCN

等系列方法;

    1. 基于深度学习的回归方法:YOLO/SSD/DenseBox 等方法;以及最近出现的结合RNN算法的RRC detection;结合DPM的Deformable CNN等

二、传统的目标检测算法

传统目标检测流程:

1)区域选择(穷举策略:采用滑动窗口,且设置不同的大小,不同的长宽比对图像进行遍历,时间复杂度高)

2)特征提取(SIFT、HOG等;形态多样性、光照变化多样性、背景多样性使得特征鲁棒性差)

3)分类器分类(主要有SVM、Adaboost等)

图像识别任务:

目标检测概览
①把图中的物体识别出来—classification
输入:图片
输出:物体的类别
评估方法:准确率
②用方框框出它的位置—localization
输入:图片
输出:方框在图片中的位置(x,y,w,h)
评估方法:检测评价函数intersection-over-union(IOU交并比:目标检测中使用的测量在特定数据集中检测相应物体准确度的一个标准,是产生的候选框candidate bound与原标记框ground truth bound的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1)

  • 卷积神经网络CNN已经帮我们完成了图像识别(判定是猫还是狗)的任务了

目标检测概览

根据定位的问题的不同解决思路——

思路一:看做回归问题

预测出(x,y,w,h)四个参数的值

步骤1:

先解决简单问题, 搭一个识别图像的神经网络

在AlexNet VGG GoogleLenet上fine-tuning(在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络来重新fine-tuning也叫微调,或者当做特征提取器)一下

目标检测概览
步骤2:

在上述神经网络的尾部展开(也就说CNN前面保持不变,我们对CNN的结尾处作出改进:加了两个头:“分类头”和“回归头”
成为classification + regression模式
目标检测概览
步骤3:

*Regression那个部分用欧氏距离损失

*使用SGD训练

步骤4:
*预测阶段
把2个头部拼上完成不同的功能
这里需要进行两次fine-tuning

第一次在ALexNet上做,第二次将头部改成regression head,前面不变,做一次fine-tuning

  • Regression的部分加在哪?

有两种处理方法:

•加在最后一个卷积层后面(如VGG)

•加在最后一个全连接层后面(如R-CNN)

  • regression太难做了,应想方设法转换为classification问题。

regression的训练参数收敛的时间要长得多,所以上面的网络采取了用classification的网络来计算出网络共同部分的连接权值。

思路二:取图像窗口

•还是刚才的classification + regression思路

•取不同大小的“框”——输入

•让框出现在不同位置,得出这个框的判定得分

•取得分最高的那个框

目标检测概览

  • 根据得分的高低,我们选择了右下角的黑框作为目标位置的预测。

注:有的时候也会选择得分最高的两个框,然后取两框的交集作为最终的位置预测
对一张图片,用各种大小的框(遍历整张图片)将图片截取出来,输入到CNN,然后CNN会输出这个框的得分(classification)以及这个框图片对应的x,y,h,w(regression)——这方法实在太耗时间了,做个优化。

原来网络是这样的:

目标检测概览
全连接层改为卷积层,这样可以提提速。
目标检测概览

当图像有很多物体怎么办

任务就变成了:多物体识别+定位多个物体

看成分类问题有何不妥?

•你需要找很多位置, 给很多个不同大小的框

•你还需要对框内的图像分类

传统目标检测的主要问题是:

1)基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余

2)手工设计的特征对于多样性的变化没有很好的鲁棒性

三、候选区域/窗 + 深度学习分类

3.1 R-CNN横空出世

  • 预先找出图中目标可能出现的位置,即候选区域Region Proposal)。利用图像中的纹理、边缘、颜色等信息,可以保证在选取较少窗口(几千甚至几百)的情况下保持较高的召回率(Recall)。
  • 问题就转变成找出可能含有物体的区域/框(也就是候选区域/框,比如选2000个候选框),这些框之间是可以互相重叠互相包含的,这样我们就可以避免暴力枚举所有框了。
  • 有了候选区域,剩下的工作实际就是对候选区域进行图像分类的工作(特征提取+分类)。
  • R-CNN的简要步骤如下:
    (1) 输入测试图像

(2) 利用选择性搜索Selective Search算法在图像中从下到上提取2000个左右的可能包含物体的候选区域Region Proposal

(3) 因为取出的区域大小各自不同,所以需要将每个Region Proposal缩放warp)成统一的227x227的大小并输入到CNN,将CNN的fc7层的输出作为特征
(4) 将每个Region Proposal提取到的CNN特征输入到SVM进行分类

  • 具体步骤则如下:
    步骤一:训练(或者下载)一个分类模型(比如AlexNet)

步骤二:对该模型做fine-tuning

•将分类数从1000改为21,比如20个物体类别 + 1个背景

去掉最后一个全连接层
步骤三:特征提取

•提取图像的所有候选框(选择性搜索Selective Search)

•对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘

步骤四:训练一个SVM分类器(二分类)来判断这个候选框里物体的类别

每个类别对应一个SVM,判断是不是属于这个类别,是就是positive,反之nagative
比如下图,就是狗分类的SVM:

目标检测概览
步骤五:使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。

目标检测概览

  • R-CNN虽然不再像传统方法那样穷举,但R-CNN流程的第一步中对原始图片通过Selective Search提取的候选框region
    proposal多达2000个左右,而这2000个候选框每个框都需要进行CNN提特征+SVM分类,计算量很大,导致R-CNN检测速度很慢,一张图都需要47s。
    目标检测概览
  • 有没有方法提速呢?答案是有的,这2000个region
    proposal不都是图像的一部分吗,那么我们完全可以对图像提一次卷积层特征,然后只需要将region proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个region proposal的卷积层特征输入到全连接层做后续操作。

但现在的问题是每个region proposal的尺度不一样,而全连接层输入必须是固定的长度,所以直接这样输入全连接层肯定是不行的。SPP Net恰好可以解决这个问题。

3.2 SPP Net

SPP:Spatial Pyramid Pooling(空间金字塔池化)

SPP-Net是出自2015年发表在IEEE上的论文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。

众所周知,CNN一般都含有卷积部分和全连接部分,其中,卷积层不需要固定尺寸的图像,而全连接层需要固定大小的输入
所以当全连接层面对各种尺寸的输入数据时,就需要对输入数据进行crop(crop就是从一个大图扣出网络输入大小的patch,比如227×227),或warp(把一个边界框bounding box的内容resize成227×227)等一系列操作以统一图片的尺寸大小,比如224224(ImageNet)、3232(LenNet)、96*96等。

  • 但warp/crop这种预处理,导致的问题要么被拉伸变形、要么物体不全,限制了识别精确度。
  • SPP Net的作者Kaiming He等人逆向思考,既然由于全连接FC层的存在,普通的CNN需要通过固定输入图片的大小来使得全连接层的输入固定。那借鉴卷积层可以适应任何尺寸,为何不能在卷积层的最后加入某种结构,使得后面全连接层得到的输入变成固定的呢?
  • 这个“化腐朽为神奇”的结构就是spatial pyramid pooling layer。
下图便是R-CNN和SPP Net检测流程的比较:

它的特点有两个:

  1. 结合空间金字塔方法实现CNNs的多尺度输入。
    SPP Net的第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。
    普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。
    ROI池化层一般跟在卷积层后面,此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出则是固定维数的向量,然后给到全连接FC层。
    目标检测概览

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

只对原图进行一次卷积计算,便得到整张图的卷积特征feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层,完成特征提取工作。

3.3 Fast R-CNN

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

R-CNN仍会有严重的速度瓶颈,原因也很明显,就是计算机对所有region进行特征提取时会有重复计算,Fast-RCNN正是为了解决这个问题诞生的。

  • 与R-CNN框架图对比,可以发现主要有两处不同:一是最后一个卷积层后加了一个ROI pooling layer,二是损失函数使用了多任务损失函数(multi-task loss),将边框回归Bounding Box Regression直接加入到CNN网络中训练。
  • (1) ROI pooling layer实际上是SPP-NET的一个精简版,SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采样到一个7x7的特征图。对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个77512维度的特征向量作为全连接层的输入。
    换言之,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量,而我们知道,conv、pooling、relu等操作都不需要固定size的输入,因此,在原始图片上执行这些操作后,虽然输入图片size不同导致得到的feature map尺寸也不同,不能直接接到一个全连接层进行分类,但是可以加入这个神奇的ROI Pooling层,对每个region都提取一个固定维度的特征表示,再通过正常的softmax进行类型识别。
  • (2) R-CNN训练过程分为了三个阶段,而Fast R-CNN直接使用softmax替代SVM分类,同时利用多任务损失函数边框回归也加入到了网络中,这样整个的训练过程是端到端的(除去region proposal提取阶段)。
    也就是说,之前R-CNN的处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做box regression,而在Fast R-CNN中,作者巧妙的把box regression放进了神经网络内部,与region分类和并成为了一个multi-task模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。
    目标检测概览
    Fast-RCNN很重要的一个贡献是成功的让人们看到了Region Proposal + CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度。

画一画重点:

  • R-CNN有一些相当大的缺点(把这些缺点都改掉了,就成了Fast R-CNN)。

  • 大缺点:由于每一个候选框都要独自经过CNN,这使得花费的时间非常多。

  • 解决:共享卷积层,现在不是每一个候选框都当做输入进入CNN了,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征

  • 原来的方法:许多候选框(比如两千个)–>CNN–>得到每个候选框的特征–>分类+回归

  • 现在的方法:一张完整图片–>CNN–>得到每张候选框的特征–>分类+回归

3.4 Faster R-CNN

Fast R-CNN存在的问题:存在瓶颈:选择性搜索,找出所有的候选框,这个也非常耗时。

  • 解决:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。
  • rgbd在Fast R-CNN中引入Region Proposal Network(RPN)替代Selective
    Search,同时引入anchor
    box应对目标形状的变化问题(anchor就是位置和大小固定的box,可以理解成事先设置好的固定的proposal)。
具体做法:

•将RPN放在最后一个卷积层的后面

•RPN直接训练得到候选区域
目标检测概览

**RPN(Region Proposal Network)**简介:

•在feature map上滑动窗口

•建一个神经网络用于物体分类+框位置的回归

•滑动窗口的位置提供了物体的大体位置信息

框的回归提供了框更精确的位置
目标检测概览
一种网络,四个损失函数;

•RPN calssification(anchor good.bad)

•RPN regression(anchor->propoasal)

•Fast R-CNN classification(over classes)

•Fast R-CNN regression(proposal ->box)
目标检测概览
Faster R-CNN的主要贡献就是设计了提取候选区域的网络RPN,代替了费时的选择性搜索Selective Search,使得检测速度大幅提高。

最后总结一下各大算法的步骤:
  • RCNN
    1.在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)

2.每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取

3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类

4.对于属于某一类别的候选框,用回归器进一步调整其位置

  • Fast R-CNN
    1.在图像中确定约1000-2000个候选框 (使用选择性搜索)

2.对整张图片输进CNN,得到feature map

3.找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层

4.对候选框中提取出的特征,使用分类器判别是否属于一个特定类

5.对于属于某一类别的候选框,用回归器进一步调整其位置

  • Faster R-CNN
    1.对整张图片输进CNN,得到feature map

2.卷积特征输入到RPN,得到候选框的特征信息

3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类

4.对于属于某一类别的候选框,用回归器进一步调整其位置
简言之,即如本文开头所列
R-CNN(Selective Search + CNN + SVM)

SPP-net(ROI Pooling)

Fast R-CNN(Selective Search + CNN + ROI)

Faster R-CNN(RPN + CNN + ROI)
总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于region proposal的R-CNN系列目标检测方法是当前目标检测技术领域最主要的一个分支。

四、基于深度学习的回归方法

4.1 YOLO (CVPR2016, oral)

(You Only Look Once: Unified, Real-Time Object Detection)

Faster R-CNN的方法目前是主流的目标检测方法,但是速度上并不能满足实时的要求。YOLO一类的方法慢慢显现出其重要性,这类方法使用了回归的思想,利用整张图作为网络的输入,直接在图像的多个位置上回归出这个位置的目标边框,以及目标所属的类别
目标检测概览
(1) 给个一个输入图像,首先将图像划分成7*7的网格

(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
(3) 根据上一步可以预测出772个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可
——整个过程非常简单,不再需要中间的region proposal找目标,直接回归便完成了位置和类别的判定。

  • 小结:YOLO将目标检测任务转换成一个回归问题,大大加快了检测的速度,使得YOLO可以每秒处理45张图像。而且由于每个网络预测目标窗口时使用的是全图信息,使得false
    positive比例大幅降低(充分的上下文信息)。
  • 但是YOLO也存在问题:没有了Region Proposal机制,只使用7*7的网格回归会使得目标不能非常精准的定位,这也导致了YOLO的检测精度并不是很高。

4.2 SSD

(SSD: Single Shot multibox Detector)
上面分析了YOLO存在的问题,使用整图特征在7*7的粗糙网格内回归对目标的定位并不是很精准。那是不是可以结合region proposal的思想实现精准一些的定位?SSD结合YOLO的回归思想以及Faster R-CNN的anchor机制做到了这点。
目标检测概览
首先SSD获取目标位置和类别的方法跟YOLO一样,都是使用回归,但是YOLO预测某个位置使用的是全图的特征,SSD预测某个位置使用的是这个位置周围的特征(感觉更合理一些)。

那么如何建立某个位置和其特征的对应关系呢?可能你已经想到了,使用Faster R-CNN的anchor机制。如SSD的框架图所示,假如某一层特征图(图b)大小是88,那么就使用33的滑窗提取每个位置的特征,然后这个特征回归得到目标的坐标信息和类别信息(图c)。

不同于Faster R-CNN,这个anchor是在多个feature map上,这样可以利用多层的特征并且自然的达到多尺度(不同层的feature map 3*3滑窗感受野不同)。

  • 小结:SSD结合了YOLO中的回归思想和Faster R-CNN中的anchor机制,使用全图各个位置的多尺度区域特征进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster R-CNN一样比较精准。SSD在VOC2007上mAP可以达到72.1%,速度在GPU上达到58帧每秒。

推荐阅读
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  •     目标检测是计算机视觉一个非常重要的子任务。目标检测需要发现并准确定位自然图片中的物体。在2012年之前,目标检测主要基于手工设计的特征以及传统分类器。2012年以后,出现了 ... [详细]
  • 每日一书丨AI圣经《深度学习》作者斩获2018年图灵奖
    2019年3月27日——ACM宣布,深度学习之父YoshuaBengio,YannLeCun,以及GeoffreyHinton获得了2018年的图灵奖, ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 理工科男女不容错过的神奇资源网站
    十一长假即将结束,你的假期学习计划进展如何?无论你是在家中、思念家乡,还是身处异国他乡,理工科学生都不容错过一些神奇的资源网站。这些网站提供了丰富的学术资料、实验数据和技术文档,能够帮助你在假期中高效学习和提升专业技能。 ... [详细]
  • 视觉图像的生成机制与英文术语解析
    近期,Google Brain、牛津大学和清华大学等多家研究机构相继发布了关于多层感知机(MLP)在视觉图像分类中的应用成果。这些研究深入探讨了MLP在视觉任务中的工作机制,并解析了相关技术术语,为理解视觉图像生成提供了新的视角和方法。 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • 数据科学笔记26:深入解析随机森林分类算法及其在Python和R中的应用
    ### 摘要随机森林是一种在集成学习领域备受推崇的算法,被誉为“集成学习技术的典范”。该方法因其简洁性、易实现性和较低的计算成本而被广泛应用。本文将深入探讨随机森林的工作原理,特别是其在Python和R中的具体应用。随机森林通过结合多个决策树和Bagging技术,有效提高了模型的准确性和鲁棒性。我们将详细解析其核心机制,并通过实际案例展示如何在不同编程环境中高效实现这一强大的分类算法。 ... [详细]
  • 基于TensorFlow的鸢尾花数据集神经网络模型深度解析
    基于TensorFlow的鸢尾花数据集神经网络模型深度解析 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 本文深入解析了 jQuery 中用于扩展功能的三个关键方法:`$.extend()`、`$.fn` 和 `$.fn.extend()`。其中,`$.extend()` 用于扩展 jQuery 对象本身,而 `$.fn.extend()` 则用于扩展 jQuery 的原型对象,使自定义方法能够作为 jQuery 实例的方法使用。通过这些方法,开发者可以轻松地创建和集成自定义插件,增强 jQuery 的功能。文章详细介绍了每个方法的用法、参数及实际应用场景,帮助读者更好地理解和运用这些强大的工具。 ... [详细]
  • 在该项目中,参与者需结合历史使用模式和天气数据,以预测华盛顿特区自行车共享系统的租赁需求。数据分析部分首先涉及数据的收集,包括用户骑行记录和气象信息,为后续模型构建提供基础。通过深入的数据预处理和特征工程,确保数据质量和模型准确性,最终实现对自行车租赁需求的有效预测。 ... [详细]
  • 第三届人工智能、网络与信息技术国际学术会议(AINIT 2022)
    20223rdInternationalSeminaronArtificialIntelligence,NetworkingandInformationTechnology第三届 ... [详细]
author-avatar
米西米西的歪国人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有