Mask R-CNN 简介与论文笔记

2023-05-16

本篇文章是面向Mask R-CNN的初学者,旨在梳理大体思路,认识框架基础概念。由于自己现在大四,也是刚刚入足深度学习领域,所以文章中免不了有错误之处,欢迎各位博友批评指正。

本博文所参考的论文和代码分别为:

★何恺明大神的:Mask R-CNN 

★综述文章:Deep Learning for Generic Object Detection: A Survey

★非配套代码:Mask_RCNN(论文的配套代码都整合到了Detectron中,FAIR都是使用的caffe框架,这个代码的可读性个人感觉比较低,所以先看了一个Keras框架版本代码)


目录

一、什么是Mask R-CNN?

二、Mask R-CNN是怎么来的?

三、Mask R-CNN的全局结构是什么?

四、Mask R-CNN的具体细节(论文中的Part3:Mask R-CNN)



一、什么是Mask R-CNN?

在目标检测(Object Detection)任务中,给定一张数字图像后,有以下子任务需要完成:

1.物体分类(Object Classification):是不是有狗?

2.通用物体检测(Generic Object Detection):有狗,狗在哪里?你给我框出来。

3.语义分割(Semantic Segmentation):框里哪些像素是狗,哪些是背景?用掩模抠出来。

从功能上来讲,Mask R-CNN可以完成这三个功能:可以识别出有狗,能够拿框把狗框出来,还能类似于抠图一样用掩模(以后直接用Mask)把狗抠出来。效果就类似于这样:其实还是很酷的。


二、Mask R-CNN是怎么来的?

在综述中,我们可以看到物体检测和识别界的里程碑图。2012年AlexNet的横空出世作为一个分界线,将研究界的关注焦点从手工特征转移到了基于深度框架的神经网络领域。下面的图展示了2012年之后更加细致的发展进程:RCNN、Fast/Faster RCNN、ResNet、Mask RCNN陆续被提出。Mask RCNN是由何凯明大神(大牛,自行百度)所在的FAIR提出的双步检测框架,框架提出后被整合在了Detectron项目中(caffe2框架)。

可以将RCNN视为一个大家族,Mask RCNN是其中的一个,是这个家族中目前进化程度最高的一个成员。其实,Mask RCNN是在前几个框架的基础上的改进版本,所以,想要深入了解Mask RCNN,就必须熟悉地掌握之前的框架。

 


三、Mask R-CNN的全局结构是什么?

综述中有一个贼长贼长的图阐述了Two-Stage方法的进化过程。我们在此只分析Mask RCNN的结构(注:此处的“步骤”与Two-Stage不同,仅仅是为方便分析结构之便):

第1步:数字图像首先由CONV Layers处理生成特征图,我们一般称CONV Layers为Backbone(脊梁骨/主干网络),在ResNet被提出后,FC被ResNet逐渐替代(ResNet网络内传播的是残差,区别于全连接网络中的传播实量,故可以将网络深度扩展到相当大的规模:50层、100层甚至1000层)。

第2步:得到特征图后,RPN网络会在特征图中生成候选区域,并且对每个候选区域进行框回归操作和得到类别可能性。

第3步:对每一个RPN得到的候选区域,进行RoI Align操作(这个操作是Mask RCNN的创新部分),得到所有RoI规整之后的特征图(比如说全部都是7*7的特征图)。

第4步:这些图随后被用于两个通路:一个是Cls&Reg通路,用于生成回归框和预测类别;另一路是Mask通路,用于生成Mask。


四、Mask R-CNN的具体细节(论文中的Part3:Mask R-CNN)

1.Faster R-CNN:大体上来讲,Mask R-CNN可以视为Faster R-CNN进化而来,进化的部分共有两个地方:

     ◆在Cls和Reg的基础上添加了一条Mask生成通路。

     ◆将RoI Pooling改进为RoI Align。

 

我们首先来回顾一下Faster R-CNN的结构:可以分为两大阶段,第一个阶段是Region Proposal Network (RPN,候选区域生成网络),用于生成目标回归框。第二个阶段的精华是一个Fast R-CNN,利用RoI Pooling来对每一个候选框进行分类和框回归。下面这幅图展示出了Faster R-CNN和Mask R-CNN之间的关系:

