实例分割之 Mask R-CNN

2024-06-10 05:48
文章标签 mask 分割 实例 cnn

本文主要是介绍实例分割之 Mask R-CNN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论文地址:Mask R-CNN

代码地址:facebookresearch/Detectron

Mask R-CNN是在Faster R-CNN的基础上进行了改进。Faster R-CNN主要是用来进行目标识别的,为了能够进行实例分割,Mask R-CNN在Faster R-CNN的基础上加了一个分支,这个分支主要是由一个small FCN(全卷积网络)构成。这个FCN就是用来输出一个Mask,这也就是所谓的Mask R-CNN了。这个Mask 就是为了更准确的对实例的轮廓进行定位,以便进行准确的分割。FCN若要准确的预测实例的轮廓位置,对每个像素进行准确分类,对输入输出特征对齐要求非常高,即输入输出的空间尺度对齐。而Fast R-CNN中的RoIPooling的两步量化操作导致了严重的空间尺度失准,为了克服RoIPooling层的量化操作,Mask R-CNN提出了改进的RoIPooling层,称之为RoIAlign层。RoIAlign层在进行输出固定feature maps的过程中,没有量化过程。总结如下:

1. Mask R-CNN在Faster R-CNN的框架下加入了一个FCN分支,用来输出Mask;

2. Mask R-CNN对Fast R-CNN提出的RoIPooling层进行了改进,提出了RoIAlign层。

下面来看一下Mask R-CNN的总体框图,如下图图1所示:


                                                               图1 Mask R-CNN网络架构

从上图图1的Mask R-CNN的网络架构可以看出,整个架构是基于Faster R-CNN的。首先是读入一张图像,进入backbone architecture(论文中采用ResNet和ResNet-FPN),输出feature maps,接下来的两个分支的处理操作与Faster R-CNN完全一致,接下来的区别就在RoIPooling层与RoIAlign层的区别。下面具体看一下RoIPooling层与RoIAlign层的操作有什么不同,如下图图2所示:


                                                                      图2 RoIPooling层与RoIAlign层输出对比

首先说一下RoIAlign层,论文中描述RoIAlign层是一个quantization-free layer。那么与之相对的RoIPooling层执行了哪些量化操作呢?由Fast R-CNN可知,RoIPooling总共执行了两步量化操作:

第一步:将原图像坐标系输出的region proposals的四元组坐标映射到feature maps上是会根据Pooling层(比如VGG16的con4_x输出的feature maps经历了4个max pooling层)的操作,feature maps的spatial size进行了缩放,比如VGG16用RoIPooling替换掉最后一个max pooling,其输出的feature maps的spatial size相对原图像缩小了16倍,所以将原图像坐标系对应的四元组坐标值均要除以16,此时对于不能整除的结果进行第一步量化,为表示rounding操作。

第二步:在对region proposal进行划分网格的时候,也会遇到不能整除的情况,如上图图2中左上角的图,就因为不能整除,在进行量化的时候,导致无法对region proposal进行均匀划分网格,这回导致输入与输出特征的严重失准。

下面来看一下RoIAlign层是怎么做的。RoIAlign严格避免了上述的两步量化操作,以至于region proposal与划分的网格不能正好包含完整的像素,如上图图2中的第2列所示。RoIAlign是通过双线性插值的方法来得到每个网格的像素值的。如下图图3所示:


并且在上述插值的过程中,实验效果表明,只要这个过程没有量化操作,对于每个网格插值的位置与抽样点数均不敏感,所以在编程实现的时候一般对每个网格只插值一个抽样点。

下面说一下由FCN得到Mask的过程。起初FCN是用于语义分割被提出来的,这里的FCN是用于对每一个由RPN输出的region proposal进行语义分割的,首先由FCN输出81个通道的feature maps(Mask R-CNN在MS COCO上做的实验,MS COCO总共有80类+BG为81类),而选择哪个通道的feature map呢?是这样的,由Classification Head,根据Softmax输出的类别概率分布,选择概率最大值对应的类别标签作为最终的预测类别,然后根据这个预测类别,选出对应的channel。也就是说,如果Classification Head预测的类别为7,则选出FCN输出的第7个通道的feature map,其它通道的feature maps直接被忽略了,在计算FCN Mask的目标函数的时候,他们也不参与。下面看一下的计算:


那么怎样得到最终的输出Mask呢?是这样的,首先Mask经过sigmoid函数,将输出映射到[0, 1]之间的概率值,然后将输出的mxm 的spatial size resize to the RoI size,再采用阈值法,论文中的阈值设为0.5,进行二值化。那么输出的这个Mask在进行实例分割的时候扮演什么样的角色呢?主要是用来大致定位出目标实例的基本轮廓,有利于进一步准确进行实例分割。

Mask R-CNN论文中做的相关实验非常丰富,这里就不讲了,关键在于理解RoIAlign层和添加的FCN分支,在以后会详细讲解Mask R-CNN的代码实现。




这篇关于实例分割之 Mask R-CNN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047362

相关文章

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体