论文链接: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_sa和forward_ca分别是self-attention和cross-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可以减少这类情况下的错误。