經典多目標跟蹤演算法DeepSORT的基本原理和實現
點選藍字
關注我們,讓開發變得更有趣
作者| 楊亦誠
排版| 李擎
經典多目標跟蹤演算法DeepSORT的基本原理和實現
OpenVINO
目標檢測 vs 目標跟蹤
在開始介紹DeepSORT的原理之前呢,我們先來了解下目標檢測,和目標跟蹤之間的區別:
· 目標檢測:在目標檢測任務中,我們需要利用AI模型識別出單張畫面中,物體的位置和類別資訊,每一幀畫面之間檢測結果相對獨立,沒有依賴關係。這也意味著目標檢測演算法可以被應用於單張圖片的檢測,也可以用於視訊中每一幀畫面的檢測。
· 目標跟蹤:而目標跟蹤則是在目標檢測的基礎上加入的跟蹤機制,他需要追蹤視訊中同一物體在不同時刻的位置資訊,因此他需要判斷相鄰幀之間的被檢測到物件是否是同一個物體,並且為同一物體分配唯一的編號ID,用來區別不同的目標物件。
例如下面短跑運動員比賽的例子中,目標檢測任務只需要識別到畫面中所有人體的位置即可,而目標跟蹤任務則需要區分畫面中相同的物件和不同物件。

圖:目標檢測與目標跟蹤比較
Deep SORT
DeepSORT的前身是SORT演算法,SORT演算法是由目標檢測器以及跟蹤器所構成,其跟蹤器的核心是卡爾曼濾波演算法和匈牙利演算法。利用卡爾曼濾波演算法預測檢測框在下一幀的狀態,將該狀態與下一幀的檢測結果利用匈牙利演算法進行匹配,實現追蹤。一旦物體受到遮擋或者其他原因沒有被檢測到,卡爾曼濾波預測的狀態資訊將無法和檢測結果進行匹配,該追蹤片段將會提前結束。
而DeepSORT則引入了深度學習中的重識別演算法來提取被檢測物體(檢測框物體中)的外觀特徵(低維向量表示),在每次(每幀)檢測+追蹤後,進行一次物體外觀特徵的提取並儲存。後面每執行一步時,都要執行一次當前幀被檢測物體外觀特徵與之前儲存的外觀特徵的相似度計算,依次來避免遇到漏檢的情況,將失去身份ID的情況,可以說DeepSORT不光使用了物體的速度和方向趨勢來對目標進行跟蹤,同時也利用物體的外觀特徵鞏固對是否為同一物體的判斷。
這裡我們可以將DeepSORT跟蹤演算法歸納為以下幾個步驟:

圖:DeepSORT方法流程圖
1. 目標檢測
使用常規的目標檢測模型,對單幀畫面進行識別,並過濾出待跟蹤物件,例如這個任務中我們的跟蹤物件為人體,那其他被檢測到的物件,例如桌子,椅子將被全部丟棄。
2. 目標預測
在這一步中,我們將使用卡爾曼濾波演算法。基於當前的一系列運動變數去預測下一時刻的運動變數,但是第一次的檢測結果用來初始化卡爾曼濾波的運動變數。預測結果分為確認態(confirmed),和不確認態(unconfirmed),新產生的Tracks是不確認態的;不確認態的Tracks必須要和Detections連續匹配一定的次數才可以轉化成確認態。確認態的Tracks必須和Detections連續適配一定次數才會被刪除。
3. 資料關聯和更新
接下來需要把檢測到的物體和預測的物體進行關聯, 此處DeepSORT將使用匈牙利演算法,並根據不同的代價函式來尋找最大匹配。如果卡爾曼濾波輸出確認態的預測結果,DeepSORT將採用馬氏距離加餘弦距離的級聯方法對相關資訊進行關聯,通過馬氏距離我們可以獲取運動物體在兩個不同狀態的距離資訊,如果某次關聯的馬氏距離小於指定的閾值,則設定運動狀態的關聯成功,但是DeepSORT不僅看框與框之間的距離,還要看框內的表觀特徵才能更好的進行關聯匹配,所以DeepSORT還引入了表觀特徵餘弦距離度量,這裡會使用一個重識別模型來獲取不同物體的特徵向量,然後再通過餘弦距離構建代價函式,計算預測物件與檢測物件的相似度。這兩個代價函式結果都儘量的小,框也接近、特徵也接近的話,就認為兩個預測框中是同一個東西。
DeepSORT之所以引入這樣的級聯方法,是因為如果在運動狀態變化比較劇烈的場景下,基於目標狀態之間的關聯很可能是不可靠的(舉個例子,當一個人在跑步時,如果相機是靜止的或者與人的運動方向相反,那麼相機中的人在每幀之間的運動狀態就會差異較大),在這樣的情況下,運動的不確定性變高,先驗狀態與目標檢測之間的匹配差異較大,而彌補這個缺陷的方法就是使用特徵相似距離關聯;但是在目標運動狀態變化並不劇烈的情況下,這時候幀與幀之間,馬氏距離就成為了很好的資料關聯度量的選擇。
資料關聯的第二步則是計算不確認態下的預測框和未被上一步級聯方法匹配檢測框的IOU交併比,DeepSORT使用匈牙利演算法尋找最大匹配的IOU結果,如果預測框和檢測框的IOU低於閾值,我們將刪除兩者的關聯性。
最後利用當前幀的關聯結果更新預測器中所有被分配ID的跟蹤物件狀態。
Deep SORT任務實現
接下來我們來看DeepSORT的基本實現,這裡我們可以直接使用DeepSORT作者提供的跟蹤器物件模組實現卡爾曼濾波演算法預測以及匈牙利演算法匹配等多種功能,開發者可以直接替換其中目標檢測模型與重識別模型,並修改最大匹配次數等引數,以提升在目標場景下的識別跟蹤準確性。推理部分使用OpenVINO™做為推理引擎。這裡有幾個關鍵的模組:
1. 模型初始化
本次任務中會使用兩個深度學習模型,都是來自於OpenVINO™官方的Open Model Zoo模型倉庫。這裡可以提前定義一個通用的OpenVINO™的模型類來對這兩個模型進行初始化,並設定他的預測推理函式。由於目標檢測任務的輸出數量往往不固定,同時我們又需要利用重識別模型為每一個目標檢測任務的輸出構建特徵向量,因此為了提升模型的執行效率,我們將重識別模型的batachsize初始化為“-1”,以動態匹配不斷變化的目標數量。

圖:OpenVINO™模型物件
2. 餘弦距離
本次任務採用餘弦距離作為匹配演算法的代價函式之一,因此我們需要首先定義餘弦距離的計算方法(如下圖所示),其中x1,x2分別為重識別模型輸出的特徵向量。

圖:餘弦距離計算方法
接下來我們可以測試下這個方案的效果,我們將兩個不同人體物件的圖片進行特徵向量化後,將模型輸出的結果直接送入餘弦距離模組中,計算相關性的置信度,可以看到當兩張圖片屬於同一物件的情況下,置信度較高,兩個圖片不屬於同一物件的情況下置信度就會低於閾值。

圖:不同人體物件餘弦距離計算結果

圖:相同人體物件餘弦距離計算結果
3. Tracker跟蹤器
Tracker是DeepSORT方法的核心物件,在具體呼叫方法裡,第一步先要定義一個Tracker物件,並宣告關鍵引數裡,例如考慮到記憶體佔用情況,我們需要定義NN_BUDGET,用於限制同屏中最大跟蹤物件的數量,同時使用cosine最大餘弦距離作為代價函式,並且指定IOU和餘弦距離的閾值,以及max_age描述最大多少次無匹配會刪除追蹤物件, n_init描述確認狀態需要的最少匹配次數。

