Mask RCNN网络结构以及整体流程的详细解读

文章目录

  • 1、概述
  • 2、Backbone
  • 3、RPN网络
    • 3.1、anchor的生成
    • 3.2、anchor的标注/分配
    • 3.3、分类预测和bbox回归
    • 3.4、NMS生成最终的anchor
  • 4、ROI Head
    • 4.1、ROI Align
    • 4.2、cls head和bbox head
    • 4.3、mask head

1、概述

  • Mask RCNN是在Faster RCNN的基础上增加了mask head用于实例分割的模型。
  • 总体来说,Mask RCNN网络结构可以分为:BackBone(ResNet+FPN) —> RPN网络(Region Proposal Network) —> ROI Head(ROIAlign + cls head + bbox head + mask head)
  • 整体网络结构如下(来自原论文https://arxiv.org/pdf/1703.06870.pdf):
    在这里插入图片描述

2、Backbone

  • Backbone主要由ResNet和FPN组成,如下图
    在这里插入图片描述

1)C1-C5是指ResNet网络5个stage输出的特征图,下采样率分别为2, 4, 8, 16, 32,通道数分别为64, 256, 512, 1024, 2048

在这里插入图片描述

2)FPN网络类似于UNet网络中的跳级连接,都是为了增强多尺度表征能力的:分别对C2-C5四个特征图通过1 × \times × 1卷积改变通道数为256,再与上采样路径中对应尺度的特征图相加。得到的P2-P6就是FPN网络的五个特征图,下采样率为4, 8, 16, 32, 64,通道数都为256
3)需要注意的是,P2-P6这五个特征图将分别作为RPN网络的输入和ROI Head中的ROI Align的输入:

RPN网络的输入:用于在这五个特征图上生成先验的anchor,并对这些anchor进行类别预测和bbox回归,以生成最终的anchor输入到ROI Head中
ROI Align的输入:根据RPN网络生成的anchors,提取这五个特征图中对应的ROI区域特征图,输入到cls、bbox和maskhead中

3、RPN网络

  • RPN网络为Region Proposal Network,主要作用:用于生成先验的anchor box/proposals;并将P2-P6这五个特征图作为网络输入学习得到这些先验的anchor box/proposal的类别(前景or背景)以及通过bbox 回归得到偏移量;最终经过RPN网络预测得到的具有更高质量的proposal送入ROI Head中
  • 主要流程为:1)anchor的生成;2)anchor的标注;3)P2-P6五个特征图进行二分类的预测和bbox回归;4)通过NMS后处理得到最终的anchor

3.1、anchor的生成

  • 在P2-P6的五个特征图上分别对应设置5个不同的anchor size(32, 64, 128, 256, 512)并设置3种长宽比(0.5, 1.0, 2.0),也就是每个特征图的每个像素点生成3个anchor(x, y, w, h)
  • 具体来说,特征图中的每个点都会先映射到原始图像中,并以该点为中心,以对应的anchor size和3种长宽比的设置,生成3个anchor(x, y, w, h)
  • 例如,输入图像为512 × \times × 512,那么五个特征图的尺寸分别为128, 64, 32, 16, 8,那么生成的anchors的数量为(128 × \times × 128 + 64 × \times × 64 + 32 × \times × 32 + 16 × \times × 16 + 8 × \times × 8) × \times × 3 = 21824 × \times × 3 = 65472个anchors

3.2、anchor的标注/分配

  • 该过程就是确定生成的所有anchor为正样本or负样本
  • 标注流程如下:

1)先排除掉超过原图边界的anchors;
2)计算其余的每个anchor与 所有ground truth bbox的IoU,取与每个bbox的的最大IoU作为判断:大于0.7为正样本,小于0.3为负样本;
3)计算每个bbox与那个anchor的IoU最大,把该anchor也标记为正样本

  • 最后随机选择128个正样本和128个负样本用于RPN网络的训练,对于分类:128个正样本的label为1,128个负样本的label和剩下的anchor的label为0;对于bbox回归:超过边界的anchor的label为(0, 0, 0, 0),其余anchor的label是与它对应的具有最大IoU的bbox的实际偏移量

