【云驻共创】图像分割模型PointRend解读分享

举报
咸蛋超人 发表于 2021/09/27 23:58:13 2021/09/27
【摘要】 今天和大家一起学习的是发表在Computer Vision and Pattern Recognition的一篇论文,名为《PointRend: Image Segmentation as Rendering》。该篇论文是何恺明及其团队对图像分割领域的又一次最新探索,论文将图像分割当做一个渲染问题,思路清晰,是一次突破传统的成功。接下来将根据论文概览、算法模型剖析、代码复现这三个部分来进行讲...

今天和大家一起学习的是发表在Computer Vision and Pattern Recognition的一篇论文,名为《PointRend: Image Segmentation as Rendering》。该篇论文是何恺明及其团队对图像分割领域的又一次最新探索,论文将图像分割当做一个渲染问题,思路清晰,是一次突破传统的成功。接下来将根据论文概览、算法模型剖析、代码复现这三个部分来进行讲解。

 

论文概览

论文提出了一种高效的语义分割新方法,通过类比计算机经典图形方法以实现高效渲染,把图像分割做一个渲染问题。这是一个非常独特的视角,在这个角度上提出了PointRend是基于点的渲染,它是一个神经网络的模块,并不是一个完整的神经网络。该模块根据以下信息在适应自信选择的位置执行。基于点的语义分割、预测、迭代细细分算法,PointRend可以灵活的应用于实例和语义分割,它能嵌入大多数主流神经网络,它的设计十分简单,但结果却很出色。从定性的角度上,PointRend在先前的方法过度平滑的区域中输出清晰的语义分割边缘对象,从定量的角度上PointRend在实例分割和语义分割方面,与现有方法对比,准确率在COCO Cityscapes数据集上有所增长,PointRend的可实现输出更高的分辨率,在内存和计算方面更加突出。

 

研究背景

分割、检测和分类是计算机视觉领域的三大任务,今天讲一下现有的语义分割体系结构。

一个通用的语义分割体系结构,通常广泛被认为是一个编码器网络和一个解码器网络。编码器通常是一个预训练的分类的网络,如VGGResNet。解码器的任务是将编码器学习到的识别特征,以低分辨率的语义投影到像素空间,高分辨率上得到密集的分类。与分类不同的是深度网络的最终结果是要在像素级别上进行区分,所以需要一种机制将编码器不同阶段学习到的特征投影到像素空间上去。

目前主流的语义分割方法主要有三类:

基于区域的语音网络,即区域的方法通常遵循使用识别分割的管道。首先从图像中提取自由形式的区域,并对其进行描述,然后进行区域的分类。典型的网络有VGGGoogLeNetResNet

然后是全卷积网络语义分割。这是2015FCN是全卷积与网络分割的开山之作。它主要思想是使经典的 CNN任意大小的图像作为输入,CNN仅接受和生产特定尺寸输入的标签限制来自完全连接的固定层,但是FCN只有卷积层和磁化层。典型的基于FCN的方法有U-NetSegNetDeepLab

弱监督语义分割。语义分割大多数方法都依赖于大量带有像素及分割制造的图像,然而手工做出这些 mask是相当费时的。最近提出了一些弱监督的方法,这些方法通常致力于通过使用带注释的边界框来实现语义分割,例如 boxsoup、使用边界框作为监督来训练网络并迭代的使用改善语义分割的源码。

在现有的语义分割模型中,模型在规则的网络网格上进行卷积操作,一般会输出一个原图大小的1/8或者1/16大小的预测图,然后通过双线性差值来补齐最后的8成和16倍分辨率,但是它需要的内存和计算量往往较大,这就涉及到计算成本和效果之间的权衡。

本文的中心思想是将图像分割问题视为一个渲染问题,定时计算机图形学的经典,思想有效的适应渲染高质量标签图,它能快速的计算出高像素的分割结果。

 

存在的问题

在目前的语义分割网络中存在的问题主要有过采样和现采样。

