在計算機視覺的應用中,“識別”只是一個相當入門的技術,相信很多人在執行深度學習推理應用中,經常產生的質疑就是“識別出的類別,有什么用途呢”?
確認每一幀圖像中有多少個我們想要識別的種類,以及他們在圖像中的位置,只是整個應用的第一步而已,如果缺乏“目標追蹤(tracking)”的能力,就很難提供視頻分析的基礎功能。
在標準 OpenCV 體系里有 8 種主流的目標追蹤算法,有興趣的可以在網上搜索并自行研究。
算法的基本邏輯就是需要對視頻的相鄰幀進行“類別”與“位置”的比對,因此這部分的計算還是相當消耗計算資源的,也就是當視頻分析軟件“開啟”目標追蹤功能時,其識別性能必定有所下降,大家必須先有這樣的認知。
DeepStream 的定位就是針對“視頻分析”的應用,因此“目標追蹤”是其最基本的功能之一。
在前面使用的 myNano.txt 配置文件中,只需要調整一個設定值就能開啟或關閉這個追蹤功能,非常簡單。
DeepStream 支持 IOU、KLT 與 NVDCF 三種目標追蹤算法(如下圖),其中 IOU 的性能最好,在 Jetson Nano 2GB 上的總體大約能到 200FPS;NVDCF 的精確度最高,但目前性能大約只能到 56FPS;KLT 算法目前在性能與精確度的平衡比較好,總體性也能到 160FPS,因此通常都選擇 KLT 追蹤器做演示。
算法的細節不多做解釋,請自行尋找相關技術文件學習,這里就直接進入實驗的過程。還是以前一篇文章中的 myNano.txt 配置文件為主,如果不知道的話,就用 source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt 復制一份出來就可以,透過修改里面的參數,讓大家體驗一下 DeepStream 目標追蹤的功能。
01
目標追蹤功能的開關
在 myNano.txt 最下方,可以看到[tracker]的設定組,下面有個“enable=1”的參數,就是目標追蹤的功能。
現在先執行一次啟動追蹤功能,如下圖可以看到每個識別出的物件除了類別、標框之外,旁邊還有個編號,這個編號會一直跟著該物件,這樣就形成“追蹤”的功能。
此時的識別性能如下圖,總性能(8 個數字相加)大約 160FPS。
如果將[trakcer]下面改成“enable=0”,再執行看看結果如何?下圖中能識別出物件的類別與標框位置,但是已經沒有編號。
關閉追蹤功能之后的識別性能如下圖,總識別性能可以達到 250FPS 左右。
02
切換追蹤器
前面說過,目前 DeepStream 5.0 支持三種追蹤器,那么要如何選擇呢?同樣在[tracker]參數組下方,有這樣的三行參數:
#ll-lib-file=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_mot_iou.so
#ll-lib-file=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_nvdcf.so
ll-lib-file=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_mot_klt.so
前面加上“#”號的就是處于關閉的狀況,請先將[tracker]切回“enable=1”的開啟狀態,接下來請自行加減“#”的位置以切換追蹤器的選擇,分別測試這三個追蹤器的不同之處,包括識別性能與追蹤能力。
這部分必須直接在視頻中體驗,因此就不截屏顯示。測試結果可以感受到 IOU 追蹤器的性能最好,可達到 200FPS 左右,但是同一物件的編號并不是太穩定,而 NVDCF 追蹤器的編號最為穩定,但性能大概只有 IOU 的 1/4,最多只能承受 2 路視頻的實時分析。
KLT 算法總體性能可達到 160FPS,可以支持到8路以內的實時識別,追蹤能力也比 IOU 好不少,不過這個算法對 CPU 的占用率比較高,是這個算法的主要缺點。該如何選擇需要看實際的場景與計算設備的資源而定。
03
獲取追蹤數據
前面打開目標追蹤功能的目的,并不只是為了在顯示器上看看而已,而是用這些數據做更有價值的應用,而這些數據要從什么地方得到呢?通常都需要透過 Python 或 C++從 DeepStream 提供的接口去獲取。
這里提供一個無需了解 DeepStream 接口就能獲取目標追蹤數據的方法,只要我們在 myNano.txt 里面的[application]參數組,添加一條“kitti-track-output-dir=《PATH》”的路徑指向就可以,這里假設要將數據存入“/home/nvidia/track”路徑下,在 myNano.txt 里添加一行參數即可:
[application]
kitti-track-output-dir=/home/nvidia/track
執行“deepstream -c myNano.txt”之后,就可以看到/home/nvidia/track目錄下產生非常多的文件,如下截屏:
每個文件存放“一幀”的目標追蹤結果,例如我們測試的 sample_1080p_h264.mp4 視頻有 48 秒,每秒有 30 幀圖像,就會生成 1440 個文件。
前面 6 位數“00_000”代表視頻源的編號,從“0”開始,如果有 4 路視頻源就會有“00_000”~“00_003”的編號,后面 6 位則是流水號,例如這個測試視頻就會生成“000000.txt”~“001440.txt”,由這兩部分組合而成文件名。
這是 KITTI 格式的數據,第一欄位是該物件的類別,第二欄是該物件的“追蹤編號”,后面數據所代表的意義,請自行參考 KITTI 的格式定義。
現在我們就可以依序讀入這些追蹤文件,或者將這些文件回傳給控制中心,進行文件解析與信息提取,這樣是不是很方便?相信這些內容對于開發會很有幫助。
責任編輯:haq
-
NVIDIA
+關注
關注
14文章
4984瀏覽量
103017 -
機器視覺
+關注
關注
162文章
4369瀏覽量
120297
原文標題:NVIDIA Jetson Nano 2GB 系列文章(29): DeepStream 目標追蹤功能
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達企業解決方案】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論