nvdsanalytics 視頻分析插件是 DeepStream 5.0 添加的功能,對 nvinfer(主檢測器)和 nvtracker 附加的元數(shù)據(jù)執(zhí)行分析,目前主要針對涉及感興趣區(qū)域(ROI)的過濾、過度擁擠檢測、方向檢測和跨線統(tǒng)計等四大功能,如下表:
功能說明
ROI 過濾此功能檢測 ROI 中是否存在目標(biāo)類別的對象,結(jié)果作為每個對象的元數(shù)據(jù)附加,以及每幀 ROI 中的對象總數(shù)。
擁擠檢測在“ROI 過濾”的前提下,檢測每幀對象總數(shù)是否處于過度擁擠的狀態(tài),就是檢測 ROI 中的對象數(shù)量是否超過預(yù)先配置的閾值。
方向檢測使用對象位置歷史記錄和當(dāng)前幀信息檢查對象是否遵循預(yù)配置的方向。結(jié)果作為每個對象的元數(shù)據(jù)附加。
跨線統(tǒng)計此功能檢查對象是否遵循虛擬線的預(yù)配置方向,以及是否已越過虛擬線。當(dāng)測線交叉時,結(jié)果將附加到對象上,同時還會附加幀元,其中累積計數(shù)與測線交叉的每幀計數(shù)一起附加。
可以看出這是 NVIDIA 經(jīng)過實際項目的要求所增加的功能插件,主要就是針對視頻內(nèi)的我們所指定的“某個區(qū)塊(興趣區(qū),ROI)”或“某條線(跨越線)”范圍中的標(biāo)的物件,進(jìn)行“物件動向”的分析與統(tǒng)計(如下圖)。大部分的使用場景是在道路流量分析的應(yīng)用,但這也可以應(yīng)用在營建工地、生產(chǎn)工廠、樓宇、校園、消防設(shè)施的危險區(qū)(danger zone)監(jiān)控,實用性非常之高。
有經(jīng)驗的開發(fā)人員就會很清楚,如果缺少 nvdsanalytics 這個插件的時候,則開發(fā)者需要自行從 nvtracker 里面抽取相關(guān)數(shù)據(jù),然后與興趣區(qū)或跨越線進(jìn)行持續(xù)比對,確認(rèn)是否屬于要列入統(tǒng)計數(shù)據(jù)的物件,至于“動向分析”功能,更需要大量的“前后幀”位置比對去進(jìn)行判斷,這些開發(fā)的工作量是相當(dāng)艱辛、計算量是非常巨大的,如今在 DeepStream 里面只要輕松調(diào)用 nvdsanalytics 插件,就能輕松地完成很復(fù)雜的工作。
在 DeepStream 開發(fā)套件里的 deepstream-nvdsanalytics-test 是 C/C++版本的范例代碼,先前文章里帶著大家安裝過的 deepstream_python_apps 范例中,也提供 Python 版本的代碼,在范例路徑下面的 deepstream-nvdsanalytics 里面。
Gst-nvdsanalytics 工作原理
DeepStream 一直令人贊賞的一個特色,就是將插件的接口做得十分簡單,因此在開始執(zhí)行范例代碼之前,我們需要先對這個插件有個初步了解,請參考下面鏈接的原廠說明:https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_plugin_gst-nvdsanalytics.html
下圖是 Gst-nvdsanalytics 的基本工作原理圖:
整個執(zhí)行流程其實就是很簡單的四個步驟:
接受上游(左邊)的 nvinfer 與 nvtracker 元件發(fā)送的批處理緩沖區(qū)(GstBuffer + NvDsBatchMeta),并從中提取元數(shù)據(jù);
將元數(shù)據(jù)傳遞到低階 nvds_analytics 接口(上圖下方)進(jìn)行處理;
低階接口根據(jù)為每個流的所制定配置(前面所列的四項功能)的規(guī)則去執(zhí)行分析;
然后返回添加了分析元數(shù)據(jù)的作為輸出,這是每個跟蹤對象以及整個幀的分析結(jié)果。
這個插件伴隨著 NvDsAnalyticsFrameMeta 與 NvDsAnalyticsObjInfo 兩組元數(shù)據(jù),可以在 DeepStream 開發(fā)包的sources/includes/nvds_analytics_meta.h 找到完整的定義,也可以在https://docs.nvidia.com/metropolis/deepstream/sdk-api/Meta/analytics.html 找到使用說明。這里也簡單說明一下,對于后面說明代碼時會有幫助:
NvDsAnalyticsFrameMeta:定義“幀級(frame level)”的數(shù)據(jù)內(nèi)容,配合所提供的四項功能,主要結(jié)構(gòu)如下:
ocStatus(數(shù)據(jù)類型:bool):在給定的ROI 區(qū)域內(nèi)
objInROIcnt(數(shù)據(jù)類型:unit32_t):在ROI 區(qū)域內(nèi)檢測到的物件總數(shù)
objLCCurrCnt(數(shù)據(jù)類型:unit64_t):保存當(dāng)前幀中跨線物件的數(shù)量objLCCumCnt(數(shù)據(jù)類型:unit64_t):保存已配置線條的累計跨線物件數(shù)量
unique_id(數(shù)據(jù)類型:guint):保存 nvdsanalytics 實例的唯一標(biāo)識符objCnt(數(shù)據(jù)類型:unit64_t):保存每幀里面每個類 ID 的對象總數(shù)
NvDsAnalyticsObjInfo:定義“對象(object level)”的數(shù)據(jù)內(nèi)容,配合所提供的四項功能,主要結(jié)構(gòu)如下:
roiStatus(數(shù)據(jù)類型:字符串?dāng)?shù)組):保存對象所在的 ROI 標(biāo)簽數(shù)組
ocStatus(數(shù)據(jù)類型:字符串?dāng)?shù)組):保存對象所在的 ROI 標(biāo)簽數(shù)組保存對象所在的過度擁擠標(biāo)簽數(shù)組
lcStatus(數(shù)據(jù)類型:字符串?dāng)?shù)組):保存對象已跨越的線交叉標(biāo)簽數(shù)組
dirStatus(數(shù)據(jù)類型:字符串):保存跟蹤對象的方向字符串
unique_id(數(shù)據(jù)類型:guint):保存 nvdsanalytics 實例的唯一標(biāo)識符
前面工作流最右邊的輸出,是以幀級的 NvDsAnalyticsFrameMeta 結(jié)構(gòu)進(jìn)行封裝,想要調(diào)用時就定義一個用戶元,將 meta_type 設(shè)置為NVDS_USER_FRAME_META_NVDSANALYTICS。然后將用戶元添加到 NvDsFrameMeta 的 frame_user_meta_list 成員。
分析(每個檢測到的對象)的輸出結(jié)果封裝在 NvDsAnalyticsObjInfo 結(jié)構(gòu)中,同樣再定義定義一個用戶元,將類型設(shè)置為 NVDS_USER_OBJ_META_NVDSANALYTICS,然后將這個用戶元添加到 NvDsObjectMeta 的 obj_user_meta_list 成員中。
上述步驟與數(shù)據(jù)結(jié)構(gòu),已經(jīng)將大部分 nvdsanalytics 插件的工作都部署的差不多了,剩下就是啟動并監(jiān)聽交互信息的部分。
項目配置文件說明
這個范例的代碼與前面幾個范例的工作流程是一致的,只是這里接受多個輸入源,包括 H264/H265 視頻文件與 RTSP 視頻流,因此需要建立多個隊列(queue)作為緩沖來處理,至于 nvanalytics_src_pad_buffer_probe 部分與 test1 的 osd_sink_pad_buffer_probe 代碼結(jié)構(gòu)的邏輯也是相近的,因此請自行根據(jù)先前代碼內(nèi)容進(jìn)行類比,這里就不花力氣再重復(fù)那些冗余的內(nèi)容。
不過這個項目里面的配置文件與前面的項目有比較大的不同之處,因此這里就花點時間探索這部分的細(xì)節(jié)。范例的配置文件為 config_nvdsanalytics.txt,一共有 5 個配置組。
這個插件一共有以下的 5 個配置組:
[property]:配置插件的一般行為,這是唯一的強(qiáng)制(必須有的)組
[roi-filtering-stream-《n》]:為第《n》個流配置 roi 篩選規(guī)則參數(shù),無數(shù)量限制
[overcrowding-stream《n》]:為第《n》個流配置過度擁擠參數(shù)的閾值
[direction-detection-stream-《n》]:為第《n》個流配置方向檢測參數(shù)
[line-crossing-stream-《n》]:為第《n》個流配置跨線參數(shù)
在[property]組里面的參數(shù)是大家比較熟悉的,其他組里面有幾個用法比較特殊的參數(shù),在這里挑出來說明:
roi-《label》:用在[roi-filtering-stream-《n》]與[overcrowding-stream-《n》]這兩個組,可自行配置《label》名稱,例如“RF”、“OC”、“DangerZone”等,后面設(shè)定一組“多(3 以上)邊形”坐標(biāo),使用“;”作為間隔,坐標(biāo)順序為“x1;y1;x2;y2;x3; y3;。..”,例如“roi-DangerZone=295;643;579;634;642;913;56;828”、“roi-OC=295;643;579; 634;642;913;56;828”等,可以為每個視頻源指定多個的興趣區(qū)。
direction-《label》:用在[direction-detection-stream-《n》]組,可自行配置《label》內(nèi)容,例如“South”、“East”、“Forward”等等,后面給定一組(x1;y1;x2;y2)坐標(biāo)來表示方向,當(dāng)對象沿這個方向移動時,前面設(shè)定的標(biāo)簽將作為用戶元數(shù)據(jù)附加到對象里,可以為每個視頻源指定多個方向。
line-crossing-《label》:用在[line-crossing-stream-《n》]組里面,同樣可自行設(shè)定《label》內(nèi)容,例如“Entry”、“Exit”、“Start”等,后面的設(shè)定值定義兩組線的四個坐標(biāo),依序為(x1d;y1d;x2d;y2d;x1c;y1c;x2c;y2c),其中第一組(x1d;y1d;x2d;y2d)代表移動的方向,如下圖“向下方的黃色箭頭”所表示;第二組(x1c;y1c;x2c;y2c)標(biāo)示“跨越線”的坐標(biāo),如下圖與黃色箭頭所交叉的“橫向線”。
只有當(dāng)物件“以符合要求的方向通過跨越線”,才算符合這里的統(tǒng)計要求,才會納入這個視頻分析的計數(shù)之中,這個功能定義的十分完善。
同樣的,我們可以為每個視頻流提供多組這種跨越線的配置。
extended:用在[line-crossing-stream-《n》]組,這個開關(guān)設(shè)定值是為了將上一個參數(shù)做個擴(kuò)展,當(dāng)設(shè)置為“0(關(guān)閉)”的時候,則計算物件通過的參考依據(jù)就僅止于“兩條線的交叉點”,如果設(shè)置為“1(開啟)”時,就會以(x1c;y1c;x2c;y2c)整條線作為參考依據(jù)。
mode:用在[line-crossing-stream-《n》]與[direction-detection-stream-《n》]這兩個組,設(shè)定“檢測方向”與“配置方向”一致性的嚴(yán)格程度,有“l(fā)oose(寬松)”、“strict(嚴(yán)格)”、“balance(平衡)”三種選項,例如“l(fā)oose”只檢查物體是否已越過線,并且該物體保持同一方向行進(jìn)即可,公差可能會很高。
以上是比較復(fù)雜的參數(shù)與用法的簡單說明,如果需要所有參數(shù)的完整說明,請直接參考https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_plugin_gst-nvdsanalytics.html下方的“Configuration File Parameters”內(nèi)容。
接下來就開始執(zhí)行這個很有用處的范例,透過修改參數(shù)值來感受用途。
范例執(zhí)行
由于 deepstream_nvdsanalytics.py 這個代碼可以接受多個視頻輸入,因此需要使用“file:///”格式給定輸入文件完整路徑,為了簡化指令長度,我們在工作目錄下使用軟鏈接來提供視頻文件路徑:
ln -s 。./。./。./。./samples/streams/sample_720p.h264 ~/test.h264python3 deepstream_nvdsanalytics.py file:///home/nvidia/test.h264
下面是這個范例的執(zhí)行畫面:
接下去看看所顯現(xiàn)的數(shù)據(jù)代表什么意思,下面是我們截取第 649 幀圖像的檢測結(jié)果:
##################################################Object 503 moving in direction: NorthObject 499 moving in direction: NorthObject 526 roi status: [‘RF’]Objs in ROI: {‘RF’: 1}Linecrossing Cumulative: {‘Exit’: 20}Linecrossing Current Frame: {‘Exit’: 0}Frame Number= 649 stream id= 0 Number of Objects= 7 Vehicle_count= 5 Person_count= 2
最上面兩行表示物件編號 503 與 499 行進(jìn)方向為“North”
第 3 行在 RF 興趣區(qū)檢測到編號 526 物件(圖左方站立的人)
第 4 行顯示興趣區(qū) RF 目前檢測到“1”個物件
第 5 行統(tǒng)計出“累積通過”右方黃色線的物件數(shù)量為“20”
第 6 行顯示“正在通過”右方黃色線的物件數(shù)量為“0”
第 7 行顯示這是“第 649 幀”,檢測到“7”個物件,其中有“5”輛車與“2”個人
如何?這個插件的功能很棒吧,可以讓你自由地設(shè)定要監(jiān)控的區(qū)域,并且非常有效率地按照你所設(shè)定的要求,反饋對應(yīng)的統(tǒng)計數(shù)據(jù)。
責(zé)任編輯:haq
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5075瀏覽量
103528 -
分析
+關(guān)注
關(guān)注
2文章
134瀏覽量
33331
原文標(biāo)題:NVIDIA Jetson Nano 2GB 系列文章(38):nvdsanalytics視頻分析插件
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論