深度学习实例分割篇——Mask RCNN原理详解篇

news2024/11/17 5:33:03

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题

🍊专栏推荐:深度学习网络原理与实战

🍊近期目标:写好专栏的每一篇文章

🍊支持小苏:点赞👍🏼、收藏⭐、留言📩

 

深度学习实例分割篇——Mask RCNN原理详解篇

写在前面

Hello,大家好,我是小苏👦🏽👦🏽👦🏽

在前面的文章中,我已经为大家介绍过深度学习中的物体分类、目标检测和语义分割,感兴趣的可以进入我的主页了解详情。我尽量通俗的为大家介绍各种网络结构原理,并配合代码帮助大家深入理解,感兴趣的快来和我一起学习吧,让我们共同进步。🥂🥂🥂


一个人可以走的很快,一群人可以走的更远🚀🚀🚀


今天为大家讲解Mask RCNN的原理,在阅读本教程之前,有些知识你是必须掌握的,如下:

  • [1] 目标检测系列——开山之作RCNN原理详解 🍁🍁🍁
  • [2] 目标检测系列——Fast R-CNN原理详解 🍁🍁🍁
  • [3] 目标检测系列——Faster R-CNN原理详解 🍁🍁🍁
  • [4] 还不懂目标检测嘛?一起来看看Faster R-CNN源码解读 🍁🍁🍁
  • [5] 深度学习语义分割篇——FCN原理详解篇 🍁🍁🍁
  • [6]深度学习语义分割篇——FCN源码解析篇 🍁🍁🍁

Mask RCNN是在Faster RCNN的基础上提出的,因此你需要对Faster RCNN的结构相当了解,不清楚的可以参考上述的[1]-[4]。同时Mask RCNN中又嵌入了FCN语义分割模块,因此你也要对此有充分认知,不清楚的可以参考[5]和[6]。

那么现在我就当大家已经有了以上的先验知识,快来和我一起学学Mask RCNN吧!🚖🚖🚖

Mask RCNN总体框架

​  Mask RCNN的网络结构如下图所示,我们先从宏观上认识一下Mask RCNN的整体结构。其主要分为两个部分,下图中黄框框住的部分为Faster RCNN结构,绿框框住的是一个FCN结构。也就是说,Mask RCNN是在Faster RCNN的基础上添加了一个FCN结构!!!

image-20221125141625738

              图1 Mask RCNN整体框架图

​  是的,Mask RCNN的结构就是这么简单,却能起到非常好的效果。而且可扩展行非常好,比如我们还添加一个可以检测人体关键点信息的网络。在介绍Mask RCNN的一些细节前,让我们先来看看Mask RCNN的效果吧。

image-20221125143151543

              图2 实例分割效果图

image-20221125143256756

              图3 关键点检测效果图

Mask RCNN细节梳理

​  我们先以下图来介绍一下Mask RCNN的整体流程。首先对于一张输入图片,我们先将其经过特征提取骨干网络得到特征图,然后将特征图送入RPN网络得到一系列候选框,接着利用刚刚得到的候选框,剪裁出候选框对应特征图的部分,然后送入ROI Align层【大家先当成ROI Pooling即可,后文详细介绍】 获得尺寸一致的特征图,然后分别送入分支①(class、box分支)和分支②(Mask分支),分支①用于获取图像中物体的位置和类别信息,分支②用于获取图像中物体的分割信息。

              图4 Mask RCNN整理流程

​  对于上述所述的流程大家能否看懂呢,我觉得分支①和分支②之前的部分大家应该很熟悉才是,完全和Faster RCNN一样,不清楚的大家先点击[3]、[4]补充补充知识。关于分支①,其是Faster RCNN中的分类头和回归头,不知道的大家自行充能喔,这里就不介绍了。关于分支②,其就是一个FCN结构,其详细结构如下图所示:

image-20221127143830804

              图5 Mask分支结构

