色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python版test1實戰說明

NVIDIA英偉達企業解決方案 ? 來源:NVIDIA英偉達中國 ? 作者:NVIDIA英偉達中國 ? 2021-10-09 14:28 ? 次閱讀

上一篇文章已經帶著大家安裝 DeepStream 的 Python 開發環境,并且執行最簡單的 deepstream-test1.py,讓大家體驗一下這個范例的效果。本文則進一步以這個 Python 代碼講解 DeepStream 插件工作流,并且擴充 USB 攝像頭作為輸入,以及將輸出透過 RTSP 轉發到其他電腦上觀看。

如果還未安裝 Python 環境或下載 Python 范例的,請至前一篇文章中找安裝與下載的步驟,這里不再重復。

前面文章中已經簡單提過 DeepStream 所用到的插件內容,但那只是整個框架中非常基礎的一小部分,本文要用代碼開始解說范例的時候,還是得將 Gstreamer 一些重要構成元素之間的關系說明清楚,這樣才能讓大家在代碼過程得以一目了然。

現在先把這個 test1 范例的執行流程先講解清楚,這樣在閱讀后面的代碼就會更加容易掌握上下之間的交互關系。這里的流程對 C/C++ 版本與 Python 版本是完全一樣的,只不過代碼不過用 Python 來說明:

首先 filesrc 數據源元件負責從磁盤上讀取視頻數據

h264parse 解析器元件負責對數據進行解析

nvv4l2decoder 編碼器元件負責對數據進行解碼

nvstreammux 流多路復用器元件負責批處理幀以實現最佳推理性能

nvinfer 推理元件負責實現加速推理

nvvideoconvert 轉換器元件負責將數據格式轉換為輸出顯示支持的格式

nvdsosd 可視化元件負責將邊框與文本等信息繪制到圖像中

nvegltransform 渲染元件和 nveglglessink 接收器元件負責輸出到屏幕上

建立 DeepStream 應用程式的步驟與 Gstreamer 幾乎一樣,都是有固定的步驟,只要熟悉之后就會發現其實并沒有什么難度,接下去就開始我們的執行步驟。

創建 DeepStream 應用的7大步驟初始化 Gstreamer 與創建管道(pipeline)

1. 初始化 Gstreamer 與創建管道(pipeline)

# 從“def main(args):”開始

GObject.threads_init()

# 標準GStreamer初始化

Gst.init(None)

# 創建Gst物件與初始化

pipeline = Gst.Pipeline()

# 創建與其他元素相連接的管道元素

2. 創建所有需要的元件(element):用Gst.ElementFactory.make() 創建所需要的元素,每個元素內指定插件類別(粗體部分)并給定名稱(自行設定):

# 階段1-處理輸入源的插件:

# 建立“源”元素負責從文件讀入數據

source = Gst.ElementFactory.make(“filesrc”, “file-source”)

# 解析文件是否為要求的h264格式

h264parser = Gst.ElementFactory.make(“h264parse”, “h264-parser”)

# 調用NVIDIA的nvdec_h264硬件解碼器

decoder = Gst.ElementFactory.make(“nvv4l2decoder”, “nvv4l2-decoder”)

# 創建nvstreammux實例,將單個或多個源數據,復用成一個“批(batch)”

streammux = Gst.ElementFactory.make(“nvstreammux”, “Stream-muxer”)

# 階段2-執行推理的插件:

# 使用NVINFERE對解碼器的輸出執行推理,推理行為是通過配置文件設置

pgie = Gst.ElementFactory.make(“nvinfer”, “primary-inference”)

# 階段3-處理輸出的插件:

# 根據nvosd的要求,使用轉換器將NV12轉換為RGBA

nvvidconv = Gst.ElementFactory.make(“nvvideoconvert”, “convertor”)

# 創建OSD以在轉換的RGBA緩沖區上繪制

nvosd = Gst.ElementFactory.make(“nvdsosd”, “onscreendisplay”)

# 最后將osd的繪制,進行渲染后在屏幕上顯示結果

transform=Gst.ElementFactory.make(“nvegltransform”, “egltransform”)

sink = Gst.ElementFactory.make(“nveglglessink”, “nvvideo-renderer”)

