iT邦幫忙

2026 iThome 鐵人賽

DAY 16
0
佛心分享-IT 人技術創業

Berry AI:從零開始打造全美第一的得來速 Vision AI系列 第 16 篇

從 SAM2 到 DINOv2:得來速 Vision AI 如何自動標註車輛旅程

  • 分享至 

  • xImage
  •  

Day 11 的「一間店準,不等於一百間店都準」裡,我留了一個伏筆:

怎麼知道夠準? 要回答「這間店是否滿足上線標準」,需要有標註可以比對。

昨天 Day 15 介紹了演算法調校平台,怎麼把調校任務交出去、讓上線時程縮短。今天講「準」:我們怎麼用車輛旅程生成器自動產生標註。它跟線上的得來速系統不同,沒有即時的延遲限制,所以我們可以在產生標註上投入更多資源與算力,用比線上產品更複雜的演算法換取準確度。

原本的做法

衡量車輛這套系統準不準,得先有一份標註:上線前準備一定數量的樣本,每筆樣本記錄車輛在各個狀態的時間戳記 — 標註的單位是一條軌跡,所以我們稱它為 track-wise ground truth。

過去這份答案怎麼來?人工標註。

我們會請標註員把影片一段一段看過,把每一台車在排隊、點餐、等餐、取餐各階段的時間戳記標出來。然後拿這份答案跟演算法跑出來的結果比對,算每個狀態的準確度,確認有沒有過門檻。

人工標註有兩個問題:

第一,耗時。 標一小時的影片要花多久?內部統計下來,平均至少 3 個人力小時。

第二,人會累。 標註員不是 24 小時都在工作,連續看好幾個小時得來速的影片,任何人的標註品質都會下降。如果標註錯誤,在演算法調校工具上,反而要花很多時間反覆驗證標註:到底是演算法的問題,還是那天標註品質的問題?

只要標註還是靠人工生產,我們的天花板就永遠被綁在人力上。 因此我們決定自己做一套車輛旅程生成器。

演算法架構

我們把這個任務拆成三個小題目:

  • 單相機追蹤
  • 跨相機整合
  • 結果品質驗證

單相機追蹤:使用 SOTA 模型推論

做這題的契機,是看到近年 SAM (Segment Anything Model) 這類視覺模型在各種資料集上都拿下最好的成績。所以任務初期,我們直接拿 SAM2 當演算法核心做車輛追蹤。這套做法在簡單的場域下準確率很好,但一到複雜場域 (車子頻繁遮擋、交錯),mask 就追不動了。原因是 SAM2 做單相機追蹤時得把片段結果整合起來,而片段匹配只有 mask 資訊可用;遮擋一發生,被截斷 (truncated) 的 mask 很難對得上,就會發生 ID switch,也就是同一台車的編號中途被換掉。

為了解決這個問題,我們回頭用追蹤的經典做法 TBD (tracking-by-detection)。公司現有的 Detector 是用完整車身框 (full box) 的標註資料訓練的,車子被擋住時也能推估被擋住的那一段。此外,我們還更貪心地想用上 SAM2 提供的 mask 資訊,因此參考了 McByte (論文、程式碼),改以 detection 為主、mask 為輔的方式做推論。

一句話總結演算法架構:簡單的情境用 ByteTrack 追蹤就夠,只在有需要時才把 mask 的資訊拿出來用。

McByte 演算法架構圖:Kalman filter 預測的軌跡片段外框與 detector 的偵測框先做 IoU 匹配,mask temporal propagator 產生的 mask 只在 Hungarian matching 前提供額外證據

(圖片來源:McByte 論文)

什麼時候叫 mask 出來幫忙?有兩種情況:

  • Ambiguity:一台正在追蹤的車,同時對到好幾個偵測框;或者好幾台車同時對到同一個框。
  • Isolation:沒有遇到 Ambiguity,但一對一配對時,IoU (Intersection over Union) 不夠高。

遇到這兩種情況,才會把 mask 拿出來檢查。先定義兩個數字 mc 與 mf,用來衡量軌跡片段 (tracklet) 的 mask 跟偵測框重疊得好不好,兩者都以像素數計算、範圍都在 0 到 1 之間:

McByte 的 mc / mf 定義與兩種情境處理:(a) 四種 mask 與外框重疊情況下的 mc、mf 值;(b) Ambiguity handling 與 Isolation handling 分別如何調整 cost matrix

(圖片來源:McByte 論文)

接著檢查四個條件:

  1. mask 真的出現在畫面上:車子有可能被完全遮住,這一幀 propagator (把 mask 沿時間往後傳的模組) 根本吐不出 mask,就沒有東西可以用。
  2. mask 的信心分數夠高:把指派給這條軌跡片段的 mask 上所有像素的信心機率平均起來,要高過設定的門檻。
  3. mf 夠高:mf 太低代表 mask 可能是雜訊,或根本是從另一條軌跡片段跑過來的。但門檻不能設太嚴,因為車子被部分遮擋時,mask 本來就只蓋得到看得見的那一小塊。
  4. mc 夠高:mask 應該幾乎整片都落在這個框裡。不過偵測框本身偶爾會抓歪,所以允許 mc 稍微小於 1,不強求剛好等於 1。

滿足這四個條件後,演算法才會把 mf 值放進 Cost Function 內。

McByte 的 cost function:滿足條件 (1)–(4) 時,IoU cost 會再減去 mf 值,否則維持原本的 IoU cost

(圖片來源:McByte 論文)

這個設計的好處是:用 TBD 做法的同時,我們也保留了 SAM2 提供的 mask 證據。而且 mask 只是輔助,車子形狀變化造成的 mask 抖動不太會汙染追蹤結果。

跨相機整合:把每一段接成一趟旅程

單相機的軌跡再準,也只是「某一支相機裡的某一台車」。我們要的是同一台車的完整旅程。一間店有五到十支相機,一趟旅程就要跨好幾次相機,每一次交接都得接對。

「點餐」跟「取餐」通常在一支相機裡就能判定,斷一段不影響;但「排隊」跟「等餐」會橫跨多支相機,每一次交接都得匹配成功。整條鏈是連乘的 — 只要其中一段失敗,其他段全對也一樣整趟作廢。

這個任務分兩個面向:車輛的特徵向量 (embedding) 怎麼取 (接下來的一、二),以及 跨相機配對怎麼設計 (接下來的三)。

一、為什麼 SAM2 的特徵不適合當車輛的外觀特徵 (representation)?

一開始我們是直接沿用 SAM2 image encoder 的特徵當作 ReID (跨相機重新識別同一台車) 的依據,畢竟 mask 都產生了,特徵也很方便就能拿到。但實驗發現這組特徵效果並不好,原因出在:SAM2 訓練時的下游任務並沒有真正學習外觀。

  • SAM2 的 loss 沒有要求「同一個物件外觀要靠近」。 SAM2 的 encoder 是用 MAE 加上 mask decoding 訓練的,loss 只要求「特徵能被 decoder 解成 mask」,也就是 SAM2 的學習內容比較偏向「哪裡有邊界、哪裡屬於同一個 region」。整個訓練過程沒有任何 instance-discriminative 的訊號。對 segmentation 來說,A 車跟 B 車都是「長得像一台完整物件的車」就已經夠用了;但 ReID 真正要的是 A ≠ B 的證據。
  • Positional embedding 也會干擾結果。 同一台車出現在畫面的不同位置,產出的特徵就會不同。而跨相機恰恰就是位置完全不同的情況,等於在特徵向量裡混進了跟身分無關的雜訊。

所以我們換掉了特徵來源,改用 DINOv2。

比起 SAM2,DINOv2 的訓練目標剛好就在學我們要的東西。它是自監督的 teacher / student 架構 (teacher 為 student 的 EMA),同時使用三種 loss:

  • DINO loss (image-level):同一張圖的不同 view,整體 semantic 要一致,把全局特徵 (global representation) 拉在一起。
  • iBOT loss (patch-level):將 student 的部分 patch 遮住,要靠周圍 context 還原出 teacher 在該位置的特徵,學的是 local semantics。
  • KoLeo loss:讓同一個 batch 裡不同圖片的 CLS token 分散,概念上像沒有標籤的 triplet loss,目的就是不要讓所有特徵擠成一團。

實際取特徵向量的流程是:拿偵測框把車子連同周圍一點環境裁出來,用 SAM2 的 mask 把背景壓掉,丟進 DINOv2,再把 CLS token (整體 semantic) 跟 patch token (車體細節) 接成一個向量。

二、一條軌跡保留多個代表視角

我們的場域還有一個要特別處理的情境:一台車進來看到車頭、經過看到側面、離開看到車尾,如果把整條軌跡的特徵向量取平均當代表,得到的可能是一個誰都不像的向量。

所以一條軌跡不會只留一個向量。我們把同一個 ID 的特徵向量先做分群,每群留一個代表 (取 medoid 而非平均,避免被離群值拉走);跨相機比對時用集合對集合 (set-to-set matching) 的方式比,讓下游相機看到的車尾去對上游相機的車尾。信心分數太差的 mask 不會進入分群。

三、跨相機配對

跨相機配對靠三樣東西做決定:相機排序、時間限制、外觀距離。相機排序決定哪兩支相機之間需要配對,時間跟外觀決定這兩台車是不是同一台。

配對分成兩步:

第一步:修復單相機內斷掉的軌跡 (broken track)。

在跨相機配對之前,會先把單相機內部斷掉的軌跡修好。這裡參考 GTA (Global Tracklet Association) 的概念:它不動前面的 tracker,而是在追蹤跑完之後,對軌跡片段重新匹配一次,分成兩半:

  • Splitter:用 DBSCAN 對同一條軌跡片段內的特徵向量分群,把它拆開。
  • Connector:用軌跡片段之間的平均餘弦距離 (cosine distance),反覆把同一個身分的片段合併起來。

