图像目标分割_6 Mask RCNN

6.6.0 背景

目标检测和语义分割的效果在短时间内得到了很大的改善。在很大程度上,这些进步是由强大的基线系统驱动的,例如,分别用于目标检测和语义分割的Fast/Faster R-CNN和全卷积网络(FCN)框架。这些方法在概念上是直观的,提供灵活性和鲁棒性,以及快速的训练和推理。论文作者在这项工作中的目标是为目标分割开发一个相对有力的框架。

Mask RCNN主要解决的是实例分割,语义分割 (semantic segmentation) 指的是把一张图像的每一个像素进行分类, 比如把图像中所有的人分为一类. 而实例分割 (instance segmentation) 是指按照对象 (object) 进行分类, 那么不同的人就要分为不同的类别.

  • deeplab:语义分割
  • maskrcnn:实例分割

Mask R-CNN的输出见下图:

运行视频检测和分割的效果

YOLOv2 vs YOLOv3 vs Mask RCNN vs Deeplab Xception:YOLOv2 vs YOLOv3 vs Mask RCNN vs Deeplab Xception_哔哩哔哩_bilibili

6.6.1 Mask RCNN介绍

Mask R-CNN是何凯明的力作,将Object Detection与Semantic Segmentation合在了一起做。Mask R-CNN是一个很多state-of-the-art算法的合成体,并非常巧妙的设计了这些模块的合成接口。

6.6.1.1 回顾

Faster R-CNN:我们首先简要回顾一下Faster R-CNN检测器。Faster R-CNN由两个阶段组成。

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

对于FasterR-CNN来说,对于每个目标对象,它有两个输出,一个是类标签(classlabel),一个是边界框的偏移值(bounding-box offset)

6.6.1.2 Mask R-CNN

Mask R-CNN采用相同的两个阶段,在Faster R-CNN网络上的修改,具体包括:

1、采用ResNet-FPN的架构,并将ROI Pooling层替换成了ROIAlign

2、添加了并列的FCN层(Mask层)

  • 第一阶段:只不过特征提取采用ResNet-FPN的架构,得到目标边界框。(FPN实际上是一种通用架构,可以结合各种骨架网络使用,比如VGG,ResNet等。Mask RCNN文章中使用了ResNNet-FPN网络结构)
    • 多尺度检测在目标检测中变得越来越重要,对小目标的检测尤其如此。
    • FasterRCNN的例子中对多级特征进行提取合并

  • 第二阶段:通过一个RoIAlign除了预测类和预测框偏移,Mask R-CNN还为每个RoI输出二进制掩码。这与最近的其它系统相反,其分类取依赖于掩码预测。

    • Mask R-CNN方法增加了第三个分支的输出:进一步的是为每个RoI生成了一个目标掩码(二元掩码)。目标掩码与已有的class和box输出的不同在于它需要对目标的空间布局有一个更精细的提取。

    • 掩码分支对于每个RoI的输出维度假设即K个分辨率为m×m的二进制掩码,每个类别一个,K表示类别数量。

6.6.1.3 RoIAlign

  • 回顾:Faster-rcnn中的ROIPool是一种针对每一个在特征图中映射得到的Region of Interested的提取一个小尺度特征图(比如说7x7)的标准操作,它用以解决将不同尺度的ROI提取成相同尺度的特征大小的问题。

但是由于我们要实现像素级的 mask 图像, 所以如果仍然使用 Fast RCNN 中的 RoIPool 的话, 会出现一些误差:因为特征图上的 RoI 池化为固定大小 (比如 7×7) 的盒子 (bins) 时也可能存在取整操作。这些取整会使得 RoI 与提取的特征之间存在偏差, 这样小的偏差对分类基本没什么影像, 但是对像素级的分割必然会产生较大的负面影响。

  • 原图800x800,经过VGG得到下采样32倍之后的25x25的特征图大小,RoI大小为665x665,所以转换到特诊途中为20x20(取整之后的),然后通过ROIPool的时候又要做7x7最大池化分成49块,显然,每个矩形块区域的边长为2.86,又含有小数,于是ROI Pooling 再次调整到2。
  • 经过两次的调整得到候选区域已经出现了很大的误差了。
    • 原因:为什么很大呢?
    • 注意到特征图上的 1 个像素的误差会引起原始图像 16 个像素的误差, 如果池化了五次则会导致 32 个像素的误差
    • 该层特征图上0.1个像素的偏差,缩放到原图就是3.2个像素。那么0.8的偏差,在原图上就是接近30个像素点的差别,影响还是很大的。

提出RoIAlign 的方法

主要包含三点:

  • 1、预选框的大小保持浮点数状态不做取整
  • 2、RoI 分割为 7×7 的单元时每个单元的边界不做取整
  • 3、使用双线性内插法,在每个单元中采样四个固定位置的值进行池化

2、做法

1、假定原图中有一region proposal,还是大小为665x665,这样,映射到特征图中的大小:665/32=20.78,即20.78x20.78,此时,没有像RoiPooling那样就行取整操作,保留浮点数。

2、假定pooled_w=7,pooled_h=7,即pooling后固定成7x7大小的特征图,所以,将在 feature map上映射的20.78x20.78的region proposal 划分成49个同等大小的小区域,每个小区域的大小20.78/7=2.97,即2.97x2.97,得到下图共49个这样的大小的区域。

  • 步骤 1:假定采样点数为4,即表示,对于每个2.97x2.97的小区域,平分四份,每一份取其中心点位置,而中心点位置的像素,采用双线性插值法进行计算。一个2.97 x2.97的区域就会得到四个点的像素值。

  • 步骤2:取四个像素值中最大值作为这个小区域(即:2.97x2.97大小的区域)的像素值,如此类推,同样是49个小区域得到49个像素值,组成7x7大小的feature map

6.6.1.3 对比两种方式

  • 对于检测图片中大目标物体时(VOC2007),两种方案的差别不大
  • 而如果是图片中有较多小目标物体需要检测(COCO2017),则优先选择RoiAlign,更精准些。
    • RoIAlign起到了很大的作用:论文中可以将掩码准确度提高0.1至0.5

6.6.1.4 主干架构(backbone architecture)的head结构(Mask预测部分)

论文中尝试的网络主干 (backbone) 结构有:

  • 1、ResNet-50-C4
  • 2、ResNet-101-C4
  • 3、ResNeXt-101
  • 4、ResNet-50-FPN
  • 5、ResNet-101-FPN

注: Faster RCNN 使用 ResNets 的原始实现中从第四阶段的最后一次卷积之后提取特征, 我们称之为 C4. FPN 是指 Feature Pyramid Network

用于分类回归和分割的网络头部 (head) 结构(头部结构):

  • 每个候选区域经过ROIAlign得到:分类和回归部分保持 Faster RCNN 中的结构不变, ResNet-C4 主干结构中额外添加 ResNet 的第五阶段
  • 每个候选区域经过ROIAlign得到:分割部分使用全卷积作为 mask 预测分支
    • 其实就是得到了图片中某个物体的像素属于哪个类别(0/1)

  • 上图为两个结构对应的mask部分设置
  • 数字表示分辨率或通道数,箭头表示卷积、反卷积、全连接层. 所有的卷积都是 3×3 的
    • 1、输出层的卷积除外 (是 1×1 的)
    • 2、反卷积是 2×2 的, 步长为 2, 使用 ReLU 激活
    • 3、左边: 'res5' 表示 ResNet 的第五个阶段, 右边: '×4' 表示 4 个连续的卷积

6.6.1.4 训练细节

1、多任务损失函数

Mask RCNN 仍然使用两阶段方法, 在第二阶段添加了 mask 分支, 损失函数为:

注:分类损失Lcls和检测框损失Lbox与中定义的相同。其中

  • mask的损失计算
    • 对于每个RoI,掩码分支都有一个[m, m, K]维输出,该输出编码K个分辨率为m×m的二进制掩码,每个K类中的一个掩码。KK大写为总类别,kk小写为其中一个类别
    • 对于每个RoI区域,找到对应分配的GT类别kk,Lmask定义的时候,只是定义了对应k这个地方的mask。

  • 假设最后得到的7x7的掩码,那么每个像素的对应是假设80个类别中的一个进行损失计算,不是有80个预测结果。
    • 而是只有某个位置进行了sigmoid处理之后,得到的结果与GT的kk进行逻辑回归损失计算。其他的地方不贡献损失
  • 为什么不算所有的:
    • 因为是一个RoI区域对应一个类别,这个区域已经很小了,就只属于这个类别即可。可以看做这些像素是一个整体类别