3. 配置元件的參數

# 以args[1]給定的文件名為輸入源視頻文件

source.set_property(‘location’, args[1])

# 設定流復用器的尺寸、數量

streammux.set_property(‘width’, 1920)

streammux.set_property(‘height’, 1080)

streammux.set_property(‘batch-size’, 1)

streammux.set_property(‘batched-push-timeout’, 4000000)

# 設定pgie的配置文件

pgie.set_property(‘config-file-path’, “dstest1_pgie_config.txt”)

4. 將元件添加到導管之中:用pipeline.add()

pipeline.add(source)

pipeline.add(h264parser)

pipeline.add(decoder)

pipeline.add(streammux)

pipeline.add(pgie)

pipeline.add(nvvidconv)

pipeline.add(nvosd)

pipeline.add(sink)

if is_aarch64():

pipeline.add(transform)

5. 將元件按照要求連接起來:本范例的管道流為file-source -》 h264-parser -》 nvh264-decoder -》 streammux -》 nvinfer -》 nvvidconv -》 nvosd -》 video-renderer

source.link(h264parser) # file-source -》 h264-parser

h264parser.link(decoder) # h264-parser -》 nvh264-decoder

# 下面粗線的三行,是streammux的特殊處理方式

sinkpad = streammux.get_request_pad(“sink_0”)

srcpad = decoder.get_static_pad(“src”)

srcpad.link(sinkpad)

streammux.link(pgie) # streammux -》 nvinfer

pgie.link(nvvidconv) # nvinfer -》 nvvidconv

nvvidconv.link(nvosd) # nvvidconv -》 nvosd

nvosd.link(transform) # nvosd -》 transform

transform.link(sink) # transform -》 video-renderer

前面5個步驟都是比較靜態的固定步驟,只要將想開發的應用所需要的插件元件進行“創建”、“給值”、“連接”就可以。

接下去的部分是整個應用中非常關鍵的靈魂,就是我們得為整個應用去建構“信息(message)傳遞系統”,這樣才能讓這個應用與插件元件之間形成互動,進而正確執行我們想要得到的結果。其相互關系圖如下,這里并不花時間去講解調用細節,想了解的請自行參考 Gstreamer 框架的詳細使用。

6. 創建一個事件循環(evnet loop):將信息(mesages)傳入并監控bus的信號

loop = GObject.MainLoop()

bus = pipeline.get_bus()

bus.add_signal_watch()

bus.connect (“message”, bus_call, loop)

# 用osdsinkpad來確認nvosd插件是否獲得輸入

osdsinkpad = nvosd.get_static_pad(“sink”)

# 添加探針(probe)以獲得生成的元數據的通知,我們將probe添加到osd元素的接收器板中,因為到那時,緩沖區將具有已經得到了所有的元數據。

osdsinkpad.add_probe(Gst.PadProbeType.BUFFER,

osd_sink_pad_buffer_probe, 0)

注意粗體“osd_sink_pad_buffer_probe”部分,這是代碼中另一個重點,需要自行撰寫代碼去執行的部分,就是代碼中第41~126行的內容,這里面的處理以“幀”為單位(在“while l_frame is not None:”里面),將該幀所檢測到的物件種類進行加總,并且將物件根據種類的顏色畫出框框。

事實上在這80+行代碼中,真正與數據處理相關的部分,只有20行左右的內容,注釋的部分占用不小的篇幅,這是作者為大家提供非常重要的說明,只要耐心地去閱讀,就能輕松地掌握里面的要領。

7. 播放并收聽事件:這部分就是個“啟動器”,如同汽車鑰匙“執行發動”功能一樣。

# 配置導管狀態為PLAYING就可以

pipeline.set_state(Gst.State.PLAYING)

try:

loop.run() # 執行前面創建的事件循環

except:

pass

# 執行結束之后,需要清除導管,將狀態為NULL就可以

pipeline.set_state(Gst.State.NULL)

以上就是建立DeepStream應用的標準步驟,可以將“def main(args):”部分的代碼當作是個模板去加以利用。

至于“osd_sink_pad_buffer_probe”函數的作用,就是從osd接收器提取接收的元數據,并更新繪圖矩形、對象信息等的參數,里面的代碼也都是標準內容,可以在別的應用在重復套用。更多參數優化的細節部分,須花時間詳細閱讀DeepStream開發手冊。

