濮阳杆衣贸易有限公司

主頁 > 知識庫 > Deepsort + Yolo 實現(xiàn)行人檢測和軌跡追蹤的方法

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

熱門標簽:佛山防封外呼系統(tǒng)收費 不錯的400電話辦理 南昌辦理400電話怎么安裝 鄭州智能外呼系統(tǒng)運營商 哈爾濱外呼系統(tǒng)代理商 電話機器人適用業(yè)務 湛江電銷防封卡 獲客智能電銷機器人 徐州天音防封電銷卡

引言

行人檢測是近年來計算機視覺領(lǐng)域的研究熱點,同時也是目標檢測領(lǐng)域中的難點。其目的是識別和定位圖像中存在的行人,在許多領(lǐ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ò)中使用回歸的方法一步就預測出目標的位置以及目標的類別。雖然兩步檢測的目標檢測方法在大多數(shù)的場景下精確率更高,但是它需要分兩個步驟進行,因此,這種方法將耗費大量的時間成本和昂貴的硬件成本,不適合對視頻文件進行實時的檢測。而YOLO系列的網(wǎng)絡(luò)速度更快,可以適應實時視頻的檢測,泛化能力更強。

對于人員跟蹤,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)一些圖像處理和識別的任務。

pillow模塊。PIL是理想的圖像存檔和批處理應用程序。您可以使用庫創(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的高階應用程序接口,進行深度學習模型的設(shè)計、調(diào)試、評估、應用和可視化 。

1.2 算法設(shè)計

使用卷積神經(jīng)網(wǎng)絡(luò)對視頻中的行人進行檢測和跟蹤。視頻幀輸入之后首先進入YOLOv3目標檢測的網(wǎng)絡(luò),經(jīng)過Darknet-53提取特征;其次,進行上采樣和特征融合,再進行回歸分析;再次,把得出的預測框信息輸入SORT算法進行目標特征建模,匹配和跟蹤;最后,輸出結(jié)果。下圖為算法流程設(shè)計圖:

行人檢測

2.1 YOLO行人檢測

常見的兩階段檢測首先是使用候選區(qū)域生成器生成的候選區(qū)集合,并從每個候選區(qū)中提取特征,然后使用區(qū)域分類器預測候選區(qū)域的類別。而YOLO作為單階段檢測器,則不用生成候選區(qū)域,直接對特征圖的每個位置上的對象進行分類預測,效率更高。

在這里使用labelme標注行人數(shù)據(jù)集,然后通過搭建好的YOLO算法產(chǎ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) 特征提取/運動軌跡預測階段:采用一種或者多種特征提取算法用來提取表觀特征,運動或者交互特征。此外,還可以使用軌跡預測器預測該目標的下一個位置。

(3) 相似度計算階段:表觀特征和運動特征可以用來計算兩個目標之間的相似性。

(4) 關(guān)聯(lián)階段:使用計算得到的相似性作為依據(jù),將屬于同一目標的檢測對象和軌跡關(guān)聯(lián)起來,并給檢測對象分配和軌跡相同的 ID。

使用卡爾曼濾波類跟蹤的估計狀態(tài)系統(tǒng)和估計的方差或不確定性。用于預測。

這里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è)街道、人行道、校園道路場景,使用其得出的人員流動數(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 實現(xiàn)行人檢測和軌跡追蹤的文章就介紹到這了,更多相關(guān)Deepsort Yolo 行人檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python+opencv3.4.0 實現(xiàn)HOG+SVM行人檢測的示例代碼

標簽:吉安 蘭州 呂梁 懷化 廣西 蕪湖 紹興 安康

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Deepsort + Yolo 實現(xiàn)行人檢測和軌跡追蹤的方法》,本文關(guān)鍵詞  Deepsort,Yolo,實現(xiàn),行人,檢測,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Deepsort + Yolo 實現(xiàn)行人檢測和軌跡追蹤的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于Deepsort + Yolo 實現(xiàn)行人檢測和軌跡追蹤的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    霍山县| 湟源县| 广河县| 枣庄市| 大名县| 蓬安县| 阿图什市| 拉萨市| 庆阳市| 遂昌县| 祁连县| 武川县| 兴和县| 宁城县| 余庆县| 白玉县| 襄汾县| 榆林市| 龙井市| 莱西市| 深水埗区| 东丽区| 霸州市| 若尔盖县| 辉南县| 内黄县| 阿瓦提县| 江口县| 龙山县| 和林格尔县| 天台县| 曲靖市| 新绛县| 化隆| 册亨县| 罗田县| 宽甸| 绥芬河市| 甘肃省| 东台市| 恭城|