視頻結構化的定義算法
利用深度學習技術實時分析視頻中有價值的內容,並輸出結構化數據。相比數據庫中每條結構化數據記錄,視頻、圖片、音頻等屬於非結構化數據,計算機程序不能直接識別非結構化數據,所以須要先將這些數據轉換成有結構格式,用於後續計算機程序分析。視頻結構化最多見的流程爲:目標檢測、目標分類(屬性識別)、目標跟蹤、目標行爲分析。最後的目標行爲分析嚴格來說不屬於視頻結構化的範疇,能夠算做前面每一個環節結果的應用。因爲現實生產過程當中,一個完整的應用系統總會存在「目標行爲分析」這個過程(不然光獲得基礎數據不能加以利用),因此本篇文章將其包含進來。數據庫
目標檢測編程
對單張圖片中感興趣的目標進行識別、定位,注意兩點,一個是檢測的對象是靜態圖片,二是不但須要識別目標的類別,還須要給出目標在原圖片中的座標值,一般以(left, top, width, height)的形式給出。注意目標檢測僅僅給出目標大概位置座標(一個矩形區域),它跟圖像分割不一樣,後者定位更加具體,可以給出圖片中單個目標的輪廓邊界。跨域
目標分類(屬性識別)服務器
一般目標被檢測出來以後,會進行二次(屢次)推理,識別出目標更加具體的屬性,好比小轎車的顏色、車牌子奧迪仍是奔馳等等。對於人來說,能夠二次推理出人的性別、年齡、穿着、髮型等等外貌屬性。這個環節主要對檢測出來的目標進行更加具體的屬性識別。網絡
目標跟蹤框架
前面兩個環節操做的對象是靜態單張圖片,而視頻有時序性,先後兩幀中的目標有關聯關係。目標跟蹤就是爲了將視頻第N幀中的目標和第N+1幀中的同一目標關聯起來,一般作法是給它們賦予同一個ID。通過目標跟蹤環節後,理論狀況下,一個目標從進入視頻檢測範圍到離開,算法賦予該目標的ID固定不變。可是現實生產過程當中,因爲各類緣由,好比目標被遮擋、目標漏檢(第N幀檢測到,第N+1幀沒檢測到)、跟蹤算法自身準確性等等緣由,系統並不能鎖定視頻中同一個目標的ID。目標ID不能鎖定,會形成目標行爲分析不許的問題,後面會提到。學習
目標行爲分析編碼
視頻中目標被跟蹤到,賦予惟一ID以後,咱們能夠記錄目標在視頻檢測範內的運動軌跡(二維座標點集合),經過分析目標軌跡點數據,咱們能夠作不少應用。好比目標是否跨域指定區域、目標運動方向、目標運動速度、目標是否逗留(逗留時長)、目標是否密集等等。該應用多存在於安防、交通視頻分析領域。spa
目標檢測算法
常見基於深度學習神經網絡的目標檢測算法有3種,SSD、YOLO以及Faster-RCNN,具體請搜索網絡,介紹文章很是多了。三者各有優劣,遵循一個原則:速度快的準確性很差,不少目標檢測不許,不少小目標檢測不到、容易漏檢等;準確性好的速度不快,可能達不到實時檢測的要求,或者須要更高的硬件條件。魚和熊掌不可兼得,犧牲速度能夠換來準確性。這三種常見目標檢測算法,綜合性比較好的是YOLO(如今已是YOLO V3版本),準確性、小目標檢測、檢測速度上均可以接受。SSD速度快,我在RTX 2080 的GPU上,可以檢測32路1080P高清實時流,可是YOLO V3勉強能夠跑到16路。Faster-RCNN準確性更好,可是速度太慢,若是你有很好的GPU硬件支持,或者單臺服務器要求檢測視頻路數比較少,能夠採用Faster-RCNN。下圖第一張是SSD算法效果,第二張是YOLO V3的算法效果,二者模型都是採用一樣的數據集訓練而成,能夠很明顯看到,後者比前者效果好不少(忽略圖中速度值)。
須要注意的是,不論是何種算法,它們的檢測效果受數據集質量影響很是大,數據集數量不夠、標註質量不高,都會嚴重影響最終檢測結果。作深度學習應用型系統,數據集的重要性很是明顯。
視頻結構化處理流程框架
前面說到過,視頻結構化包含多個環節,各個環節相連而成,造成一個Pipeline的結構。在實際生產過程當中,咱們還須要有視頻流接入的環節,它負責接收視頻流數據,因爲網絡接收到的視頻數據是編碼事後的格式,咱們還須要解碼的環節,將原始視頻數據解碼成一張張RGB格式的圖片(這以前可能還須要顏色空間轉換,將YUV格式轉換成RGB),以後將單幀圖片送給推理模型進行推理,返回推理結果。
很明顯,視頻結構化是一個數據流式的處理過程,若是對GStreamer框架比較熟悉的人可能或想到,GStreamer很是適合作這件事情。這裏是GStreamer的官網:https://gstreamer.freedesktop.org/,跟FFmpeg相似,它主要用於音視頻多媒體程序開發,可是兩個側重點不一樣,GStreamer中將多媒體處理流程中的每一個環節都封裝成單個的插件,每一個插件負責不一樣的任務,好比有接收視頻流的、有負責編解碼的、有顏色空間轉換的等等,這些經常使用插件都已經有現成很是成熟的,不須要本身開發。插件和插件之間經過某個協議進行鏈接,最終造成一個完整的Pipeline。目前來看,使用FFmpeg的人明顯多餘GStreamer。在咱們這個應用場景中,GStreamer很是適合咱們,Nvidia官方推出的智能視頻分析SDK DeepStream也是基於GStreamer開發而成,Nvidia爲咱們準備好了現成的插件,有負責推理的,有負責目標跟蹤的,還有負責圖片疊加和顯示的。咱們在使用DeepStream的同時,也可使用GStreamer中已有的其餘插件,他們能夠無縫集成,很是方便。
這裏必需要提一下,GStreamer是C語言開發的,而咱們知道C語言並不是面向對象,若是要用到面向對象的特性必須採起其餘措施,GStreamer就是使用了GObject那一套東西,GObject又是什麼呢?它是一套在C中使用面向對象編程的規範。若是已經很是熟悉主流面嚮對象語言的人,再去接收GObject這種編程風格,會要瘋掉,反人類(我這樣以爲)。下圖是採用DeepStream SDK開發視頻結構化的Pipeline,簡單示意,並不是真實生產中的結構:
使用DeepStream 作視頻結構化應用的好處
若是你用的推理硬件是Nvidia出的,好比Tesla系列顯卡、Geforce系列顯卡等等,那麼使用DeepStream SDK的好處有:
(1)內置推理加速插件nvinfer,注意普通深度學習模型(caffe、tensorflow等)在沒有通過tensorRT加速以前,速度是上不來的。而DeepStream內置的nvinfer推理插件不斷支持各類目標檢測算法(SSD、YOLO、Faster-RCNN)以及各類深度學習框架模型(自由切換),內部還自帶tensorRT INT8/FP16加速功能,不須要你作額外操做;
(2)內置目標跟蹤插件nvtracker,目前DeepStream 3.0提供兩種跟蹤算法,一種基於IOU的,這種算法簡單,可是快;另一種KLT算法,準確可是相對來說慢一些,並且因爲這個算法是跑在CPU上,基於KLT的跟蹤算法對CPU佔用相對大一些;
(3)內置其餘比較有用的插件,好比用於視頻疊加(目標方框疊加到視頻中)的nvosd、硬件加速解碼插件nvdec_h264,專門採用GPU加速的解碼插件,還有其餘顏色轉換的插件。
(4)提供跟視頻處理有關的各類元數據類型以及API,方便你擴展本身的元數據類型,元數據在GStreamer中是一個很重要的概念。
使用DeepStream SDK的前提是要先掌握GStreamer的基本用法,不然就是抓瞎,前者其實就是後者的一堆插件集合,方便供你構建視頻推理Pipeline。固然,你還須要一些CUDA編程的基礎知識。
下面提供一個基於YOLO V3 16路1080P高清視頻實時目標檢測、跟蹤、疊加、目標行爲判斷、結構化數據上報 應用系統截圖(截取其中4路圖像),因爲某些緣由,再也不作過多的技術細節介紹了。