GTA 的 Splitter:把一條軌跡的每一幀丟進 ReID 模型取特徵,再對這些軌跡片段特徵分群,把混進兩個身分的軌跡拆成兩條

GTA 的 Connector:對所有軌跡片段取特徵後算 N × N 的距離矩陣,反覆合併距離最近的一對並更新特徵,過程中套用空間限制 (spatial constraints)

(圖片來源:GTA 論文)

我們只用 Connector 這一半,再補上得來速特有的幾何限制。兩段軌跡片段要能接起來,必須同時滿足:

  • 時間完全不重疊:兩段只要共用到任何一幀,就代表畫面上同時有兩台車,不是同一台車斷掉。
  • 間隔不能太久:斷太久的話,多半已經是別台車了。
  • 最小距離不能太遠:兩段之間的距離有上限。
  • 外觀夠像:同一支相機、相隔幾秒的同一台車,外觀本來就該幾乎一樣。

為什麼要多加幾何限制,而不是像 GTA 一樣純靠外觀?因為 GTA 的場域是球場,球員能自由移動、離場再回來,外觀幾乎是唯一線索;得來速的車被車道綁死,方向是確定的。這個先驗剛好能分辨「同一台車斷掉」跟「下一台車開到同一個位置」 — 同款同色的車太多,純看外觀很難分。

第二步:相鄰相機之間建立 Cost Matrix。

Cost Function 由三個部分構成:

  • 時間 threshold:一台車最多能在兩個視野之間消失多久。
  • Representation Distance:兩台車的外觀特徵差多少。
  • Weak evidence penalty:太短、證據太少的軌跡會加上懲罰項。

結果品質驗證:怎麼驗證標註?

車輛旅程生成器產生的軌跡會再丟進旅程 (journey) 演算法 (類似 Day 14 介紹的狀態機做法),得到每台車的旅程,這份旅程資料就是我們要的標註。但在相信它之前,得先回答:憑什麼要相信它?

我們的做法是找幾個只看產出的旅程、完全不需要預標註的指標,當作上線前的品質關卡 (Quality Gate)。我們以其中的兩個指標做說明:

指標 條件
p_no_o 有取餐、卻完全沒有點餐階段的旅程佔比
o_no_p 反過來,有點餐卻沒有取餐的佔比

p_no_o 的道理很簡單:幾乎每一台開到窗口取餐的車,都應該在某個地方點過餐。 所以這個比例一高,多半就是跨相機配對把車接丟了。

o_no_p 是 p_no_o 的鏡像。雖然車子確實可能點完餐就直接開走,但如果一間店的取餐相機偵測率偏低,這個指標也會長期偏高。

持續優化

車輛旅程生成器現在還有兩件事沒做完。

1. 部署到更多店做演算法驗證
車道配置、相機角度、車流量,每一間店都不一樣,目前驗證過的場域還是太少。接下來會把生成器跑更多店驗證,一方面確認演算法在各種場域撐不撐得住,一方面也需要足夠的數據決定品質關卡的門檻該訂在哪。

2. 訓練自己的 ReID 模型
DINOv2 是通用模型,沒看過得來速,也沒有針對 ReID 任務 做過訓練,我們只是拿它的泛用特徵來用。之後會用得來速場域的資料訓練一個專門的 ReID 模型,把跨相機配對的天花板再往上抬。

小結

車輛旅程生成器做的事,是把「產生標註」從人力密集轉換成算力密集。一旦做好,我們能做到:

  • 不用再為每一間新店標大量影片 (原本一小時影片要 3 個人力小時)。
  • 沒有標註員疲勞造成的品質變異。
  • 未來調校可以自動化,因為演算法自己就能用這些指標回答「這樣調到底有沒有比較好」。

車輛旅程生成器給的是離線、上線前、可以慢慢算的標註。但上線之後,不可能每一天、每一間店都生一份標註。這時候就會輪到 ALI / ALO 上場,在沒有標註的情況下統計錯誤案例,把「這間店今天準不準」變成一個能監控的數字。前面幾個品質關卡,其實就是這個想法的雛形。

介紹完車輛旅程生成器,ML Team 的第三塊也就補齊了。剩下的最後一塊拼圖,就留到 Day 17 的 ALI / ALO。

參考資料

單相機追蹤

車輛外觀特徵 (ReID)

跨相機整合


本系列由 Berry AI 工程團隊出品。更多工程實戰紀錄都在 Berry AI 技術部落格。


上一篇
Berry AI 的演算法調校平台:streamlit 加 WebRTC 即時預覽,14470 次迭代的調校實戰
下一篇
Berry AI 如何把演算法準確度變成可監控的指標 — ALI / ALO 的誕生
系列文
Berry AI:從零開始打造全美第一的得來速 Vision AI 共 19 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言