当前位置: 首页 > news >正文

【论文精读】Mask R-CNN

摘要

       基于Faster RCNN,做出如下改变:
image

  • 添加了用于预测每个感兴趣区域(RoI)上的分割掩码分支,与用于分类和边界框回归的分支并行。mask分支是一个应用于每个RoI的FCN,以像素到像素的方式预测分割掩码,只增加了很小的计算开销,实现了实时分割
  • Faster R-CNN不是为网络输入和输出之间的像素到像素对齐而设计的。在RoIPool为特征提取执行粗空间量化过程中,出现特征错位会四舍五入强迫RoI对齐图像特征,这会对后续分支产生计算误差。为解决RoIPool带来的错位,提出一种简单的、无量化的层RoIAlign,精确保留了特征的空间位置

框架

Faster R-CNN

       Faster R-CNN由两个阶段组成。第一阶段称为区域建议网络(RPN),提出候选目标边界框。 第二阶段为Fast R-CNN,使用RoIPool从每个候选框中提取特征,并执行分类和边界框回归。 两个阶段使用的特征可以共享,以更快地进行推理。
image

Mask R-CNN

       Mask R-CNN采用与Faster R-CNN相同的两阶段过程,第一阶段(RPN)相同。在第二阶段,与边界框分类和回归并行,Mask R-CNN为每个RoI输出二值掩码,具体为对每个RoI使用全卷积网络FCN预测 m × m m× m m×m掩码图。

       在训练期间,损失定义为 L = L c l s + L b o x + L m a s k L = L_{cls} + L_{box} + L_{mask} L=Lcls+Lbox+Lmask。其中分类损失 L c l s L_{cls} Lcls和边界框损失 L b o x L_{box} Lbox与Faster R-CNN定义相同。mask分支为每个RoI提供了 K m 2 Km^2 Km2维的输出,编码了分辨率为 m × m m × m m×m K K K个二值掩码图, K K K为分类类别数。对掩码图逐像素应用sigmoid,则 L m a s k L_{mask} Lmask定义为与ground-truth类 k k k相关联的RoI掩码图的平均二值交叉熵损失(其他掩码输出对损失没有贡献)。

RoI align

       Mask分支采用的像素到像素的方法要求RoI特征(图像特征+建议框)必须良好对齐,以精准地保持每个像素的明确空间对应关系。
image
       RoIPool(上图)用于从每个RoI中提取一个小的特征映射(例 2 × 2 2× 2 2×2)。首先将浮点RoI映射到输入特征,再将RoI四舍五入细分为具有整数长度的 2 × 2 2× 2 2×2个空间box,最后将每个box覆盖的特征值聚合得到特征映射(通常通过最大池化)。这种特征映射方法对大的特征区域是鲁棒的,但对预测像素精确的掩码有很大的负面影响。
image
       为解决上述问题,提出RoIAlign层,以消除 RoIPool的特征错位。如上图,首先将RoI细分为 2 × 2 2× 2 2×2个相同大小的空间box,对每个box使用双线性插值来计算每个RoI bin采样位置的输入特征的精确值,并聚合结果(使用最大值或平均值)。注意到,结果对精确的采样位置或采样多少点不敏感。

网络架构

       网络可分为:

  • 用于在整个图像上进行特征提取的卷积主干网络
  • 用于边界框识别(分类和回归)和掩码预测的网络头,分别应用于每个RoI
    image

       如上图,本文评估了深度为50或101层的ResNet和ResNeXt网络(左)及FPN网络(右)作为主干网络FCN作网络头的Mask RCNN。

实验

训练配置

       同Fast RCNN,如果一个RoI与ground-truth box的IoU为0.5,则认为它是正的,否则是负的。 L m a s k L_{mask} Lmask仅在正RoI上定义,mask目标是RoI对应的真实mask二值图。

       采用了以图像为中心的训练。图像的大小调整为800像素。每个GPU的mini batch有2个图像,每个图像采样N个建议区域,正负比为1:3。N对于C4骨干是64,对于FPN是512。在8个gpu上训练(mini batch为16),进行160k迭代,学习率为0.02,在120k迭代时降低了10。使用0.0001的权重衰减和0.9的动量。使用ResNeXt时,每个GPU下训练1张图像,初始学习率为0.01。

       RPN anchor采用5种尺度和3种长宽比。为了方便消融,RPN是单独训练的,除非指定,否则不与Mask R-CNN共享特征。RPN和Mask R-CNN具有相同的主干。

