目標(biāo)檢測(cè) vs 目標(biāo)跟蹤
在開始介紹DeepSORT的原理之前呢,我們先來了解下目標(biāo)檢測(cè),和目標(biāo)跟蹤之間的區(qū)別:
目標(biāo)檢測(cè):在目標(biāo)檢測(cè)任務(wù)中,我們需要利用AI模型識(shí)別出單張畫面中,物體的位置和類別信息,每一幀畫面之間檢測(cè)結(jié)果相對(duì)獨(dú)立,沒有依賴關(guān)系。這也意味著目標(biāo)檢測(cè)算法可以被應(yīng)用于單張圖片的檢測(cè),也可以用于視頻中每一幀畫面的檢測(cè)。
目標(biāo)跟蹤:而目標(biāo)跟蹤則是在目標(biāo)檢測(cè)的基礎(chǔ)上加入的跟蹤機(jī)制,他需要追蹤視頻中同一物體在不同時(shí)刻的位置信息,因此他需要判斷相鄰幀之間的被檢測(cè)到對(duì)象是否是同一個(gè)物體,并且為同一物體分配唯一的編號(hào)ID,用來區(qū)別不同的目標(biāo)對(duì)象。
例如下面短跑運(yùn)動(dòng)員比賽的例子中,目標(biāo)檢測(cè)任務(wù)只需要識(shí)別到畫面中所有人體的位置即可,而目標(biāo)跟蹤任務(wù)則需要區(qū)分畫面中相同的對(duì)象和不同對(duì)象。
圖:目標(biāo)檢測(cè)與目標(biāo)跟蹤比較
DeepSORT
DeepSORT的前身是SORT算法,SORT算法是由目標(biāo)檢測(cè)器以及跟蹤器所構(gòu)成,其跟蹤器的核心是卡爾曼濾波算法和匈牙利算法。利用卡爾曼濾波算法預(yù)測(cè)檢測(cè)框在下一幀的狀態(tài),將該狀態(tài)與下一幀的檢測(cè)結(jié)果利用匈牙利算法進(jìn)行匹配,實(shí)現(xiàn)追蹤。一旦物體受到遮擋或者其他原因沒有被檢測(cè)到,卡爾曼濾波預(yù)測(cè)的狀態(tài)信息將無法和檢測(cè)結(jié)果進(jìn)行匹配,該追蹤片段將會(huì)提前結(jié)束。
而DeepSORT則引入了深度學(xué)習(xí)中的重識(shí)別算法來提取被檢測(cè)物體(檢測(cè)框物體中)的外觀特征(低維向量表示),在每次(每幀)檢測(cè)+追蹤后,進(jìn)行一次物體外觀特征的提取并保存。后面每執(zhí)行一步時(shí),都要執(zhí)行一次當(dāng)前幀被檢測(cè)物體外觀特征與之前存儲(chǔ)的外觀特征的相似度計(jì)算,依次來避免遇到漏檢的情況,將失去身份ID的情況,可以說DeepSORT不光使用了物體的速度和方向趨勢(shì)來對(duì)目標(biāo)進(jìn)行跟蹤,同時(shí)也利用物體的外觀特征鞏固對(duì)是否為同一物體的判斷。
這里我們可以將DeepSORT跟蹤算法歸納為以下幾個(gè)步驟:
圖:DeepSORT方法流程圖
1. 目標(biāo)檢測(cè)
使用常規(guī)的目標(biāo)檢測(cè)模型,對(duì)單幀畫面進(jìn)行識(shí)別,并過濾出待跟蹤對(duì)象,例如這個(gè)任務(wù)中我們的跟蹤對(duì)象為人體,那其他被檢測(cè)到的對(duì)象,例如桌子,椅子將被全部丟棄。
2. 目標(biāo)預(yù)測(cè)
在這一步中,我們將使用卡爾曼濾波算法。基于當(dāng)前的一系列運(yùn)動(dòng)變量去預(yù)測(cè)下一時(shí)刻的運(yùn)動(dòng)變量,但是第一次的檢測(cè)結(jié)果用來初始化卡爾曼濾波的運(yùn)動(dòng)變量。預(yù)測(cè)結(jié)果分為確認(rèn)態(tài) (confirmed),和不確認(rèn)態(tài) (unconfirmed),新產(chǎn)生的 Tracks 是不確認(rèn)態(tài)的;不確認(rèn)態(tài)的 Tracks 必須要和 Detections 連續(xù)匹配一定的次數(shù)才可以轉(zhuǎn)化成確認(rèn)態(tài)。確認(rèn)態(tài)的Tracks必須和Detections連續(xù)適配一定次數(shù)才會(huì)被刪除。
3. 數(shù)據(jù)關(guān)聯(lián)和更新
接下來需要把檢測(cè)到的物體和預(yù)測(cè)的物體進(jìn)行關(guān)聯(lián), 此處DeepSORT將使用匈牙利算法,并根據(jù)不同的代價(jià)函數(shù)來尋找最大匹配。如果卡爾曼濾波輸出確認(rèn)態(tài)的預(yù)測(cè)結(jié)果,DeepSORT將采用馬氏距離加余弦距離的級(jí)聯(lián)方法對(duì)相關(guān)信息進(jìn)行關(guān)聯(lián),通過馬氏距離我們可以獲取運(yùn)動(dòng)物體在兩個(gè)不同狀態(tài)的距離信息,如果某次關(guān)聯(lián)的馬氏距離小于指定的閾值,則設(shè)置運(yùn)動(dòng)狀態(tài)的關(guān)聯(lián)成功,但是DeepSORT不僅看框與框之間的距離,還要看框內(nèi)的表觀特征才能更好的進(jìn)行關(guān)聯(lián)匹配,所以DeepSORT還引入了表觀特征余弦距離度量,這里會(huì)使用一個(gè)重識(shí)別模型來獲取不同物體的特征向量,然后再通過余弦距離構(gòu)建代價(jià)函數(shù),計(jì)算預(yù)測(cè)對(duì)象與檢測(cè)對(duì)象的相似度。這兩個(gè)代價(jià)函數(shù)結(jié)果都盡量的小,框也接近、特征也接近的話,就認(rèn)為兩個(gè)預(yù)測(cè)框中是同一個(gè)東西。
DeepSORT之所以引入這樣的級(jí)聯(lián)方法,是因?yàn)槿绻谶\(yùn)動(dòng)狀態(tài)變化比較劇烈的場(chǎng)景下,基于目標(biāo)狀態(tài)之間的關(guān)聯(lián)很可能是不可靠的(舉個(gè)例子,當(dāng)一個(gè)人在跑步時(shí),如果相機(jī)是靜止的或者與人的運(yùn)動(dòng)方向相反,那么相機(jī)中的人在每幀之間的運(yùn)動(dòng)狀態(tài)就會(huì)差異較大),在這樣的情況下,運(yùn)動(dòng)的不確定性變高,先驗(yàn)狀態(tài)與目標(biāo)檢測(cè)之間的匹配差異較大,而彌補(bǔ)這個(gè)缺陷的方法就是使用特征相似距離關(guān)聯(lián);但是在目標(biāo)運(yùn)動(dòng)狀態(tài)變化并不劇烈的情況下,這時(shí)候幀與幀之間,馬氏距離就成為了很好的數(shù)據(jù)關(guān)聯(lián)度量的選擇。
數(shù)據(jù)關(guān)聯(lián)的第二步則是計(jì)算不確認(rèn)態(tài)下的預(yù)測(cè)框和未被上一步級(jí)聯(lián)方法匹配檢測(cè)框的IOU交并比,DeepSORT使用匈牙利算法尋找最大匹配的IOU結(jié)果,如果預(yù)測(cè)框和檢測(cè)框的IOU低于閾值,我們將刪除兩者的關(guān)聯(lián)性。
最后利用當(dāng)前幀的關(guān)聯(lián)結(jié)果更新預(yù)測(cè)器中所有被分配ID的跟蹤對(duì)象狀態(tài)。
DeepSORT任務(wù)實(shí)現(xiàn)
接下來我們來看DeepSORT的基本實(shí)現(xiàn),這里我們可以直接使用DeepSORT作者提供的跟蹤器對(duì)象模塊實(shí)現(xiàn)卡爾曼濾波算法預(yù)測(cè)以及匈牙利算法匹配等多種功能,開發(fā)者可以直接替換其中目標(biāo)檢測(cè)模型與重識(shí)別模型,并修改最大匹配次數(shù)等參數(shù),以提升在目標(biāo)場(chǎng)景下的識(shí)別跟蹤準(zhǔn)確性。推理部分使用OpenVINO做為推理引擎。這里有幾個(gè)關(guān)鍵的模塊:
1. 模型初始化
本次任務(wù)中會(huì)使用兩個(gè)深度學(xué)習(xí)模型,都是來自于OpenVINO官方的Open Model Zoo模型倉庫。這里可以提前定義一個(gè)通用的OpenVINO的模型類來對(duì)這兩個(gè)模型進(jìn)行初始化,并設(shè)置他的預(yù)測(cè)推理函數(shù)。由于目標(biāo)檢測(cè)任務(wù)的輸出數(shù)量往往不固定,同時(shí)我們又需要利用重識(shí)別模型為每一個(gè)目標(biāo)檢測(cè)任務(wù)的輸出構(gòu)建特征向量,因此為了提升模型的執(zhí)行效率,我們將重識(shí)別模型的batachsize初始化為“-1”,以動(dòng)態(tài)匹配不斷變化的目標(biāo)數(shù)量。
圖:OpenVINO模型對(duì)象
2. 余弦距離
本次任務(wù)采用余弦距離作為匹配算法的代價(jià)函數(shù)之一,因此我們需要首先定義余弦距離的計(jì)算方法(如下圖所示),其中x1,x2分別為重識(shí)別模型輸出的特征向量。
圖:余弦距離計(jì)算方法
接下來我們可以測(cè)試下這個(gè)方案的效果,我們將兩個(gè)不同人體對(duì)象的圖片進(jìn)行特征向量化后,將模型輸出的結(jié)果直接送入余弦距離模塊中,計(jì)算相關(guān)性的置信度,可以看到當(dāng)兩張圖片屬于同一對(duì)象的情況下,置信度較高,兩個(gè)圖片不屬于同一對(duì)象的情況下置信度就會(huì)低于閾值。
圖:不同人體對(duì)象余弦距離計(jì)算結(jié)果
圖:相同人體對(duì)象余弦距離計(jì)算結(jié)果
3. Tracker跟蹤器
Tracker是DeepSORT方法的核心對(duì)象,在具體調(diào)用方法里,第一步先要定義一個(gè)Tracker對(duì)象,并聲明關(guān)鍵參數(shù)里,例如考慮到內(nèi)存占用情況,我們需要定義NN_BUDGET,用于限制同屏中最大跟蹤對(duì)象的數(shù)量,同時(shí)使用cosine最大余弦距離作為代價(jià)函數(shù),并且指定IOU和余弦距離的閾值,以及max_age描述最大多少次無匹配會(huì)刪除追蹤對(duì)象, n_init描述確認(rèn)狀態(tài)需要的最少匹配次數(shù)。
圖:Tracker跟蹤器初始化方法
然后進(jìn)入到主函數(shù)部分,在開始track任務(wù)之前,會(huì)先將目標(biāo)檢測(cè)模型和重識(shí)別模型的輸出結(jié)果打包成Detection對(duì)象,一起送入Tracker中進(jìn)行匹配,當(dāng)目標(biāo)對(duì)象轉(zhuǎn)化為確認(rèn)狀態(tài)后,可以從Tracker對(duì)象中獲取每一個(gè)目標(biāo)的唯一ID用于在原始畫面中進(jìn)行標(biāo)注。
圖:調(diào)用跟蹤器的預(yù)算和update關(guān)聯(lián)方法
4. 最終實(shí)現(xiàn)效果
在完成主函數(shù)定義后,我們可以給他輸入一段視頻流,或者使用身邊的網(wǎng)絡(luò)攝像頭獲取實(shí)時(shí)影像進(jìn)行驗(yàn)證。
可以看到DeepSORT方法非常精確的識(shí)別并跟蹤了畫面中每一個(gè)人體對(duì)象的位置,并且在僅在普通酷睿系列的CPU上就可以實(shí)現(xiàn)60FPS左右的流暢表現(xiàn)。
圖:最終實(shí)現(xiàn)效果
小結(jié)
本文分享多目標(biāo)跟蹤算法的經(jīng)典算法DeepSORT,它是一個(gè)兩階段的算法,作為SORT 的升級(jí)版,它整合了外觀信息 (appearance information) 從而提高 SORT 的性能,這使得我們?cè)谟龅捷^長(zhǎng)時(shí)間的遮擋時(shí),也能夠正常跟蹤目標(biāo),并有效減少 ID 轉(zhuǎn)換的發(fā)生次數(shù)。
審核編輯:劉清
-
檢測(cè)器
+關(guān)注
關(guān)注
1文章
863瀏覽量
47676 -
卡爾曼濾波
+關(guān)注
關(guān)注
3文章
165瀏覽量
24648 -
sort
+關(guān)注
關(guān)注
0文章
5瀏覽量
2618
原文標(biāo)題:經(jīng)典多目標(biāo)跟蹤算法DeepSORT的基本原理和實(shí)現(xiàn)丨開發(fā)者實(shí)戰(zhàn)
文章出處:【微信號(hào):英特爾物聯(lián)網(wǎng),微信公眾號(hào):英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論