Skip to content

如何標註影片目標跟蹤

藉助模型輔助的掩碼傳播在整段影片中跟蹤一個物件,誠實地處理遮擋,並用容差掃描來衡量時間一致性。

跟蹤標註意味著在多幀之間標註同一個物件,而昂貴的部分不是第一份掩碼,而是隨後的數百份。 模型輔助的傳播能消除其中大部分工作——前提是模型對"何時跟丟了"足夠誠實。

工作流程

  1. 在某一幀上給物件畫掩碼。
  2. 向前傳播。每個結果都會作為關鍵幀出現。
  3. 逐幀檢視關鍵幀,在掩碼漂移處做修正。修正某一幀會從該點起重新錨定整條軌跡。
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
    frame_stepping: true

遇到遮擋應當什麼都不返回

在標註閉環中,傳播模型最有用的一項性質,就是當物件被遮擋時它會拒答,返回一個空幀而不是它的最佳猜測。

在被遮擋的幀上給出一個看似合理卻錯誤的掩碼,比留空更糟:標註者得先注意到它、判定它是錯的、再把它刪掉。而空幀可以被立刻讀作"這裡看不到該物件",這同時也正是正確的標籤。

SAM 2 做到了這一點,而正是它的記憶模組讓傳播能夠跨越遮擋繼續成立,而不是在遮擋的另一側把物件跟丟。對照已知基準實測,逐幀 IoU 在整個序列上穩定在 0.974 至 0.979,沒有衰減。

保持不變 vs. 混合插值

在關鍵幀之間的幀上,掩碼要麼是保持不變的(沿用上一個關鍵幀),要麼是混合插值出來的。保持不變是誠實的選擇,並且被保持的幀應當在視覺上標出。

混合出來的掩碼看起來更平滑,而它錯得沒人看得出來。如果下游確實需要插值後的幾何,請在匯出時插值——在那裡它是一次被宣告過的變換——而不要在介面裡插值,那裡它是隱形的。

多邊形插值比看上去更難

在兩個多邊形關鍵幀之間插值,會在兩個地方讓樸素實現出錯:

  • 兩個關鍵幀可能頂點數不同
  • 標註者可能是從形狀上不同的起點開始描的。

弧長重取樣加旋轉對齊能同時處理這兩點。沒有它,插值出來的多邊形可能在關鍵幀之間翻轉成自交形狀。

傳播應當在哪裡執行

如果模型帶有記憶模組,就應當在服務端。它的開銷按幀計而非按提示計,而在瀏覽器標籤頁中跑上一百幀影片模型,意味著介面要凍結好幾分鐘。逐幀重新提示的瀏覽器內延續是另一種更輕的東西——它有用,但不是同一種能力,在你自己的文件中也值得不要混為一談。

衡量一致性

兩位標註者不會為同一個事件邊界選中同一幀,因此時間一致性取決於匹配容差。請報告掃描曲線,而不是單一閾值:

  • 在 2 秒下高、在 0.25 秒下低:他們認同發生了某個事件,但對具體時點看法不一。通常是規範問題。
  • 兩者都低:他們對事件是否發生本身存在分歧。

至於掩碼本身,請按幀使用掩碼一致性那一套機制。

一個值得在你自己的工具中排查的缺陷

HTML 影片報告的 currentTime 被截斷到小數點後六位。用樸素的"乘法加下取整"把它換算成幀索引,會在每次跳轉之後產生一幀偏差:12 fps 影片的第 14 幀會被讀成第 13 幀。

在 2.8 之前,這個問題在 Potato 中是真實存在的,且影響每一位標註者、每一段影片。如果你手上有來自任何工具的按幀索引的影片標註,都值得拿一個已知幀來核驗一下。

延伸閱讀