【达摩院OpenVI】开源CVPR快速实例分割FasInst模型

2023-11-04 07:50

本文主要是介绍【达摩院OpenVI】开源CVPR快速实例分割FasInst模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

团队模型、论文、博文、直播合集,点击此处浏览

一、论文&代码

论文:https://arxiv.org/abs/2303.08594

模型&代码:https://modelscope.cn/models/damo/cv_resnet50_fast-instance-segmentation_coco/summary

二、背景

        实例分割旨在分割图像中所有感兴趣的物体。传统的以mask rcnn [1]为代表的双阶段实例分割方案遵循先检测后分割的理念,尽管简单直观,但那些方法会生成大量的重复区域提议,从而引入大量冗余的计算。为了提高计算效率,许多建立在全卷积网络上的单阶段方法涌现,例如SOLO [2]等。 他们放弃了区域提议操作,端到端地一步到位实现物体种类预测和掩码生成。这类方法推理速度很快,在实际部署时很有吸引力。然而,由于这些基于全卷积的单阶段方案仍采用密集预测的方式,他们仍然避免不开繁重的手工设计后处理步骤,例如非最大抑制等。

        最近,随着 DETR [3]在目标检测方面的成功,基于查询的单阶段实例分割方法应运而生。这类方法利用通用且强大的注意力机制,结合一系列可学习的查询来推断目标物体种类和分割掩码。例如,Mask2Former [4]简化了图像分割的工作流程,通过在主干之上添加像素解码器和带掩码的Transformer解码器来进行分割。 与以往的方法不同,Mask2Former 不需要额外设计的手工组件,例如训练目标分配器和 NMS 后处理。 虽然结构优雅,但Mask2Former 有其自身的问题:(1)它需要大量的解码器层来解码目标查询,因为它的查询是静态的,需要一个漫长的过程来迭代改进; (2) 它依赖繁重的像素解码器结构,因为它的目标分割掩码的特征直接来源于该像素解码器输出,这些输出被用作区分不同目标的特征嵌入; (3) 它使用的带掩码的交叉注意力层限制了每个query的感受野,可能导致transformer解码器陷入局部次优的query更新过程。

        虽然 Mask2Former 取得了出色的性能,但其在快速、高效的实例分割方面的优势还没有得到很好的证实,而这些优势对于许多现实世界的应用(例如自动驾驶和机器人技术等)至关重要。 事实上,由于先验知识的缺乏和昂贵的计算代价,基于查询的模型的效率普遍不尽如人意。高效实时实例分割基准仍然由经典的基于卷积的模型主导 [5]。

二、方法

在本文中,我们通过提出 FastInst 来填补基于查询的模型速度优势欠缺这一空白。FastInst 是一种简洁有效的基于查询的实时实例分割框架。 我们证明了基于查询的模型可以在保持快速的情况下在实例分割任务上取得出色的性能,在高效的实例分割算法设计方面展示出巨大潜力。 例如,我们设计的使用 ResNet-50 主干的最快的基于查询的模型在 COCO test-dev 上以 53.8 FPS(每秒帧数,单个 V100 GPU)的速度实现了 35.6 AP(参见上图); 此外,我们最好的权衡模型可以以 32.5 FPS 的实时速度执行,同时产生超过 40(即 40.5)的 AP,据我们所知,在相同设置下,这在以往方法中从未达到过。

具体来说,FastInst 遵循 Mask2Former 的元架构。 为了实现高效的实时实例分割,FastInst 引入了三个关键模块:

(1)基于实例激活引导的查询。FastInst 使用从像素解码器中动态选择具有高语义的像素嵌入作为Transformer 解码器的初始查询。与静态可学习查询相比,这些选择的动态查询包含丰富的潜在对象嵌入信息,减少了 Transformer 解码器的迭代更新负担。具体来说,FastInst 首先在像素解码器输出后接上一个辅助分类头,该辅助分类头预测每个像素归属于每个类别的概率 ,其中 是像素位置, 是类别下标。在推理时,首先确定每个像素归属的类别 ,然后选取 较大的那些位置的特征。为了避免冗余特征的选取,这里我们引入一个局部极大值选取法,即首先选取 是那些在相应通道上是极大值的点,即 ,这里 是位置 的 8 邻域下标集合,再选取 最大的那些点。在推理时,FastInst 采用匈牙利匹配为每个实例分配激活目标点。为了使每个实例都有正确的激活点而不会被其他位置具有相似语义的点所激活,FastInst 在分配目标时引入一个location cost。该location cost背后的直觉是只有落在对象内部的像素点才有理由推理出该对象的类别和掩码嵌入。同时,该location cost也减小了匹配空间,加快模型训练收敛。

