目标检测算法Faster R-CNN简介
在博文https://blog.csdn.net/fengbingchun/article/details/87091740 中对Fast R-CNN进行了简单介绍,这里在Fast R-CNN的基础上简单介绍下Faster R-CNN。
目标检测领域从R-CNN开始,通过引入卷积神经网络取得了很多突破性的进展,但是始终未能摆脱传统候选区域算法(如Selective Search)的限制。使用Selective Search算法进行候选区域的确定使得Fast R-CNN算法的运算时间大大增加,使得Fast R-CNN网络结构模型在实时性方面达不到要求。为了解决候选区域提取这个瓶颈,进一步共享卷积运算,任少卿等人在2016年提出了Faster R-CNN,论文名字为”Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”,可以从https://arxiv.org/pdf/1506.01497.pdf 直接下载。
Faster R-CNN主要包括两个模块:一个是深度全卷积网络RPN,该网络用来产生候选区域;另一个是Fast R-CNN检测器,使用RPN网络产生的候选区域进行分类与边框回归计算。整个系统共享卷积特征图,即此特征图既作为RPN网络的输入也作为Fast R-CNN的输入,是一个统一的用来进行物体检测的网络,如下图所示。可以简单理解Faster R-CNN为RPN和Fast R-CNN的结合,通过RPN代替Selective Search提取候选区域,加快了运行速度。
Faster R-CNN主要解决了两个问题:一个是提出了候选区域生成网络RPN,能够快速的生成候选区域;另一个是使RPN与Fast R-CNN共享特征提取网络,极大的降低了模型的参数空间规模,实现参数共享。
Faster R-CNN网络的核心点就是RPN候选区域生成网络的设计。RPN网络结构的设计基于卷积神经网络,其输入是一张图像,然后给出一系列的候选物体矩形框,每个矩形框附带一个分数来表示其属于真实物体的信念值。RPN由一个全卷积网络构建,为了与Fast R-CNN共享参数,RPN与Fast R-CNN共享卷积层。
RPN(Region Proposal Network):候选区域网络,是一种全卷积网络(Fully-Convolutional Network, FCN),主要用于生成候选区域,也就是估计目标物体的位置和大小,它与Fast R-CNN共享卷积层。通过在最后一个共享的卷积层输出的特征图矩阵上用d个n*n的窗口进行滑窗处理,映射为d维特征向量(对于ZF是256-d)。该向量经过两个全连接层:边框回归层(reg)和目标分类层(cls)。回归层和分类层是两个独立平行的全连接层,回归层主要是对原始目标的位置进行估计操作,分类层主要是对目标进行分类,得到目标属于某个类别的概率。在每一个滑动窗口的位置,同时预测k个候选区域,所以边框回归层有4k个输出(x,y,w,h分别为候选框的中心坐标和宽高),用来确定目标的位置;分类层有2k个得分输出,估计每个候选框属于前景(不区分具体类别)还是背景的概率。k个参考box,称之为anchor,对k候选框进行参数化。每个anchor对应一种尺度(scale)和一种长宽比(ratio),并以当前滑动窗口中心为基准点。对于大小为W*H的卷积映射,总共有W*H*k个anchor。RPN的网络结构如下图所示:
候选区域网络以原始图像所提取出的卷积特征图矩阵作为输入,输出一系列的矩形候选区域框以及该矩形候选区域是否为目标的分数。
anchor:RPN提出了锚框(anchor boxes)的概念,锚框就是人为假定的在原始图像中的候选区域。一个anchor是指以当前滑动窗口中心为中心并且具有不同的尺度和纵横比的box。对训练集中的每张图像(每张图像含有手动标注的GT box)的anchor进行考察,对于每个GT box,如果anchor与其的重叠比例最大,则标为正样本,或者GT box与anchor的重叠比例大于0.7也记为正样本;如果anchor与GT box的重叠比例小于0.3则记为负样本,剩余的anchor和跨越图像边界的anchor不用于最终训练。通过不同的尺度和长宽比生成不同的anchor。
在Faster R-CNN中作者借鉴了两种不同深度的网络模型,分别为ZF-net模型以及VGG-net模型,并在它们的网络结构基础上加入了RPN,前者有5个可共享的卷积层,后者是更深的13个可共享卷积层。输入图像在经过RPN处理之后输出一组包围目标的矩形框集合,并且给出每一个矩形框是否是目标的概率值。
以ZF-net为例,该网络对任意尺寸的图像切割为224*224大小作为输入图像,前5层为卷积层、池化层交替进行的网络对输入图像进行原始特征提取,包括颜色、纹理等浅层特征,在第5个输出的卷积层之后加入RPN,采用一个大小为3*3的小网络对第5个卷积层之后得到的特征图上进行卷积运算,每一个滑动窗被映射成更低维度(ZF-net是256维),并用ReLU函数进行激活,得到一组特征向量,然后将得到的特征向量输入两个全连接层,分别是窗口分类层(cls layer)与窗口回归层(reg layer)。在目标检测中,待测目标形态大小各异,如果统一以相同大小的窗口进行检测,必然会影响检测效果,降低检测精度,因此Faster R-CNN算法为每个滑动窗口位置配置了9个基准矩形框来适配各种目标。对于每张输入的特征图像的每一个位置,使用9种尺度的候选窗口:三种面积{128*128, 256*256, 512*512}*三种比例{1:1, 1:2, 2:1},目的是尽可能的将尺度大小不一的特定目标区域特征检测出来,并判断候选窗口是否包含感兴趣的目标。这些候选窗口称为锚点(anchor)。锚点还具有平移不变性,锚点计算函数同样具有平移不变性,如果图像中的物体发生了平移,判断函数就要计算感兴趣区域(Region of Interest, RoI)相应的平移,并对所有可能位置进行计算。平移不变性可以减少参数量,增强模型泛化能力。
候选区域,就是图像中可能包含待测目标的区域,可以利用图像中的边缘、纹理和颜色等信息来获得。生成候选区域相当于目标的粗检测过程,目的在于减轻后面分类网络的压力,以保证在选取较少检测窗口的情况下,保持较高的检测精度。
在Faster R-CNN算法中,候选区域生成网络(RPN)是一个卷积神经网络,该网络以特征提取网络输出的特征图作为输入,输出多种尺度和宽高比的矩形候选区域。如上图所示,该网络首先使用一个滑动窗口在特征图上进行滑动,该网络首先使用一个滑动窗口在特征图上进行滑动,将滑动窗口经过的每个位置上的特征映射成一个256维(选用ZF-net作为特征提取网络时为256维,,选用其它网络作为特征提取网络时,该值会有变化)的特征向量,然后将每个特征向量输入到两个全连接层当中,一个全连接层输出2*9=18个分数,另一个全连接层输出4*9=36个修正参数。Faster R-CNN算法为每个滑动窗口位置定义了9个基准矩形框(锚点),得到每个滑动窗口位置的修正参数之后,利用修正参数对基准矩形框进行修正,每个基准矩形框分别对应4个修正参数,最后每个滑动窗口位置得到9个候选区域。18个分数为候选区域的评分,每个候选区域对应2个分数,分别代表该候选区域内包含和不包含待测目标的可能性。候选区域生成网络对于每个基准矩形框会输出4个修正参数,利用这4个修正参数对基准矩形框进行修正即可得出候选区域。
候选区域生成网络的损失函数是一个多任务损失函数,通过该多任务损失函数将候选区域的类别置信度和修正参数的训练任务统一起来。
分类回归网络:即Fast R-CNN,获得候选区域之后,便要对候选区域进行分类回归操作。在Faster R-CNN算法中,分类回归网络以特征提取网络输出的特征图和候选区域生成网络输出的候选区域为输入,输出候选区域对应各类别的置信度和修正参数。修正参数用于对候选区域进行修正。
分类回归网络结构如下,由于候选区域大小、形状各不相同,分类回归网络首先使用一个RoI pooling层将候选区域所包含的特征池化成大小、形状相同的特征图,接着使用两个全连接层fc6、fc7对特征图进行特征映射,然后使用全连接层fc/cls、fc/bbox_reg分别输出候选区域对应各个类别的分数和修正参数,最后使用Softmax层将分数进行归一化,从而得到候选区域对应各个类别的置信度。
RoI pooling层:将不同候选区域所包含的特征图转换成固定维度的特征向量,从而匹配后续的权连接层。
Dropout方法:深度学习神经网络的性能很依赖训练数据,当训练数据较少时,很容易出现过拟合现象。因此Faster R-CNN算法在分类回归网络中使用Dropout来防止过拟合。Dropout是指在神经网络每次迭代训练过程中,随机选择神经网络部分隐层节点在该次训练中停止工作,这些停止工作的节点不会影响网络输出,也不会在该次训练中进行更新,参数值保持不变。Dropout是一种非常有效的防止过拟合方法,通过平均多个网络的预测概率,并且抑制非关键性特征,最终提高神经网络泛化能力。
非极大值抑制(Non-Maximum Suppression, NMS):在Faster R-CNN算法中,神经网络针对每种目标会输出大量带置信度的检测框,这些检测框之间存在包含或者相互重叠的情况,并且包含的物体可能相同,也可能不相同。虽然置信度越大,检测框包含物体的概率越高,但有可能这些置信度较大的检测框实际上针对的是同一个物体,只是该物体特征较为明显才导致置信度较高。因此,若只是简单的对检测框按置信度排序,然后筛选出高置信度的检测框,可能会出现漏检的情况。
为了解决上述问题,Faster R-CNN算法使用非极大值抑制算法来对检测框进行筛选,该算法是一种局部最大搜索方法,所谓局部就是一个邻域,邻域包含两个可变的参数,邻域的维数和邻域的大小。非极大值抑制算法的主要思想就是按照一定的比较规则筛选出局部极大值,抑制局部极小值。如下所示为非极大值抑制算法的主要步骤,其中集合S是带置信度的检测框集合,集合S’是经过筛选之后的检测框集合:
(1). 将集合S的检测框按照置信度进行排序;
(2). 只要集合S不为空,进行以下步骤:
a. 从集合S中取出置信度最高的检测框w;
b. 将w插入到集合S’中;
c. 对于集合S中剩下的每一个检测框,如果该检测框与w之间的重叠率大于阈值(比如0.6),将该检测框从集合S中删除。
分类回归网络的损失函数是一个多任务损失函数。
Faster R-CNN网络模型的训练步骤如下:
(1). RPN网络训练阶段:用经过ImageNet数据集训练过的神经网络模型初始化RPN网络,随后使用候选框以及真实组合成的训练对对RPN网络进行参数微调;
(2). Fast R-CNN网络训练阶段:用经过ImageNet数据集训练过的神经网络模型初始化Fast R-CNN网络,随后用训练图片经过第一阶段训练出的RPN网络产生的候选框训练Fast R-CNN网络。在此阶段RPN网络产生的候选框需要经过以下步骤的筛选:
a. 计算所有候选框与所有真实框的最大重叠区域比率;
b. 将最大重叠区域比率大于设定的阈值的候选框标记为目标区域,也就是正样本;
c. 若正样本的数目大于设定的阈值XX则从正样本中随机选取XX个作为正样本参与训练;
d. 将最大重叠区域比率小于设定的高阈值大于设定的低阈值的候选框区域作为负样本;
e. 若负样本的数目大于设定的阈值YY,则从负样本中随机选取YY个作为负样本参与训练;
(3). 用第二阶段训练的Fast R-CNN网络模型初始化RPN网络模型,但是在训练RPN网络的时候,只训练RPN网络特有的全连接层的连接权重矩阵,卷积特征提取层的参数不变,RPN网络与Fast R-CNN网络在这一阶段共享卷积特征提取层;
(4). 与第三阶段相同,固定卷积特征提取层的参数,只训练Fast R-CNN网络特有的全连接层的连接权重矩阵。
Faster R-CNN网络模型有效地将候选框提取的任务交由神经网络模型来完成,并提供了一种端到端(end-to-end)的模型训练方案,使得基于卷积神经网络的目标检测方案满足实时性的要求。
Faster R-CNN整体检测大致为:
(1). 把任意大小的图像输入CNN通过卷积层进行特征提取;
(2). 利用RPN网络产生高质量的候选框;
(3). 将候选框映射到CNN的最后一层卷积特征图上;
(4). 用RoI pooling层固定每个候选框的大小;
(5). 利用分类层和边框回归层对候选区域进行具体的类别判断和精确的边框回归。
在结构上,Faster R-CNN可以将特征抽取(feature extraction)、proposal提取、bounding box regression、classification都整合在一个网络中。
以上内容均来自网络,主要参考文献如下:
1. 《基于Lexical R-CNN的视频描述》,吉林大学,硕论,2018
2. 《基于深度学习的复杂背景下目标检测与分割方法》,中北大学,硕论,2018
3. 《基于Faster R-CNN的工业CT图像缺陷检测研究》,南州交通大学,硕论,2018
4. 《基于Faster R-CNN的目标检测算法的研究》,华南理工大学,硕论,2017
5. https://medium.com/@smallfishbigsea/faster-r-cnn-explained-864d4fb7e3f8
6. https://blog.csdn.net/qq_17448289/article/details/52871461
7. https://zhuanlan.zhihu.com/p/31426458
8. http://pancakeawesome.ink/%E5%BC%84%E6%87%82%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B(Faster-R-CNN)
GitHub:https://github.com/fengbingchun/NN_Test
相关文章:

ICCV 2019 | 加一个任务路由让数百个任务同时跑起来,怎么做到?
作者 | Gjorgji Strezoski, Nanne van Noord, Marcel Worring 译者 | 中国海洋大学李杰 出品 | AI科技大本营(ID:rgznai100)摘要传统的多任务(MTL)学习方法依赖于架构调整和大型可训练参数集来联合优化多个任务。但是,…

DEV开发之控件NavBarControl
右键点击RunDesigner弹出如下界面鼠标先点击3或4,1,,然后点击1或2进行相应的新增或删除操作,3是分组,4是项目,4可以直接拖动到相应的分组3.属性caption:显示的名称4.NavBarControl 属性 PaintStyleName绘画风格&…

swift支持多线程操作数据库类库-CoreDataManager
类库方法 获取数据 executeFetchRequest(request:) 同步获取数据 var request: NSFetchRequest NSFetchRequest(entityName: "MonkeyEntity")var myMonkeys:NSArray? CoreDataManager.shared.executeFetchRequest(request)异步获取数据 executeFetchRequest(re…

目标检测(或分隔)算法Mask R-CNN简介
在博文https://blog.csdn.net/fengbingchun/article/details/87195597 中对Faster R-CNN进行了简单介绍,这里在Faster R-CNN的基础上简单介绍下Mask R-CNN。 Mask R-CNN是faster R-CNN的扩展形式,能够有效地检测图像中的目标,并且Mask R-CNN…

未来之城,管理者可能不是人......
大会官网 https://t.csdnimg.cn/KSTh2010 年,IBM 正式提出了“智慧地球”愿景。在 IBM 的设想中,智慧城市应该由六个核心系统组成:组织(人)、业务/政务、交通、通讯、水和能源。(图源 | IBM 官网࿰…

UVa 10701 - Pre, in and post
题目:已知树的前根序,中根序遍历转化成后根序遍历。 分析:递归,DS。依据定义递归求解就可以。 前根序:根,左子树,右子树; 中根序:左子树,根,右子树…

图像集存储成MNIST数据集格式实现
有时会用到将一组图像存放成MNIST中那样的数据格式,以便于用于网络的训练和测试,如MNSIT中的测试集标签t10k-labels.idx1-ubyte和测试集图像t10k-images.idx3-ubyte,各包含了10000个样本,这里以此两个测试集为例详细说明下实现过程…

ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
原来定位服务是10分钟收不到定位信息就挂起定位,现在变为最短3分钟,估计都是为了省电吧。只要你开启应用的后台定位,并且10分钟有一次定位,那么苹果就不会关闭你的线程,现在变成3分钟。若你的应用开启了后台定位&#…

程序员必知的20个Python技巧
作者 | Duomly 译者 | 弯月,编辑 | 郭芮 出品 | CSDN(ID:CSDNnews)Python是一门流行且应用广泛的通用编程语言,其应用包括数据科学、机器学习、科学计算等领域,以及后端Web开发、移动和桌面应用程序等方面。…

CSS float浮动的深入研究、详解及拓展(二)
为什么80%的码农都做不了架构师?>>> 接上回… 五、浮动的非本职工作 浮动的本职工作是让匿名inline boxes性质的文字环绕图片显示,而其他所有用浮动实现的效果都不是浮动应该做的事情,我称之为“非本职工作”。 或许我们并没有…

不需要显示地图 就获得用户当前经纬度 超简单的方法
1.遵循协议 CLLocationManagerDelegate,AMapSearchDelegate,AMapLocationManagerDelegate 2. API MAMapServices.sharedServices().apiKey APIKey AMapLocationServices.sharedServices().apiKey APIKey AMapSearchServices.sharedServices().apiKey APIKey AMapNaviService…

ELECTRA:超越BERT,2019年最佳NLP预训练模型
作者 | 李如来源 | NLPCAB(ID:rgznai100)【导读】BERT推出这一年来,除了XLNet,其他的改进都没带来太多惊喜,无非是越堆越大的模型和数据,以及动辄1024块TPU,让工程师们不知道如何落地。今天要介…

安装node和spm过程
2019独角兽企业重金招聘Python工程师标准>>> 安装nodejs 官网下载nodejs,我下的是v0.10.33版本,安装到d:\nodejs下。 1.新建目录d:\nodejs,在其中建立node_cache、node_global、node_modules三个目录。 2,将C:\Users…

经典网络LeNet-5介绍及代码测试(Caffe, MNIST, C++)
LeNet-5:包含7个层(layer),如下图所示:输入层没有计算在内,输入图像大小为32*32*1,是针对灰度图进行训练和预测的。论文名字为” Gradient-Based Learning Applied to Document Recognition”,可以直接从ht…

根据经纬度获取用户当前位置信息
根据上篇文章获取的经纬度获取用户当前的位置信息 //获取用户所在位置信息ADDRESS func getUserAddress() { let latitude : CLLocationDegrees LATITUDES! let longitude : CLLocationDegrees LONGITUDES! print("latitude:\(latitude)") print("longitude…

刷了几千道算法题,我私藏的刷题网站都在这里了
作者 | Rocky0429 来源 | Python空间(ID: Devtogether)遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活...然而我是谁,我可是死狗中的战斗鸡,智力不够…
js实现点击li标签弹出其索引值
据说这是一道笔试题,以下是代码,没什么要文字叙述的,就是点击哪个<li>弹出哪个<li>的索引值即可: <html> <head> <style> li{width:50px;height:30px;margin:5px;float:left;text-align: center;li…

定时器开启和关闭
写程序时遇见了定时器,需要写入数据库用户的经纬 ,还要读取,写好之后发现很费电 总结原因: 1:地图定位耗电(这个根据程序要求,不能关闭,需要实时定位,很无奈ÿ…

一览群智胡健:在中国完全照搬Palantir模式,这不现实
作者 | Just出品 | AI科技大本营(ID:rgznai100)神秘的硅谷大数据挖掘公司 Palantir 是国内众多创业公司看齐的标杆,其业务是为政府和金融领域的大客户提供数据分析服务,帮助客户作出判断,甚至“预知未来”,…

ImageNet图像数据集介绍
ImageNet图像数据集始于2009年,当时李飞飞教授等在CVPR2009上发表了一篇名为《ImageNet: A Large-Scale Hierarchical Image Database》的论文,之后就是基于ImageNet数据集的7届ImageNet挑战赛(2010年开始),2017年后,ImageNet由Ka…

cocos2dx 场景的切换
我们知道cocos2dx中可以由多个场景组成,那么我是如何来切换场景的呢首先我们先新建一个新的场景类,我推荐的方式是,在你工程的目录中找到一个classes的文件夹,里面有AppDelegate.cpp和AppDelegate.h还有HelloWorldScene.cpp和Hell…

IOS 后台挂起程序 当程序到后台后,继续完成定位任务
// 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UIApplication *)application { } 当一个 iOS 应用被送到后台,它的主线程会被暂停。你用 NSThread 的 detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了。 我…

任正非:华为5G是瞎猫碰死老鼠
喜欢话糙理不糙的任正非,又飙金句。11月6日,在和彭博社记者对话时,谈到华为5G,他说:“回顾这个过程,我们也没有什么必胜的信心,有时候也是瞎猫碰上了死老鼠,刚好碰上世界是这个需求。…

网络文件系统(NFS)简介
网络文件系统(Network File System, NFS)是一种分布式文件系统协议,最初由Sun Microsystems公司开发,并于1984年发布。其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件。NFS和其他许多协议一样,是基于开放网络运算远…

JAVA Static方法与单例模式的理解
最近用sonar测评代码质量的时候,发现一个问题,工程中一些util类,以前写的static方法都提示最好用单例的方式进行改正。为此,我仔细想了想,发现还是很有道理的。这里谈谈我个人对static方法与单例模式的理解。所谓单例模…

程序员的自我修养--链接、装载与库笔记:目标文件里有什么
编译器编译源代码后生成的文件叫做目标文件。目标文件从结构上讲,它是已经编译后的可执行文件格式,只是还没有经过链接的过程,其中可能有些符号或有些地址还没有被调整。其实它本身就是按照可执行文件格式存储的,只是跟真正的可执…

swift 中拨电话的实现
//MARK:_一键报警设置//MARK: - 弹出视图func createView() {var alertView : UIAlertView?alertView UIAlertView(title: "110", message: "", delegate: self, cancelButtonTitle: "取消", otherButtonTitles: "呼叫")alertView?…

T5,一个探索迁移学习边界的模型
作者 | Ajit Rajasekharan译者 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】10月,Google 在《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》这篇论文中提出了一个最新的预训练模型 T5ÿ…
【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 多人聊天室
本次实验利用TCP/IP, 语言环境为 C/C 利用套接字Socket编程,以及线程处理, 实现Server/CLient 之间多人的聊天系统的基本功能。 结果大致如: 下面贴上代码(参考参考...) Server 部分: 1 /* TCPdtd.cpp - main, TCPdayt…

TeamViewer介绍:远程控制计算机
TeamViewer是一个可以远程控制计算机的程序,它也可以进行远程文件传输。TeamViewer支持的平台比较多,如Windows, Mac, Linux, ChromeOs, Android, iOS等,最新发布版本为14.x,它有个人免费和商业付费两种。只要对方告诉你他的TeamV…