在YOLO中進行高效再識別跟蹤

在YOLO中進行高效再識別跟蹤

在 YOLO、SSD、DETR 等即時物體檢測工具中識別物體,一直是監控特定框架區域內各種物體的移動和行動的關鍵。一些行業,如交通管理、商場、安防和個人防護裝置等,都利用這種機制進行跟蹤、監控和分析。

但是,此類模型的最大挑戰在於錨點框或邊界框,當不同的物體覆蓋在我們正在追蹤的物體上時,錨點框或邊界框往往會失去對某個物體的追蹤,從而導致某些物體的識別標籤發生變化。在本文中,我們將進一步討論如何在 YOLO 中採用 Re-ID。

物體檢測和跟蹤是一個多步驟過程

  1. 物體檢測:物體檢測主要是對幀內的物體進行檢測、定位和分類。目前有許多物體檢測演算法,如 Fast R-CNN、Faster R-CNN、YOLO、Detectron 等。YOLO 針對速度進行了最佳化,而 Faster R-CNN則偏向於更高的精度。
  2. 唯一 ID 分配:在真實世界的物體跟蹤場景中,通常需要跟蹤的物體不止一個。因此,在初始幀檢測之後,每個物體都將被分配一個唯一的 ID,以便在整個影像或影片序列中使用。ID 管理系統在生成穩健的分析結果、避免重複和支援長期模式識別方面起著至關重要的作用。
  3. 運動跟蹤:跟蹤器會估算每個獨特物體在剩餘影像或幀中的位置,從而獲得每個重新識別物體的運動軌跡。卡爾曼濾波器和光流等預測跟蹤模型通常會結合使用,以考慮臨時遮擋或快速運動的情況。

物體檢測和跟蹤是一個多步驟過程

Source – Link

為什麼要重新識別?

重新識別(Re-ID)或識別物件在這裡將發揮重要作用。在 YOLO 中,重新識別將使我們能夠保留被跟蹤物體的身份。有幾種深度學習方法可以同時實現跟蹤和重新識別。重新識別可以在短期內恢復跟蹤中丟失的軌跡。通常是透過使用嵌入來比較物體之間的視覺相似性,而嵌入是由處理裁剪過的物體影像的不同模型生成的。然而,這會給管道增加額外的延遲,從而導致即時檢測中的延遲或 FPS 率問題。

研究人員通常在大規模的人物或物體 Re-ID 資料集上訓練這些嵌入,使他們能夠捕捉到精細的細節,如服裝紋理、顏色或結構特徵,這些細節在姿勢和光照發生變化時仍能保持一致。在早期的工作中,有幾種深度學習方法將跟蹤和 Re-ID 結合在一起。流行的跟蹤模型包括 DeepSORT、Norfair、FairMOT、ByteTrack 等。

流行的跟蹤模型包括 DeepSORT、Norfair、FairMOT、ByteTrack 等

Source – Link

讓我們來討論一些廣泛使用的跟蹤方法

1. 一些舊策略

一些老式方法會將每個 ID 及其對應的幀和圖片片段儲存在本地。然後,系統會根據視覺相似性將 ID 重新分配給特定物件。然而,這種策略會消耗大量時間和記憶體。此外,由於這種手動重新分配 ID 的邏輯不能很好地處理視角變化、背景雜亂或解析度下降等問題。它缺乏可擴充套件或即時系統所需的魯棒性。

2. 位元組跟蹤

ByteTrack 的核心理念非常簡單。它不是忽略所有低置信度的檢測,而是保留非背景低分方框進行第二次關聯,從而提高遮擋情況下的軌跡一致性。在初始檢測階段之後,系統會將方框劃分為高置信度、低置信度(但非背景)和背景(丟棄)集。

首先,系統使用 IoU 或可選的特徵-相似性親和力將高置信度的方框與活動的和最近丟失的小軌跡進行匹配,並應用匈牙利演算法和嚴格的閾值。然後,系統使用任何未匹配的高置信度檢測結果來生成新的軌跡,或將其排成佇列進行單幀重試。

在二次檢測中,系統會使用較低的閾值將低置信度方框與剩餘的小軌跡預測相匹配。這一步驟可恢復因遮擋或外觀偏移而導致置信度下降的物體。如果仍有未匹配的小軌跡,系統會在一定時間內將它們移入“丟失”緩衝區,以便在它們再次出現時將其重新納入。這種通用的兩階段框架可與任何檢測器模型(YOLO、Faster-RCNN 等)和任何關聯指標無縫整合,以最小的開銷提供 50-60 FPS 的速度。

然而,當物體交叉、消失時間較長或外觀發生劇烈變化時,ByteTrack 仍然會出現身份切換問題。新增專用的 Re-ID 嵌入網路可以減少這些錯誤,但代價是每幀需要額外增加 15-25 毫秒,並增加記憶體使用量。

如果您想參考 ByteTrack GitHub,請點選此處:ByteTrack

ByteTrack

Source – Link

3. 深度跟蹤

DeepSORT 是對經典 SORT 追蹤器的增強,它將深度外觀特徵與運動和空間線索融合在一起,大大減少了 ID 切換,尤其是在遮擋或突然運動變化的情況下。要了解 DeepSORT 如何建立在 SORT 的基礎上,我們需要了解 SORT 的四個核心元件:

  • 檢測:每幀物件檢測器(如 YOLO、Faster R-CNN)為每個物件輸出邊界框。
  • 估計:恆定速度卡爾曼濾波器會將每個軌跡的狀態(位置和速度)投射到下一幀,一旦發現匹配的檢測結果,就會更新其估計值。
  • 資料關聯:在預測的軌跡框和新的檢測結果之間計算 IOU 成本矩陣;匈牙利演算法解決這一分配問題,但需要一個 IOU(最小)閾值來處理簡單的重疊和短時間的遮擋。
  • 軌跡建立和刪除:不匹配的檢測會初始化新的軌跡;缺失檢測時間超過使用者定義的 Tₗₒₛₜ 幀的軌跡會被終止,重新出現的物體會收到新的 ID。

由於速度快,SORT 可以在現代硬體上實現即時效能,但它完全依賴於運動和空間重疊。這往往會導致當物體交叉、被遮擋或長時間阻塞時,交換物體的身份。為了解決這個問題,DeepSORT 會離線訓練一個判別特徵嵌入網路(通常使用大規模的人物再識別資料集),為每個檢測作物生成 128-D 的外觀向量。在關聯過程中,DeepSORT 會計算一個綜合的親和力得分,其中包括

  1. 基於運動的距離(來自卡爾曼濾波器的馬哈拉諾比斯距離)
  2. 空間 IoU 距離
  3. 嵌入之間的外觀餘弦距離

由於餘弦度量即使在運動線索失效時(如長期閉塞或速度突然變化時)也能保持穩定,因此一旦物體重新出現,DeepSORT 就能正確地重新分配原始軌跡 ID。

其他細節和權衡:

  • 嵌入網路通常會增加約 20-30 毫秒的每幀延遲,並增加 GPU 記憶體使用量,使吞吐量最多降低 50%。
  • 為了限制計算成本的增長,DeepSORT 會為每個軌跡(如最近 50 幀)維護一個固定長度的最近嵌入相簿,但即便如此,在擁擠的場景中,大型相簿也會減慢關聯速度。
  • 儘管存在開銷,DeepSORT 在標準基準(如 MOT17)上的 IDF1 通常比 SORT 提高 15-20 分,這使它成為身份永續性至關重要時的首選解決方案。

DeepSORT

Source – Link

4. FairMOT

FairMOT 是一種真正的單鏡頭多目標跟蹤器,它在一個統一的網路中同時執行目標檢測和再識別,具有高精度和高效率的特點。當輸入影像進入 FairMOT 時,它會透過一個共享主幹網,然後分成兩個同構分支:檢測分支和再識別分支。檢測分支採用無錨中心網式頭部,下設三個子頭部–熱力圖、方框尺寸 中心偏移

  • Heatmap 頭在下采樣特徵圖上精確定位物件的中心。
  • 方框大小頭預測每個物件的寬度和高度
  • 中心偏移頭可糾正因下采樣造成的任何偏差(最多四個畫素),確保精確定位。

FairMOT如何工作?

與此同時,Re-ID 分支將相同的中間特徵投射到低維嵌入空間,生成可捕捉物體外觀的判別特徵向量。

FairMOT

Source – Link

Ultralytics重新識別

在開始介紹這種高效再識別策略的變化之前,我們必須先了解 YOLO 和 BotSORT 是如何檢索物件級特徵的。

什麼是BoT-SORT?

BoT-SORT (Robust Associations Multi-Pedestrian Tracking) 由 Aharon人於 2022 年提出,是一種透過檢測進行跟蹤的框架,它將運動預測和外觀建模以及明確的相機運動補償統一起來,從而在各種挑戰性場景中保持穩定的物體識別。它結合了三項關鍵創新:增強卡爾曼濾波狀態GMCIoU-Re-ID 融合。BoT-SORT 在標準 MOT 基準上實現了卓越的跟蹤指標。

您可以從這裡閱讀研究論文。

BoT-SORT

Source: Link

結構和方法

1. 檢測和特徵提取

  • Ultralytics YOLOv8 的檢測模組會為幀中的每個物件輸出邊界框、置信度分數和類別標籤,作為 BoT-SORT 管道的輸入。

2. BOTrack:保持物件狀態

  • 每次檢測都會產生一個 BOTrack 例項(STrack 的子類),該例項會新增以下內容:
    • 透過對最近 Re-ID 嵌入的 deque 進行指數移動平均來平滑特徵
    • 用於外觀匹配的 curr_feat smooth_feat 向量。
    • 用於精確運動預測的 eight-dimensional 卡爾曼濾波狀態(均值、協方差)。

這種模組化設計還允許混合跟蹤系統直接在每個物件例項中嵌入不同的跟蹤邏輯(如閉塞恢復或重新啟用閾值)。

3. BOTSORT:關聯管道

  • BOTSORT 類(BYTETracker 的子類)引入了
    • proximity_thresh appearance_thresh 引數,用於控制 IoU 和嵌入距離。
    • 可選的 Re-ID 編碼器,用於在 with_Re-ID=True 時提取外觀嵌入。
    • 全域性運動補償(GMC)模組,用於調整攝像機引起的幀間偏移。
  • 距離計算(get_dists)結合了 IoU 距離(matching.io_distance)和歸一化嵌入距離(matching.embedding_distance),遮蔽了超過閾值的資料對,並取元素最小值作為最終成本矩陣。
  • 資料關聯在此代價矩陣上使用匈牙利演算法;未匹配的軌跡可能會在 track_buffer 幀後重新啟用(如果外觀匹配)或終止。

這種雙閾值方法允許針對特定場景進行更靈活的調整,例如,高閉塞(較低的外觀閾值)或高運動模糊(較低的 IoU 閾值)。

4. 全域性運動補償(GMC)

  • 全域性運動補償(GMC)利用 OpenCV 的影片穩定 API 計算連續幀之間的同源性,然後扭曲預測的邊界框,在匹配前補償攝像機的運動。
  • GMC 在無人機或手持鏡頭中尤其有用,因為突然的運動變化可能會破壞追蹤的連續性。

5. 增強卡爾曼濾波器

  • 與傳統 SORT 的 7 元組不同,BoT-SORT 的卡爾曼濾波器使用 8 元組,用明確的寬度 w 和高度 h 取代了長寬比 a 和比例 s,並將過程噪聲和測量噪聲協方差調整為 w 和 h 的函式,以獲得更穩定的預測。

增強卡爾曼濾波器 增強卡爾曼濾波器

6. IoU-Re-ID 融合

  • 系統透過應用兩個閾值(IoU 和嵌入)來計算關聯成本要素。如果任一閾值超過其限制,系統會將成本設為最大值;否則,系統會將成本設為 IoU 距離的最小值和嵌入距離的一半,從而有效地融合運動和外觀線索。
  • 這種融合可以實現穩健的匹配,即使其中一個線索(IoU 或嵌入)變得不可靠時也是如此,例如在部分遮擋或受試者服裝一致的情況下。

YAML 檔案如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
tracker_type: botsort # Use BoT‑SORT
track_high_thresh: 0.25 # IoU threshold for first association
track_low_thresh: 0.10 # IoU threshold for second association
new_track_thresh: 0.25 # Confidence threshold to start new tracks
track_buffer: 30 # Frames to wait before deleting lost tracks
match_thresh: 0.80 # Appearance matching threshold
### CLI Example
# Run BoT‑SORT tracking on a video using the default YAML config
yolo track model=yolov8n.pt tracker=botsort.yaml source=path/to/video.mp4 show=True
### Python API Example
from ultralytics import YOLO
from ultralytics.trackers import BOTSORT
# Load a YOLOv8 detection model
model = YOLO('yolov8n.pt')
# Initialize BoT‑SORT with Re-ID support and GMC
args = {
'with_Re-ID': True,
'gmc_method': 'homography',
'proximity_thresh': 0.7,
'appearance_thresh': 0.5,
'fuse_score': True
}
tracker = BOTSORT(args, frame_rate=30)
# Perform tracking
results = model.track(source='path/to/video.mp4', tracker=tracker, show=True)
tracker_type: botsort # Use BoT‑SORT track_high_thresh: 0.25 # IoU threshold for first association track_low_thresh: 0.10 # IoU threshold for second association new_track_thresh: 0.25 # Confidence threshold to start new tracks track_buffer: 30 # Frames to wait before deleting lost tracks match_thresh: 0.80 # Appearance matching threshold ### CLI Example # Run BoT‑SORT tracking on a video using the default YAML config yolo track model=yolov8n.pt tracker=botsort.yaml source=path/to/video.mp4 show=True ### Python API Example from ultralytics import YOLO from ultralytics.trackers import BOTSORT # Load a YOLOv8 detection model model = YOLO('yolov8n.pt') # Initialize BoT‑SORT with Re-ID support and GMC args = { 'with_Re-ID': True, 'gmc_method': 'homography', 'proximity_thresh': 0.7, 'appearance_thresh': 0.5, 'fuse_score': True } tracker = BOTSORT(args, frame_rate=30) # Perform tracking results = model.track(source='path/to/video.mp4', tracker=tracker, show=True)
tracker_type: botsort      # Use BoT‑SORT
track_high_thresh: 0.25    # IoU threshold for first association
track_low_thresh: 0.10     # IoU threshold for second association
new_track_thresh: 0.25     # Confidence threshold to start new tracks
track_buffer: 30           # Frames to wait before deleting lost tracks
match_thresh: 0.80         # Appearance matching threshold
### CLI Example
# Run BoT‑SORT tracking on a video using the default YAML config
yolo track model=yolov8n.pt tracker=botsort.yaml source=path/to/video.mp4 show=True
### Python API Example
from ultralytics import YOLO
from ultralytics.trackers import BOTSORT
# Load a YOLOv8 detection model
model = YOLO('yolov8n.pt')
# Initialize BoT‑SORT with Re-ID support and GMC
args = {
    'with_Re-ID': True,
    'gmc_method': 'homography',
    'proximity_thresh': 0.7,
    'appearance_thresh': 0.5,
    'fuse_score': True
}
tracker = BOTSORT(args, frame_rate=30)
# Perform tracking
results = model.track(source='path/to/video.mp4', tracker=tracker, show=True)

您可以在此處瞭解有關相容 YOLO 追蹤器的更多資訊。

Ultralytics中的高效再識別功能

系統通常透過使用嵌入式技術比較物體之間的視覺相似性來執行重新識別。通常會有一個單獨的模型透過處理裁剪過的物體影像來生成這些嵌入。不過,這種方法會給管道增加額外的延遲。或者,系統可以直接使用物件級特徵進行重新識別,而不需要單獨的嵌入模型。這一改變在提高效率的同時,也使延遲時間幾乎保持不變。

資源:重新識別中的 YOLO 教程

Colab Notebook:連結到 Colab

請嘗試執行您的影片,看看 YOLO 中的 Re-ID 是如何工作的。在 Colab NB 中,我們只需將“occluded.mp4”的路徑替換為您的影片路徑即可。

YOLO 中的 Re-ID 是如何工作的

Source – Link

要檢視上下文中的所有差異並獲取完整的 botsort.py 補丁,請檢視連結到 Colab 和本教程。請務必在閱讀本指南時一併閱讀,這樣您就能逐步瞭解每一處改動。

第 1 步:打補丁使BoT-SORT接受功能

所做更改:

  • 方法簽名更新:update(results, img=None) → update(results, img=None, feats=None) 以接受特徵陣列。新屬性 self.img_width 是根據 img.shape[1] 設定的,以便稍後進行歸一化。
  • 特徵切分: 根據檢測指數提取 feats_keep 和 feats_second。
  • Tracklet 初始化:init_track 呼叫現在傳遞相應的特徵子集(feats_keep/feats_second),而不是原始影像陣列。

第 2 步:修改後處理回撥以傳遞特徵

所做更改:

  • 更新呼叫:tracker.update(det, im0s[i]) → tracker.update(det,result.orig_img,result.feats.cpu().numpy()),以便將特徵張量轉發給跟蹤器。

第 3 步:實現特徵偽編碼器

所做更改:

  • 建立了帶有 inference(feat, dets) 方法的虛擬編碼器類,該方法只需返回所提供的特徵。
  • 引入 BOTSORT 的自定義 BOTSORTRe-ID 子類,其中:
    • self.encoder 被設定為虛擬編碼器。
    • self.args.with_Re-ID 標誌已啟用。
  • 跟蹤器註冊:track.TRACKER_MAP[“botsort”] 重新對映為 BOTSORTRe-ID,取代預設值。

