Deepsort + Yolo 實(shí)現(xiàn)行人檢測(cè)和軌跡追蹤的方法
引言
行人檢測(cè)是近年來計(jì)算機(jī)視覺領(lǐng)域的研究熱點(diǎn),同時(shí)也是目標(biāo)檢測(cè)領(lǐng)域中的難點(diǎn)。其目的是識(shí)別和定位圖像中存在的行人,在許多領(lǐng)域中都有廣泛的應(yīng)用。交通安全方面,無人駕駛汽車通過提前檢測(cè)到行人及時(shí)避讓來避免交通事故的發(fā)生;安防保護(hù)方面,通過行人檢測(cè)來防止可疑人員進(jìn)入;公共場(chǎng)所管理方面,通過行人檢測(cè)統(tǒng)計(jì)人流量數(shù)據(jù),優(yōu)化人力物力等資源的分配。
對(duì)于目標(biāo)檢測(cè)的方法,從2013年Ross Girshick提出R-CNN開始,人們?cè)诙潭處啄陜?nèi)相繼提出Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO等算法,其中兩步檢測(cè)的目標(biāo)檢測(cè)方法(R-CNN系列算法)需要先產(chǎn)生大量候選框之后再用卷積神經(jīng)網(wǎng)絡(luò)對(duì)候選框進(jìn)行分類和回歸處理;單步檢測(cè)的方法(SSD、YOLO系列算法)則直接在卷積神經(jīng)網(wǎng)絡(luò)中使用回歸的方法一步就預(yù)測(cè)出目標(biāo)的位置以及目標(biāo)的類別。雖然兩步檢測(cè)的目標(biāo)檢測(cè)方法在大多數(shù)的場(chǎng)景下精確率更高,但是它需要分兩個(gè)步驟進(jìn)行,因此,這種方法將耗費(fèi)大量的時(shí)間成本和昂貴的硬件成本,不適合對(duì)視頻文件進(jìn)行實(shí)時(shí)的檢測(cè)。而YOLO系列的網(wǎng)絡(luò)速度更快,可以適應(yīng)實(shí)時(shí)視頻的檢測(cè),泛化能力更強(qiáng)。
對(duì)于人員跟蹤,2016年Alex Bewley提出了簡(jiǎn)單在線實(shí)時(shí)跟蹤算法,這種算法把傳統(tǒng)的卡爾曼濾波和匈牙利算法結(jié)合到一起, 能在視頻幀序列中很好地進(jìn)行跨檢測(cè)結(jié)果的關(guān)聯(lián), 而且它的速度比傳統(tǒng)的算法快20倍左右,可以快速地對(duì)目標(biāo)檢測(cè)反饋的數(shù)據(jù)進(jìn)行處理。
故本項(xiàng)目通過采用深度學(xué)習(xí)方法實(shí)現(xiàn)YOLO算法行人檢測(cè)和deepsort算法對(duì)人員定位的和軌跡跟蹤。其最終實(shí)現(xiàn)效果如下圖可見:
基本介紹
1.1 環(huán)境要求
本次環(huán)境使用的是python3.6.5+windows平臺(tái)。主要用的庫有:
opencv模塊。在計(jì)算機(jī)視覺項(xiàng)目的開發(fā)中,opencv作為較大眾的開源庫,擁有了豐富的常用圖像處理函數(shù)庫,采用C/C++語言編寫,可以運(yùn)行在Linux/Windows/Mac等操作系統(tǒng)上,能夠快速的實(shí)現(xiàn)一些圖像處理和識(shí)別的任務(wù)。
pillow模塊。PIL是理想的圖像存檔和批處理應(yīng)用程序。您可以使用庫創(chuàng)建縮略圖,在文件格式、打印圖像等之間進(jìn)行轉(zhuǎn)換。它提供了廣泛的文件格式支持、高效的內(nèi)部表示和相當(dāng)強(qiáng)大的圖像處理功能。核心圖像庫是為快速訪問以幾種基本像素格式存儲(chǔ)的數(shù)據(jù)而設(shè)計(jì)的。為通用圖像處理工具提供了堅(jiān)實(shí)的基礎(chǔ)。
Scipy庫。Scipy是一個(gè)用于數(shù)學(xué)、科學(xué)、工程領(lǐng)域的常用軟件包,可以處理插值、積分、優(yōu)化、圖像處理、常微分方程數(shù)值解的求解、信號(hào)處理等問題。它用于有效計(jì)算Numpy矩陣,使Numpy和Scipy協(xié)同工作,高效解決問題。
keras模塊。Keras是一個(gè)由Python編寫的開源人工神經(jīng)網(wǎng)絡(luò)庫,可以作為Tensorflow、Microsoft-CNTK和Theano的高階應(yīng)用程序接口,進(jìn)行深度學(xué)習(xí)模型的設(shè)計(jì)、調(diào)試、評(píng)估、應(yīng)用和可視化 。
1.2 算法設(shè)計(jì)
使用卷積神經(jīng)網(wǎng)絡(luò)對(duì)視頻中的行人進(jìn)行檢測(cè)和跟蹤。視頻幀輸入之后首先進(jìn)入YOLOv3目標(biāo)檢測(cè)的網(wǎng)絡(luò),經(jīng)過Darknet-53提取特征;其次,進(jìn)行上采樣和特征融合,再進(jìn)行回歸分析;再次,把得出的預(yù)測(cè)框信息輸入SORT算法進(jìn)行目標(biāo)特征建模,匹配和跟蹤;最后,輸出結(jié)果。下圖為算法流程設(shè)計(jì)圖:
行人檢測(cè)
2.1 YOLO行人檢測(cè)
常見的兩階段檢測(cè)首先是使用候選區(qū)域生成器生成的候選區(qū)集合,并從每個(gè)候選區(qū)中提取特征,然后使用區(qū)域分類器預(yù)測(cè)候選區(qū)域的類別。而YOLO作為單階段檢測(cè)器,則不用生成候選區(qū)域,直接對(duì)特征圖的每個(gè)位置上的對(duì)象進(jìn)行分類預(yù)測(cè),效率更高。
在這里使用labelme標(biāo)注行人數(shù)據(jù)集,然后通過搭建好的YOLO算法產(chǎn)生模型并進(jì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行人跟蹤
行人多目標(biāo)跟蹤算法設(shè)計(jì)的步驟如下:
(1) 檢測(cè)階段:目標(biāo)檢測(cè)算法會(huì)分析每一個(gè)輸入幀,并識(shí)別屬于特定類別的對(duì)象,給出分類和坐標(biāo)。
(2) 特征提取/運(yùn)動(dòng)軌跡預(yù)測(cè)階段:采用一種或者多種特征提取算法用來提取表觀特征,運(yùn)動(dòng)或者交互特征。此外,還可以使用軌跡預(yù)測(cè)器預(yù)測(cè)該目標(biāo)的下一個(gè)位置。
(3) 相似度計(jì)算階段:表觀特征和運(yùn)動(dòng)特征可以用來計(jì)算兩個(gè)目標(biāo)之間的相似性。
(4) 關(guān)聯(lián)階段:使用計(jì)算得到的相似性作為依據(jù),將屬于同一目標(biāo)的檢測(cè)對(duì)象和軌跡關(guān)聯(lián)起來,并給檢測(cè)對(duì)象分配和軌跡相同的 ID。
使用卡爾曼濾波類跟蹤的估計(jì)狀態(tài)系統(tǒng)和估計(jì)的方差或不確定性。用于預(yù)測(cè)。
這里dist_thresh為距離閾值。當(dāng)超過閾值時(shí),軌道將被刪除,并創(chuàng)建新的軌道;Max_frames_to_skip為允許跳過的最大幀數(shù)對(duì)于跟蹤對(duì)象未被檢測(cè)到;max_trace_length為跟蹤路徑歷史長(zhǎng)度;trackIdCount為每個(gè)軌道對(duì)象的標(biāo)識(shí)。
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行人檢測(cè)和deepsort算法結(jié)合,并通過設(shè)置基本閾值參數(shù)控制軌跡預(yù)測(cè)的歐式距離。通過搭建本項(xiàng)目可應(yīng)用于城市商業(yè)街道、人行道、校園道路場(chǎng)景,使用其得出的人員流動(dòng)數(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/1cJ6dgcEHOVGXvfg-ON3IrQ
提取碼: f5y9
到此這篇關(guān)于Deepsort + Yolo 實(shí)現(xiàn)行人檢測(cè)和軌跡追蹤的文章就介紹到這了,更多相關(guān)Deepsort Yolo 行人檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Python編程中3個(gè)常用的數(shù)據(jù)結(jié)構(gòu)和算法
這篇文章主要介紹了淺談Python編程中3個(gè)常用的數(shù)據(jù)結(jié)構(gòu)和算法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04bluepy 一款python封裝的BLE利器簡(jiǎn)單介紹
這篇文章主要介紹了bluepy 一款python封裝的BLE利器簡(jiǎn)單介紹,bluepy 是github上一個(gè)很好的藍(lán)牙開源項(xiàng)目, 其主要功能是用python實(shí)現(xiàn)linux上BLE的接口。,需要的朋友可以參考下2019-06-06flask post獲取前端請(qǐng)求參數(shù)的三種方式總結(jié)
這篇文章主要介紹了flask post獲取前端請(qǐng)求參數(shù)的三種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12基于python批量處理dat文件及科學(xué)計(jì)算方法詳解
今天小編就為大家分享一篇基于python批量處理dat文件及科學(xué)計(jì)算方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05Python中生成隨機(jī)密碼的多種超實(shí)用實(shí)例
隨機(jī)密碼生成器是一種常見的工具,用于生成強(qiáng)密碼,下面這篇文章主要給大家介紹了關(guān)于Python中生成隨機(jī)密碼的多種超實(shí)用實(shí)例,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05python爬蟲MeterSphere平臺(tái)執(zhí)行報(bào)告使用實(shí)戰(zhàn)
這篇文章主要為大家介紹了python爬蟲MeterSphere平臺(tái)執(zhí)行報(bào)告使用實(shí)戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12python bmp轉(zhuǎn)換為jpg 并刪除原圖的方法
今天小編就為大家分享一篇python bmp轉(zhuǎn)換為jpg 并刪除原圖的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10解決Django中修改js css文件但瀏覽器無法及時(shí)與之改變的問題
今天小編就為大家分享一篇解決Django中修改js css文件但瀏覽器無法及時(shí)與之改變的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08