3.3、分类预测和bbox回归

  • 首先对5个特征图进行3 × \times × 3卷积,然后分为2个分支
  • 分类分支为1 × \times × 1卷积,输出通道数为num_anchors=3,表示的是特征图的每个像素点对应的3个anchors为前景的概率值。

需要注意的是,五个特征图分别作为3 × \times × 3卷积和该分支的1 × \times × 1卷积的输入计算得到概率值,再计算128个正样本和128个负样本的分类损失,也就是说只有一组3 × \times × 3卷积和1 × \times × 1卷积

  • bbox回归分支为1 × \times × 1卷积,输出通道数为num_anchors × \times × 4 = 12,表示3个anchor的4个预测位置参数

以下为bbox回归的详细介绍,预测得到的(dx, dy, dw, dh)与ground truth之间计算Smooth L1损失
在这里插入图片描述
在这里插入图片描述

  • 训练RPN网络:对128个正样本和128个负样本计算分类损失:二分类交叉熵损失函数,以及回归损失:Smooth L1损失

3.4、NMS生成最终的anchor

  • 根据RPN网络生成的所有anchor的score和4个位置参数(tx, ty, tw, th)进行如下操作:

1)根据偏移量对anchor的位置进行微调,得到(x, y, w, h)
2)删除掉超过边界的anchor
3)根据score对anchor从大到小进行排序
4)对于每个尺度上的特征图(就是P2-P6的五个特征图),选择前2000个anchor,在经过NMS之后选择最高1000个anchors作为最终的anchor输入到ROI Head中(这些数量属于超参数,可调整)

  • 例如,5个特征图在NMS之前选择的前2000个anchor如下,3和4没到2000是因为他们的特征图P5和P6的尺寸分别为16和8,计算得到的anchors数量为768和192。
    在这里插入图片描述

  • 训练阶段和推理阶段有一些不同:

训练阶段:计算loss并生成anchor
推理阶段:直接生成anchor

  • 生成anchor的NMS的配置可能不同,例如:

训练阶段
在这里插入图片描述
推理阶段
在这里插入图片描述

4、ROI Head

  • 主要包括ROI ALign和3个head: class head, bbox head, mask head

4.1、ROI Align

  • RPN网络最终生成的anchors将作为ROI Align的输入,也就是说根据这些anchors(x, y, w, h) 来提取P2-P6特征图中的anchors对应的特征作为3个head的特征图输入。
  • 我们首先要知道anchors的坐标位置(x, y, w, h)表示的是原图像中的区域,可以将其映射到特征图中,Faster RCNN正是采用了ROI pooling层映射为固定尺寸的ROI区域:
    在这里插入图片描述
  • 但是ROI pooling层由于存在取整操作,对于一些小目标很容易导致区域不匹配问题,因此Mask RCNN采用了ROI ALign操作

1)将anchor映射到对应的特征图中,w和h在被除时不去整,ROI pooling取整了。对于五个特征图的选择方法如下:
在这里插入图片描述

2)将映射后的ROI区域均匀分为K × \times ×K的bin,每个bin的大小不取整,ROI pooling取整了
3)每个bin的每个像素值计算为特征图中与它邻近的4个值的双线性插值
在这里插入图片描述

4)使用max pooling或者average pooling得到K × \times ×K特征图(7 × \times × 7或者14 × \times × 14)作为3个head的输入
在这里插入图片描述

4.2、cls head和bbox head

  • 首先是样本的标注与分配

1)计算由RPN网络最终生成的所有anchors与每个GT bbox的IoU值,取每个anchor的最大IoU值进行判断:IoU>0.5的样本中选择128个正样本,小于0.5的样本中选择384个负样本
在这里插入图片描述