2.Mask R-CNN:论文在这里又重复了一次之前的论述,在Faster R-CNN的最后添加了Mask通道,构成显示RPN后是RoI Pool。之后介绍损失值由3部分组成——分类、回归框、Mask。框架对每一个RoI生成了K个m*m大小的掩模(K是类别数量)。此机制使得Mask生成与类别解耦

3.Mask 表示:分类标签和回归框的输出都很简单粗暴,只用输出一个短向量就行(用FC连接)。我们提出的全卷积表示能够对每个RoI预测出一个m*m的Mask,参数少,精确。Mask是对每个像素进行操作,但是RoIfeature太少了,会产生校准问题,于是我们提出了Mask R-CNN中的关键操作——RoIAlign。

4. RoIAlign:RoIPool会产生misalignments的问题(RoI和特征之间)。RoIAlign不做量化,而是做双线性插补。RoIWarp虽然也采用了双线性重采样,但是结果跟RoIpool差不多。(ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。两次量化过程:预选框边界量化为整数点坐标;将量化后的边界值分割为k*k个单元,对每一个单元的边界进行量化。)

这个东西要好好讲一下。首先我们来讲一下什么是RoI Pool。当图像经过backbone网络之后,我们得到了很厚的特征图,假设特征图张量维度为:[1,256,256,64],其中1代表batch_size,256*256代表特征图的高和宽,64就代表共有64个通道。现在特征图通过RPN之后,生成了很多的RoI(感兴趣区域)。要注意此时的RoI是在特征图上,并不是原照片上的。现在产生了一个问题:这些RoI奇形怪状,比如框人是个长方形,框狗是个正方形。所以我们要把RoI变成同样大小的特征图,用于Cls&Reg和Mask任务。论文上用7*7特征图来计算。总结一句话就是:要把大大小小的RoI进行下采样,使其变成一个7*7小图像,然后用于后续计算。

我们来看一下RoI Pool的计算过程:

◆原图像是800*800,经过backbone网络32倍缩放后,变成了25*25的特征图。

◆理论上这只665*665的狗应该被缩放到(665/32)*(665/32)=20.78*20.78大小,此时舍去小数点进行第一次量化,变成20*20。此时20*20的特征图狗已经比特征图上真实的狗小了一点。

◆现在进行pooling操作,将20*20的特征图狗池化为7*7的迷你特征狗。所采取的方法就是在20*20的特征图狗上画49个方格,然后在格点取值构成7*7迷你特征狗,但是问题又来了:(20/7)*(20/7)=2.86*2.86,不能够正好切分特征图狗。此时进行第二次量化,采用2*2为步长进行取值。上图中绿色小格子外白色部分为舍弃区域。

可以看到,这两次量化分别产生的特征图狗、迷你特征狗都产生了误差问题。最后这个7*7映射回原狗上面会有很大的偏差。我们称这个问题叫“Misalignments”(未对准问题)。这个问题对于Cls过程不会产生太大的影响,但是在小目标的识别上,由于特征区域的缩小,会产生一定的误差。

为了解决这个问题,我们使用RoI Align方案:不再使用量化,直接进行双线性内插

◆665*665的狗经过backbone网络特征提取之后获得了特征图,此时应该进行第一次量化,但是RoIAlign直接保留小数:20.78*20.78特征图狗。

◆再将特征图狗用7*7个小格子分开,仍然拒绝量化,每个格子大小:2.97*2.97。

◆此时会出现一个新的问题:格子对特征图上的像素点并不是完美的分割,而是有偏差的分割。所以要使每一个格子里面产生一个数值构成7*7的迷你特征狗。这个过程论文中给出了说明:

狗的例子中需要49个小格子,我们将这些小格子称为bins。在每个bin内部,取4个位置做为采样点(也可以采1个,那就是取中心值;实验证明取4个效果最好)。则一共有7*7*4个采样点。每个采样点根据位置,由临近的4个像素点进行插值。最终得到7*7的迷你特征图狗。

 

