Skip to content

视频跟踪与掩码传播

在一帧上画好掩码,SAM 2 便会让对象贯穿整段视频;实测逐帧 IoU 为 0.974 至 0.979 且不衰减。该功能有意运行在服务端。

在一帧上画好掩码,按下"向前跟踪",SAM 2 就会让该对象贯穿其后的各帧,每一帧结果都会作为关键帧出现,可供你逐帧查看与修正。 对照已知基准实测,逐帧 IoU 从第一帧到最后一帧稳定在 0.974 至 0.979,没有衰减

yaml
annotation_schemes:
  - annotation_type: video_annotation
    name: tracks
    description: "Draw the object once, then press Track forward."
    source_field: video_url
    mode: tracking
    labels:
      - {name: subject, color: "#d1495b"}
    tracking_options:
      interpolation: linear
      auto_advance_frames: 5
    video_fps: 12
    show_timecode: true
    frame_stepping: true

可运行示例:examples/video/mask-propagation/

这一项运行在服务端

传播使用的是带记忆模块的 SAM 2(记忆库排序、重复填充、时序编码、对象指针分块),而不是对每一帧独立地重新提示。

运行在服务端,且是有意为之。它的开销按帧计而非按提示计,模型体积为 181 MB、分布在五张计算图中,而视频本来就在服务端。在浏览器标签页中跑上一百帧,意味着界面要冻结好几分钟。CPU 上大约每帧 1.32 秒,GPU 上更快。

Potato 另有一条更轻量的浏览器内延续路径,它是逐帧重新提示的。两者是不同的东西,不宜混为一谈:无论哪一种,该能力在免费、可自托管的产品中都可用,但基于记忆模块的传播是服务端那一条。

遮挡是被回答的,而不是被猜测的

模型会自行判断对象何时被遮挡,并返回一个空帧,而不是给出猜测。这正是修正过程中你想要的行为:在被遮挡的帧上猜出来的掩码要花功夫撤销,而一个看似合理却错误的掩码,比一个显眼的空缺更糟。

插值帧上的掩码是保持不变而非做混合的,并且被保持的帧会在时间轴上标出。诚实的呈现胜过平滑但错误的呈现。

管状轨迹与多边形插值

除掩码传播外,Potato 还通过弧长重采样加旋转对齐来对多边形轨迹做插值。这处理了朴素插值会做错的两种情况:关键帧之间顶点数不同,以及同一形状的描画起点不同。

一个值得知道的帧索引缺陷

在 2.8 之前的每一个版本中,getCurrentFrame 在每次跳转之后、对每一段视频都会偏差一帧。HTML 视频报告的 currentTime 被截断到小数点后六位,因此 12 fps 视频的第 14 帧会被读成第 13 帧。

如果你有来自更早版本的按帧索引的视频标注,它们在任何一次跳转之后都可能整体偏移一帧。

相关内容