第 4 步:改進近距離匹配邏輯

所做更改:

  • 中心點計算:新增了基於 L2 的中心點提取器,而不再僅僅依賴邊界框 IoU。
  • 距離計算
    • 計算軌跡和檢測中心點之間成對的 L2 距離,並以 self.img_width 歸一化。
    • 如果 L2 距離超過 proximity_thresh,就會生成近似遮蔽。
  • 成本融合
    • 透過現有的 matching.embedding_distance 計算嵌入距離。
    • 同時應用近似遮蔽和外觀閾值,為距離較遠或不相似的配對設定較高的成本。
    • 最終的成本矩陣是基於 IoU 的原始距離和調整後的嵌入距離的元素最小值。

第 5 步:調整跟蹤器配置

調整 botsort.yaml 引數,以改進遮擋處理和匹配容差:

  • track_buffer:300– 延長丟失的軌跡在刪除前的保留時間。
  • proximity_thresh: 0.2– 允許與移動幅度不超過影像寬度 20% 的物體進行匹配。
  • appearance_thresh: 0.3– 要求至少 70% 的特徵相似度才能匹配。

第 6 步:初始化模型併為模型打上猴子補丁

所做更改:

  • 自定義 _predict_once 注入模型,以便在檢測的同時提取並返回特徵圖。
  • 重置跟蹤器:在 model.track(embed=embed, persist=True) 之後,重置現有的跟蹤器,以清除任何陳舊狀態。
  • 方法覆蓋
    • model.predictor.trackers[0].update 與已修補的更新方法繫結。
    • model.predictor.trackers[0].get_dists 繫結到新的距離計算邏輯。

第 7 步:透過重新識別執行跟蹤

所作更改:

  • 便捷函式 track_with_Re-ID(img) 使用了.predictor.trackers[0].get_dists:
    1. get_result_with_features([img]) 來生成帶有特徵的檢測結果。
    2. model.predictor.run_callbacks(“on_predict_postprocess_end”)呼叫更新後的跟蹤邏輯。
  • 輸出:返回 model.predictor.results,現在包含檢測和重新識別資料。

有了這些簡潔的修改,Ultralytics YOLO 與 BoT-SORT 現在可以原生支援基於特徵的再識別,而無需新增第二個再識別網路,從而以最小的效能開銷實現穩健的身份保護。您可以嘗試使用步驟 5 中的閾值,根據自己的應用調整匹配的嚴格程度。

⚠️ 注:這些更改並非 Ultralytics 正式版本的一部分。它們需要手動執行,以實現高效的重新識別。

結果對比

在這裡,水栓(id8)、卡車附近的婦女(id67)和畫面左側的卡車(id3)都被重新準確識別。

雖然有些物體(id4、id5、id60)被正確識別,但背景中的幾名警察卻得到了不同的 ID,這可能是由於幀頻限制造成的。

球(id3)和射手(id1)被很好地跟蹤和識別,但被射手遮擋住的守門員(id2 -> id8)由於失去可見度而被賦予了新的 ID。

新發展

我們正在開發一個名為 Trackers 的新開源工具包,以簡化多目標跟蹤工作流程。Trackers 將提供

  • 即插即用,可與 Transformers、Inference、Ultralytics、PaddlePaddle、MMDetection 等公司的探測器整合。
  • 目前已內建了對 SORT 和 DeepSORT 的支援,還將內建 StrongSORT、BoT-SORT、ByteTrack、OC-SORT 和其他跟蹤器。

DeepSORT 和 SORT 已經可以在 GitHub 程式碼庫中匯入,其餘跟蹤器將在隨後幾周內新增。

Github 連結 –Roboflow

小結

比較部分顯示,YOLO 中的 Re-ID 效能可靠,能在各幀中保持物件的身份。偶爾出現的不匹配是由於遮擋或幀頻過低造成的,這在即時跟蹤中很常見。可調節的接近度閾值和外觀閾值 為各種使用案例提供了靈活性。

關鍵優勢在於效率:利用 YOLO 的物件級特徵,無需單獨的 Re-ID 網路,從而實現了輕量級、可部署的管道。

這種方法提供了一個強大而實用的多目標跟蹤解決方案。未來的改進可能包括自適應閾值、更好的特徵提取或時間平滑。

注:這些更新還不是官方 Ultralytics 庫的一部分,必須手動應用,如共享資源所示。

評論留言