5. 网络结构:对网络结构做了很多示例操作——主干网络、网络头(框回归和Mask预测)。在主干网络里面我们用了“网络深度特征”命名法,对ResNet和ResNeXt网络50层或101层进行实验。以特征金字塔网络(FPN)为主干网络,在速度、精度上取得了最好的结果。在网络头方面,我们对两种Faster R-CNN头(主干为ResNet/FPN)进行了扩展:添加全连接的Mask预测支流。我们的Mask支流是直接结构,还有很多潜在提升准确度的方法,在此不再赘述。

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mask R-CNN 简介与论文笔记 的相关文章

  • 相机几何学——投影矩阵P的构成(实验报告版)

    最近在可视化WildTrack数据集 xff0c 由于要对棋盘格点进行映射和绘制 xff0c 涉及到了P矩阵的计算 现在对P的来源进行了系统的整理 xff0c 以备后忘 在最后对场地端点映射产生的问题进行了讨论 xff08 事情开始变得有意
  • 约束优化方法_2_——Frank-Wolfe方法

    Frank Wolfe方法属于约束优化中可行方向法的一种 上一篇博文对同类型的Zoutendijk可行性方法进行了介绍 xff0c 这一部分着重关注Frank Wolfe方法 Frank Wolfe方法的基本思想是 xff1a 每次迭代中使
  • 二次规划_1_——Lagrange方法

    二次规化是非线性规化中的一种特殊情形 xff0c 其目标函数是二次实函数 xff0c 约束是线性的 考试中会考到四种方法 xff0c 分别为 xff1a Lagrange方法 起作用集方法 直接消去法和广义消去法 前两种在教材上有详细描述
  • 二次规划_2_——起作用集方法

    这个算法很反人类 xff0c 迭代过程相当复杂 xff0c 最优化老师说 xff1a 明确地告诉你要考的 起作用集方法适用于消元法和Lagrange方法无法处理的不等式约束二次规化问题 其主要思想是 xff1a 以已知点为可行点 xff0c
  • 约束非线性优化:几何意义&对偶形式

    借助老师的PPT对约束非线性优化问题的几何意义 和对偶形式 进行阐述 一 几何意义 xff08 1 xff09 等式约束 考虑只有等式约束h x 的非线性优化问题 xff0c 形式为 xff1a 可视化结果如下图所示 xff0c 红色曲线为
  • 转载篇:优秀博文汇总

    1 Pytorch中堆网络语法 xff1a nn moduleList 和Sequential由来 用法和实例 写网络模型 https blog csdn net e01528 article details 84397174 2 CNN中
  • 批量归一化:Batch Normalization层 原理+Pytorch实现

    一 BN层概念明晰 BN层存在的意义 xff1a 让较深的神经网络的训练变得更加容易 BN层的工作内容 xff1a 利用小批量数据样本的均值和标准差 xff0c 不断调整神经网络中间输出 xff0c 使整个神经网络在各层的中间输出的数值更加
  • 模型量化——基础知识 & LSQ论文阅读

    感谢陈老师给的机会 xff0c 有幸能够参加2020年的DAC比赛 我在其中负责目标检测器的调试和量化 自己第一次接触量化这个任务 xff0c 很多东西都是一点一点学 一 量化基础 对于一个全精度的值 v v v xff0c 若量化步长为
  • python3安装tensorflow遇到的问题

    1 使用命令 xff1a sudo pip3 install upgrade https storage googleapis com tensorflow linux cpu tensorflow 1 1 0rc2 cp35 cp35m
  • argparse模块使用说明

    深度学习的工程中 xff0c py文件中的main函数一开始总会有大量的参数传入 xff0c 而通常使用的方法就是使用argparse通过命令行传入 xff0c 这篇博文旨在记录argparse的常用方法 一 语句简介 1 载入argpar
  • Tensorboard在网络训练中的Logger使用方法

    做为神经网络训练中最常用的可视化工具 xff0c Tensorboard经常在Pytorch和Tensorflow框架中做为可视化工具 但是其使用的确是有点繁琐 xff0c 所以开设了一个这样的专题 xff0c 用于总结见过的工程里面的数据
  • Pytorch训练流程

    调试了很久YOLO的标准Pytorch实现 xff0c 将Train代码进行了重新整理 xff0c 抽出了标准的Pytorch训练框架 现在整理下来 xff0c 以备后用 整理后的代码分为三个大部分 xff0c 每个大部分分为三个小部分 x
  • 初识Vulkan渲染管线

    目前参考 Vulkan规范 和 Vulkan开发实战详解 对渲染管线有了一个初步的认识 现结合中英文的渲染管线图进行笔记整理 中英文的渲染管线图分别如下所示 xff1a 绘制命令送入设备队列执行后 xff0c Vulkan将原始的物体顶点坐
  • Vulkan着色器的GLSL创建、编译、加载、创建流程

    Vulkan没有指定官方的着色器编程语言 xff0c 而是采用SPIR V二进制中间格式进行表示 开发人员一般需要基于某种着色器编程语言开发着色器 xff0c 之后再编译为SPIR V格式 可以选用GLSL着色器编程语言进行开发 大型游戏场
  • 神经网络运算量&参数量估计——FLOPS和FLOPs辨析

    一 概念明晰 首先要明确 运算量 和 参数量 两个概念 xff1a 参数量 xff1a 这个比较好理解 xff0c 例如卷积层中的卷积核c i k k n o xff0c 其参数量就是相乘的结果 而且 xff0c 无论输入图像的尺寸怎么变
  • 机器学习基础——彻底搞懂Precision\Recall\F1\P-R\ROC

    一直以为自己理解这些概念 xff0c 但是其实只是听说过而已 这些概念的释义来自于周志华教授的 机器学习 xff0c 都属于对机器学习算法的性能度量 一 错误率与精度 还是使用书上的定义写的明确 xff0c test set中所有样本预测对
  • [交叉熵损失函数的由来:KL散度] & [softmax+交叉熵损失函数求梯度 推导]

  • SSH基础操作

    这里写自定义目录标题 SSH基础操作SSH免密登录客户端 快捷登录服务器端 sshd配置配置完成后重启服务器端sshd服务 SSH基础操作 span class token function ssh span span class toke
  • Linux下screen的使用

    关掉xshell之后网站也随着关闭 xff0c 我们可以使用screen命令 xff0c 来让保证退出ssh之后程序继续在后台跑 利用SSH远程连接服务器 xff0c 运行程序需要保证在此期间窗口不能关闭并且连接不能断开 xff0c 否则当
  • SAI 串行音频接口学习

    SAI 简介 串行音频接口 xff08 SAI xff09 xff0c SAI具有灵活性高 配置多样的特点 SAI 通过两个完全独立的音频子模块来实现这种灵活性与可配置型 xff0c 每个音频子模块与多达4个引脚 xff08 SD SCK

