SAM-2全面来袭!可分割任意图像、视频,代码开源!

文摘   2024-12-10 23:13   四川  

  • 论文链接:https://ai.meta.com/research/publications/sam-2-segment-anything-in-images-and-videos/
  • 代码仓库:https://github.com/facebookresearch/segment-anything-2
  • 发表时间:2024.7.30

摘要

在SAM之上加入记忆模块,相比于SAM,SAM2有以下提升:

  • 支持任意长视频实时分割
  • 实现zero-shot泛化
  • 分割和追踪准确性提升
  • 解决遮挡问题

SAM2的核心思路是将图像视作单帧视频

  • 从SAM直接扩展至视频领域,同时支持图像和视频输入。
  • 处理视频唯一的区别在于,模型需要依赖内存来回忆处理过的信息,以便在当前时间步长上准确分割对象。

进行交互式分割的过程主要分为两步:选择和细化

  • 在第一帧中,用户通过点击来选择目标对象,SAM2根据点击自动将分割传播到后续帧,形成时空掩码。
  • 如果SAM2在某些帧中丢失了目标对象,用户可以通过在新一帧中提供额外的提示来进行校正。
  • 如果在第三帧中需要需要恢复对象,只需在该帧中点击即可。

方法

PVS task

Promptable Visual Segmentation (PVS) task :提示视觉分割任务

  • 把静态的图像分割任务扩展到动态的多帧图像即视频分割任务
  • PVS与静态图像和视频领域的多个任务相关。在图像上,SA任务可以被视为PVS的一个子集,其中视频被简化为单个帧。

模型结构

Image encoder

SAM2使用Hiera模型提取多尺度特征,一个基于MAE的特征提取网络(代码仓库:https://github.com/facebookresearch/hiera),可以尝试不同的预训练权重

Memory attention

将当前帧的特征与过去的帧特征和预测以及任何新的提示条件化。

  • 堆叠了L个transformer块,第一个块以当前帧的图像编码作为输入。
  • 每个块首先执行自注意力,然后是对存储在记忆库中的(有提示/无提示)帧的记忆和对象指针(见下文)进行交叉注意力
  • 随后是一个MLP。

也许可以用这个模块写(水)论文?:

【感觉在变化检测领域可以效仿这个Memory Attention,通过backbone提取多个(两个)时相特征之后,通过Memory Attention交互不同时相之间的特征】

【把这个模块直接用到雷达遥感的视频流里边好像也不是不行?】

核心代码如下:

  • forward_saforward_ca分别是self-attentioncross-attention

  • 与当前帧做SA,与记忆帧之间做CA,然后归一化、Dropout、残差连接等

  • 输入的tgt和memory分别对应当前帧和记忆帧,可以替换成当前时相和前后1个或N个时相

    def forward(
        self,
        tgt,
        memory,
        pos: Optional[Tensor] = None,
        query_pos: Optional[Tensor] = None,
        num_k_exclude_rope: int = 0,
    )
     -> torch.Tensor:


        # Self-Attn, Cross-Attn
        tgt = self._forward_sa(tgt, query_pos)
        tgt = self._forward_ca(tgt, memory, query_pos, pos, num_k_exclude_rope)
        # MLP
        tgt2 = self.norm3(tgt)
        tgt2 = self.linear2(self.dropout(self.activation(self.linear1(tgt2))))
        tgt = tgt + self.dropout3(tgt2)
        return tgt

Prompt encoder and mask decoder

  • 提示编码器:与SAM的相同,可以通过点击(正向或负向)、边界框或掩码来提示,以定义给定帧中对象的范围、
  • 解码器:设计在很大程度上遵循了SAM。堆叠了“双向”的transformer块,这些块更新提示和帧嵌入。

与SAM不同的是:

  • 在PVS任务中,有些帧可能不存在有效对象,为此增加了一个additional head来预测当前帧是否存在有效对象
  • 另一个区别是,SAM-2使用来自分层图像编码器的跳跃连接(绕过记忆注意力),以整合高分辨率信息用于掩码解码。

Memory encoder

用一个编码器获取记忆帧特征:

  • 使用卷积模块对输出掩码进行下采样,
  • 将其与图像编码器提供的未条件化的帧嵌入逐元素相加
  • 随后通过轻量级卷积层融合信息,从而生成记忆。

Memory bank

  • 记忆库通过维护FIFO队列,保留视频中目标对象的过去预测信息。它存储N个最近帧和M个提示帧的空间特征图。
  • 在VOS任务中,记忆库始终保留第一帧的记忆和最近N个未提示帧的记忆。此外,它还存储轻量级对象指针,用于表示目标对象的高级语义信息。
  • 模型在最近帧的记忆中嵌入时间位置信息,以表示短期对象运动,但不会在提示帧中嵌入,因为提示帧的训练信号较为稀疏且难以推广。

Training

模型在图像和视频数据上联合训练。

  • 采样8帧的序列,并随机选择最多2帧进行提示,概率性地接收基于训练期间的真实掩码和模型预测的纠正点击。
  • 训练任务是依次(并“交互式地”)预测真实掩码。

数据

三个阶段的数据标注:

阶段 1:每帧使用 SAM

使用 SAM 以每秒 6 帧的速度标注目标对象的掩码,此阶段不涉及任何跟踪模型来辅助掩码在其他帧中的时间传播。

在 1.4K 视频中收集了 16K 个掩码。

阶段 2:SAM + SAM 2 Mask

引入 SAM 2, 仅接受掩码作为提示(SAM 2 Mask)。在第一帧生成空间掩码,然后使用 SAM 2 Mask 将标注的掩码传播到其他帧,以获得完整的时空掩码。

收集了 63.5K 个掩码。

阶段 3:SAM 2

使用功能全面的 SAM 2,接受包括点和掩码在内的各种提示。使用收集的标注数据重新训练和更新 SAM 2

收集了 197.0K 个掩码。

SA-V dataset

SA-V数据集是迄今为止最大的视频分割数据集,包含3550万个掩码,覆盖50900个视频。这是现有视频分割数据集中掩码数量的53倍。

实验

视频任务

图像任务

结论

本文提出SAM-2:

  • (i) 将可提示的分割任务扩展到视频领域
  • (ii) 为SAM架构配备在应用于视频时使用记忆的能力,
  • (iii) 多样化的SA-V数据集,用于训练和视频分割的基准测试。

缺陷:

  • 模型可能无法在镜头切换中分割对象,并且在拥挤的场景中、长时间遮挡后或在较长视频中可能会丢失或混淆对象的跟踪。
  • 另一个具有挑战性的场景是当附近有外观相似的物体时(例如,多个相同的杂耍球)。如果将更明确的运动建模纳入SAM 2可以减少这类情况下的错误。

GEE遥感训练营
分享GEE遥感领域实用教程、最新科研成果及资讯,交流、合作等事宜请加V:GeeStudy_2020
 最新文章