圖:Tracker跟蹤器初始化方法
然後進入到主函式部分,在開始track任務之前,會先將目標檢測模型和重識別模型的輸出結果打包成Detection物件,一起送入Tracker中進行匹配,當目標物件轉化為確認狀態後,可以從Tracker物件中獲取每一個目標的唯一ID用於在原始畫面中進行標註。

圖:呼叫跟蹤器的預算和update關聯方法
4. 最終實現效果
在完成主函式定義後,我們可以給他輸入一段視訊流,或者使用身邊的網路攝像頭獲取實時影像進行驗證。完整程式碼和示例使用方法可以參考這個notebook:
http://github.com/OpenVINO™toolkit/OpenVINO™_notebooks/tree/main/notebooks/407-person-tracking-webcam。
可以看到DeepSORT方法非常精確的識別並跟蹤了畫面中每一個人體物件的位置,並且在僅在普通酷睿系列的CPU上就可以實現60FPS左右的流暢表現。

圖:最終實現效果
小結
本文分享多目標跟蹤演算法的經典演算法DeepSORT,它是一個兩階段的演算法,作為SORT 的升級版,它整合了外觀資訊 (appearance information) 從而提高 SORT 的效能,這使得我們在遇到較長時間的遮擋時,也能夠正常跟蹤目標,並有效減少 ID 轉換的發生次數。
參考文件
http://zhuanlan.zhihu.com/p/97449724
http://www.cnblogs.com/pprp/articles/12736831.html
http://guo-pu.blog.csdn.net/article/details/122827312?spm=1001.2014.3001.5502
http://blog.csdn.net/weixin_42118657/article/details/117554115
--END--
你也許想了解(點選藍字檢視)⬇️
➡️
以AI作畫,祝她節日快樂;簡單三步,OpenVINO™ 助你輕鬆體驗AIGC
➡️
還不知道如何用OpenVINO™作畫?點選瞭解教程。
➡️
如何給開源專案做貢獻? | 開發者節日福利
➡️
幾行程式碼輕鬆實現對於PaddleOCR的實時推理,快來get!
➡️
使用OpenVINO 在“端—邊—雲”快速實現高效能人工智慧推理
➡️
圖片提取文字很神奇?試試三步實現OCR!
➡️
【Notebook系列第六期】基於Pytorch預訓練模型,實現語義分割任務
➡️
使用OpenVINO™ 預處理API進一步提升YOLOv5推理效能
掃描下方二維碼立即體驗
OpenVINO™ 工具套件 2022.3



本文分享自微信公眾號 - OpenVINO 中文社群(openvinodev)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。
- 經典多目標跟蹤演算法DeepSORT的基本原理和實現
- 以 AI 作畫,祝她節日快樂;簡單三步,OpenVINO™ 助你輕鬆體驗 AIGC
- 即刻報名!飛槳黑客馬拉松第四期如約而至,等你挑戰
- OpenVINO課程回顧之上集:基礎課程 | 解鎖更多使用技巧
- 正式開啟報名!2023全球女性開發者峰會
- 大賽報名|來自飛槳黑客鬆的邀請函
- 活動回顧 | 2021微軟X英特爾黑客鬆大賽精彩回顧 01
- 賽事推薦 | 中文臨床醫學文字分詞與命名實體挑戰賽開啟報名
- 活動預告 | 使用 OpenVINO 部署加速飛漿預訓練模型
- OpenVINO 中文社群一週年特別活動:助力開發者,共建社群2.0
- 2月23日直播回顧 | 基於 Intel 架構的車聯網智慧邊緣計算
- 早餐 | 第二十八期 · Graph Transformation(一)
- 明晚20:30-21:30直播獎品
- 2月24日直播預告 | 基於Intel架構的車聯網智慧邊緣計算
- OpenVINO 學習資源
- ESH OpenVINO 相關資源連結
- 早餐|第二十二期 · 轉換Tensorflow 模型
- 早餐|第二十一期 · Model Optimizer 引數介紹 (三)
- openvinotoolkit-prc的相關工具包介紹(中文版)
- 答疑解惑|你們想知道的「社群提問三方式」來了!