(2)双路径Transformer解码器结构。FastInst 在Transformer解码器中采用双路径更新策略。如上结构图所示,一个 Transformer 解码器层包含一个像素特征更新层和一个查询更新层。 整个过程就像一个 EM 聚类算法。E步:根据所属的中心(即查询)更新像素特征; M 步:更新聚类中心(查询)。与传统的单路径更新策略相比,双路径更新策略同时优化了像素特征和查询,减少了对繁重像素解码器的依赖,获得了更细粒度的特征嵌入。

(3) GT掩码引导的Transformer解码器学习。在Mask2Former中,作者证实了在Transformer解码器中使用带有预测掩码的交叉注意力层可以提高模型分割性能。虽然这种带有预测掩码的交叉注意力层引入了稀疏先验知识,加快了模型收敛,提升了性能,但它限制了每个查询的感受野,这可能导致Transformer解码器陷入局部次优的查询更新过程。为了缓解这个问题,FastInst 引入了GT 掩码引导的学习。具体而言,FastInst使用最后一个解码器层的每个查询所匹配到的GT 掩码来替换前面每一解码器层中使用的带有前一层预测掩码的交叉注意力层中的预测掩码。对于在最后一层不匹配任何实例的查询,则不替换转而使用标准的交叉注意力。然后,FastInst使用替换过后的的交叉注意力层以及原来每个 Transformer 解码器层的输出作为输入再次前向传播每一个 Transformer 解码器层。 新的输出按照与最后一层相同的固定匹配进行监督。这种固定匹配保证了每个Transformer解码器层输出预测的一致性。同时通过这种引导学习,我们允许每个查询在训练期间看到其目标预测对象的整个区域,这有助于模型学习到更合理的带有掩码的交叉注意力区域。

通过这些模块,FastInst 获得了既快又好的性能。在COCO基准上,相同实验设置下,FastInst 超越了以往大多数实时实例分割算法。

三、实验结果

1. 消融实验

(1)基于实例激活引导的查询

(2)双路径Transformer解码器结构

(3)GT掩码引导的Transformer解码器学习

2. SOTA对比

3. 效果展示

4. 拓展实验

FastInst也适用于一般图像分割任务,包括语义分割和全景分割。

四、参考文献

[1] Kaiming He, Georgia Gkioxari, Piotr Dollar, and Ross Gir- ´ shick. Mask R-CNN. In ICCV, 2017.

[2] Xinlong Wang, Tao Kong, Chunhua Shen, Yuning Jiang, and Lei Li. SOLO: Segmenting objects by locations. In ECCV, 2020.

[3] Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, and Sergey Zagoruyko. End-toend object detection with transformers. In ECCV, 2020.

[4] Bowen Cheng, Ishan Misra, Alexander G. Schwing, Alexander Kirillov, and Rohit Girdhar. Masked-attention mask transformer for universal image segmentation. In CVPR, 2022.

[5] Tianheng Cheng, Xinggang Wang, Shaoyu Chen, Wenqiang Zhang, Qian Zhang, Chang Huang, Zhaoxiang Zhang, and Wenyu Liu. Sparse instance activation for real-time instance segmentation. In CVPR, 2022.

五、其他开源

        另外给大家介绍下CV域上的开源免费模型,欢迎大家体验、下载(大部分手机端即可体验):

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_ddsar_face-detection_iclr23-damofd/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_resnet50_face-detection_retinaface/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_resnet101_face-detection_cvpr22papermogface/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_manual_face-detection_tinymog/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_manual_face-detection_ulfd/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_manual_face-detection_mtcnn/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_resnet_face-recognition_facemask/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_ir50_face-recognition_arcface/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_manual_face-liveness_flir/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_manual_face-liveness_flrgb/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_manual_facial-landmark-confidence_flcm/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_vgg19_facial-expression-recognition_fer/summary

ModelScope 魔搭社区https://modelscope.cn/models/damo/cv_resnet34_face-attribute-recognition_fairface/summary

这篇关于【达摩院OpenVI】开源CVPR快速实例分割FasInst模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/344323

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt