NVIDIA DeepStream插件之Gst-nvtracker

NVIDIA DeepStream插件之Gst-nvtracker

  • 1. 源由
  • 2. 基礎知識
  • 3. Gst-nvtracker插件
    • 3.1 插件參數
    • 3.2 插件API接口
  • 4. 分析問題
  • 5. 總結
  • 6. 參考資料

1. 源由

這篇的主要目的是稍微吐槽下NVIDIA的設計,當然其實他們做的還是不錯的(從系統架構設計角度看,插件采用so動態庫方式是不錯的,只不過技巧上還可以更加不錯)。

本次涉及到使用 BYTETrack開源代碼的 DeepStream 集成,在實際使用的時候遇到非常郁悶、糟心的事情。N多年前的開源代碼,已經被證明或者成熟應用的東西,為啥不好用(報錯)???

  • Gstnvtracker: Optional NvMOT_RetrieveMiscData not implemented
daniel@daniel-nvidia:~/Work/jetson-fpv/utils/dsyolo$ deepstream-app -c source_config_yolov8s.txt
** WARN: <parse_tracker:1604>: Unknown key 'enable-batch-process' for group [tracker]
gstnvtracker: Loading low-level lib at /home/daniel/Work/jetson-fpv/utils/dsyolo/libByteTracker.so
gstnvtracker: Optional NvMOT_RetrieveMiscData not implemented
[BYTETrack Initialized]
gstnvtracker: Only batch processing mode is supported. query.batchMode must be set as NvMOTBatchMode_Batch
gstnvtracker: Failed to initilaize low level lib.
** ERROR: <main:716>: Failed to set pipeline to PAUSED
Quitting
nvstreammux: Successfully handled EOS for source_id=0
App run failed
daniel@daniel-nvidia:~/Work/jetson-fpv/utils/dsyolo$ ls /home/daniel/Work/jetson-fpv/utils/dsyolo/libByteTracker.so
/home/daniel/Work/jetson-fpv/utils/dsyolo/libByteTracker.so

其實本來是非常簡單的一件事情,但由于兼容性的問題,折騰!!!為了解決該問題,所以投資了不少時間,有必要討論、吐槽下。

2. 基礎知識

這里牽涉到一些概念,當然CSDN這里就不再詳細贅述。以前折騰過一些框架設計相關的知識和要點如下:

【1】靜態庫和動態庫編譯方法和開發上的重要性
【2】Linux的so組件設計框架及邏輯
【3】【C語言】函數默認實現和用戶自定義實現編程方法 – 【weak, strong alias】

這個插件實際上使用的是【1】、【2】點內容,而缺少了【3】,所以導致了本次報錯,給兼容性帶來了不必要的麻煩。

3. Gst-nvtracker插件

在這里插入圖片描述

  • Gst-nvtracker 插件允許 DeepStream (DS) 流水線使用低級跟蹤器庫,通過唯一的 ID 持續跟蹤檢測到的對象。

支持實現 NvDsTracker API 的庫,包括由 NvMultiObjectTracker 庫提供的參考實現:

  • IOU 跟蹤器:交并比(Intersection-Over-Union,IOU)跟蹤器使用檢測器在兩幀之間的邊界框的 IOU 值來進行關聯,如果沒有找到匹配,則分配一個新的目標 ID。該跟蹤器包含一個邏輯,用于處理目標檢測器中的誤檢(false positives)和漏檢(false negatives);然而,這可以被認為是最基礎的目標跟蹤器,僅能作為基準使用。
  • NvSORT:NvSORT 跟蹤器是 NVIDIA? 增強版的簡單在線實時跟蹤(Simple Online and Realtime Tracking,SORT)算法。與簡單的二分圖匹配算法不同,NvSORT 使用基于邊界框(bbox)接近性的級聯數據關聯方法,在連續幀之間進行邊界框的關聯,并使用卡爾曼濾波器更新目標狀態。由于不涉及任何像素數據處理,它的計算效率非常高。
  • NvDeepSORT:NvDeepSORT 跟蹤器是 NVIDIA? 增強版的基于深度關聯度量的在線實時跟蹤(DeepSORT)算法。它通過使用帶有重新識別(Re-ID)神經網絡的深度余弦度量學習,在多幀之間進行多個對象的數據關聯。此實現允許用戶使用任何支持 NVIDIA TensorRT? 框架的 Re-ID 網絡。NvDeepSORT 同樣采用級聯數據關聯方法,而非簡單的二分圖匹配算法,并針對 GPU 進行了高效處理的優化。
  • NvDCF:NvDCF 跟蹤器是一種在線多目標跟蹤器,采用判別性相關濾波器進行視覺目標跟蹤,即使檢測結果不可用時也能獨立跟蹤目標。它結合了相關濾波器的響應和邊界框的接近性來進行數據關聯。

