[AI 開發(fā)] 基于 DeepStream 的視頻結(jié)構(gòu)化解決方案
視頻結(jié)構(gòu)化的定義
利用深度學(xué)習(xí)技術(shù)實(shí)時(shí)分析視頻中有價(jià)值的內(nèi)容,并輸出結(jié)構(gòu)化數(shù)據(jù)。相比數(shù)據(jù)庫中每條結(jié)構(gòu)化數(shù)據(jù)記錄,視頻、圖片、音頻等屬于非結(jié)構(gòu)化數(shù)據(jù),計(jì)算機(jī)程序不能直接識(shí)別非結(jié)構(gòu)化數(shù)據(jù),因此需要先將這些數(shù)據(jù)轉(zhuǎn)換成有結(jié)構(gòu)格式,用于后續(xù)計(jì)算機(jī)程序分析。視頻結(jié)構(gòu)化最常見的流程為:目標(biāo)檢測、目標(biāo)分類(屬性識(shí)別)、目標(biāo)跟蹤、目標(biāo)行為分析。最后的目標(biāo)行為分析嚴(yán)格來講不屬于視頻結(jié)構(gòu)化的范疇,可以算作前面每個(gè)環(huán)節(jié)結(jié)果的應(yīng)用。由于現(xiàn)實(shí)生產(chǎn)過程中,一個(gè)完整的應(yīng)用系統(tǒng)總會(huì)存在“目標(biāo)行為分析”這個(gè)過程(否則光得到基礎(chǔ)數(shù)據(jù)不能加以利用),所以本篇文章將其包含進(jìn)來。
目標(biāo)檢測
對(duì)單張圖片中感興趣的目標(biāo)進(jìn)行識(shí)別、定位,注意兩點(diǎn),一個(gè)是檢測的對(duì)象是靜態(tài)圖片,二是不但需要識(shí)別目標(biāo)的類別,還需要給出目標(biāo)在原圖片中的坐標(biāo)值,通常以(left, top, width, height)的形式給出。注意目標(biāo)檢測僅僅給出目標(biāo)大概位置坐標(biāo)(一個(gè)矩形區(qū)域),它跟圖像分割不同,后者定位更加具體,能夠給出圖片中單個(gè)目標(biāo)的輪廓邊界。
目標(biāo)分類(屬性識(shí)別)
通常目標(biāo)被檢測出來之后,會(huì)進(jìn)行二次(多次)推理,識(shí)別出目標(biāo)更加具體的屬性,比如小轎車的顏色、車牌子奧迪還是奔馳等等。對(duì)于人來講,可以二次推理出人的性別、年齡、穿著、發(fā)型等等外貌屬性。這個(gè)環(huán)節(jié)主要對(duì)檢測出來的目標(biāo)進(jìn)行更加具體的屬性識(shí)別。
目標(biāo)跟蹤
前面兩個(gè)環(huán)節(jié)操作的對(duì)象是靜態(tài)單張圖片,而視頻有時(shí)序性,前后兩幀中的目標(biāo)有關(guān)聯(lián)關(guān)系。目標(biāo)跟蹤就是為了將視頻第N幀中的目標(biāo)和第N+1幀中的同一目標(biāo)關(guān)聯(lián)起來,通常做法是給它們賦予同一個(gè)ID。經(jīng)過目標(biāo)跟蹤環(huán)節(jié)后,理論情況下,一個(gè)目標(biāo)從進(jìn)入視頻檢測范圍到離開,算法賦予該目標(biāo)的ID固定不變。但是現(xiàn)實(shí)生產(chǎn)過程中,由于各種原因,比如目標(biāo)被遮擋、目標(biāo)漏檢(第N幀檢測到,第N+1幀沒檢測到)、跟蹤算法自身準(zhǔn)確性等等原因,系統(tǒng)并不能鎖定視頻中同一個(gè)目標(biāo)的ID。目標(biāo)ID不能鎖定,會(huì)造成目標(biāo)行為分析不準(zhǔn)的問題,后面會(huì)提到。
目標(biāo)行為分析
視頻中目標(biāo)被跟蹤到,賦予唯一ID之后,我們可以記錄目標(biāo)在視頻檢測范內(nèi)的運(yùn)動(dòng)軌跡(二維坐標(biāo)點(diǎn)集合),通過分析目標(biāo)軌跡點(diǎn)數(shù)據(jù),我們可以做很多應(yīng)用。比如目標(biāo)是否跨域指定區(qū)域、目標(biāo)運(yùn)動(dòng)方向、目標(biāo)運(yùn)動(dòng)速度、目標(biāo)是否逗留(逗留時(shí)長)、目標(biāo)是否密集等等。該應(yīng)用多存在于安防、交通視頻分析領(lǐng)域。
目標(biāo)檢測算法
常見基于深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的目標(biāo)檢測算法有3種,SSD、YOLO以及Faster-RCNN,具體請搜索網(wǎng)絡(luò),介紹文章非常多了。三者各有優(yōu)劣,遵循一個(gè)原則:速度快的準(zhǔn)確性不好,很多目標(biāo)檢測不準(zhǔn),很多小目標(biāo)檢測不到、容易漏檢等;準(zhǔn)確性好的速度不快,可能達(dá)不到實(shí)時(shí)檢測的要求,或者需要更高的硬件條件。魚和熊掌不可兼得,犧牲速度可以換來準(zhǔn)確性。這三種常見目標(biāo)檢測算法,綜合性比較好的是YOLO(現(xiàn)在已經(jīng)是YOLO V3版本),準(zhǔn)確性、小目標(biāo)檢測、檢測速度上都可以接受。SSD速度快,我在RTX 2080 的GPU上,能夠檢測32路1080P高清實(shí)時(shí)流,但是YOLO V3勉強(qiáng)可以跑到16路。Faster-RCNN準(zhǔn)確性更好,但是速度太慢,如果你有很好的GPU硬件支持,或者單臺(tái)服務(wù)器要求檢測視頻路數(shù)比較少,可以采用Faster-RCNN。下圖第一張是SSD算法效果,第二張是YOLO V3的算法效果,兩者模型都是采用同樣的數(shù)據(jù)集訓(xùn)練而成,可以很明顯看到,后者比前者效果好很多(忽略圖中速度值)。


需要注意的是,不管是何種算法,它們的檢測效果受數(shù)據(jù)集質(zhì)量影響非常大,數(shù)據(jù)集數(shù)量不夠、標(biāo)注質(zhì)量不高,都會(huì)嚴(yán)重影響最終檢測結(jié)果。做深度學(xué)習(xí)應(yīng)用型系統(tǒng),數(shù)據(jù)集的重要性非常明顯。
視頻結(jié)構(gòu)化處理流程框架
前面說到過,視頻結(jié)構(gòu)化包含多個(gè)環(huán)節(jié),各個(gè)環(huán)節(jié)相連而成,形成一個(gè)Pipeline的結(jié)構(gòu)。在實(shí)際生產(chǎn)過程中,我們還需要有視頻流接入的環(huán)節(jié),它負(fù)責(zé)接收視頻流數(shù)據(jù),由于網(wǎng)絡(luò)接收到的視頻數(shù)據(jù)是編碼過后的格式,我們還需要解碼的環(huán)節(jié),將原始視頻數(shù)據(jù)解碼成一張張RGB格式的圖片(這之前可能還需要顏色空間轉(zhuǎn)換,將YUV格式轉(zhuǎn)換成RGB),之后將單幀圖片送給推理模型進(jìn)行推理,返回推理結(jié)果。
很明顯,視頻結(jié)構(gòu)化是一個(gè)數(shù)據(jù)流式的處理過程,如果對(duì)GStreamer框架比較熟悉的人可能或想到,GStreamer非常適合做這件事情。這里是GStreamer的官網(wǎng):https://gstreamer.freedesktop.org/,跟FFmpeg類似,它主要用于音視頻多媒體程序開發(fā),但是兩個(gè)側(cè)重點(diǎn)不同,GStreamer中將多媒體處理流程中的每個(gè)環(huán)節(jié)都封裝成單個(gè)的插件,每個(gè)插件負(fù)責(zé)不同的任務(wù),比如有接收視頻流的、有負(fù)責(zé)編解碼的、有顏色空間轉(zhuǎn)換的等等,這些常用插件都已經(jīng)有現(xiàn)成非常成熟的,不需要自己開發(fā)。插件和插件之間通過某個(gè)協(xié)議進(jìn)行連接,最終形成一個(gè)完整的Pipeline。目前來看,使用FFmpeg的人明顯多余GStreamer。在我們這個(gè)應(yīng)用場景中,GStreamer非常適合我們,Nvidia官方推出的智能視頻分析SDK DeepStream也是基于GStreamer開發(fā)而成,Nvidia為我們準(zhǔn)備好了現(xiàn)成的插件,有負(fù)責(zé)推理的,有負(fù)責(zé)目標(biāo)跟蹤的,還有負(fù)責(zé)圖片疊加和顯示的。我們在使用DeepStream的同時(shí),也可以使用GStreamer中已有的其他插件,他們可以無縫集成,非常方便。
這里必須要提一下,GStreamer是C語言開發(fā)的,而我們知道C語言并非面向?qū)ο螅绻玫矫嫦驅(qū)ο蟮奶匦员仨毑扇∑渌胧珿Streamer就是使用了GObject那一套東西,GObject又是什么呢?它是一套在C中使用面向?qū)ο缶幊痰囊?guī)范。如果已經(jīng)非常熟悉主流面向?qū)ο笳Z言的人,再去接收GObject這種編程風(fēng)格,會(huì)要瘋掉,反人類(我這樣覺得)。下圖是采用DeepStream SDK開發(fā)視頻結(jié)構(gòu)化的Pipeline,簡單示意,并非真實(shí)生產(chǎn)中的結(jié)構(gòu):