推理配置

       在测试时,使用C4骨干或FPN骨干得到建议框。在这些建议框上运行bbox预测分支,首先根据置信度进行非极大值抑制,然后将mask分支应用于得分最高的100个检测框。mask分支可以预测每个RoI的K个掩码,但只使用 k − t h k -th kth掩码,其中 k k k是classification分支预测的类别。然后将 m × m m×m m×m的浮点数掩码输出调整为RoI大小,并以0.5的阈值进行二值化得到mask图。

对比实验

image
       上图为Mask R-CNN在COCO测试集上的结果。这些结果基于ResNet-101,实现了35.7的mask AP。显示了mask、bbox、类别和置信度。
image
       上图在COCO数据集上,在使用同样的骨干网络下将Mask R-CNN与最先进的实例分割方法进行比较。该模型的所有实例分割都优于之前最先进的模型,如MNC、FCIS、FCIS++。
image
       上图可视化比较了Mask R-CNN和FCIS++,FCIS++在重叠实例上出现了伪影,Mask R-CNN没有这样的问题。
image
       上图将Mask R-CNN与最先进的COCO 目标检测算法进行比较。实验训练了完整的Mask R-CNN模型,在推理时只使用分类和框输出(忽略掩码输出)。观察到使用ResNet-101-FPN的Mask R-CNN优于之前所有最先进的模型的基本变体。使用ResNeXt-101-FPN,Mask R-CNN进一步提高了结果,比使用Inception-ResNet-v2-TDM模型高出3.0点AP。

       作为进一步的比较,训练了一个没有Mask分支的Mask R-CNN,在上图中用“Faster R-CNN,RoIAlign”表示。由于RoIAlign的存在,该模型比行二算法具有更好的性能。另一方面,比Mask RCNN低0.9分box AP。因此可知Mask R-CNN在box检测上的这种差距受益于多任务训练。

       最后,注意到Mask R-CNN在其掩码和box AP之间存在一个小差距37.1(mask)和39.8(box)之间的2.7点。这表明所提出方法在很大程度上缩小了目标检测和实例分割任务之间的差距。

消融实验

image
       上图为一系列消融实验结果。表a显示了各种骨干的Mask R-CNN。在更深层的网络(50 vs. 101)和先进的设计(FPN和ResNeXt)下,模型都有不同程度的改进。

       表b为多项式方法和独立掩码预测方法的比较。Mask R-CNN将mask和类预测解耦,因为box分支可以独立预测类标签,故mask分支可以为每个类生成一个掩码,从而使类之间没有竞争(通过每个像素 的sigmoid和二值损失)。将其与使用逐像素softmax和多项式loss(在FCN中常用)的预测方法进行比较,这种方案将掩码任务和类别预测任务耦合在一起,相比于解耦方案,这导致掩码5.5AP的损失。一旦实例被分类为一个整体(通过box分支),就无需关注类别,这使掩码模型更容易训练。

       表c本实验中,使用步长为16的ResNet-50-C4主干网络对比RoIAlign和RoIPool。观察到RoIAlign比RoIPool提高了AP约3个点。且观察到RoIAlign对max/average pool不敏感。 此外,还与RoIWarp进行了比较,RoIWarp同样会使得输入失去对齐,观察到RoIWarp的表现与RoIPool相当,但比RoIAlign差得多。验证了正确的对齐是关键。

       表d用步长为32的ResNet-50-C5骨干评估RoIAlign。观察到RoIAlign使掩膜AP提高了7.3点,掩膜AP75提高了10.5点。还注意到,在RoIAlign中,使用stride-32 C5特征(30.9 AP)比使用stride-16 C4特征(30.3 AP,表1c)更准确。RoIAlign在很大程度上解决了长期以来使用大步长特征进行检测和分割的挑战。

       表e中,使用ResNet-50-FPN骨干网络比较MLP和FCNs。使用FCNs可以在MLPs上获得2.1掩膜AP增益。

关键点检测

image
       上图可视化显示联合学习所有三个任务(box、mask、keypoint)可以使一个统一的系统同时有效地预测所有输出。