注:NvDeepSORT 和 NvDCF 跟蹤器使用 NV12 或 RGBA 格式,而 IOU 和 NvSORT 不需要任何視頻幀緩沖區。

  • Gst-nvtracker 插件還支持通過 NvMOT_RetrieveMiscData API 從低級跟蹤器庫中檢索用戶定義的雜項數據

這些數據包括當前幀目標的默認數據以外的有用對象跟蹤信息。例如,歷史幀的對象數據、陰影跟蹤模式中的目標、已終止目標的完整軌跡以及重新識別特征。有關雜項數據類型及其意義的更多詳細信息,可以參考“雜項數據輸出”部分。用戶還可以在 NvMOTTrackerMiscData 中定義其他類型的雜項數據。

3.1 插件參數

PropertyMeaningType and RangeExample Notes
tracker-widthFrame width at which the tracker is to operate, in pixels. (To be a multiple of 32 when visualTrackerType: 1 or reidType is non-zero with useVPICropScaler: 0)Integer, 0 to 4,294,967,295tracker-width=640
tracker-heightFrame height at which the tracker is to operate, in pixels. (To be a multiple of 32 when visualTrackerType: 1 or reidType is non-zero with useVPICropScaler: 0)Integer, 0 to 4,294,967,295tracker-height=384
ll-lib-filePathname of the low-level tracker library to be loaded by Gst-nvtracker.Stringll-lib-file=/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so
ll-config-fileConfiguration file for the low-level library if needed. Supports multiple files with semicolon delimiter.Path to configuration file OR a semicolon-delimited list of pathsll-config-file=config_tracker_NvDCF_perf.yml
ll-config-file=config_tracker_NvDCF_perf1.yml;config_tracker_NvDCF_perf2.yml
gpu-idID of the GPU on which memory is allocated, and buffer copy/scaling is done. (dGPU only.)Integer, 0 to 4,294,967,295gpu-id=0
tracking-surface-typeSet surface stream type for tracking. (Default is 0.)Integer, ≥0tracking-surface-type=0
display-tracking-idEnables tracking ID display on OSD.Booleandisplay-tracking-id=1
compute-hwCompute engine to use for scaling:
0 - Default
1 - GPU
2 - VIC (Jetson only)
Integer, 0 to 2compute-hw=1
tracking-id-reset-modeAllows force-reset of tracking ID based on pipeline events:
0 - No reset
1 - Reset on GST_NVEVENT_STREAM_RESET
2 - Reset on GST_NVEVENT_STREAM_EOS
3 - Both
Integer, 0 to 3tracking-id-reset-mode=0
input-tensor-metaUse tensor-meta from Gst-nvdspreprocess if available for tensor-meta-gie-id.Booleaninput-tensor-meta=1
tensor-meta-gie-idTensor Meta GIE ID to use (valid only if input-tensor-meta is TRUE).Unsigned Integer, ≥0tensor-meta-gie-id=5
sub-batchesConfigure batch splitting in sub-batches:
Option 1: Semicolon-separated array of source IDs.
Option 2: Colon-separated array of sub-batch sizes.
See descriptionOption 1: sub-batches=0,1;2,3
Option 2: sub-batches=2:1
sub-batch-err-recovery-trial-cntNumber of recovery attempts for errors in low-level tracker. -1 for infinite retries.Integer, ≥-1sub-batch-err-recovery-trial-cnt=3
user-meta-pool-sizeSize of tracker miscellaneous data buffer pool.Unsigned Integer, >0user-meta-pool-size=32

3.2 插件API接口

  1. NvMOT_Query
NvMOTStatus NvMOT_Query (uint16_t customConfigFilePathSize,char* pCustomConfigFilePath,NvMOTQuery *pQuery
);
  1. NvMOT_Init
NvMOTStatus NvMOT_Init (NvMOTConfig *pConfigIn,NvMOTContextHandle *pContextHandle,NvMOTConfigResponse *pConfigResponse
);
  1. NvMOT_Process
NvMOTStatus NvMOT_Process (NvMOTContextHandle contextHandle,NvMOTProcessParams *pParams,NvMOTTrackedObjBatch *pTrackedObjectsBatch
);
  1. NvMOT_RetrieveMiscData
NvMOTStatus NvMOT_RetrieveMiscData (NvMOTContextHandle contextHandle,NvMOTProcessParams *pParams,NvMOTTrackerMiscData *pTrackerMiscData
);
  1. NvMOT_RemoveStreams
void NvMOT_RemoveStreams (NvMOTContextHandle contextHandle,NvMOTStreamId streamIdMask
);
  1. NvMOT_DeInit