2)对于类别标签:正样本为对应的GT bbox的类别标签,负样本为0;对于bbox回归的标签:与该样本最大IoU值的GT bbox的实际偏移量

  • 将这512个样本anchors通过ROI Align获取得到512个7 × \times × 7 × \times × 256的特征图作为class head和bbox head的输入,进行如下的前向传播:一般为2个3*3卷积+2个fc层
    在这里插入图片描述
  • 最后就是损失函数的计算:分类损失为多类别交叉熵损失,回归损失也是Smooth L1损失

4.3、mask head

  • mask标签和输入特征图的获取

1)计算每个anchor在原始图像中的大mask,就是根据位置参数在原图像的二值mask框出来的
2)根据计算得到的每个anchor对应尺度的特征图(P2-P6中的一个),将anchor位置参数除以缩放倍数/下采样率再进行ROI Align得到512个14 × \times × 14 × \times × 256的特征图作为mask head的输入;
3)而对于大mask也进行倍数缩放,就可以得到每个anchor在对应特征图上的mask(软掩码)—>二值化—>硬掩码

  • 对输入特征图再通过FCN层进行预测得到28 × \times × 28的预测mask结果

在这里插入图片描述

  • 最后进行损失函数的计算,为交叉熵损失
  • 需要注意的是,推理阶段不一样,有先后顺序:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/72186.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Games101学习笔记 - MVP矩阵

MV矩阵(模型视图变换) 目的,把摄像机通过变换移动的世界坐标远点,并且朝向与Z轴的负方向相同。这个变换就是模型试图变换。 因为移动了相机,如果想保持正确的渲染的话,那么对应的物体需要要和相机保持相对…

Apache DolphinScheduler 3.1.8 版本发布,修复 SeaTunnel 相关 Bug

近日,Apache DolphinScheduler 发布了 3.1.8 版本。此版本主要基于 3.1.7 版本进行了 bug 修复,共计修复 16 个 bug, 1 个 doc, 2 个 chore。 其中修复了以下几个较为重要的问题: 修复在构建 SeaTunnel 任务节点的参数时错误的判断条件修复 …

【TX 企业微信私有化历史版本 API 信息泄露】

目录 影响版本 复现过程 修复方式 影响版本 影响私有化部署: toB toG版微信 2.5.x 版本 2.6.930000 版本以下 危险程度:高危。攻击者可以进行获取企业的部门信息,员工信息,如权限较高包括应用获取,记录文件等等均…

学习笔记整理-JS-02-基本类型

文章目录 一、数据类型简介和检测1. JavaScript中两大数据类型 二、基本数据类型1. 数字类型2. 字符串类型3. 布尔类型4. undefined类型5. null 三、数据类型的转换1. 数据类型的转换 四、重点内容 一、数据类型简介和检测 1. JavaScript中两大数据类型 基本数据类型 Number S…

Kotlin反射访问androidx.collection.LruCache类私有变量

Kotlin反射访问androidx.collection.LruCache类私有变量 androidx.collection.LruCache类中定义了一个名为map的LinkedHashMap,map存储了所有LruCache的数据,有时候需要遍历访问该LinkedHashMap,取出里面的值,但是LruCache代码实…

勇敢牛牛,爱吃青草

牛顿问题(牛吃草问题 / 消长问题) 牛顿问题(牛吃草问题/消长问题) 牛顿问题(牛吃草问题/消长问题) 牧场上有一片青草,每天都生长得一样快。这片青草供给 10 头牛吃,可以吃 22 天&…

使用阿里云服务器搭建Discuz论坛网站教程基于CentOS系统

阿里云百科分享使用阿里云服务器建站教程,本文是搭建Discuz论坛,Discuz!是一款通用的社区论坛软件系统,它采用PHP和MySQL组合的基础架构,为您提供高效的论坛解决方案。本文介绍如何在CentOS 7操作系统的ECS实例上搭建Discuz! X3.4…

JMeter处理接口签名之BeanShell实现MD5加密

