Deepsort + Yolo 實現(xiàn)行人檢測和軌跡追蹤

極市導(dǎo)讀
?本項目通過采用深度學習方法實現(xiàn)YOLO算法行人檢測和deepsort算法對人員定位的和軌跡跟蹤。>>加入極市CV技術(shù)交流群,走在計算機視覺的最前沿
引言
行人檢測是近年來計算機視覺領(lǐng)域的研究熱點,同時也是目標檢測領(lǐng)域中的難點。其目的是識別和定位圖像中存在的行人,在許多領(lǐng)域中都有廣泛的應(yīng)用。交通安全方面,無人駕駛汽車通過提前檢測到行人及時避讓來避免交通事故的發(fā)生;安防保護方面,通過行人檢測來防止可疑人員進入;公共場所管理方面,通過行人檢測統(tǒng)計人流量數(shù)據(jù),優(yōu)化人力物力等資源的分配。
對于目標檢測的方法,從2013年Ross Girshick提出R-CNN開始,人們在短短幾年內(nèi)相繼提出Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO等算法,其中兩步檢測的目標檢測方法(R-CNN系列算法)需要先產(chǎn)生大量候選框之后再用卷積神經(jīng)網(wǎng)絡(luò)對候選框進行分類和回歸處理;單步檢測的方法(SSD、YOLO系列算法)則直接在卷積神經(jīng)網(wǎng)絡(luò)中使用回歸的方法一步就預(yù)測出目標的位置以及目標的類別。雖然兩步檢測的目標檢測方法在大多數(shù)的場景下精確率更高,但是它需要分兩個步驟進行,因此,這種方法將耗費大量的時間成本和昂貴的硬件成本,不適合對視頻文件進行實時的檢測。而YOLO系列的網(wǎng)絡(luò)速度更快,可以適應(yīng)實時視頻的檢測,泛化能力更強。
對于人員跟蹤,2016年Alex Bewley提出了簡單在線實時跟蹤算法,這種算法把傳統(tǒng)的卡爾曼濾波和匈牙利算法結(jié)合到一起, 能在視頻幀序列中很好地進行跨檢測結(jié)果的關(guān)聯(lián), 而且它的速度比傳統(tǒng)的算法快20倍左右,可以快速地對目標檢測反饋的數(shù)據(jù)進行處理。
故本項目通過采用深度學習方法實現(xiàn)YOLO算法行人檢測和deepsort算法對人員定位的和軌跡跟蹤。其最終實現(xiàn)效果如下圖可見:

基本介紹
1.1 環(huán)境要求
本次環(huán)境使用的是python3.6.5+windows平臺。主要用的庫有:
opencv模塊。在計算機視覺項目的開發(fā)中,opencv作為較大眾的開源庫,擁有了豐富的常用圖像處理函數(shù)庫,采用C/C++語言編寫,可以運行在Linux/Windows/Mac等操作系統(tǒng)上,能夠快速的實現(xiàn)一些圖像處理和識別的任務(wù)。
pillow模塊。PIL是理想的圖像存檔和批處理應(yīng)用程序。您可以使用庫創(chuàng)建縮略圖,在文件格式、打印圖像等之間進行轉(zhuǎn)換。它提供了廣泛的文件格式支持、高效的內(nèi)部表示和相當強大的圖像處理功能。核心圖像庫是為快速訪問以幾種基本像素格式存儲的數(shù)據(jù)而設(shè)計的。為通用圖像處理工具提供了堅實的基礎(chǔ)。
Scipy庫。Scipy是一個用于數(shù)學、科學、工程領(lǐng)域的常用軟件包,可以處理插值、積分、優(yōu)化、圖像處理、常微分方程數(shù)值解的求解、信號處理等問題。它用于有效計算Numpy矩陣,使Numpy和Scipy協(xié)同工作,高效解決問題。
keras模塊。Keras是一個由Python編寫的開源人工神經(jīng)網(wǎng)絡(luò)庫,可以作為Tensorflow、Microsoft-CNTK和Theano的高階應(yīng)用程序接口,進行深度學習模型的設(shè)計、調(diào)試、評估、應(yīng)用和可視化。
1.2 算法設(shè)計
使用卷積神經(jīng)網(wǎng)絡(luò)對視頻中的行人進行檢測和跟蹤。視頻幀輸入之后首先進入YOLOv3目標檢測的網(wǎng)絡(luò),經(jīng)過Darknet-53提取特征;其次,進行上采樣和特征融合,再進行回歸分析;再次,把得出的預(yù)測框信息輸入SORT算法進行目標特征建模,匹配和跟蹤;最后,輸出結(jié)果。下圖為算法流程設(shè)計圖:

行人檢測
2.1 YOLO行人檢測
常見的兩階段檢測首先是使用候選區(qū)域生成器生成的候選區(qū)集合,并從每個候選區(qū)中提取特征,然后使用區(qū)域分類器預(yù)測候選區(qū)域的類別。而YOLO作為單階段檢測器,則不用生成候選區(qū)域,直接對特征圖的每個位置上的對象進行分類預(yù)測,效率更高。
在這里使用labelme標注行人數(shù)據(jù)集,然后通過搭建好的YOLO算法產(chǎn)生模型并進行訓(xùn)練即可。
def yolo_body(inputs, num_anchors, num_classes):
"""Create YOLO_V3 model CNN body in Keras."""
darknet = Model(inputs, darknet_body(inputs))
x, y1 = make_last_layers(darknet.output, 512, num_anchors*(num_classes+5))
x = compose(
DarknetConv2D_BN_Leaky(256, (1,1)),
UpSampling2D(2))(x)
x = Concatenate()([x,darknet.layers[152].output])
x, y2 = make_last_layers(x, 256, num_anchors*(num_classes+5))
x = compose(
DarknetConv2D_BN_Leaky(128, (1,1)),
UpSampling2D(2))(x)
x = Concatenate()([x,darknet.layers[92].output])
x, y3 = make_last_layers(x, 128, num_anchors*(num_classes+5))
return Model(inputs, [y1,y2,y3])

2.2 Deepsort行人跟蹤
行人多目標跟蹤算法設(shè)計的步驟如下:
(1) 檢測階段:目標檢測算法會分析每一個輸入幀,并識別屬于特定類別的對象,給出分類和坐標。
(2) 特征提取/運動軌跡預(yù)測階段:采用一種或者多種特征提取算法用來提取表觀特征,運動或者交互特征。此外,還可以使用軌跡預(yù)測器預(yù)測該目標的下一個位置。
(3) 相似度計算階段:表觀特征和運動特征可以用來計算兩個目標之間的相似性。
(4) 關(guān)聯(lián)階段:使用計算得到的相似性作為依據(jù),將屬于同一目標的檢測對象和軌跡關(guān)聯(lián)起來,并給檢測對象分配和軌跡相同的 ID。
使用卡爾曼濾波類跟蹤的估計狀態(tài)系統(tǒng)和估計的方差或不確定性。用于預(yù)測。
這里dist_thresh為距離閾值。當超過閾值時,軌道將被刪除,并創(chuàng)建新的軌道;Max_frames_to_skip為允許跳過的最大幀數(shù)對于跟蹤對象未被檢測到;max_trace_length為跟蹤路徑歷史長度;trackIdCount為每個軌道對象的標識。
def Update\(self, detections\):
if \(len\(self.tracks\) == 0\):
for i in range\(len\(detections\)\):
track = Track\(detections\[i\], self.trackIdCount\)
self.trackIdCount += 1
self.tracks.append\(track\)
N = len\(self.tracks\)
M = len\(detections\)
cost = np.zeros\(shape=\(N, M\)\)
for i in range\(len\(self.tracks\)\):
for j in range\(len\(detections\)\):
try:
diff = self.tracks\[i\].prediction - detections\[j\]
distance = np.sqrt\(diff\[0\]\[0\]\*diff\[0\]\[0\] +
diff\[1\]\[0\]\*diff\[1\]\[0\]\)
cost\[i\]\[j\] = distance
except:
pass
cost = \(0.5\) \* cost
assignment = \[\]
for \_ in range\(N\):
assignment.append\(-1\)
row\_ind, col\_ind = linear\_sum\_assignment\(cost\)
for i in range\(len\(row\_ind\)\):
assignment\[row\_ind\[i\]\] = col\_ind\[i\]
un\_assigned\_tracks = \[\]
for i in range\(len\(assignment\)\):
if \(assignment\[i\] \!= -1\):
if \(cost\[i\]\[assignment\[i\]\] > self.dist\_thresh\):
assignment\[i\] = -1
un\_assigned\_tracks.append\(i\)
pass
else:
self.tracks\[i\].skipped\_frames += 1
del\_tracks = \[\]