​  我想这个结构对大家来说没有什么难度吧,都是一些基础的卷积和转置卷积操作,最后的输出Mask尺寸为 28 × 28 × n u m c l s 28×28×num_{cls} 28×28×numcls,对于coco数据集来说, n u m c l s = 80 num_{cls}=80 numcls=80【注意:这里所说的80没有包含背景哦,在一些代码中可能会包括背景】关于RoIAlign的作用就是将输入统一到指定大小,上图将原始输入 H × W × 256 H×W×256 H×W×256统一至 14 × 14 × 256 14×14×256 14×14×256大小。RoIAlign的作用和RoIPool的作用是一致的,不过RoIAlign相比RoIPool做了一些优化,具体内容可看本篇附录—>RoIAlign详解部分。

​  其实我感觉介绍到这里Mask RCNN的主体部分就都讲完了,剩下的就是一些细节部分,让我们一起来看看吧。



​  首先来看一下论文的创新点,上文提到对于我们图5中的Mask分支,其实就是一个FCN结构。我们知道,FCN结构会对每个像素的每个类别预测一个分数,最后通过softmax得到每个类别的概率,关于这个不知道的可以去阅读我对FCN的相关介绍,我也在这里放一张介绍FCN时的图片,希望帮助大家理解。

image-20220912212614471

              图6 FCN预测类别

​  当我们使用softmax时,分数高的会抑制分数低的,因为所有类别的预测概率要满足和为1的条件 。作者认为这使得不同类别之间存在相互竞争,这被称为是一种耦合关系,是不利于最终的结果的。于是作者希望消除这种耦合,即解耦。由于在Mask RCNN中我们还有一个分类和回归分支来预测类别和边界框,因此我们可以利用分类分支的预测类别直接提取出对应的Mask,这样就消除了不同类别间的竞争关系。作者也通过实验证明了这种解耦的方式可以提高检测精度,如下图所示:

image-20221127155719869

              图7 解耦前后精度对比

​  这里不知道大家听懂了没有,没听懂也没关系,在下文介绍损失函数的时候我也会为大家再次介绍。🍄🍄🍄


​  其实啊,对于图4给出的Mask RCNN整理流程,图中的分支①和分支②部分论文给出了两种结构,如下图所示:

image-20221127160517263

              图8 Mask分支两种结构

​  可以看出我们图4中的结构采用的是图8的结构2,这种结构要求Mask RCNN的backbone使用FPN网络(特征金字塔网络),可以看出结构2中class、box分支和Mask分支不共用一个ROI层,这是为了保证mask分支拥有更多的细节信息。图8的结构1要求Maks RCNN的backbone采用resnet结构,也即不使用FPN结构。其实我倒是认为这两种结构差的不多,可能是作者在实验时发现采用不同backbone不同结构效果不一样吧,目前来说,我觉得大家无脑用结构2就好,采用FPN对检测小目标的效果会有较大的提升。


​  这部分来谈谈Mask RCNN的损失,我们知道Mask RCNN就在Faster RCNN的基础上加上了一个Mask分支,那么Mask RCNN的损失即为Faster RCNN损失加上Mask分支的损失,如下:

​     L o s s = L f a s t e r _ r c n n + L m a s k = L r p n + L f a s t _ r c n n + L m a s k Loss=L_{faster\_rcnn}+L_{mask}=L_{rpn}+L_{fast\_rcnn}+L_{mask} Loss=Lfaster_rcnn+Lmask=Lrpn+Lfast_rcnn+Lmask

​  Faster RCNN的损失就不用我介绍了吧,不懂的去看一下写在前面提到的几篇文章,相信你读完后就明白了。这里重点说一下Mask损失,其就是一个交叉熵损失,关于交叉熵损失可以看看这篇FCN文章的附录部分。那么在Mask RCNN中是怎么计算交叉熵损失的呢?我们先来看下图:

image-20221127170938185

              图9 图片来自B站霹雳吧啦Wz

