视频跟踪与掩码传播
在一帧上画好掩码,SAM 2 便会让对象贯穿整段视频;实测逐帧 IoU 为 0.974 至 0.979 且不衰减。该功能有意运行在服务端。
在一帧上画好掩码,按下"向前跟踪",SAM 2 就会让该对象贯穿其后的各帧,每一帧结果都会作为关键帧出现,可供你逐帧查看与修正。 对照已知基准实测,逐帧 IoU 从第一帧到最后一帧稳定在 0.974 至 0.979,没有衰减。
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 帧。
如果你有来自更早版本的按帧索引的视频标注,它们在任何一次跳转之后都可能整体偏移一帧。