綜合結(jié)果顯示
將YOLO行人檢測和deepsort算法結(jié)合,并通過設(shè)置基本閾值參數(shù)控制軌跡預(yù)測的歐式距離。通過搭建本項目可應(yīng)用于城市商業(yè)街道、人行道、校園道路場景,使用其得出的人員流動數(shù)據(jù),幫助公共交通和安全管理。最終得到的使用效果如下:
track\_colors = get\_colors\_for\_classes\(max\_colors\)
result = np.asarray\(image\)
font = cv2.FONT\_HERSHEY\_SIMPLEX
result0 = result.copy\(\)
result1=result.copy\(\)
img\_position=np.zeros\(\[result.shape\[0\],result.shape\[1\],3\]\)
if \(len\(centers\) > 0\):
tracker.Update\(centers\)
for i in range\(len\(tracker.tracks\)\):
if \(len\(tracker.tracks\[i\].trace\) > 1\):
x0, y0 = tracker.tracks\[i\].trace\[\-1\]\[0\]\[0\], tracker.tracks\[i\].trace\[\-1\]\[1\]\[0\]
cv2.putText\(result0, "ID: "+str\(tracker.tracks\[i\].track\_id-99\), \(int\(x0\), int\(y0\)\), font, track\_id\_size,
\(255, 255, 255\), 2\)
cv2.putText\(result1, "ID: " + str\(tracker.tracks\[i\].track\_id - 99\), \(int\(x0\), int\(y0\)\), font,
track\_id\_size,
\(255, 255, 255\), 2\)
color\_random = tracker.tracks\[i\].track\_id \% 9
cv2.circle\(img\_position, \(int\(x0\), int\(y0\)\), 1, track\_colors\[color\_random\], 8\)
cv2.putText\(img\_position, str\(tracker.tracks\[i\].track\_id - 99\), \(int\(x0\), int\(y0\)\), font,
track\_id\_size,
\(255, 255, 255\), 2\)
result0=result0.copy\(\)
for j in range\(len\(tracker.tracks\[i\].trace\) - 1\):
x1 = tracker.tracks\[i\].trace\[j\]\[0\]\[0\]
y1 = tracker.tracks\[i\].trace\[j\]\[1\]\[0\]
x2 = tracker.tracks\[i\].trace\[j + 1\]\[0\]\[0\]
y2 = tracker.tracks\[i\].trace\[j + 1\]\[1\]\[0\]
clr = tracker.tracks\[i\].track\_id \% 9
distance = \(\(x2 - x1\) \*\* 2 + \(y2 - y1\) \*\* 2\) \*\* 0.5
if distance \< max\_point\_distance:
cv2.line\(result1, \(int\(x1\), int\(y1\)\), \(int\(x2\), int\(y2\)\),
track\_colors\[clr\], 4\)
result1\=result1.copy\(\)

完整代碼:
https://pan.baidu.com/s/1KHEbPwCrjsS_3wBdUrtdtQ提取碼:pe5m
作者簡介:??
李秋鍵,CSDN博客專家,CSDN達人課作者。碩士在讀于中國礦業(yè)大學,開發(fā)有taptap競賽獲獎等。
如果覺得有用,就請分享到朋友圈吧!
公眾號后臺回復(fù)“CVPR21檢測”獲取CVPR2021目標檢測論文下載~

#?CV技術(shù)社群邀請函?#

備注:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳)
即可申請加入極市目標檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術(shù)交流群
每月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~

