張慧辰 孔晨晨 楊卓敏
(公安部交通管理科學(xué)研究所,江蘇 無錫 214151)
當前我國高速公路總里程數(shù)已超過16 萬公里,接入視頻監(jiān)控超過5 萬路,視頻監(jiān)控資源充足,但同時,違反禁止標線、倒車、逆行等違法行為對正常的高速公路交通秩序帶來巨大安全隱患。當前通過安裝具備違法取證功能的智能監(jiān)控設(shè)備可以實現(xiàn)對部分違法行為的識別與取證,但對于更大范圍的常規(guī)視頻監(jiān)控設(shè)備,則只能通過人工視頻巡邏的方式發(fā)現(xiàn)違法,投入的人力資源大且效率低下。利用現(xiàn)有視頻監(jiān)控資源從中自動識別違法行為、異常事件是高速公路智能化管理的需求[1],在匝道口等特定高速公路場景下已經(jīng)有基于視頻監(jiān)控分析的應(yīng)用實踐[2]。本文研究基于視頻分析的高速公路違法行為識別系統(tǒng)架構(gòu)與具體實現(xiàn),利用高速公路已有的視頻監(jiān)控系統(tǒng),主動發(fā)現(xiàn)高速公路上的部分違法行為。
系統(tǒng)總體分為視頻預(yù)處理、場景識別、目標檢測跟蹤、違法分析、數(shù)據(jù)存儲、消息隊列以及視頻渲染等7 個模塊組成。消息隊列、數(shù)據(jù)存儲是保障系統(tǒng)高效穩(wěn)定運行的支撐模塊。視頻預(yù)處理、場景識別、目標檢測跟蹤、違法分析及視頻渲染是實現(xiàn)視頻分析的核心模塊,其中場景識別為獨立運行模塊,負責場景要素的結(jié)構(gòu)化識別。單一視頻識別流程中,按照先視頻預(yù)處理、再目標跟蹤、最后違法分析的順序進行;在系統(tǒng)設(shè)計中,上述3 個模塊并行運行,前一個模塊是后一個模塊的生產(chǎn)者,后一個模塊是前一個模塊的消費者。視頻渲染負責視頻分析結(jié)果的可視化直觀展現(xiàn)??傮w架構(gòu)見圖1。
圖1 總體架構(gòu)圖
在視頻違法分析流程中,基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)共有6 種,分別是視頻流、幀、圖片、目標信息、檢測結(jié)果和跟蹤結(jié)果。視頻流指待分析的實時視頻;幀指視頻分析過程中,按幀從實時視頻中提取的幀數(shù)據(jù);圖片指將幀數(shù)據(jù)進行格式轉(zhuǎn)換后形成的圖片;目標信息是一個目標在一張圖片上的位置(中心點坐標及寬高)以及車型分類結(jié)果;檢測結(jié)果是一張圖片上多個目標信息的集合;跟蹤結(jié)果是一個目標在多幀圖片上的目標信息集合?;A(chǔ)數(shù)據(jù)結(jié)構(gòu)定義見表1。
表1 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)定義
為了提供系統(tǒng)的并發(fā)處理能力,采用消息隊列負責各個模塊間的數(shù)據(jù)交換,內(nèi)存隊列、Kafka 以及ActiveMQ 都是可選的消息隊列實現(xiàn)方案。本研究采用java 自帶阻塞隊列作為消息隊列的具體實現(xiàn)。對于每個攝像機,分別創(chuàng)建幀隊列、場景識別隊列、檢測跟蹤隊列以及違法分析隊列。幀隊列中的對象是幀,場景識別隊列中的對象是圖片,檢測跟蹤隊列中的對象是檢測結(jié)果,違法分析隊列中的對象是跟蹤結(jié)果。
數(shù)據(jù)存儲模塊邏輯上分為臨時存儲區(qū)和永久存儲區(qū),物理上分為關(guān)系型數(shù)據(jù)庫和文件存儲數(shù)據(jù)庫,關(guān)系型數(shù)據(jù)庫選用oracle,文件存儲數(shù)據(jù)庫選用seaweedfs。臨時存儲區(qū)負責存儲視頻分析過程中所需的結(jié)構(gòu)化信息及圖片數(shù)據(jù),永久存儲區(qū)負責存儲違法車輛的結(jié)構(gòu)化信息和通行視頻,臨時存儲區(qū)中的數(shù)據(jù)由數(shù)據(jù)清理任務(wù)負責定期清理;關(guān)系型數(shù)據(jù)庫負責存儲攝像機信息、違法信息等結(jié)構(gòu)化文本信息,文件存儲負責存儲圖片及視頻文件。接口上通過jdbc 讀寫關(guān)系型數(shù)據(jù)庫中的結(jié)構(gòu)化信息,通過文件存取接口讀寫圖片及視頻數(shù)據(jù)。數(shù)據(jù)存儲模塊設(shè)計見圖2。
圖2 數(shù)據(jù)存儲模塊設(shè)計
當前流媒體服務(wù)器及主流品牌監(jiān)控設(shè)備均支持rtsp 實時視頻流輸出。因此在本研究中,視頻預(yù)處理的對象為rtsp實時視頻流。視頻預(yù)處理模塊負責接收視頻流,并將視頻流轉(zhuǎn)換為圖片集。由于視頻預(yù)處理是所有后續(xù)模塊的基礎(chǔ),為確保高效的視頻預(yù)處理,將視頻預(yù)處理進一步劃分為視頻抽幀以及幀圖片存儲兩個步驟,兩個步驟并行執(zhí)行,通過消息隊列進行數(shù)據(jù)交互,確保預(yù)處理過程的高效穩(wěn)定。視頻預(yù)處理流程示意見圖3。
圖3 視頻預(yù)處理流程示意
本研究中,視頻預(yù)處理基于JavaCV 的ffmpeg 模塊實現(xiàn)。視頻抽幀不斷從rtsp 實時視頻流中獲取視頻幀,并將視頻幀暫存到幀隊列中。圖片存儲負責從幀隊列中讀取幀,并將幀轉(zhuǎn)換為圖片,存入數(shù)據(jù)存儲。
(1)視頻抽幀實現(xiàn)步驟:
步驟1:利用rtsp 實時視頻地址初始化視頻抽幀器FFmpegFrameGrabber。
步驟2:從FFmpegFrameGrabber 獲取下一幀,并將幀存入幀隊列。
步驟3:循環(huán)執(zhí)行步驟2。(2)圖片存儲實現(xiàn)步驟:
步驟1:從幀隊列中獲取一幀。
步驟2:利用FrameConverter 將幀轉(zhuǎn)換為圖片數(shù)據(jù)。
步驟3:調(diào)用數(shù)據(jù)存儲模塊的圖片寫入接口存儲圖片,返回圖片鏈接。
步驟4:將攝像機編號、幀序號、圖片地址組合為圖片數(shù)據(jù),寫入檢測跟蹤隊列;每隔固定時間,將圖片數(shù)據(jù)同時寫入場景識別隊列。
步驟5:循環(huán)執(zhí)行步驟1-4。
高速公路相比城市道路,特點是場景相對簡單、固定。場景識別目的是識別出監(jiān)控區(qū)域內(nèi)的固定標志、標線,為違法分析提供數(shù)據(jù)基礎(chǔ)。基于深度學(xué)習(xí)的語義分割可以實現(xiàn)像素級的場景要素識別,為確保識別結(jié)果的有效性,對識別結(jié)果進行人工核實與修正。在本研究中,對每個攝像機間隔固定時間取一張圖片進行場景識別。場景識別示意見圖4。場景識別輸出每個攝像機編號對應(yīng)的場景識別結(jié)果,場景識別結(jié)果由若干車道與標線組成。車道是若干點連成的封閉區(qū)域;標線是若干點連成的線段或封閉區(qū)域。
圖4 場景識別流程示意
目標檢測跟蹤是視頻分析中最基礎(chǔ)也是最核心的模塊,具體包括目標檢測和運動目標跟蹤。目標檢測的任務(wù)是找出圖像中所有感興趣的目標(物體),確定它們的類別和位置;通過目標檢測,可以實現(xiàn)輸入一張圖片,輸出圖片中每個機動車的位置及車型分類。運動目標跟蹤利用連續(xù)多幀圖片中的目標位置信息,計算目標的運動軌跡;通過運動目標跟蹤,可以實現(xiàn)輸入多幀目標檢測結(jié)果,輸出每一個目標的位置運動軌跡,將視頻中運動目標的軌跡結(jié)構(gòu)化。
相比RCNN 等傳統(tǒng)目標檢測算法,YOLO 模型運行速度可以達到45fps[3],大于高速公路上主流相機的每秒幀數(shù)25fps。同時由于高速公路視頻分析對時效性要求高,因此在本研究中選用基于YOLO 模型訓(xùn)練的目標檢測算法進行機動車目標檢測。在目標檢測的同時,進行運動目標跟蹤,每完成一次目標檢測,根據(jù)檢測結(jié)果對跟蹤目標清單中的目標軌跡進行更新,對于跟蹤完成的目標,從跟蹤目標清單中移除,并加入違法分析隊列。目標檢測跟蹤流程示意見圖5。
圖5 目標檢測與跟蹤示意
本研究開發(fā)了目標檢測跟蹤算法,具體步驟如下:
假設(shè):目標信息為v;單張圖片檢測后可形成圖片中多個目標信息的集合,定義為檢測結(jié)果V,V 是同一張圖片中若干v 的集合;某一車輛在多幀圖片中的目標信息集合記為跟蹤結(jié)果r,r 是同一輛車,在不同圖片中的若干v 的集合;正在進行跟蹤的目標集合定義為跟蹤目標清單R,R 是r 的集合;跟蹤完畢的目標集合定義為跟蹤完成結(jié)果Y,Y 也是r 的集合。R 與Y 初始化均為空。
步驟1:從檢測跟蹤隊列中取出圖片信息,根據(jù)圖片鏈接,獲取實際圖片。
步驟2:對圖片進行目標檢測,得到Vj。
步驟3:判斷R 是否為空,若R 為空,則將Vj中每一個vj 作為一個跟蹤結(jié)果r,寫入R,進入步驟1;若R 不為空,進入步驟4。
步驟4:從集合R 中取出一個車輛信息集合r,r 中最后一個目標信息為vr,為r 構(gòu)建一個候選列表集合L,初始化L為空。
步驟5:從Vj中取出一個車輛信息vk,設(shè)Vj中包括N 個目標信息,k 為目標信息v 在Vj中的序號,k≤N;k 初始化為0。
步驟6:比較vk和vr的目標分類是否相同,如果二者相同,進入步驟c7;否則進入步驟8。
步驟7:計算vr的中心點坐標與vk的中心點坐標的距離D,比較D 和預(yù)設(shè)的軌跡距離閾值:若DH < 軌跡距離閾值,則將對應(yīng)的vk放入到L 中;否則,進入步驟8。
步驟8:循環(huán)實施步驟c5~c7,直至集合Vj中所有vk都與vr進行過比較后,執(zhí)行步驟9。
步驟9:確認r 對應(yīng)的候選表集合L 是否為空:如果L 為空,r 跟蹤結(jié)束,將r 從R 中移除,加入Y,進入步驟11;否則,進入步驟c10。
步驟10:從L 中取出與r 中心點坐標距離最小的車輛信息vk,放到車輛跟蹤結(jié)果r 中,作為車輛跟蹤結(jié)果r 的最后一輛車,并從Vj中刪除vk。
步驟11:循環(huán)執(zhí)行步驟c4~c10;直至R 中每一個r 都參與過計算。
步驟12:若Vj中仍然存在vk,則將每一個vk作為一個新的跟蹤結(jié)果r,寫入R。
步驟13:循環(huán)執(zhí)行步驟1~12。
違法分析模塊負責對每一個完成檢測跟蹤的目標進行分析,結(jié)合場景識別結(jié)果,判斷有無違法行為。根據(jù)目標軌跡與禁止標線的位置關(guān)系可以實現(xiàn)違反禁止標線違法識別;根據(jù)目標軌跡與場景應(yīng)急車道的位置關(guān)系可以實現(xiàn)占用應(yīng)急車道違法識別;根據(jù)目標軌跡運動方向與場景車道通行方向的比較,可以實現(xiàn)倒車、逆行違法識別等。視頻渲染模塊負責根據(jù)需要,從存儲模塊讀取違法信息及圖片集,并將目標軌跡信息、違法信息疊加到圖片集上,再轉(zhuǎn)換為視頻文件,以更加直觀的方式展現(xiàn)。違法分析與視頻渲染流程見圖6。
圖6 違法分析與視頻渲染
選擇某地高速公路視頻片段進行分析,渲染后的視頻分析結(jié)果及軌跡重現(xiàn)示例見圖7,其中軌跡重現(xiàn)使用目標區(qū)域底部中點的軌跡。
圖7 視頻分析結(jié)果及軌跡重現(xiàn)
本文根據(jù)高速公路視頻監(jiān)控建設(shè)現(xiàn)狀及違法智能分析需求,研究了基于視頻分析的違法行為分析實現(xiàn)方法,提出了系統(tǒng)總體架構(gòu)設(shè)計以及各個功能模塊的設(shè)計思路,基于JAVACV 開發(fā)了違法行為分析系統(tǒng)軟件,并在真實場景的視頻資源下進行了測試、驗證。