接下來就實際執行一下Python版本的deepstream-test1代碼,看看效果如何!

執行deepstream_test_1.py

前面文章中已經將NVIDIA/AI-IOT/deepstream-python-apps項目下載到Jetson Nano 2GB上的《deepstream《 span=“”》根目錄》/sources下面,現在就到這個目錄下去執行

cd《deepstream《 span=“”》根目錄》/sources/deepstream_python_apps/apps

cd deepstream-test1

下面有執行文件deepstream_test_1.py、配置文件dstest1_pgie_config.txt與說明文件README,這個配置文件就是步驟3最后“pgie.set_property”里面指定的文件,在執行文件里看不到任何與推理模型相關的內容,原來都放在設定文件里面去指定了。

關于設定文件的參數設定部分,是相對容易了解的,這里不多花時間說明,接下去直接執行以下指令看看執行結果:

python3 deepstream_test_1.py 。。/。。/。。/。。/samples/streams/sample_720p.h264

就能跑出我們熟悉的結果,

如果覺得左上方顯示的字體太小,請自行改動代碼第110行的字體號數。字體放大到20號時候的顯示結果,現在就可以看到很清楚了。

到這里,相信您應該對DeepStream代碼有更深層次的了解,在了解整個框架與工作流程之后,可以發現要開發一個基礎應用,并不是一件太困難的事情,不過建議您多反復閱讀代碼內的每一行說明,并且自行適度修改些參數看看效果會有什么變化,一旦熟悉這些邏輯與交互關系之后,就會覺得DeepStream其實很簡單。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7002

    瀏覽量

    88943
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68525
  • python
    +關注

    關注

    56

    文章

    4792

    瀏覽量

    84628

原文標題:NVIDIA Jetson Nano 2GB 系列文章(35):Python版test1實戰說明

