前面一篇文章已經(jīng)帶著大家將 DeepStream 容器配置 Python 使用環(huán)境,本文的重點(diǎn)就是繼續(xù)執(zhí)行實(shí)際的開發(fā)操作。
由于前面開啟容器時,透過 “-v” 指令將容器外路徑與容器內(nèi)形成映射,因此實(shí)際代碼文件是存放在主機(jī)上(容器外),我們可以在主機(jī)上使用 gedit 這個較為便利的編輯器去修改代碼,然后在容器內(nèi)執(zhí)行應(yīng)用,如此搭建起實(shí)用性更高的開發(fā)環(huán)境。
在 DeepStream 范例中的test2是識別功能最豐富的經(jīng)典范例,不僅能識別對 “Car” 與 “Person” 配置唯一的編號進(jìn)行跟蹤功能,還能為 “Car” 物體進(jìn)一步分析 “廠牌”、“顏色”、“車型” 等屬性,我們還可以將這些信息改成中文顯示。
另一個runtime_source_add_delete項(xiàng)目則是實(shí)現(xiàn) “動態(tài)添加/刪減視頻源” 的功能,通常在面對 “不均衡” 監(jiān)控的時候,會需要這項(xiàng)功能的輔助。
例如 “醫(yī)院的門診與急診” 的流量在正常工作時間是門診大于急診,下班之后的流量就剛好反轉(zhuǎn),如果能根據(jù)時間去調(diào)整輸入源的增減,就會有很高的實(shí)用性;都市中很多道路車流量在上下班高峰期是反轉(zhuǎn)的,如果中控室的監(jiān)控屏幕數(shù)量有限的時候,也可以根據(jù)不同狀態(tài)去調(diào)整視頻流的來源。
這并不意味著我們得去調(diào)整設(shè)備的數(shù)量,而是調(diào)整輸入源的 “接收開關(guān)”,例如道路交通的監(jiān)控有 100 臺攝像頭,是保持 24 小時全年午休地拍攝并傳輸數(shù)據(jù),而中控室如果只有 50 個顯示屏幕,就只要切換接收輸入源的開關(guān)就可以。
現(xiàn)在就用容器版 DeepStream 的 Python 環(huán)境,來執(zhí)行這兩個應(yīng)用。
1、DeepStream-test2 項(xiàng)目
這個項(xiàng)目將 DeepStream 關(guān)于物體識別的絕大部分人工智能功能都集于一身,包括以下三大類組件:
-
1 個具備四類別的物體檢測器(object detector)作為一階段檢測器;
-
1 個跟蹤器(tracker);
-
3 個基于 “Car” 類別的圖像分類器(image classifier)作為二階段分類器。
三者的合作關(guān)系如下:
1)將讀入的圖像傳給一階段檢測器進(jìn)行物體檢測計算;
2)將識別出的物體傳送給跟蹤器去賦予唯一的編號;
3)如果識別的類別為 “Car”,則將物體位置坐標(biāo)分別傳送給 3 個二階段分類器,對坐標(biāo)內(nèi)圖形進(jìn)行 “廠牌”、“顏色”、“車型” 等屬性識別;
4)最后將上面的信息合成回原始圖像,然后進(jìn)行輸出作業(yè)。
這里使用的檢測器與 3 個二階段分類器模型都在 samples / models 下,如以下的路徑名:
-
Primary_Detector:一階段監(jiān)測器
-
Secondary_CarColor:識別車輛顏色的二階段分類器
-
Secondary_CarMake:識別車輛廠牌的二階段分類器
-
Secondary_VehicleTypes:識別車輛種類的二階段分類器
如果前面建立的 Python 容器環(huán)境沒有刪除的話,現(xiàn)在就可以執(zhí)行以下指令進(jìn)入容器內(nèi)去執(zhí)行這個范例:
sudo xhost +si:localuser:root
dockerstartds_python&&dockerexec-itds_pythonbash
進(jìn)入容器后,執(zhí)行以下指令:
cd sources/deepstream_python_apps/apps/deepstream-test2
./deepstream_test_2.py../../../../samples/streams/sample_720p.h264
下圖就是執(zhí)行的效果,可以看到每個識別到的物體都有唯一的識別號,在 “Car 3” 后面還有 “gray” 與 “nissan” 等顏色與廠牌的信息。
不過這個容器版有個還未解決的問題,就是 “中文顯示” 的部分,如果有更精通操作系統(tǒng)的朋友可以試著解決這個中文顯示問題。
2、runtime_source_add_delete 項(xiàng)目
這個項(xiàng)目也是基于 deepstream-test2 多神經(jīng)網(wǎng)絡(luò)組合識別項(xiàng)目基礎(chǔ)上,使用以下的動態(tài)處理函數(shù),因此沒有固定的通道結(jié)構(gòu):
1)create_uridecode_bin:作為 “多輸入源路徑解析” 功能;
2)stop_release_source:停止指定編號數(shù)據(jù)源,并釋放相關(guān)資源的內(nèi)存空間;
3)delete_sources:首先刪除現(xiàn)有 stream 中已經(jīng) End of Stream 的數(shù)據(jù)源,如果沒有隨機(jī)刪除一個視頻源。如果全部視頻源都被刪除時,就結(jié)束應(yīng)用;
4)add_sources:隨機(jī)增加數(shù)據(jù)源,如果數(shù)量達(dá)到 MAX_NUM_SOURCES,10s 后刪除一個視頻源;
5)bus_call:總線管理機(jī)制,作為觸發(fā)事件的管理機(jī)制。
為了簡化運(yùn)行,這個示例只接收 1 個 H.264 視頻文件當(dāng)作 4 個輸入源使用,每 10 秒添加的視頻都會從頭開始播放,系統(tǒng)就是為每個輸入源設(shè)置唯一的編號,作為新增與刪除的依據(jù)。
cd sources/deepstream_python_apps/apps/runtime_source_add_delete
export DS_ROOT=/opt/nvidia/deepstream/deepstream/
./deepstream_rt_src_add_del.pyfile://$DS_ROOT/samples/streams/sample_720p.mp4
接下去就會執(zhí)行以下的 7 個畫面變化:
1)顯示第一個輸入源的檢測結(jié)果:
2)10 秒后添加第二個輸入源的檢測結(jié)果:
3)再 10 秒后添加第三個輸入源的檢測結(jié)果:
4)再 10 秒后添加第四個輸入源的檢測結(jié)果:
5)再 10 秒后隨機(jī)刪除一個輸入源:
6)再 10 秒后又隨機(jī)刪除一個輸入源:
7)再 10 秒后又隨機(jī)刪除一個輸入源:
8)再 10 秒后刪除最后一個輸入源。
可以修改 deepstream_rt_src_add_del.py 文件的以下兩個粗體下劃線的參數(shù),調(diào)整輸出總數(shù)量與間隔時間:
-
第 48 行:MAX_NUM_SOURCES = 4
-
第 278 行:GLib.timeout_add_seconds(10, delete_sources, g_source_bin_list)
之后請自行嘗試修改的結(jié)果。
審核編輯:湯梓紅
-
NVIDIA
+關(guān)注
關(guān)注
14文章
4978瀏覽量
102987 -
容器
+關(guān)注
關(guān)注
0文章
495瀏覽量
22060 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627
原文標(biāo)題:NVIDIA Jetson 系列文章(8):用DS容器執(zhí)行Python范例
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論