如何標註影片目標跟蹤
藉助模型輔助的掩碼傳播在整段影片中跟蹤一個物件,誠實地處理遮擋,並用容差掃描來衡量時間一致性。
跟蹤標註意味著在多幀之間標註同一個物件,而昂貴的部分不是第一份掩碼,而是隨後的數百份。 模型輔助的傳播能消除其中大部分工作——前提是模型對"何時跟丟了"足夠誠實。
工作流程
- 在某一幀上給物件畫掩碼。
- 向前傳播。每個結果都會作為關鍵幀出現。
- 逐幀檢視關鍵幀,在掩碼漂移處做修正。修正某一幀會從該點起重新錨定整條軌跡。
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 中是真實存在的,且影響每一位標註者、每一段影片。如果你手上有來自任何工具的按幀索引的影片標註,都值得拿一個已知幀來核驗一下。