目前主流的目标检测算法主要是基于深度学习模型,其可以分成两大类:two-stage检测算法;one-stage检测算法。本文主要介绍第一类检测算法,第二类在下一篇博文中介绍。

  目标检测模型的主要性能指标是检测准确度和速度,对于准确度,目标检测要考虑物体的定位准确性,而不单单是分类准确度。一般情况下,two-stage算法在准确度上有优势,而one-stage算法在速度上有优势。不过,随着研究的发展,两类算法都在两个方面做改进。

  two-stage检测算法将检测问题划分为两个阶段,首先产生候选区域(region proposals),然后对候选区域分类(一般还需要对位置精修),这类算法的典型代表是基于region proposal的R-CNN系算法,如R-CNN,SPPNet ,Fast R-CNN,Faster R-CNN,FPN,R-FCN等;

1、R-CNN(13)

  R-CNN算法分为4个步骤 :

  • 一张图像生成1K~2K个候选区域 ,Selective search方法(使用了Selective Search方法从一张图像生成约2000-3000个候选区域。基本思路如下: 使用一种过分割手段,将图像分割成小区域 ;查看现有小区域,合并可能性最高的两个区域(基于颜色、纹理等)。重复直到整张图像合并成一个区域位置; 输出所有曾经存在过的区域,所谓候选区域);
  • 对每个候选区域,归一化为同一尺寸,使用深度网络提取特征 ;
  • 特征送入每一类的SVM 分类器(二分类),判别是否属于该类 ;
  • 使用回归器精细修正候选框位置 ;

  RCNN存在三个明显的问题:

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

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

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

  4)方法中的三个模型是分别训练的——CNN提取图像特征、分类器预测类别、回归模型tighten bounding box的边界,这也导致流程不易训练。

2、SPPNet (14)

   SPP-Net在RCNN的基础上做了实质性的改进:

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

  在R-CNN中,由于每个候选区域大小是不同,所以需要先resize成固定大小才能送入CNN网络,SPP-net正好可以解决这个问题。采用空间金字塔池化(SpatialPyramid Pooling )替换了 全连接层之前的最后一个池化层。为了适应不同分辨率的特征图,定义一种可伸缩的池化层,不管输入分辨率是多大,都可以划分成m*n个部分。这是SPP-net的第一个显著特征,它的输入是conv5特征图 以及特征图候选框(原图候选框 通过stride映射得到),输出是固定尺寸(m*n)特征;

  SPP层原理如下所示,假定CNN层得到的特征图大小为a×a(比如13×13,随输入图片大小而变化),设定的金字塔尺度为n×n bins(对于不同大小图片是固定的),那么SPP层采用一种滑动窗口池化,窗口大小win_size=⌈a/n⌉,步为stride=⌊a/n⌋stride=⌊a/n⌋,采用max pooling,本质上将特征图均分为n×n个子区域,然后对各个子区域max pooling,这样不论输入图片大小,经过SPP层之后得到是固定大小的特征。一般设置多个金字塔级别,文中使用了4×4,2×2和1×1三个尺度。每个金字塔都得一个特征,将它们连接在一起送入后面的全连接层即可,这样就解决了变大小图片输入的问题了。

  

  (2)只对原图提取一次特征:SPP的位置,放在所有的卷积层之后,有效解决了卷积层的重复计算问题(速度提高了24~102倍),这是论文的核心贡献。

  R-CNN每次都要挨个使用CNN模型计算各个候选区域的特征,这是极其费时的,不如直接将整张图片送入CNN网络,然后抽取候选区域的对应的特征区域,采用SPP层,这样可以大大减少计算量,并提升速度。基于SPP层的R-CNN模型在准确度上提升不是很大,但是速度却比原始R-CNN模型快24-102倍。

  

  尽管SPP-Net贡献很大,仍然存在很多问题:

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

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

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

3、Fast R-CNN(15)

  Fast RCNN 在 RCNN的基础上做了实质性的改进:

  (1)共享卷积层:输入一张完整的图片,再把候选框映射到conv5上,得到每个候选框的特征。提出简化版的ROI池化层(注意,没用金字塔)。

  

  (2)多任务Loss层:把类别判断和位置精调统一用深度网络实现,不再需要额外存储。

  在实现上是使用两个不同的全连接层,第一个全连接层有N+1个输出(N是类别总数,1是背景),表示各个类别的概率值;第二个全连接层有4N个输出,表示坐标回归值(tx,ty,tw,th),这个与R-CNN是一样的,每个类别都预测4个位置坐标值。Fast R-CNN采用了softmax分类器而不是SVM分类器(softmax性能好一些),定位误差采用smooth L1 而不是R-CNN中的L2。

 

 

  总代价为两者加权和,如果分类为背景则不考虑定位代价。损失函数:

    