这与FCN方法是不同,FCN是对每个像素进行多类别softmax分类,然后计算交叉熵损失,这种做法是会造成类间竞争的,而每个类别使用sigmoid输出并计算二值损失,可以避免类间竞争。实验表明,通过这种方法,可以较好地提升性能。

2、训练

  • 1、正负样本:ground truth box 的 IoU 重合度超过 0.5 的 RoI 视为正例, 否则为反例.
    • Mask 损失只定义在正例上. Mask 分支每个 RoI 可以预测 K (总类别数) 个 masks, 但我们只使用第 k 个, 这里的 k 是分类分支预测出的类别
  • 2、图像 resize 到短边为 800 像素.
  • 3、每个 mini-batch 每个 GPU 使用两张图, 每张图有 N 个采样的 RoIs, 正负样本数比例为 1:3
    • C4 主干的 N=64, FPN 主干的 N=512.
  • 4、参数:在 8 块 GPU 上训练 160k 步, 在第 120k 步的时候学习率从 0.02 下降到 0.002. 使用 0.0001 的权重衰减和 0.9 的动量.
  • 5、RPN 的 anchor 使用了 5 种尺寸和 3 种比例, 与 FPN 中一致。一共15中类别的先验框

3、运行效果:

模型可以在GPU上以200毫秒每帧的速度运行,使用一台有8个GPU的机器,在COCO上训练需要一到两天的时间。

4、测试阶段

  • 1、C4 的 proposals 的数量为 300, FPN 为 1000.
  • 2、在所有的 proposals 上都进行 Bbox 回归, 最后应用 NMS
  • 3、Mask 分支使用得分最高的 100 个检测框
    • m×m 的浮点数的 mask 输出 resize 到 RoI 的大小, 然后应用 0.5 的阈值进行二值化。

6.6.4 效果

6.6.4.1 目标分割

Mask R-CNN超越了COCO实例分割任务上所有先前最先进的单一模型结果,其中包括COCO 2016挑战优胜者。作为副产品,我们的方法也优于COCO对象检测任务。

实例分割:MaskRCNN每个物体对象对应到一个类别,还有得到位置。所以能区分图片中同类别物体但是位置不一样

与以往实例分割算法比较

将Mask R-CNN与其它最先进的目标分割方法进行比较,如下表(表1)所示:(COCO test-dev上的目标分割掩码AP。 MNC和FCIS分别是COCO 2015和2016分割挑战的获胜者。Mask R-CNN优于更复杂的,包含多尺度训练和测试、水平翻转测试的FCIS+++,和OHEM。所有条目都是单模型的结果。)

对比:

FCIS+++对比 Mask R-CNN(ResNet-101-FPN)。 FCIS在重叠对象上有问题,Mask R-CNN没问题。

6.6.4.2 消融实验

  • 1、结构上:表a显示了具有各种使用不同下层网络的Mask R-CNN。受益于更深层次的网络(50对比101)和高级设计,包括FPN和ResNeXt。我们注意到并不是所有的框架都会从更深层次的或高级的网络中自动获益

  • 2、独立与非独立掩码:Mask R-CNN解耦了掩码和类预测:由于现有的检测框分支预测类标签,所以我们为每个类生成一个掩码,而不会在类之间产生竞争(通过像素级Sigmoid和二值化损失)。在表b中,这些方法将掩码和类预测的任务结合,导致了掩码AP(5.5个点)的严重损失。

  • 3、RoIAlign:表c显示了对提出的RoIAlign层的评估。对于这个实验,使用的下层网络为ResNet-50-C4,其步进为16。RoIAlign相对RoIPool将AP提高了约3个点,在高IoU(AP75)结果中增益更多

  • 采用双线性采样的ROIAlign与提出的RoIWarp进行比较,RoIWarp仍然四舍五入了RoI,与输入失去了对齐。从表c可以看出,RoIWarp与RoIPool效果差不多,比RoIAlign差得多。这突出表明正确的对齐是关键。

  • 4、掩码分支:

    分割是一个像素到像素的任务,我们使用FCN来利用掩码的空间布局。在表e中,我们使用ResNet-50-FPN下层网络来比较多层感知机(MLP)和FCN。使用FCN可以提供超过MLP 2.1个点的AP增益。为了与与MLP进行公平的比较,FCN的上层网络的卷积层没有被预训练。

