• 作者:老汪软件技巧
  • 发表时间:2024-09-07 21:02
  • 浏览量:

导读

Segment Anything 的初次发布受到了广泛赞誉,在 ICCV 2023 上获得了荣誉提名,并吸引了行业领袖和学术界的关注。在此基础上,Meta 现推出了 Segment Anything 2,该模型进一步提高了图像分割的精度,并将其功能扩展到视频识别。

在本指南中,我们将探索 Segment Anything 2 的新特性,这些特性现已无缝集成到 X-AnyLabeling 生态系统中。现在,所有使用 X-AnyLabeling 的小伙伴都可以轻松地使用 SAM2 来构建强大的计算机视觉流程。

Segment Anything 2

简介

Segment Anything Model 2,简称SAM 2,这是一个用于图像和视频中交互式实例分割的基础模型。它基于带有streaming memory的 Transformer 架构构成,以支持实时视频处理。SAM 2 是第一个版本的 SAM 向视频领域的泛化,它可以逐帧处理视频,并使用一个记忆注意力模块来关注目标对象的前一记忆。当 SAM 2 应用于图像时,内存为空,其模型的整个行为便退化到常规的 SAM。

与 Segment Anything 的第一个版本不同,SAM 2 解码器使用的帧嵌入是基于过去预测的记忆和提示帧(注意这里并不是直接从图像解码器获取的)。记忆编码器根据当前预测创建帧的“记忆”,这些“记忆”存储在模型的记忆库中,以供后续帧使用。记忆注意力操作从图像编码器获取每帧嵌入,并将其条件化于记忆库,以产生一个嵌入,然后这个嵌入被传递给掩码解码器。

架构图像编码器

Segment Anything 2 使用 Hiera 预训练的分层图像编码器——这种分层结构允许在解码过程中使用多尺度特征。同 SAM 一样,图像编码器在整个交互过程中只使用一次,以获取代表每个帧的特征嵌入。

Hiera: A Hierarchical Vision Transformer without the Bells-and-Whistles

Link: /abs/2306.00…

提示编码器和掩码解码器

SAM 2 的提示编码器与 SAM 的第一个版本的提示编码器相同。掩码解码器也与 SAM 的第一个版本相似,但具有一些特定功能。

原始的 SAM 假设在给定正面提示(positive prompt)的情况下总是有一个有效的对象可以进行分割,但新版本的 SAM 也支持可提示的视频分割任务——在这个任务中,目标对象可能不会出现在某些帧上。为了处理这类特殊情况,增加了一个额外的 Head 来预测目标对象是否存在于当前帧上。新的掩码解码器还使用了来自分层图像编码器的Skip Connection——这对于获取高精度掩码解码所需的高分辨率上下文信息是必要的。

记忆编码器

记忆编码器通过卷积模块对输出掩码进行下采样,并将其与图像编码器的帧嵌入进行逐元素相加。轻量级的卷积层用于信息融合。

记忆库

记忆库用于存储关于目标对象先前预测的信息。记忆库采用FIFO(先进先出)队列来存储最多 N 个最近帧和 M 个提示帧的记忆——这两组记忆都以空间特征图的形式存储。除了这些空间特征图,记忆库还存储一个对象指针列表——这些是轻量级的向量,用于待分割对象的高级语义表示。这些向量是基于每帧的掩码解码器输出 Token 产生的。

记忆注意力

记忆注意力用于根据先前帧的特征加上新的提示来产生当前帧特征。堆叠了几个 Transformer 块,第一个块将当前帧的编码作为输入,每个块执行自注意力操作,并结合对存储在记忆库中的帧记忆的交叉注意力,之后便是多层感知器(MLP)。

实验训练细节

Segment Anything 2 是在图像和视频数据上联合训练的。交互式提示模拟的方式如下:采样 8 帧的序列,随机选择最多 2 帧进行提示,并概率性地接收纠正性点击(这些点击在训练过程中使用 GT 掩码和模型预测进行采样)。

初始提示有几个变体:

数据集

Segment Anything 2 是在 SA-V 数据集上训练的——该数据集包含约 51K 个视频,带有约 643K 个 masklets。为了确保相似对象的最小重叠,根据视频作者及其地理位置,将其分为训练集、验证集和测试集。此外,Meta 的内部数据集(约 63K 个视频)也被用于训练集的增强。

性能分析基于提示的图像分割任务

SAM 2 在 Segment Anything 任务上进行了评估,使用了 37 个零样本数据集(其中 23 个数据集之前由 SAM 用于评估)。

SAM 2 在没有使用任何额外数据的情况下,比 SAM 实现了更高的准确度(1 次点击时的 mIoU 为 58.9,而 SAM 为 58.1),并且速度快了 6 倍。论文中提到这主要归功于 SAM 2 中使用了高效轻量级的 Hiera 图像编码器。

基于提示的视频分割任务