4、Faster R-CNN(15)

  具体解释:https://blog.csdn.net/u011746554/article/details/74999010   

  Fast R-CNN存在的问题:存在瓶颈:选择性搜索,找出所有的候选框,这个也非常耗时。那我们能不能找出一个更加高效的方法来求出这些候选框呢?解决:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。做这样的任务的神经网络叫做Region Proposal Network(RPN)。

  Faster R-CNN的主要贡献是设计了提取候选区域的网络RPN,代替了费时的选择性搜索,将候选框提取合并到深度网络中,使得检测速度大幅提高。

  具体做法:将RPN放在最后一个卷积层的后面;RPN直接训练得到候选区域。RPN网络的特点在于通过滑动窗口的方式实现候选框的提取,在feature map上滑动窗口,每个滑动窗口位置生成9个候选窗口(不同尺度、不同宽高),提取对应9个候选窗口(anchor)的特征,用于目标分类和边框回归,与FastRCNN类似。 目标分类只需要区分候选框内特征为前景或者背景,边框回归确定更精确的目标位置。

  

  一种网络,四个损失函数:RPN calssification(anchor good.bad);RPN regression(anchor->propoasal);Fast R-CNN classification(over classes);Fast R-CNN regression(proposal ->box)。

  Faster R-CNN模型采用一种4步迭代的训练策略:(1)首先在ImageNet上预训练RPN,并在PASCAL VOC数据集上finetuning;(2)使用训练的PRN产生的region proposals单独训练一个Fast R-CNN模型,这个模型也先在ImageNet上预训练;(3)用Fast R-CNN的CNN模型部分(特征提取器)初始化RPN,然后对RPN中剩余层进行finetuning,此时Fast R-CNN与RPN的特征提取器是共享的;(4)固定特征提取器,对Fast R-CNN剩余层进行finetuning。这样经过多次迭代,Fast R-CNN可以与RPN有机融合在一起,形成一个统一的网络。

  其实还有另外一中近似联合训练策略,将RPN的2个loss和Fast R-CNN的2个loss结合在一起,然后共同训练。注意这个过程,Fast R-CNN的loss不对RPN产生的region proposals反向传播,所以这是一种近似(如果考虑这个反向传播,那就是非近似联合训练)。应该来说,联合训练速度更快,并且可以训练出同样的性能。

  RPN生成候选框样本不均衡问题:

  1. 为了训练速度和训练精度的平衡,原始图像进入训练之前需要先进行resize,使图像的短边为600(或者长边为1000);
  2. 在训练过程产生的anchor中,忽视掉所有的超过图像边界的anchor:如在1000*600的图像中,大概会有20000(60*40*9)个anchor,去除掉超过边界的anchor之后,还剩6000个。论文中提到:若是不去除这些anchor的话,它们会带来大量的、难以纠正的错误,并且导致训练loss难以收敛。而在测试过程中,对于超出边界的anchor并不是删除,而是修剪掉其超过边界的部分。
  3. RPN得到的大量proposal可能会相互重叠,冗余度较高,论文根据这些proposal的cls得分对其区域采用非极大值抑制(NMS)去除冗余proposal,经过NMS后每张图还剩下大概2000个proposal。经过实验,NMS并不会降低检测的准确度,但是大量减少了无关的proposal。
    1. 对每个标定的 ground true box 区域,与其重叠比例最大的 anchor 记为正样本 (保证每个 ground true 至少对应一个正样本 anchor )
    2. 对 1 中剩余的 anchor,如果其与某个标定区域重叠比例 (IoU) 大于 0.7,记为正样本(每个 ground true box 可能会对应多个正样本 anchor。但每个正样本 anchor 只可能对应一个grand true box);如果其与任意一个标定的重叠比例都小于 0.3,记为负样本。
    3. 对 1、2 剩余的 anchor,弃去不用。
    4. 跨越图像边界的anchor弃去不用。

5、最后总结一下各大算法的步骤:

  • RCNN解决的是,“为什么不用CNN做classification呢?”
  • Fast R-CNN解决的是,“为什么不一起输出bounding box和label呢?”
  • Faster R-CNN解决的是,“为什么还要用selective search呢?”

  (1)RCNN

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

  (2)Fast RCNN

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

  (3)Faster RCNN

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

     

5、FPN (17)

  原有的目标检测算法通常都是只采用顶层特征做检测,原因是网络顶层特征的语义信息比较丰富。然而,虽顶层特征的语义信息丰富,但其中的目标位置信息却比较粗略,不利于目标包围框的准确定位;相反,虽然底层特征的语义信息比较少,但其中目标的位置信息却非常准确。

  FPN 主要解决的是物体检测中的多尺度问题,通过简单的网络连接改变,在基本不增加原有模型计算量情况下,大幅度提升了小物体检测的性能

  一个自底向上的线路,一个自顶向下的线路,横向连接(lateral connection)。侧向连接通过 1x1 的卷积进行连接(减少特征图维度同时保证尺寸不变),通过 Add 操作进行 Merge。

  同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的

    

  论文实验结论:

  <1> 如果没有top-down的语义增强分支(仍然从不同的层输出),那么RPN的AR(average recall)会下降6%左右;

  <2> 如果不进行特征的融合(也就是说去掉所有的1x1侧连接),虽然理论上分辨率没变,语义也增强了,但是AR下降了10%左右!作者认为这些特征上下采样太多次了,导致它们不适于定位。Bottom-up的特征包含了更精确的位置信息。

  <3> 如果不利用多个层进行输出呢?作者尝试只在top-down的最后一层(分辨率最高、语义最强)设置anchors,仍然比FPN低了5%。需要注意的是这时的anchors多了很多,但是并没有提高AR。

  <4> 在RPN和object detection任务中,FPN中每一层的heads 参数都是共享的,作者认为共享参数的效果也不错就说明FPN中所有层的语义都相似。