6.6.4.3 目标检测结果

在COCO数据集上将Mask R-CNN与其它最先进的目标检测方法进行比较,如下表所示:(目标检测结果(目标边界框AP),单模型,在test-dev上与其它最先进的技术对比。使用ResNet-101-FPN的Mask R-CNN优于所有先前最先进的模型的基本变体(实验中忽略了掩码输出)。Mask R-CNN超过12的增益来自使用RoIAlign(+1.1 APbb),多任务训练(+0.9 APbb)和ResNeXt-101(+1.6 APbb)。)

为了作进一步的比较,论文作者训练了一个没有掩码分支版本的Mask R-CNN,见表3中的“Faster R-CNN,RoIAlign”。由于RoIAlign,该模型的性能优于中提出的模型。但是比Mask R-CNN低0.9个点的AP。这个差距这是由于Mask R-CNN的多任务训练产生的。

6.6.4.4 Cityscapes上的实验

Cityscapes数据集的目标分割结果。该数据集具有精细标注的2975个训练图像,500个验证图像和1525个测试图像。它还有20k粗糙的训练图像,无精细标注,Cityscapes数据集的主要挑战是训练数据较少,特别是对于卡车,公共汽车和火车的类别,每个类别的训练样本大约有200-500个。所有图像的分辨率为2048 x 1024像素。目标分割任务涉及8个对象类别,其训练集中的总共目标数为

骑手小汽车卡车公交车火车摩托车自行车
17.9k1.8k26.9k0.5k0.4k0.2k0.7k3.7k

该任务的目标分割性能由和COCO一样的AP(在IoU阈值上平均)来测量,也包括AP50(即,IoU为0.5的掩码AP)。

实现:

  • 1、Mask R-CNN模型使用的下层网络是ResNet-FPN-50,也测试了对应的101层的网络,不过由于数据集比较小,性能相似。
  • 2、将图像在[800,1024]像素范围内随机缩放(较短边)进行训练,从而减少过拟合。测试时则统一缩放到1024像素。
  • 3、使用的批量大小为每个GPU 1个图像(实际上8个GPU上有8个),学习率为0.01,迭代次数为24k,在迭代次数达到18k时,学习率减少到0.001

结果:我们在测试集和验证集上,将我们的结果与其它主流方法进行了比较,使用预先训练好的COCO Mask R-CNN模型(骑手类别被随机初始化)。如下表(表7)所示:

  • 1、对于人和小汽车类别,Cityscapes数据集包含了大量的类内重叠目标(每个图像平均6人和9辆小汽车)。类内重叠是目标分割的核心难点。论文的方法在这两个类别相对前最佳结果有大幅度改善(人相对提升了约85%,从16.5提高到30.5,小汽车相对提升了约30%,从35.7提高到46.9)
  • 2、使用COCO预训练的Mask R-CNN模型在测试集上达到了32.0 AP,比不预训练的模型提高了6个点。这表明足够的训练数据的重要性。
  • 3、观察到测试集和训练集AP之间的偏差,偏差主要是由卡车,公共汽车和火车类别造成的,其中只使用精细标注训练数据的模型,在验证集和测试集上的AP分别为28.8/22.8,53.5/32.2和33.0/18.6。这表明这些训练数据很少的类别存在domain shift。 COCO预训练有助于改善这些类别上的结果,然而,domain shift依然存在,在验证集和测试集上的AP分别为38.0/30.1,57.5/40.9和41.2/30.9。