可提示的视频对象分割假设生成初始帧的掩码并在其余帧上跟踪这些掩码。

对于这个任务,SAM 2 文献中描述有两种模式:

这些评估是在 9 个零样本视频数据集上进行的,每帧使用 3 次点击。

以往的可提示视频对象分割方法通常需要使用几个模型:一个模型用于初始帧标注,另一个模型用于掩码跟踪。举个大家比较熟悉的例子,例如SAM + XMem++或者SAM + Cutie。

而今天,SAM 2 的出现又仿佛将这个方向给 close 掉了。Segment Anything 2 在能够同时在初始帧上创建掩码并在其余帧上跟踪它们的情况下,性能已然超过多模型组合。

另外,我们再看下半监督 VOS 这一块。

半监督视频对象分割假设仅在序列的初始帧上使用现有的框、点击或掩码提示,并在序列的其余部分跟踪分割。SAM 2 的作者使用了点击提示,交互式地在第一个视频帧上采样了 1、3 或 5 次点击,然后基于这些点击跟踪对象。

可以看出,SAM2 在此任务上超越了现有的方法。半监督 VOS 的另一种变体是在第一帧上使用 GT Masks 作为提示。同样,SAM 2 的表现显著优于现有方法:

图像分割标注工具__视频图像标注标准

总体来说,可以看出 SAM 2 在交互式视频和图像分割方面的双重能力,这种能力来源于涵盖视频和跨视觉领域的静态图像的多样化训练数据。

X-AnyLabeling

X-AnyLabeling 是一款基于 AI 推理引擎和丰富功能特性于一体的强大辅助标注工具,其专注于实际应用,致力于为图像数据工程师提供工业级的一站式解决方案,可自动快速进行各种复杂任务的标定。具体介绍可访问下方:

/post/740730…

在正式开始之前,大家可以先按照官方手册把本地环境安装好:

在 X-AnyLabeling 中使用 SAM 2 的视频分割功能非常简单,只需三步:

前置准备运行程序

python3 anylabeling/app.py

加载模型

这里我们提供了以下四种不同的型号,你可以根据自己的硬件和需求选取合适的模型:

上述准测试实验是在“单个 A100 GPU 上使用 PyTorch 2.3.1 和 CUDA 12.1,在 bfloat16 的自动混合精度下”进行的。当然,模型越大,结果会精确,运行时间也会更长。

导入数据

你可以在本地选择一个视频文件(Ctrl+O)或切分好的图像帧文件夹(Ctrl+U)上传.

使用教程添加提示

对于初始帧,您可以添加如正点、负点和矩形(标记)等提示来指导所需对象的跟踪。请按照以下步骤操作:

a. 在初始帧上,使用正点、负点和矩形等标记来指定您希望模型跟踪的对象。

b. 添加标记后,SAM 2 模型将根据这些提示生成分割结果。

c. 如果分割结果符合您的预期,请点击屏幕顶部的“完成对象(f)”按钮或按“f”键来确认对象。

d. 如果分割结果不符合预期,点击“清除(b)”按钮或按“b”键快速清除任何无效标记。

e. 我们强烈建议按照顺序为每个添加的目标分配标签,如 object0, object1, ..., objectN。

通过这种方式,您可以有效地引导 SAM 2 模型准确地跟踪和分割视频中的对象。正确地标记和确认对象将有助于提高后续帧的分割质量。

请注意!⚠️ 如果您需要删除已经被确认过的对象,请按照以下步骤操作:

a. 打开编辑模式(Ctrl + J),右侧标签烂选中所有目标并从当前帧中移除所有已添加的对象;❌

b. 点击屏幕顶部的“重置跟踪器”按钮,以重置跟踪器 ;

c. 重新按照上述描述添加提示(标记)✔️。

另外,如果您只想设置目标检测跟踪,只需将输出模式设置为矩形框或者选择框即可:

开启追踪

设置好提示后,您可以通过点击左侧菜单的视频开始按钮或使用快捷键 Ctrl+M 来启动视频跟踪,从而在整个视频中获取轨迹片段:

这里,为了进一步细化视频跟踪器,如果在运行过程中或结束时出现以下情况:

你完全可以在任意中间帧上参考以下步骤实施:

a. 打开编辑模式(Ctrl + J),右侧标签烂选中所有目标并从当前帧中移除所有已添加的对象;❌

b. 点击屏幕顶部的“重置跟踪器”按钮,以重置跟踪器 ;

c. 重新按照上述描述添加提示(标记)✔️。

完成确认

在所有任务完成后,可以通过点击顶部菜单中的"工具" -> "标签管理器"选项来设置特定的类别名称:

恭喜你! 现在你已经熟练掌握了 X-AnyLabeling 的核心操作。随意在你的视频素材上探索各种应用场景,尽情发挥吧!

项目地址:/CVHub520/X-…

图文教程:/CVHub520/X-…

视频教程:…

写在最后