Mask RCNN 学习笔记

本文深入解析Mask R-CNN的工作原理,包括其在网络结构、RoIAlign改进、损失函数等方面的创新,以及如何实现高质量的实例分割。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

涉及到的知识点补充:

FasterRCNN:https://blog.youkuaiyun.com/wangyong1988/article/details/81064597

 

RoIPooling、RoIAlign:https://blog.youkuaiyun.com/wangyong1988/article/details/81064995

 

FPN:https://blog.youkuaiyun.com/wangyong1988/article/details/81065115


首先,先看两张图(第一张图来源于论文,第二张图来源于网络),如下:


                                         (图1)


   

                                           (图2)


1:可以看出MaskRCNN在有效检测目标的同时输出高质量的实例分割mask

图2:可以看出MaskRCNN的网络结构,作为FasterRCNN的扩展

1):用RolAlign代替了RoIPooling,RoIPooling使用取整量化,导致特征图RoI映射回原图RoI时空间不对齐明显,造成误差;RolAlign不使用取整量化而是采用双线性插值,完成像素级的对齐;

2):FasterRcnn为每个候选对象ROI提供两个输出,一个类标签,一个边界框偏移量,为此,MaskRCNN并行添加了第三个分割mask的分支,mask分支是应用到每一个ROI上的一个小的FCN(Fully Convolutional Network),以pix2pix的方式预测分割mask。


MaskRCNN具有很好的泛化适应能力,可以和多种RCNN框架结合,比较常见的如:

1)FasterRCNN/ResNet;

2)FasterRCNN/FPN

在接下来的文章介绍中则主要结合FPN网络记录MaskRCNN的工作原理

如果要说清楚MaskRCNN的工作原理,先从数据标注开始,知道如何制作数据集,对理解网络有帮助


一)、数据标注

利用labelImg和labelme的源码,整合成一套新的标注工具,同时支持矩形和多边形的绘制,界面如下图(从上到下,从左到右依次是:菜单栏、工具箱、文件列表展示区、主图绘制区、标签展示区、状态栏):

绘制完成,点击保存后,会将图中绘制的点坐标信息保存到JSON文件中,JSON文件的格式如下:

每一张图片会产生一个与其同名的JSON文件,文件夹中的格式如下图所示:

注:一张图片只需对应一张JSON文件即可,而网络在训练的时候需要一个‘mask图片’,这个会在代码中利用JSON中坐标点临时生成


二)、网络原理

MaskRCNN作为FasterRCNN的扩展,产生RoI的RPN网络和FasterRCNN网络一样,如想详细了解这个过程,可以参看文章上述给出的FasterRCNN的博文,这里不太叙述RPN网络的原理,重点看下MaskRCNN其余部分的理解;

源码:https://github.com/matterport/Mask_RCNN

结构:ResNet101+FPN

代码:TensorFlow+ Keras(Python)

代码中将Resnet101网络,分成5个stage,记为[C1,C2,C3,C4,C5];如果了解FPN网络(也可以参看上面提供的FPN网络博文链接),知道这里的5个阶段分别对应着5中不同尺度的feature map输出,用来建立FPN网络的特征金字塔(feature pyramid).

先通过两张MaskRCNN整体网络结构图,再附带一张绘制了stage1和stage2的层次结构图(stage3到stage5的结构层次比较多,未绘制),来整体了解下MaskRCNN网络。

MaskRCNN网络结构泛化图:


MaskRCNN网络结构细化图(可放大看):


stage1和stage2层次结构图:


结合MaskRCNN网络结构图,注重点出以下几点:

1) 虽然事先将ResNet网络分为5个stage,但是,并没有利用其中的Stage1即P1的特征,官方的说法是因为P1对应的feature map比较大计算耗时所以弃用;相反,在Stage5即P5的基础上进行了下采样得到P6,故,利用了[P2 P3 P4 P5 P6]五个不同尺度的特征图输入到RPN网络,分别生成RoI.

 

2)[P2 P3 P4 P5 P6]五个不同尺度的特征图由RPN网络生成若干个anchor box,经过NMS非最大值抑制操作后保留将近共2000个RoI(2000为可更改参数),由于步长stride的不同,分开分别对[P2 P3 P4 P5]四个不同尺度的feature map对应的stride进行RoIAlign操作,将经过此操作产生的RoI进行Concat连接,随即网络分为三部分:全连接预测类别class、全连接预测矩形框box、     全卷积预测像素分割mask

 

3)损失函数:分类误差+检测误差+分割误差,即L=Lcls+Lbox+Lmask

   Lcls、Lbox:利用全连接预测出每个RoI的所属类别及其矩形框坐标值,可以参看FasterRCNN网络中的介绍。

   Lmask:

 ① mask分支采用FCN对每个RoI的分割输出维数为K*m*m(其中:m表示RoI Align特征图的大小),即K个类别的m*m的二值mask;保持m*m的空间布局,pixel-to-pixel操作需要保证RoI特征 映射到原图的对齐性,这也是使用RoIAlign解决对齐问题原因,减少像素级别对齐的误差。

        K*m*m二值mask结构解释:最终的FCN输出一个K层的mask,每一层为一类,Log输出,用0.5作为阈值进行二值化,产生背景和前景的分割Mask

这样,Lmask 使得网络能够输出每一类的 mask,且不会有不同类别 mask 间的竞争. 分类网络分支预测 object 类别标签,以选择输出 mask,对每一个ROI,如果检测得到ROI属于哪一个分 类,就只使用哪一个分支的相对熵误差作为误差值进行计算。(举例说明:分类有3类(猫,狗,人),检测得到当前ROI属于“人”这一类,那么所使用的Lmask为“人”这一分支的mask,即,每个class类别对应一个mask可以有效避免类间竞争(其他class不贡献Loss)

 

 ② 对每一个像素应用sigmoid,然后取RoI上所有像素的交叉熵的平均值作为Lmask。

 

       由于MaskRCNN网络包含了很多之前介绍过的知识点,例如RPN,FPN,RoIPooling,RoIAlign,故这遍文章看上去显得比较‘单薄’,如果想弄清楚MaskRCNN网络,还是可以需要结合文章一开头提到的几遍博文一起阅读…

 

     文章开头的时候,利用自己的标注工具,对细胞图片进行标注,每个图片产生一个JSON文件,通过训练后,测试效果如下(标注的图片不是很多,效果还行):

     

作为一枚技术小白,写这篇笔记的时候参考了很多博客论文,在这里表示感谢,同时,转载请注明出处......

 如有疑问,欢迎留言,互相学习...


### Mask R-CNN 气球 示例 实现 教程 Mask R-CNN 是一种用于实例分割的强大工具,其通过 ROIAlign 方法改进了区域提议网络 (RPN),从而提高了精度和性能[^1]。对于气球相关的实现或教程,可以参考以下几个方面: #### 数据准备 为了训练一个针对气球分类的模型,通常不需要大量的数据集,因为可以通过迁移学习利用已经在 MS COCO 上预训练的权重文件[^4]。COCO 数据集中虽然没有气球这一类别,但由于其包含了大量的自然图像特征,这些特征仍然有助于提升模型的表现。 #### 训练流程 `train_shapes.ipynb` 提供了一个详细的指南,展示了如何在一个自定义的小型数据集上训练 Mask R-CNN 模型。此笔记本使用的是玩具形状数据集作为示例,但同样的逻辑也可以应用于其他小型数据集,比如气球数据集[^2]。具体步骤如下: - **标注数据**:需要先对气球图片进行标注,生成对应的掩码(mask)。这一步骤可以在 `inspect_data.ipynb` 中找到一些帮助理解数据预处理过程的内容。 - **配置参数**:用户可以根据实际需求调整超参数设置。例如,在 `MyConfig` 类中重新定义图像尺寸、批量大小以及学习率等重要属性[^5]。 #### 测试与验证 完成训练之后,你可以使用 `demo.ipynb` 来测试你的新模型。该脚本允许你在任何输入图片上调用预训练或者自己刚刚训练出来的模型来进行目标检测和实例分割操作。 以下是基于 Python 的一段简化版代码片段用来加载预训练模型并对单张图片执行预测: ```python import os import sys import random import math import numpy as np import skimage.io import matplotlib.pyplot as plt from mrcnn import utils import mrcnn.model as modellib from mrcnn.config import Config class BalloonConfig(Config): NAME = "balloons" IMAGES_PER_GPU = 2 NUM_CLASSES = 1 + 1 # Background + balloon MODEL_DIR = "./logs/" BALLOON_WEIGHTS_PATH = "./mask_rcnn_balloon.h5" if not os.path.exists(BALLOON_WEIGHTS_PATH): utils.download_trained_weights(BALLOON_WEIGHTS_PATH) config = BalloonConfig() model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config) model.load_weights(BALLOON_WEIGHTS_PATH, by_name=True) image_path = './test_image.jpg' image = skimage.io.imread(image_path) results = model.detect([image], verbose=1) r = results[0] visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], ['BG', 'balloon'], r['scores']) plt.show() ``` 上述代码实现了从加载模型到读取一张待测图片最后输出识别结果整个链条的功能。 #### 可视化分析 如果想深入了解模型内部工作机制,则可查阅 `inspect_model.ipynb` 和 `inspect_weights.ipynb` 这两个文档。前者会逐步剖析每一个阶段的工作原理并通过图形方式呈现出来;后者则专注于探索经过训练后的神经网络层权值分布情况是否存在异常等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值