Cityscapes的结果示例如下图:

6.6.4.5 Mask R-CNN人体姿态估计(了解)

通过COCO关键点数据集上的人体姿态估计任务来展示论文框架的通用性。通过将每个关键点视为one-hot二进制掩码,只需要很少的修改,Mask R-CNN可以应用于人体关键点检测。不需要额外的技巧,Mask R-CNN超过了COCO 2016人体关键点检测比赛的冠军,同时运行速度可达5 FPS。因此,Mask R-CNN可以被更广泛地看作是用于目标级识别的灵活框架,并且可以容易地扩展到更复杂的任务。

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

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

相关文章

cf 621E. Wet Shark and Blocks

神奇,矩阵乘法23333333333333333 递推式是很简单的(连我这种不会DP的人都写出来了。) 需要求出的是转移矩阵(还是叫系数矩阵的),也是最这个东西用快速幂。 这个东西的i,j大概就表示从i到j的方案…

Python enum的使用总结

Python enum的使用总结 枚举(enumeration)在许多编程语言中常被表示为一种基础的数据结构使用,枚举帮助组织一系列密切相关的成员到同一个群组机制下,一般各种离散的属性都可以用枚举的数据结构定义,比如颜色、季节、国家、时间单位等 在Pyt…

ascii码转字符

在C语言中,ASCII码转字符非常简单。但是之前因为没有用到就没有去关注这方面的问题。 printf("%c\n",char(69)); E 下面是ASCII码表: BinDecHex缩写/字符解释0000 0000000NUL(null)空字符0000 0001101SOH(start of headline)标题开始0000…

SCI论文写作训练营笔记汇总01_概述+文献检索与管理

1 概述 1.1 适用人群 ①初涉科研, 目前或将来有英文科技论文发表需求的科研工作者 ②正在撰写或准备撰写英文科技论文的科研工作者 1.2 科技论文的基本结构 1.3 科技论文组成部分的写作方法 1.4 阅读文献的重要性 2、文献检索与管理 2.1 如何查找文献参考 2.2 文…

天猫11.11:搜索引擎实时秒级更新(转载)

搜索是很多用户在天猫购物时的第一入口,搜索结果会根据销量、库存、人气对商品进行排序,而商品的显示顺序往往会决定用户的选择,所以保证搜索结果的实时性和准确性非常重要。在电商系统中,特别是在“双十一”这样的高并发场景下&a…

pandas处理日期的几种常用方法

