目标识别_目标识别舰船 - CSDN
精华内容
参与话题
  • 深度学习之目标检测与目标识别

    万次阅读 多人点赞 2018-06-05 21:58:54
    本文主要讲述了目标识别中的第一种类型---基于region proposal的目标检测和目标识别的算法, 主要主要包括R-CNN,Fast R-CNN,Faster R-CNN等网络, 揭示了基于region proposal的目标检测和目标识别的算法的发展历程....

    一 目标识别分类及应用场景

        目前可以将现有的基于深度学习的目标检测与识别算法大致分为以下三大类: 

        ① 基于区域建议的目标检测与识别算法,如R-CNN, Fast-R-CNN, Faster-R-CNN;

        ② 基于回归的目标检测与识别算法,如YOLO, SSD;

        ③ 基于搜索的目标检测与识别算法,如基于视觉注意的AttentionNet,基于强化学习的算法.

        目前, 目标识别主要有以下几个应用场景:

        ① 安全领域指纹识别人脸识别等,代表项目如Face++、依图科技、深醒科技等。

        ② 军事领域地形勘察飞行物识别等,代表项目全悉科技。

        ③ 交通领域车牌号识别无人驾驶交通标志识别等,代表项目纵目科技、TuSimple(图森科技)、驭势科技等。

        ④ 医疗领域心电图B超健康管理营养学等,代表项目智影医疗、图玛深维等。

        ⑤ 生活领域智能家居购物智能测肤等,代表项目Yi+、木薯科技、肌秘等。

        具体可参考这里:从图像识别多样化的应用场景,看计算机视觉的未来价值

    二 基于区域建议的目标识别的算法

    1. R-CNN

    1.1 基本工作流程:

        1) 接收一个图像, 使用Selective Search选择大约2000个从上到下的类无关的候选区域(proposal)

        2) 将提取出来的候选区域转换为统一大小的图片(拉升/压缩等方法), 使用CNN模型提取每一个候选区域的固定长度的特征.

        3) 使用特定类别的线性SVM分类器对每一个候选区域进行分类.

        4) Bounding Box回归.

    1.2 训练 (使用AlexNet, 要求输入为227*227大小的图像)

        1) 预训练预训练CNN(边界框标签不可用于该数据).

        2) 特征领域的微调使用基于CNN的SGD的训练,对模型进行微调.在这里选择学习率为预训练的1/10, 保证微调不破坏初始化.

        3) 将所有候选区域与真实框重叠(IoU)大于等于0.5的作为该框类的正例,其余的作为负例.再进行SVM分类.

            ------这个表明了训练过程是需要Grounding Truth(标定框)的, 是有监督的过程.

    注意: 在预训练和微调中使用的CNN网络参数的共享,并且提取的特征数目为(类别N+背景1)个.

    1.3 预测

        预测的过程和训练基本相同,不同的是:

        1) 预测的过程没有初始给定的标定框(Grounding Truth).

        2) Bounding Box回归.

        其实简单来说, 预测的过程就是根据在训练过程中找到的CNN回归值与所要预测的Grounding Truth之间的关系, 反向推导Grounding Truth的位置.

    1.4 R-CNN的优劣分析及小结

        1) R-CNN较之于传统方法的主要优势:

        ① 使用了Select Search进行proposal的选择, 极大地减少了proposal的数量.(百万级别~2000左右)

        ② 深度学习提取特征来代替人为设计, 较大地提高了精度和效率.

        ③ 使用了Bounding Box回归, 进一步提高了检测的精度.

        2) R-CNN的不足之处:

        ① 训练分为了多个步骤. 包括Select Search进行proposal的选择, CNN的模型训练(模型的预训练和微调), SVM的分类, Bounding Box回归等, 整个过程需要的时间过长.

        ② 由于当时的历史等各个因素的影响, 使用了SVM进行多类别分类,要训练多个分类器, 训练时间较长

        ③ 测试时间长,由于每张图片要处理大量的目标候选框

        3) 小结

        虽然R-CNN仍然存在很多的问题, 但是它打破了传统的目标识别的方式, 基于深度神经网络的目标识别技术也由此发展起来了.

    2. SPP Net

        为了后面介绍Fast R-CNN, 这里我们简要介绍下SPP Net的相关内容.


        SPP Net具有两个特点:

        ① 结合金字塔的思想, 实现了实现了CNNs的多尺寸输入. 解决了因为CNNs对输入的格式要求而进行的预处理(如crop,warp等)操作造成的数据信息的丢失问题.

        ② 只对原图进行一次卷积操作

    2.1 SPP Net的金字塔池化


        如上图所示, 输入图片经过多个卷积层操作, 再将输出的feature map输入到SPP Net池化层, 最后将池化后的特征输入全连接层.

        下面针对上图来说说SPP Net池化层的思想.可以参见这里.

        我们使用三层的金字塔池化层pooling,分别设置图片切分成多少块,论文中设置的分别是(1,4,16),然后按照层次对这个特征图feature A进行分别处理(用代码实现就是for(1,2,3层)),也就是在第一层对这个特征图feature A整个特征图进行池化(池化又分为:最大池化,平均池化,随机池化),论文中使用的是最大池化,得到1个特征。

        第二层先将这个特征图feature A切分为4个(20,30)的小的特征图,然后使用对应的大小的池化核对其进行池化得到4个特征,

        第三层先将这个特征图feature A切分为16个(10,15)的小的特征图,然后使用对应大小的池化核对其进行池化得到16个特征.

        最后将这1+4+16=21个特征输入到全连接层,进行权重计算. 当然了,这个层数是可以随意设定的,以及这个图片划分也是可以随意的,只要效果好同时最后能组合成我们需要的特征个数即可.

    2.2 SPP Net的一次卷积

        由于R-CNN先获取proposal,再进行resize,最后输入CNN卷积, 这样做效率很低. SPP Net针对这一缺点, 提出了只进行一次原图的卷积操, 得到feature map , 然后找到每一个proposal在feature map上对应的patch, 将这个patch作为每个proposal的卷积特征输入到SPP Net中,进行后续运算. 速度提升百倍.

    3. Fast R-CNN

        Fast R-CNN主要作用是实现了对R-CNN的加速, 它在R-CNN的基础上主要有以下几个方面的改进:

        ① 借鉴了SPP Net的思路, 提出了简化版的ROI池化层(没有使用金字塔), 同时加入了候选框映射的功能, 使得网络能够进行反向传播, 解决了SPP的整体网络训练的问题.

        ② 多任务Loss层. 1) 使用了softmax代替SVM进行多分类. 2) SmoothL1Loss取代了 Bounding Box回归.

    3.1  基本工作流程

        1) 接收一个图像, 使用Selective Search选择大约2000个从上到下的类无关的候选区域(proposal).

        2) 对整张图片进行卷积操作提取特征, 得到feature map.

        3) 找到每个候选框在feature map中的映射patch. 将patch作为每个候选框的特征输入到ROI池化层及后面的层.

        4) 将提取出的候选框的特征输入到softmax分类器中进行分类.==>替换了R-CNN的SVM分类.

        5) 使用SmoothL1Loss回归的方法对于候选框进一步调整位置.

    3.2 Fast R-CNN的优点及其不足之处

        1) 优点

        融合了R-CNN和SPP Net的精髓, 并且引入了多任务损失函数 ,极大地特高了算法的效率, 使得整个网络的训练和测试变得较为简单(相对R-CNN而言).

        2) 不足

        没有对Selective Search进行候选区域(region proposal)的选择进行改进, 仍然不能实现真正意义上的edge-to-edge(端到端)的训练测试.

    4. Faster R-CNN

        Faster R-CNN和Faste R-CNN的不同点主要是使用RPN网络进行region proposal的选择, 并且将RPN网络合并到CNN网络中, 真正地实现了端到端的目标检测.这也是 Faster R-CNN的里程碑式的贡献.

        Faster R-CNN的网络拓扑图如下图所示.

    4.1 基本工作流程

        1. 对整张图片输进CNN网络,得到feature map.

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

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

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

    4.2 RPN

        用于提取region proposal的神经网络叫做Region Proposal Network(简称RPN).

        RPN网络的特点在于通过滑动窗口的方式实现候选框的提取,每个滑动窗口位置生成9个候选窗口(不同尺度、不同宽高), 提取对应9个候选窗口(anchor)的特征,用于目标分类和边框回归,与FastRCNN类似。目标分类只需要区分候选框内特征为前景或者背景。

        1) 候选框的选取依据:

        ① 对于IoU大于等于0.7的标记为前景样本, 低于0.3的样本标记为后景样本.

        ② 丢弃①中所有的边界样本

        对于每一个位置,通过两个全连接层(目标分类+边框回归)对每个候选框(anchor)进行判断,并且结合概率值进行舍弃(仅保留约300个anchor),没有显式地提取任何候选窗口,完全使用网络自身完成判断和修正。

        2) 损失函数

        同时使用两种损失函数:

        a. 分类的误差.

        b. 前景样本的窗口位置的偏差.

        3) 模型训练

        从模型训练的角度来看,通过使用共享特征交替训练的方式,达到接近实时的性能,交替训练方式描述为:

        1)根据现有网络初始化权值w,训练RPN;

        2)用RPN提取训练集上的候选区域,用候选区域训练FastRCNN,更新权值w;

        3)重复1、2,直到收敛.

    4.3 Faster R-CNN的优点及其不足之处

        1) 优点

        Faster R-CNN将我们一直以来的目标检测的几个过程(预选框生成, CNN特征提取, SVM/softmax/CNN预选框分类,y 预选框位置微调)完全被统一到同一个网络中去, 从真正意义上实现了从端到端的训练和测试.

        2) 不足

        预先获取预选区域,再对预选区域进行分类, 仍然具有较大的运算量, 还是没有实现真正意义上的实时检测的要求.

    三  小结

           本节介绍基于region proposal的目标检测与识别算法, 从最初的R-CNN, fast R-CNN,  直到最后的faster R-CNN, 逐步实现了端到端的目标识别和检测的网络.网络训练和测试的效率也有了一个较大的提升.可以说基于region proposal的R-CNN系列目标检测与识别算法是当前目标最主要的一个分支。

        下一章我们将讲述第二类--基于回归的目标检测与识别算法.

    展开全文
  • 目标识别

    万次阅读 多人点赞 2016-08-28 23:17:57
    1.研究意义 众所周知,当前是信息时代,信息的获得、加工、处理以及应用都有了飞跃发展。人们认识世界的重要知识来源就是图像信息,在很多场合,图像所传送的信息比其他形式的信息更丰富、真切和具体。...

    1.研究意义

    众所周知,当前是信息时代,信息的获得、加工、处理以及应用都有了飞跃发展。人们认识世界的重要知识来源就是图像信息,在很多场合,图像所传送的信息比其他形式的信息更丰富、真切和具体。人眼与大脑的协作使得人们可以获取、处理以及理解视觉信息,人类利用视觉感知外界环境信息的效率很高。事实上,据一些国外学者所做的统计,人类所获得外界信息有80%左右是来自眼睛摄取的图像。由此可见,视觉作为人类获取外界信息的主要载体,计算机要实现智能化,就必须能够处理图像信息。尤其是近年来,以图形、图像、视频等大容量为特征的图像数据处理广泛应用于医学、交通、工业自动化等领域。

    自然界的一切图像都是连续变化的模拟图像,在日常生活中,这些图像中的运动目标往往是我们比较关心的,如:行人、行驶的交通工具以及其他的物体。目标检测和识别是计算机视觉和数字图像处理的一个热门方向,广泛应用于机器人导航、智能视频监控、工业检测、航空航天等诸多领域。因此,目标识别也就成为了近年来理论和应用的研究热点,它是图像处理和计算机视觉学科的重要分支,也是智能监控系统的核心部分。它的目的就是如何快速、准确地检测出监控视频中的目标,即从序列图像中将目标提取出来。

    随着社会经济的不断发展,城市化步伐的不断加速,城市的工作、生活秩序显得越来越紊乱,实时的人数统计有着重要意义。如:可以通过统计等候电梯的人数来优化调度电梯,以此提高电梯的利用率,减少用户的等待时间。可以通过统计经过十字路口、丁字路口人群流动繁忙的交通场合的人数,可以合理安排交通警察或保安人员的工作时间和工作额度。


     

    2.研究现状

    目标识别是指用计算机实现人的视觉功能,它的研究目标就是使计算机具有从一幅或多幅图像或者是视频中认知周围环境的能力(包括对客观世界三维环境的感知、识别与理解)。目标识别作为视觉技术的一个分支,就是对视场内的物体进行识别,如人或交通工具,先进行检测,检测完后进行识别,然后分析他们的行为。目前,国际上许多高校和研究所,如麻省理工学学院、牛津大学等都专门设立了针对目标检测和识别的研究组或者研究实验室。美英等国家已经研究了大量的相关项目。一些著名公司和研究机构,如IBM、Microsoft、麻省理工学院等近几年来投入了大量的人力物力来进行智能监控系统的研究,部分成果已经转化为产品投入了市场。

    目前在国内的研究机构中,中国科学院自动化研究所下属的模式识别国家重点实验室视觉监控研究处于领先地位。自动化所在交通场景视觉监控、人的运动视觉监控和行为模式识别方面进行了深入研究。另外他们也总结了英国雷丁大学VIEWS的车辆交通监控原型系统的研究经验,在之前的理论研究的基础上,自行设计并初步实现了一个拥有完全自主知识产权的交通监控原型系统vstart(Visual surveillance star)。国内其他高校如上海交通大学、北京航空航天大学也对这方面进行了研究。


     

    3.目标识别

    3.1目标识别的任务

    识别出图像中有什么物体,并报告出这个物体在图像表示的场景中的位置和方向。对一个给定的图片进行目标识别,首先要判断目标有没有,如果目标没有,则检测和识别结束,如果有目标,就要进一步判断有几个目标,目标分别所在的位置,然后对目标进行分割,判断哪些像素点属于该目标。

    3.2目标识别的过程

    3.2.1目标的识别大体框架:

     

    目标识别往包含以下几个阶段:预处理,特征提取,特征选择,建模,匹配,定位。目前物体识别方法可以归为两类:一类是基于模型的或者基于上下文识别的方法,另一类是二维物体识别或者三维物体识别方法。对于物体识别方法的评价标准,Grimson总结出了大多数研究者主要认可的4个标准:健壮性(robustness)、正确性(correctness)、效率(efficiency)和范围(scope)

    3.2.2训练分类器所需训练样本的创建

    训练样本包括正样本和负样本;其中正例样本是指待检目标样本(例如人脸或汽车等),负样本指其它不包含目标的任意图片(如背景等),所有的样本图片都被归一化为同样的尺寸大小(例如,20x20)。

    3.2.4预处理

           预处理是尽可能在不改变图像承载的本质信息的前提下,使得每张图像的表观特性(如颜色分布,整体明暗,尺寸大小等)尽可能的一致,以便于之后的处理过程。预处理有生物学的对应。瞳孔,虹膜和视网膜上的一些细胞的行为类似于某些预处理步骤,如自适应调节入射光的动态区域等等。预处理和特征提取之间的界线不完全分明。有时两者交叉在一起。它主要完成模式的采集、模数转换、滤波、消除模糊、减少噪声、纠正几何失真等预处理操作。因此也要求相应的设备来实现。

    预处理经常与具体的采样设备和所处理的问题有关。例如,从图象中将汽车车牌的号码识别出来,就需要先将车牌从图像中找出来,再对车牌进行划分,将每个数字分别划分开。做到这一步以后,才能对每个数字进行识别。以上工作都应该在预处理阶段完成。

    从理论上说,像预处理这种先验式的操作是不应该有的。因为它并不为任何目的服务,所以完全可以随意为之而没有“应该怎么做”的标准,大部分情况下预处理是看着实验结果说话。这是因为计算机视觉目前没有一个整体的理论框架,无法从全局的高度来指导每一个步骤应该如何进行。在物体识别中所用到的典型的预处理方法不外乎直方图均衡及滤波几种。像高斯模糊可以用来使得之后的梯度计算更为准确;而直方图均衡可以克服一定程度的光照影响。值得注意的是,有些特征本身已经带有预处理的属性,因此不需要再进行预处理操作。

    预处理通常包括五种基本运算:

        (1)编码:实现模式的有效描述,适合计算机运算。

        (2)阀值或者滤波运算:按需要选出某些函数,抑制另一些。

        (3)模式改善:排除或修正模式中的错误,或不必要的函数值。

        (4)正规化:使某些参数值适应标准值,或标准值域。

        (5)离散模式运算:离散模式处理中的特殊运算。

    3.2.5特征提取

    由图像或波形所获得的数据量是相当大的。例如,一个文字图像可以有几千个数据,一个心电图波形也可能有几千个数据。为了有效地实现分类识别,就要对原始数据进行变换,得到最能反映分类本质的特征。这就是特征选择和提取的过程。一般我们把原始数据组成的空间叫测量空间,把分类识别赖以进行的空间叫做特征空间,通过变换,可把在维数较高的测量空间中表示的模式变为在维数较低的特征空间中表示的模式。特征提取是物体识别的第一步,也是识别方法的一个重要组成部分,好的图像特征使得不同的物体对象在高维特征空间中有着较好的分离性,从而能够有效地减轻识别算法后续步骤的负担,达到事半功倍的效果,下面是对一些常用的特征提取方法:

    (1)颜色特征。颜色特征描述了图像或图像区域所对应的景物的表面性质,常用的颜色特征有图像片特征、颜色通道直方图特征等。

    (2)纹理特征。纹理通常定义为图像的某种局部性质,或是对局部区域中像素之间关系的一种度量。纹理特征提取的一种有效方法是以灰度级的空间相关矩阵即共生矩阵为基础的,其他方法还有基于图像友度差值直方图的特征提取和基于图像灰度共生矩阵的特征提取。

    (3)形状特征。形状是刻画物体的基本特征之一,用形状特征区别物体非常直观,利用形状特征检索图像可以提高检索的准确性和效率,形状特征分析在模式识别和视觉检测中具有重要的作用。通常情况下,形状特征有两类表示方法,一类是形状轮廓特征描述,另一类是形状区域特征。形状轮廓特征主要有:直线段描述、样条拟合曲线、博立叶描述子、内角直方图以及高斯参数曲线等等,形状区域特征主要有:形状的无关矩、区域的面积、形状的纵横比等。

    (4)空间特征。空间特征是指图像中分割出来的多个目标之间的相互的空间位置或者相对方向关系,有相对位置信息,比如上下左右,也有绝对位置信息,常用的提取空间特征的方法的基本思想为对图像进行分割后,提取出特征后,对这些特征建立索引。

    目标比较盛行的有:Haar特征、LBP特征、HOG特征和Shif特征等;他们各有千秋,得视你要检测的目标情况而定。

     

    3.2.6特征选择

    再好的机器学习算法,没有良好的特征都是不行的;然而有了特征之后,机器学习算法便开始发挥自己的优势。在提取了所要的特征之后,接下来的一个可选步骤是特征选择。特别是在特征种类很多或者物体类别很多,需要找到各自的最适应特征的场合。严格地来说,任何能够在被选出特征集上工作正常的模型都能在原特征集上工作正常,反过来进行了特征选择则可能会丢掉一些有用的特征;不过由于计算上的巨大开销,在把特征放进模型里训练之前进行特征选择仍然是相当重要的。

    3.2.7建模

    一般物体识别系统赖以成功的关键基础在于,属于同一类的物体总是有一些地方是相同的。而给定特征集合,提取相同点,分辨不同点就成了模型要解决的问题。因此可以说模型是整个识别系统的成败之所在。对于物体识别这个特定课题,模型主要建模的对象是特征与特征之间的空间结构关系;主要的选择准则,一是模型的假设是否适用于当前问题;二是模型所需的计算复杂度是否能够承受,或者是否有尽可能高效精确或者近似的算法。

           模型表示涉及到物体具有那些重要属性或特征以及这些特征如何在模型库中表示,有些物体模型定义为一系列局部的统计特征,即generative模型,有些是采用物体的特征以及物体特征之间的相互关系定义的,比如位置关系等,即discriminative模型,或者是二者的混合模型。对于大多数物体来说,几何特征描述是可以很有效的;但对于另外一些物体,可能需要更一般的特征或函数来表示。物体的表示应该包含所有相关信息,但没用任何冗余信息,并且将这些信息以某种方式组织起来,使得物体识别系统的不同组元能够容易访问这些信息。

    3.2.8用训练样本来训练分类器

    这得先明白分类器是什么?百度百科的解释是:“使待分对象被划归某一类而使用的分类装置或数学模型。”可以这样理解,举个例子:人脑本身也算一个分类器,只是它强大到超乎想象而已,人对事物的识别本身也是一个分类的过程。人在成长或者学习过程中,会通过观察A类事物的多个具体事例来得到对A类事物性质和特点的认识,然后以后遇到一个新的物体时,人脑会根据这个事物的特征是否符合A类事物性质和特点,而将其分类为A类或者非A类。(这里只是用简单的二分类问题来说明)。那么训练分类器可以理解为分类器(大脑)通过对正样本和负样本的观察(学习),使其具有对该目标的检测能力(未来遇到该目标能认出来)。

    分类器按特征类型分为数值型分类器和符号型两大类。数值型分类器包括统计分类器(统计理论为基础)、模糊分类器(模糊集理论为基础)、人工神经元网络(模拟生物神经系统的电子系统,也可以用软件在计算机上实现)、人工智能分类器(基于逻辑推理或专家系统结构)。符号型分类器包括句法分类器(基于句法分析和自动机理论)、人工智能分类器(基于逻辑推理或专家系统结构)。 其中符号型分类器具有更大的灵活性,所以能处理较为复杂的模式分类问题。但是目前对符号型分类器的研究远没有数值型分类器成熟。为了使分类检测准确率较好,训练样本一般都是成千上万的,然后每个样本又提取出了很多个特征,这样就产生了很多的的训练数据,所以训练的过程一般都很耗时的。

    目标比较盛行的分类器有:SVM支持向量机、AdaBoost算法等;其中检测行人的一般是HOG特征+SVM,OpenCV中检测人脸的一般是Haar+AdaBoost,OpenCV中检测拳头一般是LBP+ AdaBoost。随着深度学习的兴起,现在深度学习在物体识别上取得了相当好的成果。

    3.2.9匹配

    在得到训练结果之后(在描述、生成或者区分模型中常表现为一簇参数的取值,在其它模型中表现为一组特征的获得与存储),接下来的任务是运用目前的模型去识别新的图像属于哪一类物体,并且有可能的话,给出边界,将物体与图像的其它部分分割开。一般当模型取定后,匹配算法也就自然而然地出现。在描述模型中,通常是对每类物体建模,然后使用极大似然或是贝叶斯推理得到类别信息;生成模型大致与此相同,只是通常要先估出隐变量的值,或者将隐变量积分,这一步往往导致极大的计算负荷;区分模型则更为简单,将特征取值代入分类器即得结果。

    一般匹配过程是这样的:用一个扫描子窗口在待检测的图像中不断的移位滑动,子窗口每到一个位置,就会计算出该区域的特征,然后用我们训练好的分类器对该特征进行筛选,判定该区域是否为目标。然后因为目标在图像的大小可能和你训练分类器时使用的样本图片大小不一样,所以就需要对这个扫描的子窗口变大或者变小(或者将图像变小),再在图像中滑动,再匹配一遍。

    3.2.10目标识别方法

           物体识别方法就是使用各种匹配算法,根据从图像已提取出的特征,寻找出与物体模型库中最佳的匹配,它的输入为图像与要识别物体的模型库,输出为物体的名称、姿态、位置等等。大多数情况下,为了能够识别出图像中的一个物体,物体识别方法一般由5个步骤组成:特征提取;知觉组织;索引;匹配;验证

           经典的物体识别方法:

    1)         Bag ofwords(BoW)方法。BoW 方法主要是采用分类方法来识别物体,BoW 方法是来自于自然语言处理,在自然语言处理中是用来表示一篇文档是有一袋子词语组成的,在计算机视觉的物体识别方法中,将图像比作文档,将从图像中提取的特征比作词语,即一幅图像是有一袋子特征组成的,如图1 所示。BoW 方法首先需要一个特征库,特征库中的特征之间是相互独立的,然后图像可以表示为特征库中所有特征的一个直方图,最后采用一些生成性(generative)方法的学习与识别来识别物体。

    2)         Partsand structure 方法。BoW 方法的一个主要缺点为特征之间是相互独立的,丢失了位置信息,Parts and structure 方法采用了特征之间的关系,比如位置信息和底层的图像特征,将提取出的特征联系起来。 Pictorial Structure(PS)提出的弹簧模型,物体部件之间的关系用伸缩的弹簧表示,对于特征之间的关系的模型表示,还有星型结构、层次结构、树状结构等。

    3)         生成性(generative)方法与鉴别性(Discriminative)方法。生成性方法检查在给定物体类别的条件下,图像中出现物体的可能性,并以此判定作为检测结果的得分,鉴别性方法检查图像中包含某个类别出现的可能性与其他类的可能性之比,从而将物体归为某一类。

    3.2.11分割

           一旦在图像中潜在目标的位置找到了,就要从背景中尽可能准确的将目标提取出来,即将目标从背景中分割出来。当存在噪声和杂波干扰时,信噪比可能很低,这是将会给分割造成困难。

           目标的分割算法有很多。每个分割算法都要解决两个问题:分割准则和执行方法。

    (1)MeanShift聚类

    Meanshift聚类也可以用在边缘检测、图像规则化、跟踪等方面。基于meanshift的分割需要精密的参数调整以得到较好的分割效果,如颜色和空间核带宽的选择,区域尺寸最小值的阈值设定。

    (2)Graph-cut

    图像分割可以建模为graph-cut问题。图G的顶点V由图像像素点构成;通过剪除加权的边分割为N个不相连的子图。两个子图间被剪除的边的权和称为cut。权值由颜色、光照、纹理等因素计算得到。通常应用在跟踪目标轮廓上;与MeanShift相比,它所需要参数较少,但计算开销和内存开销较大。

    (3)主动轮廓

    主动轮廓曲线将一个闭合轮廓曲线推演为目标边界,从而实现图像分割。这个过程由轮廓的能量函数来操纵。这个问题需要解决三个方面问题:一是能量函数的确定,二是轮廓曲线的初始化,三是轮廓表达方式的选择。


     

    4.存在问题

    虽然目标识别已经被广泛研究了很多年,研究出大量的技术和算法,识别方法的健壮性、正确性、效率以及范围得到了很大的提升,但在目标检测和识别这方面仍然存在着许多不足,体现在一下几个方面。

    (1)目标之间互遮挡和人体自遮挡问题,尤其是在拥挤状态下,多人的检测更是难处理。 

    (2)获取物体的观测数据时会受到多方面的影响。在不同的视角对同一物体也会得到不同的图像,物体所处的场景的背景以及物体会被遮挡,背景杂物一直是影响物体识别性能的重要因素,场景中的诸多因素,如光源、表面颜色、摄像机等也会影响到图像的像素灰度,要确定各种因素对像素灰度的作用大小是很困难的,这些使得图像本身在很多时候并不能提供足够的信息来恢复景物。

    (3)同样的图像在不同的知识导引下,会产生不同的识别结果,知识库的建立不仅要使用物体的自身知识,如颜色、纹理、形状等,也需要物体间关系的知识,知识库的有效性与准备性直接影响了物体识别的准确性。

    (4)物体本身是一个高维信息的载体,但是图像中的物体只是物体的一个二维呈现,并且在人类目前对自己如何识别物体尚未了解清楚,也就无法给物体识别的研究提供直接的指导。

    (5)目前人们所建立的各种视觉系统绝大多数是只适用于某一特定环境或应用场合的专用系统,而要建立一个可与人的视觉系统相比的通用视觉系统是非常困难的,虽然存在着很多困难。

    (6)目标之间互遮挡,尤其是在拥挤状态下,目标检测很不稳定,检测结果也很不理想,这个问题还需要进一步的研究解决。


     

    5.未来研究思路

             目标检测和识别仍然存在着诸多的问题,以后目标识别可以从以下几个方面改进:

    (1)形状特征的研究。目前大部分的形状特征仍然是基于有向梯度,这是否是足够的,形状是否应该有更高一层的抽象表示,还值得进一步的研究。

    (2)物体的表示与描述。如何描述物体,物体不应该是独立的,物体与物体之间的交互应该考虑进来。物体不应该是一组独立的特征的集合,物体识别应该放在一个更大的上下文环境中来重新考察。

    展开全文
  • 最近在做毕设,关于卷积神经网络的目标识别,做的时候意识到自己混淆了目标识别和目标检测的概念。现在做一个总结,把目标分割、目标识别、目标检测和目标跟踪四个概率捋清楚。 目标分割:Target Segmentation,是...

    最近在做毕设,关于卷积神经网络的目标识别,做的时候意识到自己混淆了目标识别和目标检测的概念。现在做一个总结,把目标分割、目标识别、目标检测和目标跟踪四个概率捋清楚。

    • 目标分割:Target Segmentation,是将图片里的目标分割出来。比如我的目标是人,那最终我从图片里分割出来的新的图片里只有人没有其他东西。
    • 目标识别:Target Recognition,目标识别是做分类任务,既从图像中识别出哪些是第一类东西,哪些是第二类,哪些是第三类·····,而不是我一开始理解的单纯识别出某一个物体。
    • 目标检测:Target Detection,目标检测实质是多目标的定位,即要在图片中定位多个目标物体,包括分类和定位。
    • 目标追踪:Target Tracking,是基于对目标的定位后,实时追踪目标所在的位置。这个应用于视频中。
    展开全文
  • 目标检测综述

    万次阅读 多人点赞 2019-07-10 19:37:06
    这意味着,我们不仅要用算法判断图片中是不是一辆汽车, 还要在图片中标记出它的位置, 用边框或红色方框把汽车圈起来, 这就是目标检测问题。 其中“定位”的意思是判断汽车在图片中的具体位置。 近几年来,目标...

    本文作者 刘畅,公众号计算机视觉life编辑成员

    前言

    图片分类任务我们已经熟悉了,就是算法对其中的对象进行分类。而今天我们要了解构建神经网络的另一个问题,即目标检测问题。这意味着,我们不仅要用算法判断图片中是不是一辆汽车, 还要在图片中标记出它的位置, 用边框或红色方框把汽车圈起来, 这就是目标检测问题。 其中“定位”的意思是判断汽车在图片中的具体位置。
    img
    近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN等),它们是two-stage的,需要先算法产生目标候选框,也就是目标位置,然后再对候选框做分类与回归。而另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个卷积神经网络CNN直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。这可以在下图中看到。
    img
    本文对常见目标检测算法进行简要综述,并最后总结了目标检测算法方向的一些大V方便大家学习查看。

    1. R-CNN

    目标检测有两个主要任务:物体分类和定位,为了完成这两个任务,R-CNN借鉴了滑动窗口思想, 采用对区域进行识别的方案,具体是:

    1. 输入一张图片,通过指定算法从图片中提取 2000 个类别独立的候选区域(可能目标区域)
    2. 对于每个候选区域利用卷积神经网络来获取一个特征向量
    3. 对于每个区域相应的特征向量,利用支持向量机SVM 进行分类,并通过一个bounding box regression调整目标包围框的大小

    1.1. 提取候选区域

    R-CNN目标检测首先需要获取2000个目标候选区域,能够生成候选区域的方法很多,比如:

    1. objectness
    2. selective search
    3. category-independen object proposals
    4. constrained parametric min-cuts(CPMC)
    5. multi-scale combinatorial grouping
    6. Ciresan
      R-CNN 采用的是 Selective Search 算法。简单来说就是通过一些传统图像处理方法将图像分成很多小尺寸区域,然后根据小尺寸区域的特征合并小尺寸得到大尺寸区域,以实现候选区域的选取。

    1.2. 提取特征向量

    对于上述获取的候选区域,需进一步使用CNN提取对应的特征向量,作者使用模型AlexNet (2012)。(需要注意的是 Alexnet 的输入图像大小是 227x227,而通过 Selective Search 产生的候选区域大小不一,为了与 Alexnet 兼容,R-CNN 采用了非常暴力的手段,那就是无视候选区域的大小和形状,统一变换到 227x227 的尺寸)。
    那么,该网络是如何训练的呢?训练过程如下:

    1. 有监督预训练:训练网络参数
      • 样本:ImageNet
      • 这里只训练和分类有关的参数,因为ImageNet数据只有分类,没有位置标注
      • 图片尺寸调整为227x227
      • 最后一层:4097维向量->1000向量的映射。
    2. 特定样本下的微调 :训练网络参数
      • 样本:
        RCNN样本
      • 采用训练好的AlexNet模型进行PASCAL VOC 2007样本集下的微调,学习率=0.001(PASCAL VOC 2007样本集上既有图像中物体类别标签,也有图像中物体位置标签)
      • mini-batch为32个正样本和96个负样本(由于正样本太少)
      • 修改了原来的1000为类别输出,改为21维【20类+背景】输出。

    1.3. SVM分类

    通过上述卷积神经网络获取候选区域的特征向量,进一步使用SVM进行物体分类,关键知识点如下:

    1. 使用了一个SVM进行分类:向SVM输入特征向量,输出类别得分
    2. 用于训练多个SVM的数据集是ImageNet数据
    3. 将2000×4096维特征(2000个候选框,每个候选框获得4096的特征向量)与20个SVM组成的权值矩阵4096×20相乘(20种分类,SVM是二分类器,每个种类训练一个SVM,则有20个SVM),获得2000×20维矩阵表示每个建议框是某个物体类别的得分
    4. 分别对上述2000×20维矩阵中每列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些候选框;
      RCNN分类
      SVM训练:
    • 样本:

      RCNN-SVM训练

    • 由于SVM是二分类器,需要为每个类别训练单独的SVM;

    • SVM训练时,输入正负样本是在AlexNet CNN网络输出的4096维特征向量,输出为该类的得分

    • 由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本

    1.4 边框修正

    使用一个回归器进行边框回归:输入为卷积神经网络pool5层的4096维特征向量,输出为x、y方向的缩放和平移,实现边框的修正。在进行测试前仍需回归器进行训练。
    回归器训练

    • 样本:

      RCNN边框回归样本
      在2014年R-CNN横空出世的时候,颠覆了以往的目标检测方案,精度大大提升。对于R-CNN的贡献,可以主要分为两个方面:

      1. 使用了卷积神经网络进行特征提取
      2. 使用bounding box regression进行目标包围框的修正
        但是,我们来看一下,R-CNN有什么问题:
      3. 耗时的selective search,对一张图像,需要花费2s
      4. 耗时的串行式CNN前向传播,对于每一个候选框,都需经过一个AlexNet提取特征,为所有的候选框提取特征大约花费47s
      5. 三个模块(CNN特征提取、SVM分类和边框修正)是分别训练的,并且在训练的时候,对于存储空间的消耗很大

    2. Fast R-CNN

    面对R-CNN的缺陷,Ross在2015年提出的Fast R-CNN进行了改进,下面我们来概述一下Fast R-CNN的解决方案:

    img

    1. 首先还是采用selective search提取2000个候选框RoI
    2. 使用一个卷积神经网络对全图进行特征提取
    3. 使用一个RoI Pooling Layer在全图特征上摘取每一个RoI对应的特征
    4. 分别经过为21和84维的全连接层(并列的,前者是分类输出,后者是回归输出)
      Fast R-CNN通过CNN直接获取整张图像的特征图,再使用RoI Pooling Layer在特征图上获取对应每个候选框的特征,避免了R-CNN中的对每个候选框串行进行卷积(耗时较长)。

    2.1 RoI Pooling Layer

    对于每个RoI而言,需要从共享卷积层获取的特征图上提取对应的特征,并且送入全连接层进行分类。因此,RoI Pooling主要做了两件事,第一件是为每个RoI选取对应的特征,第二件事是为了满足全连接层的输入需求,将每个RoI对应的特征的维度转化成某个定值。RoI Pooling示意图如下所示:ROI-POOLING

    如上图所示,对于每一个RoI,RoI Pooling Layer将其映射到特征图对应位置,获取对应特征。另外,由于每一个RoI的尺度各不相同,所以提取出来的特征向量region proposal维度也不尽相同,因此需要某种特殊的技术来做保证输入后续全连接层的特征向量维度相同。ROI Pooling的提出便是为了解决这一问题的。其思路如下:

    • 将region proposal划分为目标H×W大小的分块

    • 对每一个分块中做MaxPooling(每个分块中含有多个网格,每个分块获取一个特征值)

    • 将所有输出值组合起来便形成固定大小为H×W的feature map

      pooling_sections
      out
      Fast R-CNN的贡献可以主要分为两个方面:

    1. 取代R-CNN的串行特征提取方式,直接采用一个CNN对全图提取特征(这也是为什么需要RoI Pooling的原因)。
    2. 除了selective search,其他部分都可以合在一起训练。
      Fast R-CNN也有缺点,体现在耗时的selective search还是依旧存在。

    3. Faster R-CNN

    Faster R-CNN 取代selective search,直接通过一个Region Proposal Network (RPN)生成待检测区域,这么做,在生成RoI区域的时候,时间也就从2s缩减到了10ms。下图是Faster R-CNN整体结构。

    img
    由上图可知,Faster R-CNN由共享卷积层、RPN、RoI pooling以及分类和回归四部分组成:

    1. 首先使用共享卷积层为全图提取特征feature maps
    2. 将得到的feature maps送入RPN,RPN生成待检测框(指定RoI的位置),并对RoI的包围框进行第一次修正
    3. RoI Pooling Layer根据RPN的输出在feature map上面选取每个RoI对应的特征,并将维度置为定值
    4. 使用全连接层(FC Layer)对框进行分类,并且进行目标包围框的第二次修正。
      尤其注意的是,Faster R-CNN真正实现了端到端的训练(end-to-end training)。Faster R-CNN最大特色是使用了RPN取代了SS算法来获取RoI,以下对RPN进行分析。

    3.1 RPN

    经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster R-CNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
    首先来看看RPN的工作原理:

    img
    上图展示了RPN网络的具体结构。可以看到RPN网络实际分为2条支线,上面一条支线通过softmax来分类anchors获得前景foreground和背景background(检测目标是foreground),下面一条支线用于计算anchors的边框偏移量,以获得精确的proposals。而最后的proposal层则负责综合foreground anchors和偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
    anchor:
    简单地说,RPN依靠一个在共享特征图上滑动的窗口,为每个位置生成9种预先设置好长宽比与面积的目标框(即anchor)。这9种初始anchor包含三种面积(128×128,256×256,512×512),每种面积又包含三种长宽比(1:1,1:2,2:1)。示意图如下所示:

    img
    由于共享特征图的大小约为40×60,所以RPN生成的初始anchor的总数约为20000个(40×60×9)。其实RPN最终就是在原图尺度上,设置了密密麻麻的候选anchor。进而去判断anchor到底是前景还是背景,意思就是判断这个anchor到底有没有覆盖目标,以及为属于前景的anchor进行第一次坐标修正。

    img
    判断前景或背景:
    对于所有的anchors,首先需要判断anchor是是否为前景。对于第一个问题,RPN的做法是使用SoftmaxLoss直接训练,在训练的时候排除掉了超越图像边界的anchor;
    边框修正:
    如图绿色表示的是飞机的实际框标签(ground truth),红色的表示的其中一个候选区域(foreground anchor),即被分类器识别为飞机的区域,但是由于红色区域定位不准确,这张图相当于没有正确检测出飞机,所以我们希望采用一种方法对红色的框进行微调,使得候选区域和实际框更加接近:

    img
    对于目标框一般使用四维向量来表示(x,y,w,h)(x,y,w,h) ,分别表示目标框的中心点坐标、宽、高,我们使用AA 表示原始的foreground anchor,使用GG 表示目标的ground truth,我们的目标是寻找一种关系,使得输入原始的Anchor AA 经过映射到一个和真实框GG 更接近的回归窗口G′G′ ,即:

    • 给定:

    • 寻找一种变换FF ,使得



      img
      那么如何去计算F 呢?这里我们可以通过平移和缩放实现

    • 平移:

    • 缩放:


      上面公式中,我们需要学习四个参数,分别是


      其中


      表示的两个框中心距离的偏移量
      当输入的anchor A与G相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对目标框进行微调(注意,只有当anchors A和G比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了)。
      接下来就是如何通过线性回归获得


      线性回归就是给定输入的特征向量X ,学习一组参数W,使得线性回归的输出WX和真实值Y 的差很小。对于该问题,输入X是特征图,我们使用ϕ 表示,同时训练时还需要A到G变换的真实参数值:


      输出是


      那么目标函数可以表示为:


      其中ϕ(A) 是对应anchor的特征图组成的特征向量,ww 是需要学习的参数,d(A) 是得到预测值(表示x*,y,w,*h,也就是每一个变换对应一个上述目标函数),为了让预测值和真实值差距最小,代价函数如下:


      函数优化目标为:


      需要说明,只有在G和A比较接近时,才可近似认为上述线性变换成立,下面对于原文中,A与G之间的平移参数和尺度因子为:


      在得到每一个候选区域anchor A的修正参数之后,我们就可以计算出精确的anchor,然后按照物体的区域得分从大到小对得到的anchor排序,然后提出一些宽或者高很小的anchor(获取其它过滤条件),再经过非极大值抑制抑制,取前Top-N的anchors,然后作为proposals(候选框)输出,送入到RoI Pooling层。
      那么,RPN怎么实现呢?这个问题通过RPN的本质很好求解,RPN的本质是一个树状结构,树干是一个3×3的卷积层,树枝是两个1×1的卷积层,第一个1×1的卷积层解决了前后景的输出,第二个1×1的卷积层解决了边框修正的输出。来看看在代码中是怎么做的:



      从如上代码中可以看到,对于RPN输出的特征图中的每一个点,一个1×1的卷积层输出了18个值,因为是每一个点对应9个anchor,每个anchor有一个前景分数和一个背景分数,所以9×2=18。另一个1×1的卷积层输出了36个值,因为是每一个点对应9个anchor,每个anchor对应了4个修正坐标的值,所以9×4=36。那么,要得到这些值,RPN网络需要训练。在训练的时候,就需要对应的标签。那么,如何判定一个anchor是前景还是背景呢?文中做出了如下定义:如果一个anchor与ground truth的IoU在0.7以上,那这个anchor就算前景(positive)。类似地,如果这个anchor与ground truth的IoU在0.3以下,那么这个anchor就算背景(negative)。在作者进行RPN网络训练的时候,只使用了上述两类anchor,与ground truth的IoU介于0.3和0.7的anchor没有使用。在训练anchor属于前景与背景的时候,是在一张图中,随机抽取了128个前景anchor与128个背景anchor。

    3.3. 分类和定位

    Faster R-CNN中的RoI Pooling Layer与 Fast R-CNN中原理一样。在RoI Pooling Layer之后,就是Faster R-CNN的分类器和RoI边框修正训练。分类器主要是分这个提取的RoI具体是什么类别(人,车,马等),一共C+1类(包含一类背景)。RoI边框修正和RPN中的anchor边框修正原理一样,同样也是SmoothL1 Loss,值得注意的是,RoI边框修正也是对于非背景的RoI进行修正,对于类别标签为背景的RoI,则不进行RoI边框修正的参数训练。对于分类器和RoI边框修正的训练,可以损失函数描述如下:


    上式中u>=1表示RoI边框修正是对于非背景的RoI而言的,实验中,上式的λ取1。
    在训练分类器和RoI边框修正时,步骤如下所示:

    1. 首先通过RPN生成约20000个anchor(40×60×9)。
    2. 对20000个anchor进行第一次边框修正,得到修订边框后的proposal。
    3. 对超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围。
    4. 忽略掉长或者宽太小的proposal。
    5. 将所有proposal按照前景分数从高到低排序,选取前12000个proposal。
    6. 使用阈值为0.7的NMS算法排除掉重叠的proposal。
    7. 针对上一步剩下的proposal,选取前2000个proposal进行分类和第二次边框修正。
      总的来说,Faster R-CNN的loss分两大块,第一大块是训练RPN的loss(包含一个SoftmaxLoss和SmoothL1Loss),第二大块是训练Faster R-CNN中分类器的loss(包含一个SoftmaxLoss和SmoothL1Loss),Faster R-CNN的总的loss函数描述如下:

    4. Mask R-CNN

    Mask R-CNN可以分解为如下的3个模块:Faster-RCNN、RoI Align和Mask。算法框架如下:

    img
    图6 Mask R-CNN算法框架
    算法步骤:

    • 首先,输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;

    • 然后,将其输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;

    • 接着,对这个feature map中的每一点设定预定个的RoI,从而获得多个候选RoI;

    • 接着,将这些候选的RoI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的ROI;

    • 接着,对这些剩下的RoI进行RoIAlign操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);

    • 最后,对这些RoI进行分类(N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作)。
      Mask R-CNN是一个非常灵活的框架,可以增加不同的分支完成不同的任务,可以完成目标分类、目标检测、语义分割、实例分割、人体姿势识别等多种任务,如下图所示。

      imgimg

    4.1. ROI Align

    Mask R-CNN使用RoIAlign取代了Faster RCNN中的RoIPooling,故下文对RoIPooling和RoIAlign进行分析与比较

    img
    如上图所示,RoI Pooling和RoIAlign最大的区别是:前者使用了两次量化操作,而后者并没有采用量化操作,使用了线性插值算法,具体的解释如下所示。
    RoI Pooling

    img
    如上图所示,为了得到固定大小(7X7)的feature map,我们需要做两次量化操作:1)图像坐标 — feature map坐标,2)feature map坐标 — RoI feature坐标。我们来说一下具体的细节,如图我们输入的是一张800x800的图像,在图像中有两个目标(猫和狗),狗的BB大小为665x665,经过VGG16网络后,我们可以获得对应的feature map,如果我们对卷积层进行Padding操作,我们的图片经过卷积层后保持原来的大小,但是由于池化层的存在,我们最终获得feature map 会比原图缩小一定的比例,这和Pooling层的个数和大小有关。在该VGG16中,我们使用了5个池化操作,每个池化操作都是2x2Pooling,因此我们最终获得feature map的大小为800/32 x 800/32 = 25x25(是整数),但是将狗的BB对应到feature map上面,我们得到的结果是665/32 x 665/32 = 20.78 x 20.78,结果是浮点数,含有小数,但是我们的像素值可没有小数,那么作者就对其进行了量化操作(即取整操作),即其结果变为20 x 20,在这里引入了第一次的量化误差;然而我们的feature map中有不同大小的ROI,但是我们后面的网络却要求我们有固定的输入,因此,我们需要将不同大小的ROI转化为固定的ROI feature,在这里使用的是7x7的ROI feature,那么我们需要将20 x 20的ROI映射成7 x 7的ROI feature,其结果是 20 /7 x 20/7 = 2.86 x 2.86,同样是浮点数,含有小数点,我们采取同样的操作对其进行取整吧,在这里引入了第二次量化误差。其实,这里引入的误差会导致图像中的像素和特征中的像素的偏差,即将feature空间的ROI对应到原图上面会出现很大的偏差。原因如下:比如用我们第二次引入的误差来分析,本来是2,86,我们将其量化为2,这期间引入了0.86的误差,看起来是一个很小的误差呀,但是你要记得这是在feature空间,我们的feature空间和图像空间是有比例关系的,在这里是1:32,那么对应到原图上面的差距就是0.86 x 32 = 27.52。这个差距不小吧,这还是仅仅考虑了第二次的量化误差。这会大大影响整个检测算法的性能,因此是一个严重的问题。
    RoIAlign

    img
    如上图所示,为了得到为了得到固定大小(7X7)的feature map,RoIAlign技术并没有使用量化操作,即我们不想引入量化误差,比如665 / 32 = 20.78,我们就用20.78,不用什么20来替代它,比如20.78 / 7 = 2.97,我们就用2.97,而不用2来代替它。这就是RoIAlign的初衷。那么我们如何处理这些浮点数呢,我们的解决思路是使用“双线性插值”算法。双线性插值是一种比较好的图像缩放算法,它充分的利用了原图中虚拟点(比如20.56这个浮点数,像素位置都是整数值,没有浮点值)四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将20.56这个虚拟的位置点对应的像素值估计出来。如下图所示,蓝色的虚线框表示卷积后获得的feature map,黑色实线框表示ROI feature,最后需要输出的大小是2x2,那么我们就利用双线性插值来估计这些蓝点(虚拟坐标点,又称双线性插值的网格点)处所对应的像素值,最后得到相应的输出。这些蓝点是2x2Cell中的随机采样的普通点,作者指出,这些采样点的个数和位置不会对性能产生很大的影响,你也可以用其它的方法获得。然后在每一个橘红色的区域里面进行max pooling或者average pooling操作,获得最终2x2的输出结果。我们的整个过程中没有用到量化操作,没有引入误差,即原图中的像素和feature map中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。

    img

    4.2. Mask

    下图阐述了Mask R-CNN的Mask branch:


    在Mask R-CNN中的RoI Align之后有一个"head"部分,主要作用是将RoI Align的输出维度扩大,这样在预测Mask时会更加精确。在Mask Branch的训练环节,作者没有采用FCN式的SoftmaxLoss,反而是输出了K个Mask预测图(为每一个类都输出一张),并采用average binary cross-entropy loss训练,当然在训练Mask branch的时候,输出的K个特征图中,也只是对应ground truth类别的那一个特征图对Mask loss有贡献。
    Mask R-CNN的训练损失函数可以描述为:

    5. Yolo

    以上目标检测模型都是two-stage算法,针对于two-stage目标检测算法普遍存在的运算速度慢的缺点,Yolo创造性的提出了one-stage,也就是将物体分类和物体定位在一个步骤中完成。Yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式,Yolo可实现45帧每秒的运算速度,完全能满足实时性要求(达到24帧每秒,人眼就认为是连续的)。整个系统如下图所示。img

    前言

    图片分类任务我们已经熟悉了,就是算法对其中的对象进行分类。而今天我们要了解构建神经网络的另一个问题,即目标检测问题。这意味着,我们不仅要用算法判断图片中是不是一辆汽车, 还要在图片中标记出它的位置, 用边框或红色方框把汽车圈起来, 这就是目标检测问题。 其中“定位”的意思是判断汽车在图片中的具体位置。
    img
    近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN等),它们是two-stage的,需要先算法产生目标候选框,也就是目标位置,然后再对候选框做分类与回归。而另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个卷积神经网络CNN直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。这可以在下图中看到。
    img
    本文对常见目标检测算法进行简要综述,并最后总结了目标检测算法方向的一些大V方便大家学习查看。

    1. R-CNN

    目标检测有两个主要任务:物体分类和定位,为了完成这两个任务,R-CNN借鉴了滑动窗口思想, 采用对区域进行识别的方案,具体是:

    1. 输入一张图片,通过指定算法从图片中提取 2000 个类别独立的候选区域(可能目标区域)
    2. 对于每个候选区域利用卷积神经网络来获取一个特征向量
    3. 对于每个区域相应的特征向量,利用支持向量机SVM 进行分类,并通过一个bounding box regression调整目标包围框的大小

    1.1. 提取候选区域

    R-CNN目标检测首先需要获取2000个目标候选区域,能够生成候选区域的方法很多,比如:

    1. objectness
    2. selective search
    3. category-independen object proposals
    4. constrained parametric min-cuts(CPMC)
    5. multi-scale combinatorial grouping
    6. Ciresan
      R-CNN 采用的是 Selective Search 算法。简单来说就是通过一些传统图像处理方法将图像分成很多小尺寸区域,然后根据小尺寸区域的特征合并小尺寸得到大尺寸区域,以实现候选区域的选取。

    1.2. 提取特征向量

    对于上述获取的候选区域,需进一步使用CNN提取对应的特征向量,作者使用模型AlexNet (2012)。(需要注意的是 Alexnet 的输入图像大小是 227x227,而通过 Selective Search 产生的候选区域大小不一,为了与 Alexnet 兼容,R-CNN 采用了非常暴力的手段,那就是无视候选区域的大小和形状,统一变换到 227x227 的尺寸)。
    那么,该网络是如何训练的呢?训练过程如下:

    1. 有监督预训练:训练网络参数
      • 样本:ImageNet
      • 这里只训练和分类有关的参数,因为ImageNet数据只有分类,没有位置标注
      • 图片尺寸调整为227x227
      • 最后一层:4097维向量->1000向量的映射。
    2. 特定样本下的微调 :训练网络参数
      • 样本:
        RCNN样本
      • 采用训练好的AlexNet模型进行PASCAL VOC 2007样本集下的微调,学习率=0.001(PASCAL VOC 2007样本集上既有图像中物体类别标签,也有图像中物体位置标签)
      • mini-batch为32个正样本和96个负样本(由于正样本太少)
      • 修改了原来的1000为类别输出,改为21维【20类+背景】输出。

    1.3. SVM分类

    通过上述卷积神经网络获取候选区域的特征向量,进一步使用SVM进行物体分类,关键知识点如下:

    1. 使用了一个SVM进行分类:向SVM输入特征向量,输出类别得分
    2. 用于训练多个SVM的数据集是ImageNet数据
    3. 将2000×4096维特征(2000个候选框,每个候选框获得4096的特征向量)与20个SVM组成的权值矩阵4096×20相乘(20种分类,SVM是二分类器,每个种类训练一个SVM,则有20个SVM),获得2000×20维矩阵表示每个建议框是某个物体类别的得分
    4. 分别对上述2000×20维矩阵中每列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些候选框;
      RCNN分类
      SVM训练:
    • 样本:

      RCNN-SVM训练

    • 由于SVM是二分类器,需要为每个类别训练单独的SVM;

    • SVM训练时,输入正负样本是在AlexNet CNN网络输出的4096维特征向量,输出为该类的得分

    • 由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本

    1.4 边框修正

    使用一个回归器进行边框回归:输入为卷积神经网络pool5层的4096维特征向量,输出为x、y方向的缩放和平移,实现边框的修正。在进行测试前仍需回归器进行训练。
    回归器训练

    • 样本:

      RCNN边框回归样本
      在2014年R-CNN横空出世的时候,颠覆了以往的目标检测方案,精度大大提升。对于R-CNN的贡献,可以主要分为两个方面:

      1. 使用了卷积神经网络进行特征提取
      2. 使用bounding box regression进行目标包围框的修正
        但是,我们来看一下,R-CNN有什么问题:
      3. 耗时的selective search,对一张图像,需要花费2s
      4. 耗时的串行式CNN前向传播,对于每一个候选框,都需经过一个AlexNet提取特征,为所有的候选框提取特征大约花费47s
      5. 三个模块(CNN特征提取、SVM分类和边框修正)是分别训练的,并且在训练的时候,对于存储空间的消耗很大

    2. Fast R-CNN

    面对R-CNN的缺陷,Ross在2015年提出的Fast R-CNN进行了改进,下面我们来概述一下Fast R-CNN的解决方案:

    img

    1. 首先还是采用selective search提取2000个候选框RoI
    2. 使用一个卷积神经网络对全图进行特征提取
    3. 使用一个RoI Pooling Layer在全图特征上摘取每一个RoI对应的特征
    4. 分别经过为21和84维的全连接层(并列的,前者是分类输出,后者是回归输出)
      Fast R-CNN通过CNN直接获取整张图像的特征图,再使用RoI Pooling Layer在特征图上获取对应每个候选框的特征,避免了R-CNN中的对每个候选框串行进行卷积(耗时较长)。

    2.1 RoI Pooling Layer

    对于每个RoI而言,需要从共享卷积层获取的特征图上提取对应的特征,并且送入全连接层进行分类。因此,RoI Pooling主要做了两件事,第一件是为每个RoI选取对应的特征,第二件事是为了满足全连接层的输入需求,将每个RoI对应的特征的维度转化成某个定值。RoI Pooling示意图如下所示:ROI-POOLING

    如上图所示,对于每一个RoI,RoI Pooling Layer将其映射到特征图对应位置,获取对应特征。另外,由于每一个RoI的尺度各不相同,所以提取出来的特征向量region proposal维度也不尽相同,因此需要某种特殊的技术来做保证输入后续全连接层的特征向量维度相同。ROI Pooling的提出便是为了解决这一问题的。其思路如下:

    • 将region proposal划分为目标H×W大小的分块

    • 对每一个分块中做MaxPooling(每个分块中含有多个网格,每个分块获取一个特征值)

    • 将所有输出值组合起来便形成固定大小为H×W的feature map

      pooling_sections
      out
      Fast R-CNN的贡献可以主要分为两个方面:

    1. 取代R-CNN的串行特征提取方式,直接采用一个CNN对全图提取特征(这也是为什么需要RoI Pooling的原因)。
    2. 除了selective search,其他部分都可以合在一起训练。
      Fast R-CNN也有缺点,体现在耗时的selective search还是依旧存在。

    3. Faster R-CNN

    Faster R-CNN 取代selective search,直接通过一个Region Proposal Network (RPN)生成待检测区域,这么做,在生成RoI区域的时候,时间也就从2s缩减到了10ms。下图是Faster R-CNN整体结构。

    [外链图片转存失败(img-aWtAvx5g-1562678877759)(https://ae01.alicdn.com/kf/UTB8tV72OwQydeJk43PUq6AyQpXak.jpg)]
    由上图可知,Faster R-CNN由共享卷积层、RPN、RoI pooling以及分类和回归四部分组成:

    1. 首先使用共享卷积层为全图提取特征feature maps
    2. 将得到的feature maps送入RPN,RPN生成待检测框(指定RoI的位置),并对RoI的包围框进行第一次修正
    3. RoI Pooling Layer根据RPN的输出在feature map上面选取每个RoI对应的特征,并将维度置为定值
    4. 使用全连接层(FC Layer)对框进行分类,并且进行目标包围框的第二次修正。
      尤其注意的是,Faster R-CNN真正实现了端到端的训练(end-to-end training)。Faster R-CNN最大特色是使用了RPN取代了SS算法来获取RoI,以下对RPN进行分析。

    3.1 RPN

    经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster R-CNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
    首先来看看RPN的工作原理:

    img
    上图展示了RPN网络的具体结构。可以看到RPN网络实际分为2条支线,上面一条支线通过softmax来分类anchors获得前景foreground和背景background(检测目标是foreground),下面一条支线用于计算anchors的边框偏移量,以获得精确的proposals。而最后的proposal层则负责综合foreground anchors和偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
    anchor:
    简单地说,RPN依靠一个在共享特征图上滑动的窗口,为每个位置生成9种预先设置好长宽比与面积的目标框(即anchor)。这9种初始anchor包含三种面积(128×128,256×256,512×512),每种面积又包含三种长宽比(1:1,1:2,2:1)。示意图如下所示:

    img
    由于共享特征图的大小约为40×60,所以RPN生成的初始anchor的总数约为20000个(40×60×9)。其实RPN最终就是在原图尺度上,设置了密密麻麻的候选anchor。进而去判断anchor到底是前景还是背景,意思就是判断这个anchor到底有没有覆盖目标,以及为属于前景的anchor进行第一次坐标修正。

    img
    判断前景或背景:
    对于所有的anchors,首先需要判断anchor是是否为前景。对于第一个问题,RPN的做法是使用SoftmaxLoss直接训练,在训练的时候排除掉了超越图像边界的anchor;
    边框修正:
    如图绿色表示的是飞机的实际框标签(ground truth),红色的表示的其中一个候选区域(foreground anchor),即被分类器识别为飞机的区域,但是由于红色区域定位不准确,这张图相当于没有正确检测出飞机,所以我们希望采用一种方法对红色的框进行微调,使得候选区域和实际框更加接近:

    img
    对于目标框一般使用四维向量来表示(x,y,w,h)(x,y,w,h) ,分别表示目标框的中心点坐标、宽、高,我们使用AA 表示原始的foreground anchor,使用GG 表示目标的ground truth,我们的目标是寻找一种关系,使得输入原始的Anchor AA 经过映射到一个和真实框GG 更接近的回归窗口G′G′ ,即:

    • 给定:

    • 寻找一种变换FF ,使得



      img
      那么如何去计算F 呢?这里我们可以通过平移和缩放实现

    • 平移:

    • 缩放:


      上面公式中,我们需要学习四个参数,分别是


      其中


      表示的两个框中心距离的偏移量
      当输入的anchor A与G相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对目标框进行微调(注意,只有当anchors A和G比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了)。
      接下来就是如何通过线性回归获得

      [外链图片转存失败(img-63l5Z6W6-1562678877766)(https://pic.superbed.cn/item/5d08b6a3451253d178dd9fe3.gif)]
      线性回归就是给定输入的特征向量X ,学习一组参数W,使得线性回归的输出WX和真实值Y 的差很小。对于该问题,输入X是特征图,我们使用ϕ 表示,同时训练时还需要A到G变换的真实参数值:


      输出是


      那么目标函数可以表示为:


      其中ϕ(A) 是对应anchor的特征图组成的特征向量,ww 是需要学习的参数,d(A) 是得到预测值(表示x*,y,w,*h,也就是每一个变换对应一个上述目标函数),为了让预测值和真实值差距最小,代价函数如下:


      函数优化目标为:


      需要说明,只有在G和A比较接近时,才可近似认为上述线性变换成立,下面对于原文中,A与G之间的平移参数和尺度因子为:


      在得到每一个候选区域anchor A的修正参数之后,我们就可以计算出精确的anchor,然后按照物体的区域得分从大到小对得到的anchor排序,然后提出一些宽或者高很小的anchor(获取其它过滤条件),再经过非极大值抑制抑制,取前Top-N的anchors,然后作为proposals(候选框)输出,送入到RoI Pooling层。
      那么,RPN怎么实现呢?这个问题通过RPN的本质很好求解,RPN的本质是一个树状结构,树干是一个3×3的卷积层,树枝是两个1×1的卷积层,第一个1×1的卷积层解决了前后景的输出,第二个1×1的卷积层解决了边框修正的输出。来看看在代码中是怎么做的:



      从如上代码中可以看到,对于RPN输出的特征图中的每一个点,一个1×1的卷积层输出了18个值,因为是每一个点对应9个anchor,每个anchor有一个前景分数和一个背景分数,所以9×2=18。另一个1×1的卷积层输出了36个值,因为是每一个点对应9个anchor,每个anchor对应了4个修正坐标的值,所以9×4=36。那么,要得到这些值,RPN网络需要训练。在训练的时候,就需要对应的标签。那么,如何判定一个anchor是前景还是背景呢?文中做出了如下定义:如果一个anchor与ground truth的IoU在0.7以上,那这个anchor就算前景(positive)。类似地,如果这个anchor与ground truth的IoU在0.3以下,那么这个anchor就算背景(negative)。在作者进行RPN网络训练的时候,只使用了上述两类anchor,与ground truth的IoU介于0.3和0.7的anchor没有使用。在训练anchor属于前景与背景的时候,是在一张图中,随机抽取了128个前景anchor与128个背景anchor。

    3.3. 分类和定位

    Faster R-CNN中的RoI Pooling Layer与 Fast R-CNN中原理一样。在RoI Pooling Layer之后,就是Faster R-CNN的分类器和RoI边框修正训练。分类器主要是分这个提取的RoI具体是什么类别(人,车,马等),一共C+1类(包含一类背景)。RoI边框修正和RPN中的anchor边框修正原理一样,同样也是SmoothL1 Loss,值得注意的是,RoI边框修正也是对于非背景的RoI进行修正,对于类别标签为背景的RoI,则不进行RoI边框修正的参数训练。对于分类器和RoI边框修正的训练,可以损失函数描述如下:


    上式中u>=1表示RoI边框修正是对于非背景的RoI而言的,实验中,上式的λ取1。
    在训练分类器和RoI边框修正时,步骤如下所示:

    1. 首先通过RPN生成约20000个anchor(40×60×9)。
    2. 对20000个anchor进行第一次边框修正,得到修订边框后的proposal。
    3. 对超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围。
    4. 忽略掉长或者宽太小的proposal。
    5. 将所有proposal按照前景分数从高到低排序,选取前12000个proposal。
    6. 使用阈值为0.7的NMS算法排除掉重叠的proposal。
    7. 针对上一步剩下的proposal,选取前2000个proposal进行分类和第二次边框修正。
      总的来说,Faster R-CNN的loss分两大块,第一大块是训练RPN的loss(包含一个SoftmaxLoss和SmoothL1Loss),第二大块是训练Faster R-CNN中分类器的loss(包含一个SoftmaxLoss和SmoothL1Loss),Faster R-CNN的总的loss函数描述如下:

    4. Mask R-CNN

    Mask R-CNN可以分解为如下的3个模块:Faster-RCNN、RoI Align和Mask。算法框架如下:

    img
    图6 Mask R-CNN算法框架
    算法步骤:

    • 首先,输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;

    • 然后,将其输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;

    • 接着,对这个feature map中的每一点设定预定个的RoI,从而获得多个候选RoI;

    • 接着,将这些候选的RoI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的ROI;

    • 接着,对这些剩下的RoI进行RoIAlign操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);

    • 最后,对这些RoI进行分类(N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作)。
      Mask R-CNN是一个非常灵活的框架,可以增加不同的分支完成不同的任务,可以完成目标分类、目标检测、语义分割、实例分割、人体姿势识别等多种任务,如下图所示。

      img
      img

    4.1. ROI Align

    Mask R-CNN使用RoIAlign取代了Faster RCNN中的RoIPooling,故下文对RoIPooling和RoIAlign进行分析与比较

    img
    如上图所示,RoI Pooling和RoIAlign最大的区别是:前者使用了两次量化操作,而后者并没有采用量化操作,使用了线性插值算法,具体的解释如下所示。
    RoI Pooling

    img
    如上图所示,为了得到固定大小(7X7)的feature map,我们需要做两次量化操作:1)图像坐标 — feature map坐标,2)feature map坐标 — RoI feature坐标。我们来说一下具体的细节,如图我们输入的是一张800x800的图像,在图像中有两个目标(猫和狗),狗的BB大小为665x665,经过VGG16网络后,我们可以获得对应的feature map,如果我们对卷积层进行Padding操作,我们的图片经过卷积层后保持原来的大小,但是由于池化层的存在,我们最终获得feature map 会比原图缩小一定的比例,这和Pooling层的个数和大小有关。在该VGG16中,我们使用了5个池化操作,每个池化操作都是2x2Pooling,因此我们最终获得feature map的大小为800/32 x 800/32 = 25x25(是整数),但是将狗的BB对应到feature map上面,我们得到的结果是665/32 x 665/32 = 20.78 x 20.78,结果是浮点数,含有小数,但是我们的像素值可没有小数,那么作者就对其进行了量化操作(即取整操作),即其结果变为20 x 20,在这里引入了第一次的量化误差;然而我们的feature map中有不同大小的ROI,但是我们后面的网络却要求我们有固定的输入,因此,我们需要将不同大小的ROI转化为固定的ROI feature,在这里使用的是7x7的ROI feature,那么我们需要将20 x 20的ROI映射成7 x 7的ROI feature,其结果是 20 /7 x 20/7 = 2.86 x 2.86,同样是浮点数,含有小数点,我们采取同样的操作对其进行取整吧,在这里引入了第二次量化误差。其实,这里引入的误差会导致图像中的像素和特征中的像素的偏差,即将feature空间的ROI对应到原图上面会出现很大的偏差。原因如下:比如用我们第二次引入的误差来分析,本来是2,86,我们将其量化为2,这期间引入了0.86的误差,看起来是一个很小的误差呀,但是你要记得这是在feature空间,我们的feature空间和图像空间是有比例关系的,在这里是1:32,那么对应到原图上面的差距就是0.86 x 32 = 27.52。这个差距不小吧,这还是仅仅考虑了第二次的量化误差。这会大大影响整个检测算法的性能,因此是一个严重的问题。
    RoIAlign

    img
    如上图所示,为了得到为了得到固定大小(7X7)的feature map,RoIAlign技术并没有使用量化操作,即我们不想引入量化误差,比如665 / 32 = 20.78,我们就用20.78,不用什么20来替代它,比如20.78 / 7 = 2.97,我们就用2.97,而不用2来代替它。这就是RoIAlign的初衷。那么我们如何处理这些浮点数呢,我们的解决思路是使用“双线性插值”算法。双线性插值是一种比较好的图像缩放算法,它充分的利用了原图中虚拟点(比如20.56这个浮点数,像素位置都是整数值,没有浮点值)四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将20.56这个虚拟的位置点对应的像素值估计出来。如下图所示,蓝色的虚线框表示卷积后获得的feature map,黑色实线框表示ROI feature,最后需要输出的大小是2x2,那么我们就利用双线性插值来估计这些蓝点(虚拟坐标点,又称双线性插值的网格点)处所对应的像素值,最后得到相应的输出。这些蓝点是2x2Cell中的随机采样的普通点,作者指出,这些采样点的个数和位置不会对性能产生很大的影响,你也可以用其它的方法获得。然后在每一个橘红色的区域里面进行max pooling或者average pooling操作,获得最终2x2的输出结果。我们的整个过程中没有用到量化操作,没有引入误差,即原图中的像素和feature map中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。

    img

    4.2. Mask

    下图阐述了Mask R-CNN的Mask branch:


    在Mask R-CNN中的RoI Align之后有一个"head"部分,主要作用是将RoI Align的输出维度扩大,这样在预测Mask时会更加精确。在Mask Branch的训练环节,作者没有采用FCN式的SoftmaxLoss,反而是输出了K个Mask预测图(为每一个类都输出一张),并采用average binary cross-entropy loss训练,当然在训练Mask branch的时候,输出的K个特征图中,也只是对应ground truth类别的那一个特征图对Mask loss有贡献。
    Mask R-CNN的训练损失函数可以描述为:

    5. Yolo

    以上目标检测模型都是two-stage算法,针对于two-stage目标检测算法普遍存在的运算速度慢的缺点,Yolo创造性的提出了one-stage,也就是将物体分类和物体定位在一个步骤中完成。Yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式,Yolo可实现45帧每秒的运算速度,完全能满足实时性要求(达到24帧每秒,人眼就认为是连续的)。整个系统如下图所示。img

    主要分为三个部分:卷积层,目标检测层,NMS筛选层

    5.1 卷积层

    采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构)

    5.2 目标检测层

    先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。Yolo将一副448x448的原图分割成了7x7个网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如下图所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测 个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为 ,当该边界框是背景时(即不包含目标),此时 [外链图片转存失败(img-gwKmfXrN-1562678877779)(https://pic1.superbed.cn/item/5d08bb50451253d178de1286.gif)] 。而当该边界框包含目标时, 。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为 [外链图片转存失败(img-WETDar5g-1562678877780)(https://pic.superbed.cn/item/5d08bb66451253d178de1463.gif)] 。因此置信度可以定义为 。很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。边界框的大小与位置可以用4个值来表征: [外链图片转存失败(img-l1vC1QDp-1562678877781)(https://pic.superbed.cn/item/5d08bb7b451253d178de161b.gif)] ,其中 是边界框的中心坐标,而 是边界框的宽与高。还有一点要注意,中心坐标的预测值 是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图6所示。而边界框的 预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在 范围。这样,每个边界框的预测值实际上包含5个元素: ,其中前4个表征边界框的大小与位置,而最后一个值是置信度。

    img

    1. bounding box坐标: 如上图,7x7网格内的每个grid(红色框),对应两个大小形状不同的bounding box(黄色框)。每个box的位置坐标为(x,y,w,h), x和y表示box中心点坐标,w和h表示box宽度和高度。通过与训练数据集上标定的物体真实坐标(Gx,Gy,Gw,Gh)进行对比训练,可以计算出初始bounding box平移和伸缩得到最终位置的模型。

    2. bounding box置信度confidence:这个置信度只是为了表达box内有无物体的概率,并不表达box内物体是什么。

    前言

    图片分类任务我们已经熟悉了,就是算法对其中的对象进行分类。而今天我们要了解构建神经网络的另一个问题,即目标检测问题。这意味着,我们不仅要用算法判断图片中是不是一辆汽车, 还要在图片中标记出它的位置, 用边框或红色方框把汽车圈起来, 这就是目标检测问题。 其中“定位”的意思是判断汽车在图片中的具体位置。
    img
    近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN等),它们是two-stage的,需要先算法产生目标候选框,也就是目标位置,然后再对候选框做分类与回归。而另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个卷积神经网络CNN直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。这可以在下图中看到。
    img
    本文对常见目标检测算法进行简要综述,并最后总结了目标检测算法方向的一些大V方便大家学习查看。

    1. R-CNN

    目标检测有两个主要任务:物体分类和定位,为了完成这两个任务,R-CNN借鉴了滑动窗口思想, 采用对区域进行识别的方案,具体是:

    1. 输入一张图片,通过指定算法从图片中提取 2000 个类别独立的候选区域(可能目标区域)
    2. 对于每个候选区域利用卷积神经网络来获取一个特征向量
    3. 对于每个区域相应的特征向量,利用支持向量机SVM 进行分类,并通过一个bounding box regression调整目标包围框的大小

    1.1. 提取候选区域

    R-CNN目标检测首先需要获取2000个目标候选区域,能够生成候选区域的方法很多,比如:

    1. objectness
    2. selective search
    3. category-independen object proposals
    4. constrained parametric min-cuts(CPMC)
    5. multi-scale combinatorial grouping
    6. Ciresan
      R-CNN 采用的是 Selective Search 算法。简单来说就是通过一些传统图像处理方法将图像分成很多小尺寸区域,然后根据小尺寸区域的特征合并小尺寸得到大尺寸区域,以实现候选区域的选取。

    1.2. 提取特征向量

    对于上述获取的候选区域,需进一步使用CNN提取对应的特征向量,作者使用模型AlexNet (2012)。(需要注意的是 Alexnet 的输入图像大小是 227x227,而通过 Selective Search 产生的候选区域大小不一,为了与 Alexnet 兼容,R-CNN 采用了非常暴力的手段,那就是无视候选区域的大小和形状,统一变换到 227x227 的尺寸)。
    那么,该网络是如何训练的呢?训练过程如下:

    1. 有监督预训练:训练网络参数
      • 样本:ImageNet
      • 这里只训练和分类有关的参数,因为ImageNet数据只有分类,没有位置标注
      • 图片尺寸调整为227x227
      • 最后一层:4097维向量->1000向量的映射。
    2. 特定样本下的微调 :训练网络参数
      • 样本:
        RCNN样本
      • 采用训练好的AlexNet模型进行PASCAL VOC 2007样本集下的微调,学习率=0.001(PASCAL VOC 2007样本集上既有图像中物体类别标签,也有图像中物体位置标签)
      • mini-batch为32个正样本和96个负样本(由于正样本太少)
      • 修改了原来的1000为类别输出,改为21维【20类+背景】输出。

    1.3. SVM分类

    通过上述卷积神经网络获取候选区域的特征向量,进一步使用SVM进行物体分类,关键知识点如下:

    1. 使用了一个SVM进行分类:向SVM输入特征向量,输出类别得分
    2. 用于训练多个SVM的数据集是ImageNet数据
    3. 将2000×4096维特征(2000个候选框,每个候选框获得4096的特征向量)与20个SVM组成的权值矩阵4096×20相乘(20种分类,SVM是二分类器,每个种类训练一个SVM,则有20个SVM),获得2000×20维矩阵表示每个建议框是某个物体类别的得分
    4. 分别对上述2000×20维矩阵中每列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些候选框;
      RCNN分类
      SVM训练:
    • 样本:

      RCNN-SVM训练

    • 由于SVM是二分类器,需要为每个类别训练单独的SVM;

    • SVM训练时,输入正负样本是在AlexNet CNN网络输出的4096维特征向量,输出为该类的得分

    • 由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本

    1.4 边框修正

    使用一个回归器进行边框回归:输入为卷积神经网络pool5层的4096维特征向量,输出为x、y方向的缩放和平移,实现边框的修正。在进行测试前仍需回归器进行训练。
    回归器训练

    • 样本:

      RCNN边框回归样本
      在2014年R-CNN横空出世的时候,颠覆了以往的目标检测方案,精度大大提升。对于R-CNN的贡献,可以主要分为两个方面:

      1. 使用了卷积神经网络进行特征提取
      2. 使用bounding box regression进行目标包围框的修正
        但是,我们来看一下,R-CNN有什么问题:
      3. 耗时的selective search,对一张图像,需要花费2s
      4. 耗时的串行式CNN前向传播,对于每一个候选框,都需经过一个AlexNet提取特征,为所有的候选框提取特征大约花费47s
      5. 三个模块(CNN特征提取、SVM分类和边框修正)是分别训练的,并且在训练的时候,对于存储空间的消耗很大

    2. Fast R-CNN

    面对R-CNN的缺陷,Ross在2015年提出的Fast R-CNN进行了改进,下面我们来概述一下Fast R-CNN的解决方案:

    img

    1. 首先还是采用selective search提取2000个候选框RoI
    2. 使用一个卷积神经网络对全图进行特征提取
    3. 使用一个RoI Pooling Layer在全图特征上摘取每一个RoI对应的特征
    4. 分别经过为21和84维的全连接层(并列的,前者是分类输出,后者是回归输出)
      Fast R-CNN通过CNN直接获取整张图像的特征图,再使用RoI Pooling Layer在特征图上获取对应每个候选框的特征,避免了R-CNN中的对每个候选框串行进行卷积(耗时较长)。

    2.1 RoI Pooling Layer

    对于每个RoI而言,需要从共享卷积层获取的特征图上提取对应的特征,并且送入全连接层进行分类。因此,RoI Pooling主要做了两件事,第一件是为每个RoI选取对应的特征,第二件事是为了满足全连接层的输入需求,将每个RoI对应的特征的维度转化成某个定值。RoI Pooling示意图如下所示:ROI-POOLING

    如上图所示,对于每一个RoI,RoI Pooling Layer将其映射到特征图对应位置,获取对应特征。另外,由于每一个RoI的尺度各不相同,所以提取出来的特征向量region proposal维度也不尽相同,因此需要某种特殊的技术来做保证输入后续全连接层的特征向量维度相同。ROI Pooling的提出便是为了解决这一问题的。其思路如下:

    • 将region proposal划分为目标H×W大小的分块

    • 对每一个分块中做MaxPooling(每个分块中含有多个网格,每个分块获取一个特征值)

    • 将所有输出值组合起来便形成固定大小为H×W的feature map

      pooling_sections
      out
      Fast R-CNN的贡献可以主要分为两个方面:

    1. 取代R-CNN的串行特征提取方式,直接采用一个CNN对全图提取特征(这也是为什么需要RoI Pooling的原因)。
    2. 除了selective search,其他部分都可以合在一起训练。
      Fast R-CNN也有缺点,体现在耗时的selective search还是依旧存在。

    3. Faster R-CNN

    Faster R-CNN 取代selective search,直接通过一个Region Proposal Network (RPN)生成待检测区域,这么做,在生成RoI区域的时候,时间也就从2s缩减到了10ms。下图是Faster R-CNN整体结构。

    img
    由上图可知,Faster R-CNN由共享卷积层、RPN、RoI pooling以及分类和回归四部分组成:

    1. 首先使用共享卷积层为全图提取特征feature maps
    2. 将得到的feature maps送入RPN,RPN生成待检测框(指定RoI的位置),并对RoI的包围框进行第一次修正
    3. RoI Pooling Layer根据RPN的输出在feature map上面选取每个RoI对应的特征,并将维度置为定值
    4. 使用全连接层(FC Layer)对框进行分类,并且进行目标包围框的第二次修正。
      尤其注意的是,Faster R-CNN真正实现了端到端的训练(end-to-end training)。Faster R-CNN最大特色是使用了RPN取代了SS算法来获取RoI,以下对RPN进行分析。

    3.1 RPN

    经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster R-CNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
    首先来看看RPN的工作原理:

    img
    上图展示了RPN网络的具体结构。可以看到RPN网络实际分为2条支线,上面一条支线通过softmax来分类anchors获得前景foreground和背景background(检测目标是foreground),下面一条支线用于计算anchors的边框偏移量,以获得精确的proposals。而最后的proposal层则负责综合foreground anchors和偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
    anchor:
    简单地说,RPN依靠一个在共享特征图上滑动的窗口,为每个位置生成9种预先设置好长宽比与面积的目标框(即anchor)。这9种初始anchor包含三种面积(128×128,256×256,512×512),每种面积又包含三种长宽比(1:1,1:2,2:1)。示意图如下所示:

    img
    由于共享特征图的大小约为40×60,所以RPN生成的初始anchor的总数约为20000个(40×60×9)。其实RPN最终就是在原图尺度上,设置了密密麻麻的候选anchor。进而去判断anchor到底是前景还是背景,意思就是判断这个anchor到底有没有覆盖目标,以及为属于前景的anchor进行第一次坐标修正。

    img
    判断前景或背景:
    对于所有的anchors,首先需要判断anchor是是否为前景。对于第一个问题,RPN的做法是使用SoftmaxLoss直接训练,在训练的时候排除掉了超越图像边界的anchor;
    边框修正:
    如图绿色表示的是飞机的实际框标签(ground truth),红色的表示的其中一个候选区域(foreground anchor),即被分类器识别为飞机的区域,但是由于红色区域定位不准确,这张图相当于没有正确检测出飞机,所以我们希望采用一种方法对红色的框进行微调,使得候选区域和实际框更加接近:

    img
    对于目标框一般使用四维向量来表示(x,y,w,h)(x,y,w,h) ,分别表示目标框的中心点坐标、宽、高,我们使用AA 表示原始的foreground anchor,使用GG 表示目标的ground truth,我们的目标是寻找一种关系,使得输入原始的Anchor AA 经过映射到一个和真实框GG 更接近的回归窗口G′G′ ,即:

    • 给定:

    • 寻找一种变换FF ,使得



      img
      那么如何去计算F 呢?这里我们可以通过平移和缩放实现

    • 平移:

    • 缩放:


      上面公式中,我们需要学习四个参数,分别是


      其中


      表示的两个框中心距离的偏移量
      当输入的anchor A与G相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对目标框进行微调(注意,只有当anchors A和G比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了)。
      接下来就是如何通过线性回归获得


      线性回归就是给定输入的特征向量X ,学习一组参数W,使得线性回归的输出WX和真实值Y 的差很小。对于该问题,输入X是特征图,我们使用ϕ 表示,同时训练时还需要A到G变换的真实参数值:


      输出是


      那么目标函数可以表示为:


      其中ϕ(A) 是对应anchor的特征图组成的特征向量,ww 是需要学习的参数,d(A) 是得到预测值(表示x*,y,w,*h,也就是每一个变换对应一个上述目标函数),为了让预测值和真实值差距最小,代价函数如下:


      函数优化目标为:


      需要说明,只有在G和A比较接近时,才可近似认为上述线性变换成立,下面对于原文中,A与G之间的平移参数和尺度因子为:


      在得到每一个候选区域anchor A的修正参数之后,我们就可以计算出精确的anchor,然后按照物体的区域得分从大到小对得到的anchor排序,然后提出一些宽或者高很小的anchor(获取其它过滤条件),再经过非极大值抑制抑制,取前Top-N的anchors,然后作为proposals(候选框)输出,送入到RoI Pooling层。
      那么,RPN怎么实现呢?这个问题通过RPN的本质很好求解,RPN的本质是一个树状结构,树干是一个3×3的卷积层,树枝是两个1×1的卷积层,第一个1×1的卷积层解决了前后景的输出,第二个1×1的卷积层解决了边框修正的输出。来看看在代码中是怎么做的:



      从如上代码中可以看到,对于RPN输出的特征图中的每一个点,一个1×1的卷积层输出了18个值,因为是每一个点对应9个anchor,每个anchor有一个前景分数和一个背景分数,所以9×2=18。另一个1×1的卷积层输出了36个值,因为是每一个点对应9个anchor,每个anchor对应了4个修正坐标的值,所以9×4=36。那么,要得到这些值,RPN网络需要训练。在训练的时候,就需要对应的标签。那么,如何判定一个anchor是前景还是背景呢?文中做出了如下定义:如果一个anchor与ground truth的IoU在0.7以上,那这个anchor就算前景(positive)。类似地,如果这个anchor与ground truth的IoU在0.3以下,那么这个anchor就算背景(negative)。在作者进行RPN网络训练的时候,只使用了上述两类anchor,与ground truth的IoU介于0.3和0.7的anchor没有使用。在训练anchor属于前景与背景的时候,是在一张图中,随机抽取了128个前景anchor与128个背景anchor。

    3.3. 分类和定位

    Faster R-CNN中的RoI Pooling Layer与 Fast R-CNN中原理一样。在RoI Pooling Layer之后,就是Faster R-CNN的分类器和RoI边框修正训练。分类器主要是分这个提取的RoI具体是什么类别(人,车,马等),一共C+1类(包含一类背景)。RoI边框修正和RPN中的anchor边框修正原理一样,同样也是SmoothL1 Loss,值得注意的是,RoI边框修正也是对于非背景的RoI进行修正,对于类别标签为背景的RoI,则不进行RoI边框修正的参数训练。对于分类器和RoI边框修正的训练,可以损失函数描述如下:


    上式中u>=1表示RoI边框修正是对于非背景的RoI而言的,实验中,上式的λ取1。
    在训练分类器和RoI边框修正时,步骤如下所示:

    1. 首先通过RPN生成约20000个anchor(40×60×9)。
    2. 对20000个anchor进行第一次边框修正,得到修订边框后的proposal。
    3. 对超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围。
    4. 忽略掉长或者宽太小的proposal。
    5. 将所有proposal按照前景分数从高到低排序,选取前12000个proposal。
    6. 使用阈值为0.7的NMS算法排除掉重叠的proposal。
    7. 针对上一步剩下的proposal,选取前2000个proposal进行分类和第二次边框修正。
      总的来说,Faster R-CNN的loss分两大块,第一大块是训练RPN的loss(包含一个SoftmaxLoss和SmoothL1Loss),第二大块是训练Faster R-CNN中分类器的loss(包含一个SoftmaxLoss和SmoothL1Loss),Faster R-CNN的总的loss函数描述如下:

    4. Mask R-CNN

    Mask R-CNN可以分解为如下的3个模块:Faster-RCNN、RoI Align和Mask。算法框架如下:

    img
    图6 Mask R-CNN算法框架
    算法步骤:

    • 首先,输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;

    • 然后,将其输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;

    • 接着,对这个feature map中的每一点设定预定个的RoI,从而获得多个候选RoI;

    • 接着,将这些候选的RoI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的ROI;

    • 接着,对这些剩下的RoI进行RoIAlign操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);

    • 最后,对这些RoI进行分类(N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作)。
      Mask R-CNN是一个非常灵活的框架,可以增加不同的分支完成不同的任务,可以完成目标分类、目标检测、语义分割、实例分割、人体姿势识别等多种任务,如下图所示。

      img
      img

    4.1. ROI Align

    Mask R-CNN使用RoIAlign取代了Faster RCNN中的RoIPooling,故下文对RoIPooling和RoIAlign进行分析与比较

    img
    如上图所示,RoI Pooling和RoIAlign最大的区别是:前者使用了两次量化操作,而后者并没有采用量化操作,使用了线性插值算法,具体的解释如下所示。
    RoI Pooling

    img
    如上图所示,为了得到固定大小(7X7)的feature map,我们需要做两次量化操作:1)图像坐标 — feature map坐标,2)feature map坐标 — RoI feature坐标。我们来说一下具体的细节,如图我们输入的是一张800x800的图像,在图像中有两个目标(猫和狗),狗的BB大小为665x665,经过VGG16网络后,我们可以获得对应的feature map,如果我们对卷积层进行Padding操作,我们的图片经过卷积层后保持原来的大小,但是由于池化层的存在,我们最终获得feature map 会比原图缩小一定的比例,这和Pooling层的个数和大小有关。在该VGG16中,我们使用了5个池化操作,每个池化操作都是2x2Pooling,因此我们最终获得feature map的大小为800/32 x 800/32 = 25x25(是整数),但是将狗的BB对应到feature map上面,我们得到的结果是665/32 x 665/32 = 20.78 x 20.78,结果是浮点数,含有小数,但是我们的像素值可没有小数,那么作者就对其进行了量化操作(即取整操作),即其结果变为20 x 20,在这里引入了第一次的量化误差;然而我们的feature map中有不同大小的ROI,但是我们后面的网络却要求我们有固定的输入,因此,我们需要将不同大小的ROI转化为固定的ROI feature,在这里使用的是7x7的ROI feature,那么我们需要将20 x 20的ROI映射成7 x 7的ROI feature,其结果是 20 /7 x 20/7 = 2.86 x 2.86,同样是浮点数,含有小数点,我们采取同样的操作对其进行取整吧,在这里引入了第二次量化误差。其实,这里引入的误差会导致图像中的像素和特征中的像素的偏差,即将feature空间的ROI对应到原图上面会出现很大的偏差。原因如下:比如用我们第二次引入的误差来分析,本来是2,86,我们将其量化为2,这期间引入了0.86的误差,看起来是一个很小的误差呀,但是你要记得这是在feature空间,我们的feature空间和图像空间是有比例关系的,在这里是1:32,那么对应到原图上面的差距就是0.86 x 32 = 27.52。这个差距不小吧,这还是仅仅考虑了第二次的量化误差。这会大大影响整个检测算法的性能,因此是一个严重的问题。
    RoIAlign

    img
    如上图所示,为了得到为了得到固定大小(7X7)的feature map,RoIAlign技术并没有使用量化操作,即我们不想引入量化误差,比如665 / 32 = 20.78,我们就用20.78,不用什么20来替代它,比如20.78 / 7 = 2.97,我们就用2.97,而不用2来代替它。这就是RoIAlign的初衷。那么我们如何处理这些浮点数呢,我们的解决思路是使用“双线性插值”算法。双线性插值是一种比较好的图像缩放算法,它充分的利用了原图中虚拟点(比如20.56这个浮点数,像素位置都是整数值,没有浮点值)四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将20.56这个虚拟的位置点对应的像素值估计出来。如下图所示,蓝色的虚线框表示卷积后获得的feature map,黑色实线框表示ROI feature,最后需要输出的大小是2x2,那么我们就利用双线性插值来估计这些蓝点(虚拟坐标点,又称双线性插值的网格点)处所对应的像素值,最后得到相应的输出。这些蓝点是2x2Cell中的随机采样的普通点,作者指出,这些采样点的个数和位置不会对性能产生很大的影响,你也可以用其它的方法获得。然后在每一个橘红色的区域里面进行max pooling或者average pooling操作,获得最终2x2的输出结果。我们的整个过程中没有用到量化操作,没有引入误差,即原图中的像素和feature map中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。

    img

    4.2. Mask

    下图阐述了Mask R-CNN的Mask branch:


    在Mask R-CNN中的RoI Align之后有一个"head"部分,主要作用是将RoI Align的输出维度扩大,这样在预测Mask时会更加精确。在Mask Branch的训练环节,作者没有采用FCN式的SoftmaxLoss,反而是输出了K个Mask预测图(为每一个类都输出一张),并采用average binary cross-entropy loss训练,当然在训练Mask branch的时候,输出的K个特征图中,也只是对应ground truth类别的那一个特征图对Mask loss有贡献。
    Mask R-CNN的训练损失函数可以描述为:

    5. Yolo

    以上目标检测模型都是two-stage算法,针对于two-stage目标检测算法普遍存在的运算速度慢的缺点,Yolo创造性的提出了one-stage,也就是将物体分类和物体定位在一个步骤中完成。Yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式,Yolo可实现45帧每秒的运算速度,完全能满足实时性要求(达到24帧每秒,人眼就认为是连续的)。整个系统如下图所示。img


    主要分为三个部分:卷积层,目标检测层,NMS筛选层

    5.1 卷积层

    采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构)

    5.2 目标检测层

    先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。Yolo将一副448x448的原图分割成了7x7个网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如下图所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测 个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为 ,当该边界框是背景时(即不包含目标),此时 。而当该边界框包含目标时, 。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为 。因此置信度可以定义为 。很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。边界框的大小与位置可以用4个值来表征: ,其中 是边界框的中心坐标,而 是边界框的宽与高。还有一点要注意,中心坐标的预测值 是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图6所示。而边界框的 预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在 范围。这样,每个边界框的预测值实际上包含5个元素: ,其中前4个表征边界框的大小与位置,而最后一个值是置信度。

    img

    1. bounding box坐标: 如上图,7x7网格内的每个grid(红色框),对应两个大小形状不同的bounding box(黄色框)。每个box的位置坐标为(x,y,w,h), x和y表示box中心点坐标,w和h表示box宽度和高度。通过与训练数据集上标定的物体真实坐标(Gx,Gy,Gw,Gh)进行对比训练,可以计算出初始bounding box平移和伸缩得到最终位置的模型。

    2. bounding box置信度confidence:这个置信度只是为了表达box内有无物体的概率,并不表达box内物体是什么。


      其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。
      每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对每个网格的,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。

    5.3 NMS筛选层

    筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。

    5.4 Yolo损失函数

    yolo的损失函数包含三部分,位置误差,confidence误差,分类误差。具体公式如下

    img
    误差均采用了均方差算法,其实我认为,位置误差应该采用均方差算法,而分类误差应该采用交叉熵。由于物体位置只有4个参数,而类别有20个参数,他们的累加和不同。如果赋予相同的权重,显然不合理。故Yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为0.5,包含物体的权重则为1。
    Yolo算法开创了one-stage检测的先河,它将物体分类和物体检测网络合二为一,都在全连接层完成。故它大大降低了目标检测的耗时,提高了实时性。但它的缺点也十分明显

    1. 每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果很差。
    2. 原始图片只划分为7x7的网格,当两个物体靠的很近时,效果很差
    3. 最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
    4. 对于图片中比较小的物体,效果很差。这其实是所有目标检测算法的通病,SSD对它有些优化,我们后面再看。

    6. SSD

    Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而Yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( Titan X 的 GPU ),72.1%的mAP。
    SSD和Yolo一样都是采用一个CNN网络来进行检测,但是却采用了多尺度的特征图,SSD网络结构如下图:

    img
    和Yolo一样,也分为三部分:卷积层,目标检测层和NMS筛选层

    6.1 卷积层

    SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。

    6.2 目标检测层

    这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下:

    6.2.1 多尺寸feature map上进行目标检测

    每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到多尺度检测的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。

    img
    如上所示,在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。

    6.2.2 设置先验框

    在Yolo中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,Yolo需要在训练过程中自适应目标的形状。而SSD和Faster R-CNN相似,也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。

    img
    SSD的检测值也与Yolo不太一样。对于每个单元的每个先验框,其都输出一套独立的检测值,对应一个边界框,主要分为两个部分。第一部分是各个类别的置信度或者评分,值得注意的是SSD将背景也当做了一个特殊的类别,如果检测目标共有 个类别,SSD其实需要预测 个置信度值,其中第一个置信度指的是不含目标或者属于背景的评分。后面当我们说 个类别置信度时,请记住里面包含背景那个特殊的类别,即真实的检测类别只有 个。在预测过程中,置信度最高的那个类别就是边界框所属的类别,特别地,当第一个置信度值最高时,表示边界框中并不包含目标。第二部分就是边界框的location,包含4个值 ,分别表示边界框的中心坐标以及宽高。但是真实预测值其实只是边界框相对于先验框的转换值(paper里面说是offset,但是觉得transformation更合适,参见R-CNN(https://arxiv.org/abs/1311.2524)
    另外,SSD采用了数据增强。生成与目标物体真实box间IOU为0.1 0.3 0.5 0.7 0.9的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。SSD认为这个策略提高了8.8%的准确率。

    6.3 筛选层

    和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。

    7 其他模型

    针对Yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,提出了YoloV2。它主要还是采用了Yolo的网络结构,在其基础上做了一些优化和改进,如下:

    1. 网络采用DarkNet-19:19层,里面包含了大量3x3卷积,同时借鉴inceptionV1,加入1x1卷积核全局平均池化层。结构如下

      img

    2. 去掉全连接层:和SSD一样,模型中只包含卷积和平均池化层(平均池化是为了变为一维向量,做softmax分类)。这样做一方面是由于物体检测中的目标,只是图片中的一个区块,它是局部感受野,没必要做全连接。而是为了输入不同尺寸的图片,如果采用全连接,则只能输入固定大小图片了。

    3. batch normalization:卷积层后加入BN,对下一次卷积输入的数据做归一化。可以在增大学习率的前提下,同样可以稳定落入局部最优解。从而加速训练收敛,在相同耗时下,增大了有效迭代次数。

    4. 使用anchors:借鉴faster R-CNN和SSD,对于一个中心点,使用多个anchor,得到多个bounding box,每个bounding box包含4个位置坐标参数(x y w h)和21个类别概率信息。而在Yolo中,每个grid(对应anchor),仅预测一次类别,而且只有两个bounding box来进行坐标预测。

    5. pass through layer:Yolo原本最终特征图为13x13x256。YoloV2还利用了之前的26x26的特征图进行目标检测。26x26x256的feature map分别按行和列隔点采样,得到4幅13x13x256的feature map,将他们组织成一幅13x13x2048的feature map。这样做的目的是提高小物体的识别率。因为越靠前的卷积,其感受野越小,越有利于小物体的识别。

    6. 高分辨率输入Training:Yolo采用224x224图片进行预训练,而YoloV2则采用448x448

    7. Multi-Scale Training:输入不同尺寸的图片,迭代10次,就改变输入图片尺寸。由于模型中去掉了全连接层,故可以输入不同尺寸的图片了。从320x320,到608x608
      Yolo和YoloV2只能识别20类物体,为了优化这个问题,提出了Yolo9000,可以识别9000类物体。它在YoloV2基础上,进行了imageNet和coco的联合训练。这种方式充分利用imageNet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imageNet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。

    参考大V:

    知乎:

    推荐阅读

    如何从零开始系统化学习视觉SLAM?
    从零开始一起学习SLAM | 为什么要学SLAM?
    从零开始一起学习SLAM | 学习SLAM到底需要学什么?
    从零开始一起学习SLAM | SLAM有什么用?
    从零开始一起学习SLAM | C++新特性要不要学?
    从零开始一起学习SLAM | 为什么要用齐次坐标?
    从零开始一起学习SLAM | 三维空间刚体的旋转
    从零开始一起学习SLAM | 为啥需要李群与李代数?
    从零开始一起学习SLAM | 相机成像模型
    从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
    从零开始一起学习SLAM | 神奇的单应矩阵
    从零开始一起学习SLAM | 你好,点云
    从零开始一起学习SLAM | 给点云加个滤网
    从零开始一起学习SLAM | 点云平滑法线估计
    从零开始一起学习SLAM | 点云到网格的进化
    从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
    从零开始一起学习SLAM | 掌握g2o顶点编程套路
    从零开始一起学习SLAM | 掌握g2o边的代码套路
    零基础小白,如何入门计算机视觉?
    SLAM领域牛人、牛实验室、牛研究成果梳理
    我用MATLAB撸了一个2D LiDAR SLAM
    可视化理解四元数,愿你不再掉头发
    最近一年语义SLAM有哪些代表性工作?
    视觉SLAM技术综述
    汇总 | VIO、激光SLAM相关论文分类集锦
    研究SLAM,对编程的要求有多高?
    2018年SLAM、三维视觉方向求职经验分享
    2018年SLAM、三维视觉方向求职经验分享
    深度学习遇到SLAM | 如何评价基于深度学习的DeepVO,VINet,VidLoc?
    视觉SLAM关键方法总结
    SLAM方向公众号、知乎、博客上有哪些大V可以关注?
    SLAM实验室
    SLAM方向国内有哪些优秀公司?
    SLAM面试常见问题
    SLAM相关领域数据集调研
    从零开始一起学习SALM-ICP原理及应用
    解放双手——相机与IMU外参的在线标定

    展开全文
  • 目标识别算法

    千次阅读 2019-03-28 13:58:07
    cnn两个最重要的特征: 权值共享(w),就是filter对于不同位置的特征都敏感 稀疏链接,避免过拟合(因为只有在局部感受野的上层输入才对下层对应位置的输出负责) Alexnet: 1.Relu解决了网络深的时候出现的梯度...
  • 深度学习(目标检测)---目标检测20年

    万次阅读 多人点赞 2018-05-30 11:39:42
    目标检测二十年“目标检测是当前计算机视觉和机器学习领域的研究热点。从Viola-Jones Detector、DPM等冷兵器时代的智慧到当今RCNN、YOLO等深度学习土壤孕育下的GPU暴力美学,整个目标检测的发展可谓是计算机视觉领域...
  • 视频目标检测识别

    万次阅读 多人点赞 2020-05-05 15:37:14
    之前文章目标检测API 已经介绍过API的基本使用,这里就不赘述了,直接上本次内容的代码了,添加的内容并不多。将测试的test.mp4原文件放到models-master\research\object_detection路径下,并创建一个detect_video....
  • 目标检测用来确定图像的某个区域是否含有要识别的对象,计算机视觉中有很多目标检测和是别的技术,这里介绍: 梯度直方图(Histogram of Oriented Gradient,HOG),图像金字塔(image pyramid),滑动窗口...
  • 未能够识别目标 ***;票根

    万次阅读 2013-08-02 22:55:48
    spring-security cas 未能够识别目标    未能够识别目标 'ST-2-gqQSrEpDwAQlHLdkJIEz-cas01.example.org'票根     修改:WEB-INF/spring-configuration/ticketExpirationPolicies.xml中的 ...
  • 目标识别和目标检测的区别

    千次阅读 2019-06-13 16:18:11
    Object Recognition:which object is depicted in the image? input: an image containing unknown object(s) Possibly, the position of the object can be marked in the input, or the input might be only a....
  • CV:基于深度学习实现目标检测之GUI界面产品设计并实现图片识别、视频识别、摄像头识别(准确度非常高) 目录 GUI编程设计界面 产品演示 GUI编程设计界面 产品演示 视频演示:...
  • 首先在photoshop中打开想要识别文字的目标图片 然后在上方菜单中点击文字,弹出菜单,点击匹配文字,弹出窗口提示 最后选择目标文字区域,便会自动开始搜索字体,加载完成后,选择字体即可 ...
  • 激光雷达目标识别算法研究综述

    千次阅读 2018-05-25 10:00:19
    为了达到高可靠性的分类识别效果,通常采用现代模式识别理论和方法进行分类器设计,例如基于统计的模式分类方法、模糊模式分类方法、基于神经网络的模式分类方法、基于支持向量机的模式分类方法、基于模型的模式分类...
  • 《SAR图像质量评估机器目标识别应用-张倩》   道路识别   道路是一种非常常见的目标,在雷达波束中一般可看作是平滑的路面,因此回波较弱,在 SAR 图像中表现为暗色的连续线状区域。道路识别的能力受到路面...
  • 怎么在一幅图像里对多个目标分别进行识别? 我的想法是定位需要识别目标,返回图像的一个子区域,再储存为Mat,再进行识别。可是上网搜了很多有关图像分割的,都是类似于边缘检测那种,输出的是一整幅经过处理后的...
  • 网络摄像机智能算法的关键是对包含运动目标的图像序列进行分析处理,其核心技术就是对场景中活动目标的检测...基于多目标识别与跟踪技术的视频监控应用文/江浩现有的运动目标检测方法可以归纳为四种:背景减除法、时间
  • 介绍了目标识别中基于阈值的分割和基于分类器的识别,之后我们将介绍基于深度学习的目标识别
  • 数据集:MNIST, CIFAR, ImageNet目标检测(object detection)给定一幅图像,只需要找到一类目标所在的矩形框 人脸检测:人脸为目标,框出一幅图片中所有人脸所在的位置,背景为非目标 汽车检测:汽车为目标、框...
  • Python 使用Opencv实现目标检测与识别

    万次阅读 2018-09-25 15:32:19
    本人新书《玩转Python网络爬虫》,可在天猫、京东等商城搜索...在上章节讲述到图像特征检测与匹配 ,本章节是讲述目标检测与识别。后者是在前者的基础上进一步完善。 在本章中,我们使用HOG算法,HOG和SIFT、SU...
  • MSTAR数据库作为SAR图像自动目标识别(SAR ATR)研究的一个通用库,被很多学者广泛采用。从现有的SAR ATR系统处理流程来看,目标检测作为该系统的前端,很大程度上影响系统后续识别性能,在较好的检测性能下获得的...
1 2 3 4 5 ... 20
收藏数 422,273
精华内容 168,909
关键字:

目标识别