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 幀。

如果你有來自更早版本的按幀索引的影片標註,它們在任何一次跳轉之後都可能整體偏移一幀。

相關內容