1.读取字符串日期 写入csv 文件 csv_text """date, value 2022-01-01, 1 2022-01-05, 5 2022-11-05, 5 """ with open("date_text.csv", "w") as f:f.write(csv_text)读取日期 df pd.read_csv("date_text.csv"…

OAD 空中升级

http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/p/69222/172351.aspx#172351第二十三节 OAD空中升级 通过仿真器更新程序或者通过USB更新固件那都是一般人都可以实现的操作,但是要想实现OAD空中升级…

SCI论文写作训练营笔记汇总02_英文科技论文阅读与解析

3、英文科技论文阅读与解析的方法 3.1 科技论文介绍 3.1.1 科技论文的类型 • Research • Review • Theoretical • Methodological • Case study 3.1.2 研究型论文的结构 3.1.3 科技论文的基本结构 3.2 文献阅读 3.2.1 文献选择的原则 3.2.2 文献阅读顺序 3.2.2 文献阅读…

9.带有返回值的函数

<!DOCTYPE html><html><body> <p>本例调用的函数会执行一个计算&#xff0c;然后返回结果&#xff1a;</p> <p id"demo"></p> <script>function myFunction(a,b){return a*b;} document.getElementById("demo&…

报错curl: (7) Failed to connect to 127.0.0.1 port xxxx: Connection refused

&#xff08;pyenv install xxx&#xff09; 报错curl: (7) Failed to connect to 127.0.0.1 port xxxx: Connection refused的解决方法 问题重现截图&#xff1a; 在查看下面的原因和使用解决方法之前&#xff0c;确保自己的pyenv已经安装好了最新的python-build&#xff0c…

linux通过I2C地址查看设备名称

 root@android:/sys/bus/i2c # cd devices cd devices root@android:/sys/bus/i2c/devices # ls ls 0-0020 0-0022 0-0036 0-0078 1-000c 1-000d 1-001d 1-0028 1-0029 1-002a 1-0038 1-0060 1-0068 2-001c i2c-0 i2c-1 i2c-2 root@android:/sys/bus/i2c/devices # cd 0-00…

SCI论文写作训练营笔记汇总03_科技论文写作(方法篇)

4、科技论文写作——方法篇 4.1 准备工作与概述 4.1.2 杂志编辑评估文章的标准 4.2 图表部分的写作方法 4.2.1 为什么使用图表 4.2.2 如何使用图表 4.2.3 如何选择图or表or文字 4.2.4 图片/表格制作软件 4.2.5 图片的各种指标 4.2.6 图片的分类 4.2.6 图注的使用 4.2.7 表格 …

跨域获取

本地&#xff1a; <?php$_arr array(a>1,b>2,c>3);$_result json_encode($_arr);echo $_result; ?> //本地获取$(form input[typebutton]).click(function(){$.ajax({type:"post",url:"test.php",async:true,dataType:json,success:fun…

python 嵌套型partials(nested partials)的使用

Python嵌套型partial的使用 partial对象中包含partial对象的使用 要实现的目标&#xff0c;简单示例&#xff1a; from functools import partialdef func1(f):return fdef func2(f1):return f1def func(n):return np partial(func2, partial(func1, partial(func, 5))) pri…

SCI论文写作训练营笔记汇总04_科技论文写作(技巧篇)

1、语言点 1.1 时态 1.1.1 时态使用的基本原则 1.1.2 在引言部分的时态使用 1.1.3 在“材料与方法”部分的时态使用 1.1.4 在“结果”部分的时态使用 1.1.5 在“讨论”部分的时态使用 1.1.6 总结 1.2 语态 1.2.1 语态-主动/被动 1.2.2 语态-主动/被动的不同点 1.2.2 语态-主…

做怎样的一个自己

1、如果总是患得患失&#xff0c;即使一时的成功&#xff0c;也不可能找到正确的自己。 2、这一次的创业机会错失了&#xff0c;是一件非常遗憾的事。 3、可是我会是更好的我&#xff0c;明天的我会是更加优秀的我&#xff0c;我将要遇见那个超过自己我我。 为自己努力&#…

SCI论文写作训练营笔记汇总05_英文论文投稿流程与常见问题(完)

1 目标期刊的选择 1.1 文章未送审直接被拒稿的常见理由 1.2 目标期刊的选择 1.2.1 学科与影响力 1.2.2 影响因子 1.2.3 审稿平均周期 1.2.4 主编水平 1.2.5 版面费 2 根据期刊要求调整文章 2.1 具体 2.2 期刊的审查重点 2.3 期刊的审查列表 3 其他材料 3.1 稿件作者信息 3.…

【bzoj1738】[Usaco2005 mar]Ombrophobic Bovines 发抖的牛 Floyd+二分+网络流最大流

题目描述 FJs cows really hate getting wet so much that the mere thought of getting caught in the rain makes them shake in their hooves. They have decided to put a rain siren on the farm to let them know when rain is approaching. They intend to create a rai…

动态规划思路和Python解决零钱兑换问题和最大乘积子序列的乘积的问题

动态规划&#xff08;Dynamic Programming&#xff09;思路和Python解题示例 动态规划是一种主要用来优化朴素递归的方法&#xff0c;每当输入不同值调用递归函数出现大量重复的&#xff08;子&#xff09;输入和调用&#xff08;返回结果&#xff09;时&#xff0c;就可以考虑…

open(/dev/ietctl, O_RDWR) 参数含义

这是文件I/O的常用函数&#xff0c;open函数&#xff0c;open函数用来打开一个设备&#xff0c;他返回的是一个整型变量&#xff0c;如果这个值等于-1&#xff0c;说明打开文件出现错误&#xff0c;如果为大于0的值&#xff0c;那么这个值代表的就是文件描述符。一般的写法是if…