文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達企業解決方案】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ad12dj5200數據部分錯誤且Transport Layer test有問題,怎么解決?

    1、ADC是ADC12DJ5200RF,配置為JMOD1,Transport Layer部分的代碼參考ad12dj3200的示例工程寫的,仔細核對過沒發現問題。 2、JTEST=Ramp test
    發表于 12-02 08:27

    基于迅為RK3588【RKNPU2項目實戰1】:YOLOV5實時目標分類

    【RKNPU2項目實戰1】:YOLOV5實時目標分類 https://www.bilibili.com/video/BV1ZN411D7V8/?spm_id_from=333.999.0.0
    發表于 08-15 10:51

    opa857在test mode下,out端輸出電壓不隨TEST_IN的電壓變化怎么解決?

    原理圖: CTRL(增益控制引腳): logic 0–5kΩ logic 1–20kΩ OPA857有兩種模式:normal mode 和 test mode ,由TEST_SD引腳控制
    發表于 08-02 07:15

    pytorch和python的關系是什么

    在當今的人工智能領域,Python已經成為了最受歡迎的編程語言之一。Python的易學易用、豐富的庫和框架以及強大的社區支持,使其成為了數據科學、機器學習和深度學習等領域的首選語言。而在深度學習領域
    的頭像 發表于 08-01 15:27 ?1888次閱讀

    python訓練出的模型怎么調用

    Python中,訓練出的模型可以通過多種方式進行調用。 1. 模型保存與加載 在Python中,訓練好的模型需要被保存,以便在其他程序或會話中使用。以下是一些常用的模型保存和加載方法。 1.1
    的頭像 發表于 07-11 10:15 ?1873次閱讀

    Espressif-IDE編譯報錯的原因?

    also \"D:/Prj_esp/test/test1/build/CMakeFiles/CMakeOutput.log\". Failed to run Python
    發表于 06-07 07:34

    Matter最新Test Harness工具使用介紹(二)

    Matter的測試項根據聯盟的TestPlan目前可以分為五類:全自動測試項,半自動測試項,手動測試項,Python in docker測試項以及UI Python測試項。
    的頭像 發表于 05-08 10:42 ?2165次閱讀
    Matter最新<b class='flag-5'>Test</b> Harness工具使用介紹(二)

    ELF 1技術貼|如何將Python3.6.9移植到開發板上

    在ELF1開發板的Linux4.1.15eMMC鏡像中,默認預裝了Python2.7。為了適應更多應用場景,有些小伙伴可能需要移植其他版本的Python,下面將以Python3.6.9
    的頭像 發表于 02-22 14:06 ?429次閱讀
    ELF <b class='flag-5'>1</b>技術貼|如何將<b class='flag-5'>Python</b>3.6.9移植到開發板上

    python中open函數的用法詳解

    python中open函數的用法詳解 Python中的open()函數用于打開文件。它接受文件名和模式作為參數,并返回一個文件對象。文件對象可用于讀取、寫入和管理文件。 open()函數的基本語法
    的頭像 發表于 01-30 15:31 ?2086次閱讀

    嵌入式學習-ElfBoard ELF 1板卡-移植python3.6.9

    。本篇文章以python3.6.9為例,在網址下載Python-3.6.9.tar.xz壓縮文件。1.拷貝Python-3.6.9.tar.xz到開發環境/home/elf/work目
    發表于 01-24 16:50

    如何解決Python爬蟲中文亂碼問題?Python爬蟲中文亂碼的解決方法

    Python爬蟲中文亂碼問題。 一、了解字符編碼 在解決亂碼問題之前,我們首先需要了解一些基本的字符編碼知識。常見的字符編碼有ASCII、UTF-8和GBK等。 1. ASCII:是一種用于表示英文字母、數字和常用符號的字符編碼,它使用一個字節(8位)來表示一個字符。
    的頭像 發表于 01-12 15:11 ?2333次閱讀

    【核桃派1B 開發板試用體驗】+ Python編程篇

    在核桃派開發板其系統配置了Python軟件,通過它完成編寫和運行Python代碼。 在使用Python時,可分為2種情況,即一種是通過?終端來操作,它適用于無桌面操作系統的環境,見圖1
    發表于 01-03 22:08

    ADXL355的self test作用是什么?

    各位大神: 目前在使用貴ADI的MEMS傳感器,在ADXL355的規格書里面,有關于self test說明和響應參數,我不是很明白怎么做。 我的問題是: 1、self test的作用
    發表于 12-28 07:44

    ADE7753讀取vrms的數值波動很大怎么解決?

    (); ADE7753_Init(); _delay_ms(200); uint32_t test1; uint32_t test2; while(1) { test2=Read775
    發表于 12-27 07:41

    split在python中的用法

    split()函數的用法,以及一些實際應用場景。 1. split()的基本用法 split()函數的基本用法非常簡單,只需要在字符串上直接調用即可。例如: ``` str = "Python is a
    的頭像 發表于 12-25 15:12 ?2018次閱讀
    主站蜘蛛池模板: 日本黄色www| 亚洲AV一宅男色影视| 熟妇内谢69XXXXXA片| 37大但人文艺术A级都市天气| 美女gif趴跪式动态图| JIZJIZJIZ 日本老师水多| 人妻超级精品碰碰在线97视频| 俄罗斯videosbest8| 天天躁日日躁狠狠躁午夜剧场 | 99热在线视频| 人妖欧美一区二区三区四区| 成人伦理影院| 日日夜夜国产| 国产国拍亚洲精品av麻豆| 色淫阁色九九| 国产短视频精品区| 亚洲 综合 欧美在线视频| 国产欧美一区二区精品久久久| 星空无限传媒视频在线观看视频| 国产成人综合在线| 午夜日本大胆裸艺术| 果冻传媒在线观看高清完整免费| 亚洲无人区码二码三码区别图| 久久三级视频| 扒开屁股眼往里面夹东西| 双腿打开揉弄高潮H苏安安秦慕深| 国产网站免费观看| 2019午夜福合集不打码| 色人阁久久| 久久亚洲精品中文字幕| 超碰国产人人做人人爽| 午夜免费福利| 男人国产AV天堂WWW麻豆| 国产欧美另类久久久精品免费 | 国产精品免费视频能看| 伊人情人网综合| 色偷偷超碰97人人澡人人| 久久这里只有精品无码3D| 国产福利高清在线视频| 37pao成人国产永久免费视频| 日韩综合网|