目标检测(或分隔)算法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训练简单,只需要在Faster R-CNN的基础上增加一个较小的开销,同时还能为每个实例生成一个高质量的分隔掩码(segmentation mask)。Mask R-CNN是Kaiming He等人在2017年提出的,论文名字为”Mask R-CNN”,可以从https://arxiv.org/pdf/1703.06870.pdf 直接下载。
Mask R-CNN的构建方法是:在每个兴趣点RoI上加一个用于预测分隔掩码的分层,称为掩码层(mask branch),使该层并行于已有box层和分类层,具体框架结构如下图所示:
Mask R-CNN可实现像素级别的图像实例分隔(Instance Segmentation),Mask R-CNN将物体检测和目标分隔同时并行处理,取得较好实例分隔效果。Mask R-CNN是在Faster R-CNN基础上发展而来,在其基础上增加RoIAlign以及全卷积网络(Fully Convolutional Network, FCN),Mask R-CNN将分类预测和掩码(mask)预测拆分为网络的两个分支,分类预测分支与Faster R-CNN相同,对兴趣区域给出预测,产生类别标签以及矩形框坐标输出,而掩码预测分支产生的每个二值掩码依赖分类预测结果,基于此刻分隔出物体。Mask R-CNN对每个类别均独立地预测一个二值掩码,避开类间的竞争。Mask R-CNN是逐像素分隔。
Mask R-CNN框架结构:当我们在该网络中输入一张任意大小的图像,系统会通过深度卷积网络完成两个任务,第一个任务是Faster R-CNN的RPN网络,主要实现候选区域;第二个任务是目标检测。KaiMing He等人做出的第一点改进就是将原来的RoIPool改为了RoIAlign,如下图所示,主要原因是对于分隔操作是基于像素的,而Faster R-CNN在对图像进行RoIPool时,有两次量化过程,这中间出现像素的输入与输出没有一一对应。RoIAlign直接将feature map划分成m*m的bin,然后采用双线性插值就可以保证池化过程中像素在输入前后的一一对应关系。
Mask R-CNN网络经过区域推荐网络提取候选区域,区域推荐网络是一个轻量的神经网络,通过滑动窗口扫描特征图进行卷积操作,结合不同的尺寸与长宽比,生成互相重叠区域,即anchor,并给出每个anchor默认预置的位置信息,用以后续提取候选区域。区域推荐网络针对每个anchor输出两种信息,第一种信息是对anchor前景或背景类别的预测,前景类别代表该anchor中具有一定概率存在某类或多类目标,背景类别指待检测目标之外的其它物体,后续会滤除。第二种信息是预置边框的精调,当目标的中心与前景anchor的中心不完全重合,即存在偏移时,输出位置信息(x, y, w, h)的变化百分比,以精确地调整anchor位置,对目标位置的拟合更正确。在前景anchor中存在互相重叠的现象,通过非极大值抑制方法滤除前景得分低的anchor,保留得分最高的anchor,最终得到的兴趣区域。
Mask R-CNN采用RoIAlign网络层对兴趣区域尺寸进行统一定义,然后分别输入进两个分类器分支,Faster R-CNN网络进行类别以及位置的预测,FCN网络进行像素级分割。通过FCN网络来预测并输出m*m二值掩膜(Binary Mask),m*m是所提取的局部小特征图的尺寸。为了减少计算量且达到较好分割效果,采用RoIAlign网络层将m*m特征图映射回原始输入图像上,RoIAlign网络层映射质量的好坏直接影响到图像分割掩膜位置的准确度,RoIAlign插值算法的选取对Mask R-CNN网络分割速度具有较大影响。
FCN分支网络:常规神经网络如 Faster R-CNN,为达到像素级别的像素分类,选取某像素邻域图像像素块,输入神经网络进行训练或者预测,像素块的使用造成数据重复存储;预测物体类别以及位置时,将特征图压缩到全连接层,并输出一维特征向量存储预测信息,该过程破坏了特征图的平面结构,无法进行空间上的卷积计算。而图像在做实例分割时,像素生成的预测掩膜是对输入图像在空间结构上的编码,输出像素的预测掩膜无需压缩特征图为向量。
FCN网络传统卷积神经网络中的全连接层全部都换成卷积层,故称为全卷积网络。采用 RoIAlign 层更精确地将兴趣区域于特征图进行映射,由于兴趣区域在特征图上位置精确,故可以直接对特征图进行卷积,以卷积形式表达图像各像素点之间的位置以及映射关系。
经典卷积神经网络,先是连续的5个卷积层,第 6 以及第 7 层压缩特征图,得到长度为4096的一维特征向量,第8层对该向量进一步处理使得长度减小为1000,分别对应预测得到的1000类别的概率。FCN网络将后3层的一维特征向量进行改变,将其同样表示为卷积层,即(4096,1,1)、(4096,1,1)、(1000,1,1),可将其视为1*1的卷积核,如下图所示:
在多个卷积层后边周期性的插入池化层,导致特征图在网络中的分辨率越来越低,FCN使用上采样(Upsample)方法,使特征图从低分辨率恢复到较高的分辨率,经过5次卷积层以及池化层的搭配之后,图像的原始分辨率依次被降低到了1/ 2、1/4、1/8、1/16、1/32。为得到分辨率较高的特征图,需对最后一层的输出结果进行32倍上采样,该过程可通过添加反卷积层(Deconvolution Layer)实现,反卷积层对网络中最后一层卷积层的输出的特征图进行上采样操作,最终得到原图相同的尺寸输出,且特征图的分辨率提升。特征图经历上采样操作之后,经过神经网络最后的softmax分类器,预测某像素属于某类别的概率,在上采样的特征图上进行逐像素的预测分类,同时对原始图像的空间结构未造成破坏。
FCN在图像分割领域与使用CNN系列网络方法进行对比,具有两大优势:一是输入图像的尺寸不受限定,训练图像和后续测试图像的尺寸不做统一要求;二是效率更高,FCN不采用CNN方式将像素块输入网络,避免了重复存储问题。
RoIAlign:Mask R-CNN的主干网络,即Faster R-CNN经RPN产生众多anchor,将其映射的特征图上,再经非极大值抑制得到兴趣区域。常规的Faster R-CNN网络采用Ro IPool层对特征图中大小各异的兴趣区域进行尺寸上的统一,将兴趣区域转化成不同细粒度的特征图,后续使用最大池化进行特征提取。任意尺寸的特征图输入RoIPool层,输出固定尺寸特征图。
RoIPool是卷积神经网络中常用的特征提取方法,对特征图尺寸进行缩放归一化处理,Ro IPool过程采用最近邻插值方法,通常情况下,缩放后兴趣区域位置信息不是整数,但最近邻插值简单的进行四舍五入操作,赋给目标点最近像素点的像素值,会导致提取的特征和兴趣区域不重合,如下图所示,假设经卷积提取特征之后的特征图尺寸为128*128 ,将其池化为固定尺寸,如25*25的特征图,在将特征区域映射到原始图像上时,为将原始图像左下角15*15区域与特征图中的某特定特征区域建立联系,需进行插值操作。原始图像中长宽均为15个的区域像素,在特征图上对应尺寸为15*25/128≈2.93像素。在此情况下,若采用RoIPool会进行最近邻插值,非整数部分被四舍五入处理,得到特征区域如3*3,导致区域与真值之间一定程度的错位。在RoIAlign中会使用双线性插值法准确得到2.93像素的内容,这样就能很大程度上,避免了错位问题。
针对此问题采用舍弃经典RoIPool层,改进池化操作,加入ROIAlign层,使用ROIAlign 层对提取的特征和输入之间进行校准。基于四个采样位置使用双线性插值(Bilinear Interpolation),将兴趣区域归一化到一定尺寸,再将其池化到统一尺寸大小,在很大程度上避免了RoIPool方法造成的像素错位。双线性插值在两个方向上各自进行线性插值,可视为线性插值的精度升级,保证了空间的对称性。
在Faster R-CNN的网络设计上,并未考虑输入与输出之间的像素到像素对齐。而实际应用到目标上的核心操作执行的是粗略的空间量化特征提取,为了改进空间错位,Mask R-CNN提出了一种简单的方法,叫做ROIAlign,它可以保留精确的空间位置,并将掩码的准确度提高。
在Faster R-CNN中分为两个步骤进行训练,首先是RPN用于提取候选区域,然后,使用ROIPool对候选区域提取的特征进行分类和box回归,且使用共享权值来提高网络训练速度。Mask R-CNN同样采用两个步骤,第一步也是RPN提取候选区域,在第二步中,对于每个ROI,Mask R-CNN输出一个二值的掩码,将分类与box回归同时进行,简化了训练流程,网路结构如下图所示:
Mask R-CNN的思路很简洁,既然Faster R-CNN目标检测的效果非常好,每个候选区域能输出种类标签和定位信息,那么就在Faster R-CNN的基础上再添加一个分支从而增加一个输出,即物体掩膜(object mask),也即由原来的两个任务(分类+回归)变为了三个任务(分类+回归+分割)。Mask R-CNN将二进制mask与来自Faster R-CNN的分类和边界框组合,便产生惊人的图像精确分隔,如下图所示:Mask R-CNN是灵活通用的对象实例分割框架,它不仅可以对图像中的目标进行检测,还可以对每一个目标输出一个高质量的分割结果。另外,Mask R-CNN还易于泛化到其他任务,比如人物关键点检测。
以上内容均来自网络,主要参考文献如下:
1. 《基于深度学习的海面船舶目标检测》,哈尔滨工程大学,硕论,2018
2. 《基于深度学习的复杂背景下目标检测与分隔方法》,中北大学,硕论,2018
3. https://medium.com/@jonathan_hui/image-segmentation-with-mask-r-cnn-ebe6d793272
4. https://blog.csdn.net/jiongnima/article/details/79094159
5. https://github.com/Ewenwan/MVision/blob/master/CNN/%E7%AE%80%E4%BB%8B%E7%89%A9%E4%BD%93%E6%A3%80%E6%B5%8B%E4%BB%8ERCNN%E5%88%B0Mask%20RCNN%E7%9A%84%E7%BD%91%E7%BB%9C%E6%9E%84%E5%9E%8B%E5%8F%98%E5%8C%96.md
6. https://www.jianshu.com/p/0db565b2ef7d
7. https://alvinzhu.xyz/2017/10/07/mask-r-cnn/
GitHub:http://github.com/fengbingchun/NN_Test
相关文章:

未来之城,管理者可能不是人......
大会官网 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…

PyTorch攻势凶猛,程序员正在抛弃TensorFlow?
来源 | The Gradient译者 | 夕颜出品 | AI科技大本营(ID:rgznai100)自 2012 年深度学习重新获得重视以来,许多机器学习框架便争相成为研究人员和行业从业人员的新宠。从早期的学术成果 Caffe 和 Theano ,到背靠庞大工业支持的 PyT…

swift 错误集合 ------持续更新中
从今天开始凡是在用swift中遇到的错误都会在本博客持续更新 便于自己学习和快速开发 2017.7.20 如果你的程序写的有进入后台的方法,例如我的博客中点击home进入后台持续定位的那篇文章,发信进入后台后定位没有按得定时器规定的时间走,这…

【转载】【贪心】各种覆盖问题
1、独立区间问题 在N个区间里找出最多的互不覆盖的区间 对结束点进行排序,然后从结束点最小的区间开始进行选择即可 2、覆盖区间问题 给一个大区间,再给出N个小区间,求出最少用多少个区间可以把大区间覆盖完 先选出开始的一个,然后…

使用Python3发送邮件测试代码
SMTP(Simple Mail Trasfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,用它来控制信件的中转方式。Python3对SMTP的支持有smtplib和email两个模块,smtplib负责发送电子邮件, email负责组织邮件内…