image
       上图实验评估了人体关键点AP,并在ResNet-50-FPN骨干上进行了实验。上图显示本文的结果(62.7 APkp)比使用多阶段处理管道的COCO 2016关键点检测冠军CMU-pose++高0.9分。
image
       上图显示将mask分支添加到仅支持box的版本(Faster RCNN)或仅支持keypoint的版本中,可以不断改进这些任务。然而,添加关键点分支略微减少了box/mask AP,这表明尽管关键点检测从多任务训练中受益,但它并没有反过来帮助其他任务。
image
       上图研究了RoIAlign对关键点检测的影响。尽管ResNet-50-FPN骨干具有很细的步长,但因为关键点检测对定位精度更敏感,所以RoIAlign仍然比RoIPool显示出显著的改进,并将APkp提高了4.4个点。这再次表明,对齐对于像素级定位(包括掩码和关键点)至关重要。

reference

Kaiming, H. , Georgia, G. , Piotr, D. , & Ross, G. . (2018). Mask R-CNN.

相关文章:

【论文精读】Mask R-CNN

摘要 基于Faster RCNN,做出如下改变: 添加了用于预测每个感兴趣区域(RoI)上的分割掩码分支,与用于分类和边界框回归的分支并行。mask分支是一个应用于每个RoI的FCN,以像素到像素的方式预测分割掩码,只增加了很小的计…...

vue + js 项目打包JS、CSS文件自动部署到oss

一、下载oss依赖 npm install webpack-aliyun-oss 或 yarn add webpack-aliyun-oss 二、在vue.config.js中配置文件 const WebpackAliyunOss require("webpack-aliyun-oss");let VUE_APP_BUCKET "xxx"; let VUE_APP_REGION "xx-xxx-xxx";m…...

CSS:让动画流畅生动的缓动函数

在CSS中&#xff0c;可以使用transition属性或者keyframes关键帧动画来创建动画效果。 使用缓动函数则可以让动画更加流畅和生动。 div {transition: <property> <duration> <timing-function> <delay>; }div {animation: <keyframes-name> &l…...

蓝桥杯集训·每日一题2024 (差分)

前言&#xff1a; 差分笔记以前就做了&#xff0c;在这我就不再写一遍了&#xff0c;直接上例题。 例题&#xff1a; #include<bits/stdc.h> using namespace std; int a[10009],b[100009]; int main(){int n,ans10,ans20;cin>>n;for(int i1;i<n;i){cin>>…...

嵌入式通信数据经常说的大端和小端模式(学习)

一.概念 大端模式&#xff08;Big-endian&#xff09;&#xff1a;高位字节排放在内存的低地址端&#xff0c;低位字节排放在内存的高地址端&#xff0c;即正序排列&#xff0c;高尾端&#xff1b; 小端模式&#xff08;Little-endian&#xff09;&#xff1a;低位字节排放在…...

bun 单元测试

bun test Bun 附带了一个快速、内置、兼容 Jest 的测试运行程序。测试使用 Bun 运行时执行&#xff0c;并支持以下功能。 TypeScript 和 JSX生命周期 hooks快照测试UI 和 DOM 测试使用 --watch 的监视模式使用 --preload 预加载脚本 Bun 旨在与 Jest 兼容&#xff0c;但并非所…...

阿里云2核4G服务器支持多少人同时在线?

2核4G服务器支持多少人在线&#xff1f;阿里云服务器网账号下的2核4G服务器支持20人同时在线访问&#xff0c;然而应用不同、类型不同、程序效率不同实际并发数也不同&#xff0c;2核4G服务器的在线访问人数取决于多个变量因素&#xff1a; 2核4G&#xff1a;2核CPU和4G内存对…...

浏览器发出一个请求到收到响应步骤详解

前言 在网络通信中&#xff0c;浏览器向Web服务器发送HTTP请求消息的过程是一个复杂而精密的环节&#xff0c;涉及到URL解析、DNS解析、数据拆分、路由表规则和MAC头部添加等一系列步骤。本文将深入探讨这一过程的每个环节&#xff0c;帮助读者更全面地了解浏览器与Web服务器之…...

121. 买卖股票的最佳时机【leetcode】/动态规划

121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从…...

K8S Service相关概念

