要想做好目標追蹤,須做好目標檢測,所以這里就是基于yolov5檢測基礎上進行DeepSort,叫它為Yolov5_DeepSort。整體思路是先檢測再追蹤,基于檢測結果進行預測與匹配。
一.參數與演示
這里用到的是coco預訓練人的數據集:
二.針對檢測結果初始化track
對每一幀數據都輸出yolo5的檢測結果(主要是四個坐標值)
上圖是說在第一幀時檢測到8個框,它們每個框的4個坐標值如上圖。
置信度是指每個框是人的可能性是多少。
下面就看它取特征的網絡結構:
最終輸出的特征結果是每個框(一共8個框)對應的128維的向量。
上圖是按置信度過濾掉分值低的,然后再從detections對象出取出過濾后的boxes與置信度值(得分)。
三.對track執行預測操作
?
對上二個張圖中寫的卡曼濾波更正為卡爾曼濾波。按上圖所示下面就實例化Track了,如下圖:
一個track只會保存100個特征,也就保存100幀結果。到此第一幀的追蹤就完成(其實第一幀也只是初始化track,沒做核心內容,從第二幀開始才執行核心內容),
上面二個方法也是卡爾曼濾波的預測與更新兩個核心操作。
下面開始第二幀追蹤了,這里track已經有值了:
四.狀態量預測結果
上圖中mean[3]就是指h的值,因為對人進行跟蹤時,隨著運動,距離越遠h值變得越小,越近h值就會變得越大,其它的x,y值是固定的,a這個長寬比也是固定的,所以說h變化比較大,那么就用基于h來做噪聲矩陣。
按h初始化得到一個噪聲矩陣P:
得到狀態轉移矩陣A:
?
上圖中寫的FX中的F改成A,表示狀態轉移矩陣。
其實上圖中寫的F實際上是A來的,表示狀態轉移矩陣。
做8次后tracker.predict()就結束了,下面將進行tracker.update(detections)方法了。tracker.update(detections)不但完成更新還要完成匹配,是最核心的方法。
五.IOU代價矩陣計算
tracker.update(detections)流程是先匹配再更新操作的。匹配包括級聯匹配,當未匹配上就做IOU。
因為3次確認上才會做級聯匹配,那現在第2幀進來時不會做級聯匹配,就會做IOU匹配:
IOU核心就是把代價矩陣做出來,使它的損失最小(距離最小),其實就是計算track與detection之間的IOU距離值出來。
初始化出一個全是0的8*8的代價矩陣cost_matrix出來。
六.參數更新操作
匈牙利匹配只需要一個代價矩陣cost_matrix參數,輸入代價矩陣返回回來最合適的匹配。上面已經得到這個參數了,所以下面就直接調用這方法:
linear_assignment是scipy中已經實現好的,直接調用返回對應的ID值:
調用的結果如下圖:
有返回ID后就對detection與track中的值進行匹配過濾,如下圖:
返回后得到匹配后的結果,完成IOU代價矩陣計算:
由上圖可見到匹配到8個對,那接下來就要做更新操作:
取前4個值:
將協方差矩陣映射到檢測空間:
上圖最后把均值向量映射到檢測空間的4個值(mean),協方差映射到檢測空間+初始化的噪聲矩陣都返回回去。映射完后就計算卡爾曼增益了,如下圖:
至此卡爾曼增益已算出,預測值與協方差距陣都做了更新。
七.級聯匹配模塊
上圖中假設8個人都連續命中3次那也就是要進行級聯匹配,
為什么先做級聯匹配呢?因為級聯匹配是對確定狀態(連續3幀都匹配上,即比較有把握的匹配了)的匹配。IOU匹配主要是對新的detection的匹配。
八.ReID特征代價矩陣計算
進入級聯匹配方法中,它主要做外觀信息與運動信息的匹配:
它也一樣要構建代價矩陣出來
求上面所說的代價矩陣用到的是余弦相似度計算
這里運用到二個特征向量之間做余弦相似度,取出距離最近的(相似度最大的)出來,值得其它地方運用。
九.匹配結果與總結
返回級聯的代價矩陣后,也要做過濾:
IOU匹配都是每一幀都會去匹配的。追蹤的核心思想是當前幀track是否與檢測值bbox匹配上,其中核心是代價矩陣的求解。
總結:目標檢測得到bbox,第一幀得到track(iou匹配),連續3幀確定的就進行級聯匹配(包括iou匹配)。
本例是對人的目標做追蹤,而如果換成其它物體追蹤就要把ckpt.t7換一下。
.
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?