​  首先输入RoIAlign的是一个个候选框,输出的是 14 × 14 × c 14×14×c 14×14×c大小的特征图,然后经过一系列的卷积、转置等操作得到logits,其是尺度为 28 × 28 × n u m c l s 28×28×num_{cls} 28×28×numcls的特征图,这个过程对应图5。上图描述的是Mask分支的结构,我们可以思考一下利用现在的logits能不能实现分割任务呢?我想这完全是可行的,因为FCN就是这么做的呀!!!🍮🍮🍮这就回到了上文所述的本论文的创新点上,这里论文不采用传统FCN的方式实现分割,因为这样会让不同类别之前存在竞争关系,会导致最后的分割精度下降。这里我们会利用class、box分支中的类别信息,比如我们通过class、box分支会知道当前的候选框的GT类别是cat(猫),于是我们就提取出logits中对应类别为猫的mask,此时这个mask是单通道的28×28大小的图像,这样就得到了Mask分支的预测输出,那么只要和GT计算交叉熵损失即可。那么GT是什么呢?同样的道理,我们通过class、box分支知道了候选框的类别是cat,那么我们将这个候选框在原图对应的GT【注:原图对应的GT是单通道的喔,目标区域为1,背景区域为0】上进行裁剪并将裁剪后图片缩放到28×28大小得到GT Mask,此时计算GT Mask和Mask分支的损失即可。

​  还有一点大家需要注意,图9所述的损失计算是训练过程中的,其输入RoIALign的候选框是由RPN网络提供的,至于为什么这样做呢?我提供B站霹雳吧啦Wz的一个理解,我觉得非常有道理。我们知道RPN网络提供的候选框是不准确的,一个目标可能会有好多个边界框,如下图所示,非常类似于对目标做随机裁剪,这样起到扩充数据集的作用。

image-20221127195322435

​  上一部分谈了谈训练过程中的损失计算,这部分为大家介绍介绍Mask RCNN的预测过程,如下图所示:

image-20221127200236380

              图10 图片来自B站霹雳吧啦Wz

​  看了图10,你可能会觉得和图9差不多,但你仔细观察观察就会发现有一些不一样了喔。首先我们来看看此时输入Mask分支的候选框来自哪里,通过图10你会发现,其不再和训练阶段一样由RPN网络提供,而是由Fast RCNN网络提供。我想这一部分也非常好理解,在预测阶段我们只需要一个最准确的候选框就好了,不再像训练阶段一样需要数据增强,所以直接从Fast RCNN网络中获得候选框即可,FPN中得到的候选框没有经过一系列微调,不准确。经过RoIAlign后,和训练阶段一样我们会得到一个28×28的单通道图片,然后将其缩放到预测目标候选框同样大小,接着将其放到原图对应的区域,得到Mask。最后还会设置一个阈值,比如0.5,将刚刚得到的Mask转换为二值图像,具体操作为将预测值大于0.5的区域设置为前景剩下区域都设置为背景。最后我们就能够在一张图像上展示出类别信息,边界框信息和Mask信息。

 

小结

​  Mask RCNN的原理部分就为大家介绍到这里了喔,更多细节将在下一篇Mask RCNN源码解析中为大家介绍,敬请期待吧。🍓🍓🍓

 

参考连接

Mask R-CNN论文🌱🌱🌱

Mask R-CNN网络详解🌱🌱🌱

 

附录

RoIAlign详解

​  这部分我们来看看RoIAlign的实现原理,在介绍RoIAlign之前,我们必须要谈的是我们为什么不使用传统的RoIPool,也即RoIAlign相较RoIPool有什么优势。【注:RoIAlign和RoIPool的目的是相同的】

​  RoIPool的目的是将原图缩放到统一的大小,比如原图大小为8×8,我们期望经过RoIPool层后输出2×2大小的特征图,我们只需将原图等分成4份,分别为1、2、3、4,然后对1、2、3、4应用maxPool即可得到2×2大小的特征图,大致过程如下图所示:

image-20221127210303000

              图11 RoIPool

​  现在考虑如果原图的大小是9×9,期望经过RoIPool层后的输出同样为2×2大小的特征图,此时2不能被9整除,我们需要进行量化操作(取整操作),如下图所示:

image-20221128102036261

              图12 RoIPool量化操作

​  这种量化操作会导致最终的2×2的特征图的每个像素对应的信息量不同,有点是由16个像素MaxPool得到,有点是由20个像素得到…作者认为这种操作是对分割影响很大的。


​  通过上文的简单描述,我想你可能明白了RoIPool是怎么运行的了,也知道了RoIPool的量化操作是不利于分割的。其实啊,使用RoIPool一共使用了两次量化操作,如下图所示:

image-20221128103240094

              图13 RoIPool两次量化

​  首先,我们输入网络的原图大小为800×800,经过VGG16网络得到特征图。【注:这里使用VGG16做示范,此网络将原图下采样32倍】此时特征图长和宽都为 800 32 = 25 \frac{800}{32}=25 32800=25。原图中狗的bbox尺寸为665×665,经过VGG16同样下采样32倍。但是你会发现 665 32 = 20.78 \frac{665}{32}=20.78 32665=20.78,无法整除,而像素点都是整数,因此我们需要进行第一次量化操作,取20.78的下界20作为bbox的长和宽。🍭🍭🍭得到20×20的bbox后,我们将其输入RoIPool中,期望输出为7×7大小,显然此时 20 7 = 2.86 \frac{20}{7}=2.86 720=2.86,其仍然是一个小数,此时需要进行第二次量化操作,同样向下取整,即取2。【注:不知道大家发现没有,这里的第二次量化操作和我图12中所描述的是有一定差异的,这里直接舍去了一些像素,在我用代码验证过程中,发现使用的是图12的方式,当然了,可能会有一些参数来控制RoIPool实现的形式,感兴趣的可以去搜搜看喔。🍄🍄🍄】

​  介绍完了RoIPool,下面就来为大家介绍介绍RoIAlign,其没有像RoIPool一样采用量化操作,RoIAlign过程如下图所示:

image-20221128115146744

              图14 RoIAlign操作

​  从上图可以看出,RoIAlign在RoIPool两次量化时都没有量化,而是保留了小数,这种方式能够较大的提升网络分割效果,至于提升多大,我们直接来看论文中给的表吧。

image-20221128115534440

​  这个提升是不是足够震惊的,足足增加了好几个点。说到这里,我想大家就知道了RoIAlign是优于RoIPool的,但是似乎还是不太明白这个RoIAlign具体是怎么操作的。这里我不准备码字为大家介绍了,推荐大家去看此视频,大家可直接跳转到5分50秒观看喔。🍀🍀🍀

 
 

如若文章对你有所帮助,那就🛴🛴🛴

         一键三连 (1).gif

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何系列 如何使用SikuliX执行自动化任务

文章目录 什么是SikuliX?SikuliX的使用场景安装SikuliX常用方法查找鼠标键盘其他 示例脚本示例一 自动抢票示例二 自动打开计算器示例三 自动访问CSDN博客搜索博主并关注其他 SikuliX原理SikuliX脚本Sikuli 源文件夹或压缩文件(.sikuli、.skl&#xff09…

电源纹波测试,居然还能这么玩

开关稳压器因其具有非常高的效率优势,正在各个领域逐渐替代线性稳压器。 但由于开关稳压器通常被认为具有很大的输出纹波(Ripple),所以很多工程师在高性能和噪声敏感型系统中只考虑使用低压差(LDO)稳压器。 而事实上,现今很多高性能开关稳压…

人机接口回路原理(三)

四、串行通信接口电路 (一)人机接口与保护CPU之间的串行通信 1.串行通信接口电路及其作用 人机接口与保护CPU之间的串行通信的作用是人机对话和巡检,其电路见图1-33所示。这个串行通信系统是主从分布式的系统&#x…

双向可控硅控制后续篇:过零检测电路、丢波、斩波、定时

概念讲解 当我们在使用AC负载的时候,为了能较好的控制负载工作功率,需要用到继电器、可控硅等对负载进行工作与断开的控制,从而将功率维持在所需的大小上,之前介绍双向可控硅的文章也讲了其控制方式主要有:定时、丢波…

go语言的反射和泛型

反射 反射可以在程序的运行时获取变量的各种信息。Go语言中光反射在reflect包下。 http://c.biancheng.net/view/4407.html 泛型 Go语言中通过断言转化为指定类型。 func main() {arr : []string{"int", "dghjs", "hdk"}printArr(arr)arr1 …

【JavaWeb】servlet实现excel表格数据批量导入到数据库

这是一个教大家使用excel表格,批量将数据导入到数据库的一个教程 通过Javaweb项目 的servlet技术实现,教程详细简单,跟着做就不会报错! 1.下载依赖包: tomcat-jdbc的jar包下载:文件上传批量导入数据库依赖…

一篇打通,性能测试与性能测试瓶颈评估,测试之道...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 什么是性能测试&a…

硬件系统工程师宝典(30)-----降压式Buck电路分析

各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。上篇我们说到DC/DC变换中的开关调节模式有功耗小、效率高并且稳压范围宽的特点以及DC/DC的指标参数和设计要求。今天我们来分析一下DC/DC中的一个典型…

嬴图 | 围绕中心性算法在寄生虫网络的研究

算法在实践中的应用有哪些?中心性算法的特点和应用一文了解。 前言 寄生(Parasitism)是两种生物之间的一种“消费者—资源”的关系,即寄生虫(Parasite)和它的宿主(Host)。 寄生虫…

智芯MCU软件开发环境搭建

智芯MCU软件开发环境搭建 目录 智芯MCU软件开发环境搭建前言1 软件安装2 编译环境3 烧录环境4 新建工程结束语 前言 智芯科技的MCU主要应用于汽车行业,属于车规级的MCU,目前上市的MCU型号较少,相关资料也不多,所以这里出一期开发…

医学影像信息系统(PACS源码)基本概况和工作原理

一、医学影像信息系统(PACS)基本概况 医学影像信息系统(PACS)是一种集影像采集、传输、存储、管理、查询、诊断、报告、归档和科研于一体的综合性应用系统。它基于医学影像存储与通信系统(Picture Archiving and Comm…

Seata Saga 模式理论学习、生产级使用示例搭建及注意事项(一) | Spring Cloud57

一、前言 通过以下系列章节: docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

当我用AI为开发AntV图表插上想象的翅膀后

前言 做前端图表时,最耗时的就是找配置参数,比如你在使用AntV G2时,为了更加美观,拉大数据之间的差距,需要将y轴设置一个最小值,由于每个图表的参数少说十几个,多达二十多个,一个一…

C# 反射 (Reflection) 的常用功能

目录 一、概述 二、实例化类 三、反射赋值 四、获取字段值 五、获取字段名 六、获取字段类型 七、调用方法 结束 一、概述 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则…

华为认证 | HCIE-Datacom 考试大纲

01 HCIE-Datacom考试概述 02 HCIE-Datacom考试内容 HCIE-Datacom V1.0 考试覆盖数据通信领域:路由交换高阶技术、企业网络架构全景、园区网络典型架构与技术、华为CloudCampus解决方案设计与部署、广域互联网络典型架构与技术、华为SD-WAN解决方案设计与部署、广域…

人机接口回路原理(四)

五、硬件时钟电路 接口插件设置了一个硬件时钟电路,由一片MC146818时钟芯片及辅助元器件组成,如图1-35所示。 MC146818芯片是智能式硬件时钟,其内部由电子时钟和存储器两部分组成。可计年、月、日、时、分、秒、星期;能…

时间序列中的无监督表示学习

自监督学习中,有一个常用的方法是对比学习; 2.  时间序列的表示学习 1.1 采用对比学习的方式 Time-series representation learning via temporal and contextual contrasting(IJCAI’21) 本文采用对比学习的方式进行时间序列表示学习。首先对于同一…

告别原始 UI 样式,拥抱 Fluent Design 风格 PyQt/PySide 组件库

简介 这是一个使用 PyQt/PySide 编写的 Fluent Design 风格的组件库,支持亮暗主题无缝切换和自定义主题色,搭配 QtDesigner 可以快速开发美观的界面。github 仓库地址为 https://github.com/zhiyiYo/PyQt-Fluent-Widgets ,演示视频可以在哔哩…

夏至后,这些农事活动要注意管理

夏至过后,温度会进一步攀登,较高的气温和光照会让夏作物生长更加旺盛。接下来就让我们看看在这些夏作物在种植时都需要注意哪些方面吧! 一、蔬菜管理 夏白菜、夏甘蓝、夏菜花都是在6月下旬开始育早熟的菜花苗,秋大棚中的芹菜也是…

超强总结,性能测试实战(购物业务板块)真实压测场景...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 购物网站购物流程…