Service基本概念 K8S Service是K8S实现微服务架构最重要的组件之一&#xff0c;主要作用&#xff1a;1&#xff09;为Pod提供稳定的访问地址&#xff08;域名或IP&#xff09;&#xff0c;2&#xff09;实现负责均衡&#xff0c;3&#xff09;自动屏蔽后端Endpoints的变化。 …...

小米消金剖析“冒充老板”诈骗案例,呼吁群众提高反诈意识

近年来&#xff0c;诈骗手段日益翻新&#xff0c;冒充公司老板身份进行诈骗的案例屡见不鲜。不法分子利用人们的焦虑心理&#xff0c;以冒充老板的身份进行诈骗&#xff0c;给无数工作人员和企业带来了巨大的经济损失。重庆小米消费金融有限公司&#xff08;以下简称“小米消金…...

全量知识系统问题及SmartChat给出的答复 之14 解析器+DDD+文法型 之2

Q36. 知识系统中设计的三种文法解析器和设计模式之间的关系 进一步&#xff0c;我想将 知识系统中设计的三种语言&#xff08;形式语言、人工语言和自然&#xff09;的文法解析器和DDD中的三种程序类型&#xff08;领域模型、领域实体和领域服务&#xff09; 形式语言文法 我…...

蓝桥杯备赛 day2 | 4. 付账问题 5. 数字三角形

付账问题&#xff0c;关键是要了解整型的范围&#xff0c;确定获取输入数据的变量类型 需要注意的是int的十进制范围-32768 ~ 32767&#xff0c;那么我们可以知道&#xff0c;人数n是可以用int来装的&#xff0c;需付款数S应该是long long&#xff0c;获取的每个人初始钱数也应…...

2024关于idea激活码报This license xxxx has been suspended

HOSTS文件中增加 0.0.0.0 www.jetbrains.com 0.0.0.0 account.jetbrains.com 然后...

Android9-W517-使用NotificationListenerService监听通知

目录 一、前言 二、前提 三、方案 方案一 方案二 方案三 方案四 方案五 方案六 方案七 四、关于NotificationListenerService类头注释 五、结论 一、前言 NotificationListenerService可以让应用监听所有通知&#xff0c;但是无法获得监听通知的权限&#xff0c;如…...

git的“You can‘t push commits with committe“解决方法

如果使用错误的用户和邮箱执行了git提交&#xff0c;在执行 git push 时将遇到如下错误&#xff1a; ! [remote rejected] feature_116390305_story_0 -> feature_116390305_story_0 (You cant push commits with committer ‘yijian’ or email eyjianqq.com who is not ex…...

CAN总线的拓扑类型和CAN收发器(原理讲解)

1&#xff1a;CAN收发器&#xff08;原理讲解&#xff09; 从原理上来讲CAN_H拉升电压&#xff0c;或CAN_L拉低电压的原理。 以上是TJA1145AT的俯瞰图&#xff0c;此芯片是NXP比较先进的CAN收发器&#xff0c;带SPI总线系统。 回到正题&#xff0c;CAN_H和CAN_L收发器是通过内…...

如何实现WordPress后台显示文章、分类目录、标签等的ID?

我们平时在使用WordPress的过程中&#xff0c;偶尔需要用到文章的ID&#xff0c;或分类目录ID&#xff0c;或标签ID&#xff0c;或媒体库ID&#xff0c;或评论ID&#xff0c;或用户ID等&#xff0c;但是WordPress后台默认是不显示它们的ID的。 今天boke112百科就跟大家分享如何…...

【GB28181】SIP协议实践之Windows下VS2019编译eXosip、osip,测试(附工程源码,一键打开编译)

引言 SIP开源库或者GB28181,这里选择了osip和eXosip,但是这两个库的编译使用有些麻烦,源码下来之后编译会出现很多问题,网上也没有找到完整的编译介绍,只能一步一步的找办法解决,以下帮大家整理编译过程。 如果不想编译,可以跳转文章末尾链接直接下载相应工程直接编译即…...

GPT提示语格式——个人自用

总体格式 指令&#xff1a;将 输入 划分为/翻译为/提取出/... 输出 输出格式&#xff1a;... 输入示例&#xff1a;... 输出示例&#xff1a;... 输入&#xff1a;... 输出&#xff1a;基本概述 示例 指令&#xff1a; 提取以下文本中的介词。 输入&#xff1a;“虽然这些发展…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...