随机推荐

  • Tensorflow笔记1:Graph

    参考内容都出自于官方API教程tf Graph 一 Graph类调用 这里使用的是1 15版本 xff0c TF官方为了能够在2 0 43 版本中保持兼容 xff0c 因此调用时使用了tf compat v1 Graph 若安装的就是1 1
  • Tensorflow笔记2:Session

    参考内容都出自于官方API教程tf Session 一 Session类基本使用方法 这里使用的是1 15版本 xff0c TF官方为了能够在2 0 43 版本中保持兼容 xff0c 因此调用时使用了tf compat v1 Session
  • Tensorflow笔记3:Variable

    调用Variable类即可向Graph中添加变量 Variable在创建之后需要给定初始值 xff0c 可以是任意type shape的Tensor 一旦使用初始值完成了初始化 xff0c type和shape都固定 xff0c 除非使用a
  • TensorFlow-Slim API 官方教程

    https blog csdn net u014061630 article details 80632736 TF Slim 模块是 TensorFlow 中最好用的 API 之一 尤其是里面引入的 arg scope model var
  • Tensorflow笔记4:Saver

    Saver类位于tf train中 xff0c 属于训练过程中要用到的方法 xff0c 主要作用就是保存和加载save amp restore ckpt 最简单的保存应用举例 xff1a saver span class token pun
  • Tensorflow笔记4:学习率衰减策略tf.train.cosine_decay_restarts

    TF在learning rate decay py中提供了几种非常骚气的学习率下降方法 xff0c 今天就来玩一玩 只需要简单的参数设定 xff0c 就能够产生神奇的lr衰减效果 首先简介lr的一般使用方法 xff1a lr span cl
  • ffmpeg使用笔记

    视频压缩 ffmpeg i lt input gt vcodec libx264 crf 25 lt output gt 分辨率调整 ffmpeg i 123 mp4 s 960x540 1 mp4 视频截取 截取 xff08 t1 43
  • Pytorch 入门

    1 加载模型 seg model 61 torchvision models detection maskrcnn resnet50 fpn pretrained 61 True seg model 61 seg model cuda 1
  • 小白之通俗易懂的贝叶斯定理

    原文链接 xff1a https zhuanlan zhihu com p 37768413 概率论与数理统计 xff0c 在生活中实在是太有用了 xff0c 但由于大学课堂理解不够深入 xff0c 不能很好地将这些理论具象化并应用到实际生
  • tf.variable_scope中的reuse

    一 两种scope xff1a variable与name tf variable scope 是对变量进行命名管理 xff0c 而tf name scope 是对算子 op 进行命名管理 xff0c 二者相互不影响 见下例 xff1a i
  • HTML+CSS 简易搜索框

    搜索框是页面中很常见的一种 xff0c 下面分享一段简单搜索框案例 xff0c 直接上代码 HTML部分 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 UTF
  • frp内网穿刺/反向代理教程

    文章目录 前言一 明确基本概念二 frp下载与使用1 云服务器做为Server端2 GPU服务器做为Client端3 远程访问 三 云服务器防火墙端口开启 前言 frp 是一个高性能的反向代理应用 xff0c 可以帮助开发者轻松地进行内网穿
  • Keras模型基本流程

    文章目录 前言一 Keras流程二 Keras中的模型定义1 基于Sequential 类2 基于函数式API 前言 目前打算看tensorflow probability模块 xff0c 但是发现整个都是适配Keras的 xff0c 很多
  • pytorch自动混合精度训练

    from torch cuda amp import autocast GradScaler Init Step 1 Create Model model device start epoch 61 create model opt if
  • Linux系统查看CPU个数&超线程&线程数

    小命令 xff1a Linux查看CPU详细信息 简书 jianshu com Intel CPU产品规范 xff1a 英特尔 产品 xff1a 处理器 xff0c 英特尔 NUC 迷你电脑 xff0c 内存和存储 xff0c 芯片组 in
  • Tensorflow学习笔记(1)——Tensorflow-CPU版安装躺坑实录

    从今天开始就要出品自己的Tensorflow系列啦 xff01 由于是第一篇关于Python的博文 xff0c 所以先把接触Python以来的感想和心得都放了进来 xff0c 想看Tensorflow的博友请直接跳到标题三 一 Python
  • Tensorflow学习笔记(3)——图、会话基本语法

    前言 xff1a Tensorflow xff0c 与我们之前熟悉的C C 43 43 Python的确不太一样 xff0c 建议初学者当作一门新的语言来学 如果看的过程中忽然有一种 的确不太一样 的感觉 xff0c 并且明白了哪里不一样
  • Tensorflow学习笔记(2)——Tensorflow-GPU版安装总结

    经历了N多次的失败 xff0c TF GPU的环境终于搭建好了 xff0c 全程连着弄了三天 现在把安装中的注意事项总结一下 xff0c 希望大家少走弯路 xff01 先把自己的配置列表说一下 xff1a Windows7 x64 VS20
  • 深度学习基础——彻底掌握卷积层的计算

    机器学习也是刚刚入门 xff0c 虽然对卷积 池化等过程很熟悉 xff0c 但是一直不太清楚具体的计算 xff0c 幸好在博文上看到了讲解过程 xff0c 看完以后受益匪浅 xff0c 然后自己又重新写了一遍 有这个表格 xff0c 再也不
  • Mask R-CNN 简介与论文笔记

    本篇文章是面向Mask R CNN的初学者 xff0c 旨在梳理大体思路 xff0c 认识框架基础概念 由于自己现在大四 xff0c 也是刚刚入足深度学习领域 xff0c 所以文章中免不了有错误之处 xff0c 欢迎各位博友批评指正 本博文