项目A需要给项目B提供一个接口,这个接口加密了,现在需要测试这个接口,需要怎么编写脚本呢?实现接口签名的方式有两种:BeanShell实现MD5加密和函数助手实现MD5加密,之前已经分享过了函数助手实现MD5加密&…

Grafana Prometheus 通过JMX监控kafka 【2023最新方式】

第三方kafka exporter方案 目前网上关于使用Prometheus 监控kafka的大部分资料都是使用一个第三方的 kafka exporter,他的原理大概就是启动一个kafka客户端,获取kafka服务器的信息,然后提供一些metric接口供Prometheus使用,随意它…

Mongoose http server 例子

今天抽了点时间看了一下 mongoose的源码, github 地址,发现跟以前公司内部使用的不太一样,这里正好利用其 http server 例子来看一下。以前的 http message 结构体是这样的: /* HTTP message */ struct http_message {struct mg_…

山景DSP芯片可烧录AP8224C2音频处理器方案

AP8224C2高性能32位音频应用处理器AP82系列音频处理器是面向音频应用领域设计的新一代SoC平台产品,适用于传统音响系统、新兴的蓝牙或Wifi 无线音频产品、Sound Bar 和调音台等市场。该处理器在总体架构和系统组成上,充分考虑了音频领域的特点&#xff0…

代码分析Java中的BIO与NIO

开发环境 OS:Win10(需要开启telnet服务,或使用第三方远程工具) Java版本:8 BIO 概念 BIO(Block IO),即同步阻塞IO,特点为当客户端发起请求后,在服务端未处理完该请求之前&#xff…

CCLINK IE转MODBUS-TCP网关modbus tcp协议详解

你是否曾经遇到过需要同时处理CCLINK IE FIELD BASIC和MODBUS两种数据协议的情况?捷米的JM-CCLKIE-TCP网关可以帮助你解决这个问题。 捷米JM-CCLKIE-TCP网关可以分别从CCLINK IE FIELD BASIC一侧和MODBUS一侧读写数据,然后将数据存入各自的缓冲区。接着…

MySQL高阶知识点(一)一条SQL【更新】语句是如何执行的

一条SQL【更新】语句是如何执行的 首先,可以确定的说,【查询】语句的那一套流程,【更新】语句也是同样会走一遍,与查询流程不一样的是, 更新语句涉及到【事务】,就必须保证事务的四大特性:ACID&…

k8s 滚动更新控制(一)

在传统的应用升级时,通常采用的方式是先停止服务,然后升级部署,最后将新应用启动。这个过程面临一个问题,就是在某段时间内,服务是不可用的,对于用户来说是非常不友好的。而kubernetes滚动更新,…

jacoco功能测试-代码覆盖率

1、下载 jacoco 官网地址:EclEmma - JaCoCo Java Code Coverage Library 2、拷贝 jar 包 下载好后,找到这两个文件,然后找到被测项目 3、启动 jacocoagent,监控被测项目 java -javaagent:jacocoagent.jarincludes*,outputtcp…

Filament for Android 编译搭建(基于Ubuntu20.04系统)

一、Filament 源代码下载 github下载地址: 2、安装clang 我是直接安装clang-10 Ubuntu 20.04 ,sudo apt install clang 命令默认就是clang-10 $sudo apt-get install clang-10 # 安装 AST.h 等头文件 $sudo apt-get install libclang-10-dev $sudo …

【Linux操作系统】文件描述符fd

🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️林 子       🛰️博客专栏:✈️ Linux之路       🛰️社区 :✈️ 进步学堂       &#x1…

使用logback异步打印日志

文章目录 一、介绍二、运行环境三、演示项目1. 接口2. 日志配置文件3. 效果演示4. 异步输出验证 四、异步输出原理五、其他参数配置六、源码分析1. 同步输出2. 异步输出 七、总结 一、介绍 对于每一个开发人员来说,在业务代码中添加日志是至关重要的,尤…

docker基本使用方法

docker使用 1. Docker 介绍 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。通过利用 …