void NvMOT_DeInit (NvMOTContextHandle contextHandle);

4. 分析問題

現象:鑒于前面執行LOG顯示: gstnvtracker: Optional NvMOT_RetrieveMiscData not implemented

分析NvMOT_RetrieveMiscData 正好是上面第四個API,因此邏輯上考慮可能是加載這個so符號的時候遇到了問題。

原因:最終,發現在 BTYETrack 確實沒有這部分代碼。

解決:由于之前這部分代碼是可以使用,隨著Jetpack版本升級,增加了這部分API,但是BYTETrack沒有這部分。為此:fix multi-object track and Deepstream 6.3 API link issue

5. 總結

若在架構設計的時候,考慮兼容性方面的問題,引入weak symbol概念(當用戶沒有實現,weak鏈接到stub函數,就能很好的兼容舊接口開發的代碼)。

總的來說,NVIDIA在Deepstream這塊其實采用了so插件的框架結構,很好,但若能更好的技巧上運用一些方法,可以讓代碼兼容性,尤其是第三方插件開發更好的應用于NVIDIA的生態。

6. 參考資料

【1】DeepStream documentation - Gst-nvtracker
【2】ByteTrack is a simple, fast and strong multi-object tracker

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63670.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63670.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63670.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

進程內存轉儲工具|內存鏡像提取-取證工具

1.內存轉儲&#xff0c;內存轉儲&#xff08;Memory Dump&#xff09;是將計算機的物理內存&#xff08;RAM&#xff09;內容復制到一個文件中的過程&#xff0c;這個文件通常被稱為“內存轉儲文件”或“核心轉儲文件”&#xff08;Core Dump&#xff09;,內存轉儲的主要目的是…

Lua語言入門 - Lua 面向對象

Lua 面向對象 面向對象編程&#xff08;Object Oriented Programming&#xff0c;OOP&#xff09;是一種非常流行的計算機編程架構&#xff0c;通過創建和操作對象來設計應用程序。 以下幾種編程語言都支持面向對象編程&#xff1a; CJavaObjective-CSmalltalkC#Ruby Lua 是…

Pyqt6在lineEdit中輸入文件名稱并創建或刪除JSON文件

1、創建JSON文件 代碼 import osdef addModulekeyWordFile(self):if "" ! self.lineEdit_module.text():moduleFile self.lineEdit_module.text() .jsonelse:self.toolLogPrinting(請輸入模塊名稱)returnfilePath modulekeyWordFileDir moduleFileif os.path.e…

【Leetcode 熱題 100】236. 二叉樹的最近公共祖先

問題背景 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 最近公共祖先的定義為&#xff1a;對于有根樹 T T T 的兩個節點 p p p、 q q q&#xff0c;最近公共祖先表示為一個節點 x x x&#xff0c;滿足 x x x 是 p p p、 q q q 的祖先且 x x x 的深度盡可能大…

數據結構--堆的向上調整和向下調整

文章目錄 1.完全二叉樹2.堆向上調整3.堆向下調整4.測試代碼 1.完全二叉樹 下面的這個就是對于我們的完全二叉樹的這個邏輯結構和物理結構的說明&#xff1a; 邏輯結構就是我們自己認為的進行購想出來的&#xff1b; 但是這個物理結構卻是我們的這個數據結構在內存里面的真是…

智能掛號系統設計典范:SSM 結合 Vue 在醫院的應用實現

摘要 隨著信息技術在管理上越來越深入而廣泛的應用&#xff0c;管理信息系統的實施在技術上已逐步成熟。本文介紹了醫院預約掛號系統的開發全過程。通過分析醫院預約掛號系統管理的不足&#xff0c;創建了一個計算機管理醫院預約掛號系統的方案。文章介紹了醫院預約掛號系統的系…

“魔法糖果盒的秘密:用樸素貝葉斯算法猜糖果顏色”

想象一下&#xff0c;你有一個神奇的糖果盒&#xff0c;這個糖果盒里有兩種糖果&#xff1a;紅色的和藍色的。你閉上眼睛&#xff0c;從盒子里拿出一個糖果&#xff0c;然后嘗一嘗&#xff0c;你想知道這個糖果是紅色的還是藍色的。樸素貝葉斯算法就像是一個魔法規則&#xff0…

Transform組件的用法

文章目錄 1. 概念介紹2. 使用方法3. 示例代碼我們在上一章回中介紹了Checkbox Widget相關的內容,本章回中將介紹Transform Widget.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在這里說的Transform是一種容器類widget,它和Container組件類似。它可以包含其它的組件…

go面試問題

1 Go的內存逃逸如何分析 go build -gcflags-m main_pointer.go 2 http狀態碼 300 請求的資源可包括多個位置&#xff0c;相應可返回一個資源特征與地址的列表用于用戶終端&#xff08;例如&#xff1a;瀏覽器&#xff09;選擇 301 永久移動。請求的資源已被永久的移動到新U…

康冠科技嵌入式面試題及參考答案

LCD 驅動你自己做了哪些內容? 在 LCD 驅動開發中,首先是硬件層面的理解。需要仔細研究 LCD 的數據手冊,明確其引腳定義,包括電源引腳、數據引腳、控制引腳等。比如,對于常見的 RGB 接口 LCD,要清楚哪幾個引腳是用于傳輸紅、綠、藍三種顏色的數據,以及像 VSYNC(垂直同步…

TouchGFX移植(5)增加觸屏驅動

一&#xff09;增加驅動代碼gt9xxx.c和ctiic.c到工程中的BSP目錄下: 二&#xff09;更改觸摸文件STM32TouchController.cpp 1&#xff09;在STM32TouchController.cpp文件中增加&#xff1a; #include “gt9xxx.h” 2&#xff09;增加gt9xxx_init(); void STM32TouchControlle…

初識面向對象晨考day09

1.類和對象什么關系 類是對象的抽象 對象是類的具體 2.什么是屬性和方法 一類事物共有的特征&#xff0c;使用屬性描述 一類事物共有的行為&#xff0c;使用方法描述 3.普通方法的定義格式 public 返回值類型 方法名(參數列表){} 4.什么是形參&#xff0c;什么是實參 形參是方法…

資源型數字化平臺該如何順利運營?

一、引言 隨著信息技術的迅猛發展&#xff0c;資源型數字化平臺在各領域的重要性日益凸顯。此類平臺整合各類資源&#xff0c;以數字化手段提升資源利用效率與價值&#xff0c;但確保其順利運營面臨諸多挑戰。 二、資源型數字化平臺特點 資源型數字化平臺具有資源整合性&…

GitLab的安裝和使用

1.GitLab 環境說明 系統版本 CentOS 7.2 x86_64 軟件版本 gitlab-ce-10.8.4 GitLab 是一個用于倉庫管理系統的開源項目&#xff0c;使用Git作為代碼管理工具&#xff0c;并在此基礎上搭建起來的web服務。可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能…

Leetcode 串聯所有單詞的子串

算法思想&#xff08;中文解釋&#xff09; 這道題目要求我們在字符串 s 中找到所有子串&#xff0c;這些子串是字符串數組 words 中所有單詞的串聯&#xff0c;并且每個單詞只能使用一次&#xff0c;且順序可以任意。下面是代碼的算法思想&#xff1a; 1. 核心思路 分解問題…

解析在OceanBase創建分區的常見問題|OceanBase 用戶問題精粹

在《分區策略和管理分區計劃的實踐方案》這篇文章中&#xff0c;我們介紹了在ODC中制定分區策略及有效管理分區計劃的經驗。有不少用戶在該帖下提出了使用中的問題&#xff0c;其中一個關于創建分區的限制條件的問題&#xff0c;也是很多用戶遭遇的老問題。因此本文以其為切入&…

有哪些免費的 ERP 軟件可供選擇?哪些 ERP 軟件使用體驗較好?

想找個 “免費” 的 ERP 軟件&#xff1f; 咱得知道&#xff0c;ERP 那可是涉及財務、人力、供應鏈、采購、銷售等好多方面的重要企業軟件。功能這么全&#xff0c;能免費才怪呢&#xff01;真要是有免費的&#xff0c;早就火遍大江南北&#xff0c;說不定把市場都壟斷了&…

centos-stream9系統安裝docker

如果之前安裝過docker需要刪除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安裝yum-utils工具&#xff1a; dnf -y install yum-utils dnf-plugin…

了解cuda的統一內存

1. CUDA 6中的統一內存 在CUDA 6中&#xff0c;從Kepler GPU架構&#xff08;計算能力3.0或更高&#xff09;開始&#xff0c;在64位Windows 7、8和Linux操作系統&#xff08;內核2.6.18&#xff09;上開始支持統一內存. 從CUDA 6開始&#xff0c;NVIDIA推出了CUDA平臺歷史上…

unity 最小后監聽鍵盤輸入

當Untiy最小化后&#xff0c;游戲窗口不會立刻失去焦點&#xff0c;此時依然可以使用Input來獲取按鍵&#xff0c;但是點擊其他窗口后&#xff0c;就會失去焦點&#xff0c;此時系統會把按鍵輸入分配到其他窗口里&#xff0c;此時要用windowsAPI獲取按鍵輸入&#xff0c;應對兩…