1.过采样( oversample ):对于图片中低频区域( 属于同一个物体 ),没必要使用 太多的采样点,却使用太多采样点造成过采样;

2.欠采样( undersample ) :对于图片中高频区域( 靠近物体边界 ),如果这些区域的采样过于稀疏,导致分割出的边界过于平滑,不大真实。

 

例如上图, 7×7的网格上身体中间的区域没必要使用太多的采样点。但是边界的区域,如果采样过于稀疏的话,最后会导致输出的边界过于平滑,不会很清晰。比如说手指采样的太少会导致分割出来的边界过于平滑,不太真实。但是为什么会使用这种7×7和那为什么如果要增加分辨率,然后是边界更加清晰的话,为什么不一直使用这224×224的网格?因为使用224×224的网格,虽然结果非常清晰,但是用到的显存要更大,计算速度要更慢。使用7×7的网格的话,输出计算速度最快,但是得到的mask非常模糊,缺少细节。

 

 

相关工作

1.PointRend使用细分策略在需要计算标签的区域选择一组非均匀的采样点,而后为其预测类别。

2.PointRend是一个通用模块,可以有多种形式的实现。它接受一个或多个典型的CNN feature map,然后输出高分辨率预测。

3.PointRend不会对输出网格上的所有点进行预测,而只会对部分点(不确定性较强的点)进行预测。

4.PointRend通过插值操作来提取选中点的点级特征,并使用一个小的point head子网络根据逐点特征来预测输出特征图。

 

 

论文主要贡献

1.提出可嵌入主流网络的PointRend模块,提高了图像分割精度。

2.把图像分割问题看作渲染问题,本质上是一个新型上采样方法,为图像分割提供独特视角。

3.降低了训练所需的算力。输出224×224分辨率图像,PointRend只需0.9B FLOPs

 

 

算法模型剖析

模型总览

如上图,PointRend模型总览包括三个主要部分:

  • 使用轻量级的分割头,对每个检测到的对象(红框)进行粗略的mask预测。

点选择是在平面中自适应的选择预测标签所需的点,这些点主要是高频区域,即图像的边缘。

  • 选择一组点(红色点),用小规模的多层感知器(MLP)为每个点进行独立预测。

通过组合低层特征和高层特征(边缘的点),在选定的点上构造组点特征。在细粒度特征方面,为了让PointRend呈现出精细的分割细节,为CN特征图中的每个产业链提供了特征向量,细粒度特征虽然可以解析细节,但也可存在两方面的不足,首先它不包含特定的区域信息,对于实例分割任务就可能存在在同一点上预测出不同的标签。用于细腻度的特征映射,可能包含相对较低级别的信息。这需要粗略分割预测图来进行补充,提供更多的全局背景,这是粗略coarse prediction就是粗略的预测图,然后将两个结合之后输出最后的预测结果。

  • 对这样的细分算法进行迭代,以从粗到细的方式计算mask

 

算法创新点

1.自适应细分通过计算与其近邻的值显著不同的位置,自适应的选择一组非均匀点,通过对不确定点的预测逐渐增加分辨率,来高效渲染高分辨率图像。

2.将细粒度特征与粗差预测结合。

 

从图中可以看出,7×7的影像边界非常模糊,然后他逐渐上采样之后选择点通过选择点,然后选择这种边缘区域的点,高频的区域的点,最后的结果是224×240影像,这个边界就非常清晰。

算法在推断的时候,用的点是自适应细分,该技术通过计算与其均匀点显出不同的位置,来高效渲染高分辨率图像。在训练过程中,还需要选择点来构建训练PointRend的所需的组点特征,原则上点选的策略类似于推断使用的细分策略,但是细分策略的顺序步骤,对于反向传播训练神经网络不那么友好,因此训练过程中使用随机采样的非迭代策略。

前面讲到了细度特征虽然可以解决一些细节,但是也存在两方面的不足,首先它不包含特定的区域信息,对于实例分割任务可能存在于预测不同的标签,所以说这时候使用了粗糙预测进行补充,提供更多的全局背景。

 

实验结果

  1. 与先前方法对比

接下来是实验结果,上图是实例分割的结果,通过表格可以看出mask head添加了PointRend模块之后再COCO数据集上提高了,AP*提高了2.1,达到了39.7。在Cityscapes数据集上,AP提高了2.8,达到35.8

上图是语义分割的结果,Deeplab V3-OS引入PointRend模块之后,输出分辨率提高了,长宽各提高了16倍,mIoU提高了1.2,达到了78.4SemanticFPN引入了PointRend模块之后,分辨率长宽各提高了4倍,mIoU提高了0.9,达到了78.6

通文中其实还做了一些其他的实验,通过这两组实验可以看出PointRend模型提高了分割的精度,提高了模型的效率。

 

 

2.PointRend 在 COCO 数据集的结果

从图中可以看出手部更加清晰了,边缘也更加细致,人的手指都能很好的识别出来,比Mask R-CNN效果要更好。

 

3.PointRend 在 CD Skype数据集的实例分割结果

下图是Mask R-CNN加上4个卷积操作之后得到原始影像和Maskr加上PointRend模块之后得到的原始影像。可以看出这个分割的对象边缘更加丰富,不会导致过度平滑的问题。

下图可以看出这个 DeeplabV3加上PointRend,边界不会导致过度平滑。

 

 

代码复现

原则是先实现,再调优以达到论文要求。秉承“站在巨人肩膀上”的思想,我在论文的开源代码基础上进行调优。经过一些“小插曲”后,代码调通了,经过一些调优调整,特别是受论文启发(增加训练轮数和数据增广),在单卡和八卡训练下达到精度要求。


首先了解Modelarts环境

Modelarts是一个即开即用的在线开发环境。Modelarts集成了Jupyter notebook,可为大家提供在线交互式开发调试工具。大家可以通过创建开发环境,自行开发调试训练模型,在线环境为大家安装常用的机器学习引擎和软件库,实现即开即用。

然后模型部署的话,在Modelarts上训练好的模型,通过模型管理和服务部署功能,可以快速发布在线推理服务,实现高吞吐、低延时支持多模型的灰度发布。同时支持批量的推理任务,处理大数大批量数据推理时,高效分布式计算Modelarts提供了模型优化能力,使模型更好的匹配边缘设备与华为的HiLens结合,可将模型轻松部署到摄像头等端测试设备快速进行应用开发。

 

代码讲解

  1. PointRend中的get_uncertain_point_coords_on_gridpoint_sample

get_uncertain_point_coords_on_grid这个函数是用于得到不确定点。因为PointRend不会对输出网格上所有点进行预测,只会对部分不确定性较强的点进行预测。代码参考如下:

 

 

point_sample函数是根据点的位置来预测每个点的特征。就是通过一个差值操作来提供提取选中点的点集特征,并使用PointRendHead子网络根据组点特征来预测输出特征图。代码参考如下:

2.PointRend中的PointRendHead

PointRendHead就是标准的语义分割头,在得到每个点的特征之后,对每个不确定的点使用一个MLP来进行单独的细分预测。在训练的时候和预测的时候是有区别的,训练的时候通过粗糙预测计算出n个不确定的像素点,针对每个不确定的像素点得到的在精细预测和粗糙预测中对应的特征,组合 n个不稳定像素点对应的粗糙特征和好的特征,再通过MLP得到精准的预测。在预测的时候通过粗糙预测计算出拓扑n个不确定的像素点,针对每个不确定像素点在精细预测和粗糙预测中对应的特征组合n个不稳定像素点对应的坏特征和粗糙特征和好特征,再通过MLP得到更准确预测,逐步迭代,最后得到原始图片一致,实现端到端的预测。

 

如果大家有兴趣的话可以扫描下方二维码获取原文

 

本文整理自【内容共创系列】中秋月圆至,人间好时节——签约作者征集令,推荐/参与活动有奖

查看活动详情:https://bbs.huaweicloud.com/blogs/298594

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。