6、R-FCN(16)

  主要贡献在于解决了“分类网络的位置不敏感性(translation-invariance in image classification)”与“检测网络的位置敏感性(translation-variance in object detection)”之间的矛盾,在提升精度的同时利用“位置敏感得分图(position-sensitive score maps)”提升了检测速度。

  Faster R-CNN系列的网络都可以分成2个部分:(1)Fully Convolutional subnetwork before RoI Layer;(2)RoI-wise subnetwork.

  第一部分是直接用普通分类网络的卷积层,用其来提取共享特征,然后一个RoI Pooling Layer在第1部分的最后一张特征图上进行提取针对各个RoIs的特征向量(或者说是特征图,维度变换一下即可),然后将所有RoIs的特征向量都交由第2部分来处理(分类和回归),而第二部分一般都是一些全连接层,在最后有2个并行的loss函数:softmax和smoothL1,分别用来对每一个RoI进行分类和回归,这样就可以得到每个RoI的真实类别和较为精确的坐标和长宽了。

  这部分具有位置不敏感性,而如果我们将一个分类网络比如ResNet的所有卷积层都放置在第1部分用来提取特征,而第2部分则只剩下全连接层,这样的目标检测网络是“位置不敏感的translation-invariance”,所以其检测精度会较低,并且也白白浪费了分类网络强大的分类能力(does not match the network's superior classification accuracy)。而ResNet论文中为了解决这样的位置不敏感的缺点,做出了一点让步,即将RoI Pooling Layer不再放置在ResNet-101网络的最后一层卷积层之后而是放置在了“卷积层之间”,这样RoI Pooling Layer之前和之后都有卷积层,并且RoI Pooling Layer之后的卷积层不是共享计算的,它们是针对每个RoI进行特征提取的,所以这种网络设计,其RoI Pooling Layer之后就具有了“位置敏感性translation-variance”,但是这样做牺牲了测试速度,因为所有RoIs都要经过若干层卷积计算,测试速度会很慢。

  

  

  详解:https://zhuanlan.zhihu.com/p/30867916

7、Mask R-CNN(17)

  Mask R-CNN在此基础上更进一步:得到像素级别的检测结果。 对每一个目标物体,不仅给出其边界框,并且对边界框内的各个像素是否属于该物体进行标记。

  主要贡献其实就是RoIAlign以及加了一个mask分支。 RoIAlign,是将RoIPooling的插值方式,从最近邻插值(INTER_NEAREST)方式变为双线性插值。

  

参考博客:https://blog.csdn.net/xiaohu2022/article/details/79600037

       https://www.cnblogs.com/skyfsm/p/6806246.html

       https://blog.csdn.net/xyfengbo/article/details/70227173

目标检测 — two-stage检测的更多相关文章

  1. 目标检测之单步检测(Single Shot detectors)

    目标检测之单步检测(Single Shot detectors) 前言 像RCNN,fast RCNN,faster RCNN,这类检测方法都需要先通过一些方法得到候选区域,然后对这些候选区使用高质量 ...

  2. 带你读AI论文丨用于目标检测的高斯检测框与ProbIoU

    摘要:本文解读了<Gaussian Bounding Boxes and Probabilistic Intersection-over-Union for Object Detection&g ...

  3. OPENCV图像特征点检测与FAST检测算法

    前面描述角点检测的时候说到,角点其实也是一种图像特征点,对于一张图像来说,特征点分为三种形式包括边缘,焦点和斑点,在OPENCV中,加上角点检测,总共提供了以下的图像特征点检测方法 FAST SURF ...

  4. kaggle信用卡欺诈看异常检测算法——无监督的方法包括: 基于统计的技术,如BACON *离群检测 多变量异常值检测 基于聚类的技术;监督方法: 神经网络 SVM 逻辑回归

    使用google翻译自:https://software.seek.intel.com/dealing-with-outliers 数据分析中的一项具有挑战性但非常重要的任务是处理异常值.我们通常将异 ...

  5. JavaScript浏览器检测之客户端检测

    客户端检测一共分为三种,分别为:能力检测.怪癖检测和用户代理检测,通过这三种检测方案,我们可以充分的了解当前浏览器所处系统.所支持的语法.所具有的特殊性能. 一.能力检测: 能力检测又称作为特性检测, ...

  6. unity3d 赛车游戏——复位点检测优化、反向检测、圈数检测、赛道长度计算

    接着上一篇文章说 因为代码简短且思路简单 所以我就把这几个功能汇总为一篇文章 因为我之前就是做游戏外挂的 经过验证核实,**飞车的复位点检测.圈数检测就是以下的方法实现的 至于反向检测和赛道长度计算, ...

  7. 离群点检测与序列数据异常检测以及异常检测大杀器-iForest

    1. 异常检测简介 异常检测,它的任务是发现与大部分其他对象不同的对象,我们称为异常对象.异常检测算法已经广泛应用于电信.互联网和信用卡的诈骗检测.贷款审批.电子商务.网络入侵和天气预报等领域.这些异 ...

  8. 人脸检测的harr检测函数

    眼球追踪需要对人脸进行识别,然后再对人眼进行识别,判断人眼张合度,进而判断疲劳... 解析:人脸检测的harr检测函数使用方法 代码理解: 利用训练集,检测出脸部,画出框 void CAviTestD ...

  9. 24V低压检测电路 - 低压检测电压(转)

    24V低压检测电路 - 低压检测电压 参考: ADC采样工作原理详解 使用单片机的ADC采集电阻的分压 问题: 当ADC采集两个电阻分压后的电压的时候,ADC转换出来的电压值和万用表量出来的不一样差异 ...

  10. [DeeplearningAI笔记]卷积神经网络3.1-3.5目标定位/特征点检测/目标检测/滑动窗口的卷积神经网络实现/YOLO算法

    4.3目标检测 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1目标定位 对象定位localization和目标检测detection 判断图像中的对象是不是汽车--Image clas ...

随机推荐

  1. url请求特殊字符转换

    一.问题阐述 用URL传参数的时候,用&符号连接,如果某一个参数中含"#$ ^ & * + ="这些符号的时候,在另一个页面getParameter就会取不到传过来 ...

  2. 如何理解AWS 网络,如何创建一个多层安全网络架构

    目录 一.要求 网络架构图 网络各组件关系 二.操作步骤 2.1.网络设置 2.2.安全设置 2.3.创建实例 三.费用 3.1.NAT 网关费用 一.要求 创建一个三层网络架构,服务器只能通过跳板机 ...

  3. webpack官网demo起步中遇到的问题

    在webpack官网demo一开始搭建中 

  4. python3.6-Yelp/elastalert0.2.1-elk7.2.0邮件加企业微信告警

    0.修改时区(前提条件已经安装好elk7.2) rm -f /etc/localtimecp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimetimed ...

  5. 报错Unsupported major.minor version 52.0的原因

    原因分析 很明显是JDK版本不一致所导致的,,我们知道Java是支持向后编译的,也就是说,在低版本(如JDK6)上编译的class文件或者jar文件可以在高版本上(如JDK8)上编译通过,但这并不意味 ...

  6. TCP 客户端编程

    1.Qt中TCP客户端编程 对Qt编程而言,网络只是数据传输的通道: Qt提供了QTcpSocket类(封装了TCP协议细节): 将QTcpSocket的对象当做黑盒使用,进行数据首发. 1.1QTc ...

  7. Airflow怎么删除系统自带的DAG任务

    点击这个按钮 找到dag文件所在路径,并进入路径将其文件删除即可

  8. 超全的IE兼容性问题及解决方案

    1.怪异盒模型:在老版本IE下不设置文档声明,页面就会进入怪异盒模型解析,所以要设置文档声明: 2.IE6下,子元素的宽高超出父级的宽高 :可以把父级设 置好的宽度撑开 3.在IE6下,块属性元素的高 ...

  9. Android MTK6580 客制化关机充电动画

    1.客制化关机充电图片 vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/xxx 找到对应分辨率替换 2.调整显示图片位置.大小 ...

  10. 【最后一战】NOI2019游记

    NOI2019 游记 报到日 -1 打了一场LOJ发现rk5,听完cy讲T1后感觉自己非常智障--AK的那位老哥好强啊qwq 窝在宾馆里打打游戏敲敲板子 饥荒真好玩 等着明天去报道 要退役了反而心情平 ...