使用DeepStream?做視頻結(jié)構(gòu)化應(yīng)用的好處
如果你用的推理硬件是Nvidia出的,比如Tesla系列顯卡、Geforce系列顯卡等等,那么使用DeepStream SDK的好處有:
(1)內(nèi)置推理加速插件nvinfer,注意普通深度學(xué)習(xí)模型(caffe、tensorflow等)在沒有經(jīng)過tensorRT加速之前,速度是上不來的。而DeepStream內(nèi)置的nvinfer推理插件不斷支持各種目標(biāo)檢測算法(SSD、YOLO、Faster-RCNN)以及各種深度學(xué)習(xí)框架模型(自由切換),內(nèi)部還自帶tensorRT INT8/FP16加速功能,不需要你做額外操作;
(2)內(nèi)置目標(biāo)跟蹤插件nvtracker,目前DeepStream 3.0提供兩種跟蹤算法,一種基于IOU的,這種算法簡單,但是快;另外一種KLT算法,準(zhǔn)確但是相對(duì)來講慢一些,而且由于這個(gè)算法是跑在CPU上,基于KLT的跟蹤算法對(duì)CPU占用相對(duì)大一些;
(3)內(nèi)置其他比較有用的插件,比如用于視頻疊加(目標(biāo)方框疊加到視頻中)的nvosd、硬件加速解碼插件nvdec_h264,專門采用GPU加速的解碼插件,還有其他顏色轉(zhuǎn)換的插件。
(4)提供跟視頻處理有關(guān)的各種元數(shù)據(jù)類型以及API,方便你擴(kuò)展自己的元數(shù)據(jù)類型,元數(shù)據(jù)在GStreamer中是一個(gè)很重要的概念。
使用DeepStream SDK的前提是要先掌握GStreamer的基本用法,否則就是抓瞎,前者其實(shí)就是后者的一堆插件集合,方便供你構(gòu)建視頻推理Pipeline。當(dāng)然,你還需要一些CUDA編程的基礎(chǔ)知識(shí)。
?
下面提供一個(gè)基于YOLO V3 16路1080P高清視頻實(shí)時(shí)目標(biāo)檢測、跟蹤、疊加、目標(biāo)行為判斷、結(jié)構(gòu)化數(shù)據(jù)上報(bào) 應(yīng)用系統(tǒng)截圖(截取其中4路圖像),由于某些原因,不再做過多的技術(shù)細(xì)節(jié)介紹了。

作者:周見智
出處:http://www.cnblogs.com/xiaozhi_5638/?
原文鏈接:https://www.cnblogs.com/xiaozhi_5638/p/10831459.html
本文轉(zhuǎn)自博客園網(wǎng),版權(quán)歸原作者所有。
