昇騰ACL應用開發之硬件編解碼dvpp

1.前言

? ? ? ? 在我們進行實際的應用開發時,都會隨著對一款產品或者AI芯片的了解加深,大家都會想到有什么可以加速預處理啊或者后處理的手段?常見的不同廠家對于應用開發的時候,都會提供一個硬件解碼和硬件編碼的能力,這也是拋棄了傳統的opencv或者pl等在cpu上話費多的時間進行視頻解碼和編碼,而對于昇騰產品,310一系列產品來說,他也會有自己的數據媒體處理單元,如下圖所示:參考學習鏈接:

昇騰社區-官網丨昇騰萬里 讓智能無所不及

????????

硬件產品結構示意圖,內置的有dvpp模塊用于數據預處理,AI core用于矩陣、向量等計算;不會占用cpu的資源,剛了解昇騰框架的伙伴可能會用下面的開發順序進行編寫代碼:

(1)首先輸入視頻源的選擇:rtsp流、視頻、圖片等

(2)直接使用opencv的api進行讀取,也就是解碼,其實opencv讀取視頻還是蠻快的,讀取rtsp確實有一些慢,而且還占用cpu的資源,

(3)使用opencv解碼出來之后的圖片是,bgr,uint8,NHWC格式的圖片,對于不同的模型輸入,需要進行轉換為模型需要的輸入,比如resize縮放圖片指定大小,數據格式轉換從uint8 到float32 16\以及通道的變換,這一步也是大家的預處理。

(4)送入模型進行推理,大家可以做int8量化之類的操作

(5)模型后處理,對輸出的數據進行篩選,獲取最終的目標。

(6)opencv直接顯示或者數據編碼使用ffmpeg或者其他工具進行推流

以下是使用ACL我在整個端到端應用開發時總結的比較優選方案:

(1)使用dvpp進行rtsp和視頻的解碼,dvpp解碼之后的數據為yuv420sp,是在device中的數據,無需內存拷貝,這個過程是將h264/h265的碼流解碼為yuv的數據,這一過程會在npu硬件執行,但是底層的實現是先通過ffmpeg進行解封裝,再進行dvpp解碼,內部實現了多線程:參考樣例如下:

cplusplus/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_video_DVPP_with_AIPP/src/sample_process.cpp · Ascend/samples - Gitee.com

g_cap_ = new AclLiteVideoProc(g_streamName_);stream是視頻路徑或者rtsp
ImageData testPic;
AclLiteError ret = g_cap_->Read(testPic);

將解碼數據傳送到testpic結構體中:

這個ImageDATA 結構體如下:

struct ImageData {acldvppPixelFormat format;uint32_t width = 0;uint32_t height = 0;uint32_t alignWidth = 0;uint32_t alignHeight = 0;uint32_t size = 0;std::shared_ptr<uint8_t> data = nullptr;
};

(2)解碼之后通過VPC進行圖像縮放,由于dvpp解碼之后的數據為YUV格式,所以模型轉換的時候需要配合aipp,將模型的輸入改為yuv輸入與模型對齊。

        ImageData resizedImage;ret = g_dvpp_.Resize(resizedImage, testPic, g_modelInputWidth, g_modelInputHeight);

(3)將數據直接存入模型中進行推理:

(4)模型的后處理,怎么和原圖進行畫框,可以將原始的yuv圖片轉換為opencv的圖片進行畫框,或者使用frretype直接在yuv上進行畫框,參考案例如下:

方法一:將device的原圖拷貝到cpu測轉換為cv::mat類型進行畫框:

        ImageData yuvImage;ret = CopyImageToLocal(yuvImage, testPic, g_runMode_);if (ret == ACLLITE_ERROR) {ACLLITE_LOG_ERROR("Copy image to host failed");return ACLLITE_ERROR;}cv::Mat yuvimg(yuvImage.height * 3 / 2, yuvImage.width, CV_8UC1, yuvImage.data.get());cv::Mat origImage;cv::cvtColor(yuvimg, origImage, CV_YUV2BGR_NV12);

方法二;直接在yuv上進行繪制目標框圖:參考案例如下:

samples: CANN Samples - Gitee.com

(5)將畫框后的數據硬件編碼為h264文件用于ffmpeg進行推流,編碼代碼流程參考案例:

samples: CANN Samples - Gitee.com

由于ACL僅支持編碼yuv的圖片到h264/265所以建議大家可以使用第二種方法進行編碼,不需要再次使用ffmpeg進行軟件編碼,大大可以節約時間。

整個流程可以在原來的軟件編碼情況下快1.5倍左右。關于ffmpeg推流可以加我學習群或者網上找一些簡單的源碼推流工具,如果大家有興趣可以加入a群:855986726

下一章我們繼續講解如何進行多模型串聯推理,

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

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

相關文章

Docker 命令詳解:容器、鏡像、網絡和數據卷管理

文章目錄 1. docker run2. docker pull3. docker images4. docker ps5. docker stop6. docker rm7. docker commit8. docker exec9. docker logs10. docker network11. docker volume12. docker save13. docker load14. docker tag15. docker search16. docker diff17. docker …

sql注入之sqli-labs/less-3 單引號加括號閉合

輸入單引號試探&#xff1a; id1 報錯信息里面出現 ) 說明閉合符合里面還有個 ) 再次試探&#xff1a;id1 ) order by 3 -- 查看回顯位置&#xff1a; id-1%20%27)%20union%20select%201,2,3%20-- 查看數據庫&#xff1a; id-1%20%27)%20union%20select%201,2,database()%2…

Kerberos協議攻防之黃金票據控制整個公司電腦

&#x1f449;重點內容&#xff1a; 1、網絡認證、本地認證、域認證的優略勢 2、域認證之Kerberos協議的認證流程詳解 3、TGT、Krbtgt、KDC、TGS搞懂這些繞口的概念 4、深入理解黃金票據攻擊Golden Ticket Attack 5、實戰&#xff01;通過黃金票據控制內網中所有的電腦

DC-2靶機詳解

寫寫自己打DC-2的過程 使用工具 kali DC-2的靶機下載地址為&#xff1a;https://www.vulnhub.com/entry/dc-2,311/ 環境配置。 Kali和DC-2都設置為NAT模式&#xff0c;都為僅主機模式也可以。 信息收集 arp-scan -l nmap -sn 192.168.236.0/24 獲取靶機ip&#xff1a;192.16…

基于springboot+vue的工廠車間管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

【Linux】輸入系統應用

# 前置知識 (1)輸入子系統分為三層&#xff0c;分別是事件處理層、核心層、設備驅動層&#xff1b; (2)鼠標移動、鍵盤按鍵按下等輸入事件都需要通過設備驅動層→核心層→事件處理層→用戶空間&#xff0c;層層上報&#xff0c;直到應用程序; 事件處理層 (1)事情處理層主要是負…

【八】【SQL】子查詢和where

顯示與SMITH同一部門的員工 mysql> select *from emp where enameSMITH; ----------------------------------------------------------------------- | empno | ename | job | mgr | hiredate | sal | comm | deptno | --------------------------------…

Python調用C,python call c,pybind11

文章目錄 前言1.將pybind11 clone至當前項目下的extern目錄下2.在CmakeLists.txt中將pybind11項目包含3.接口cpp文件格式4.編譯5.導入Python使用6.性能比較pybind11項目地址 前言 通過https://github.com/pybind/pybind11項目實現Python調用C/C代碼 實現步驟 1.將pybind11 cl…

騰訊云4核8G服務器申請費用多少?性能如何?支持幾個人?

騰訊云4核8G服務器支持多少人在線訪問&#xff1f;支持25人同時訪問。實際上程序效率不同支持人數在線人數不同&#xff0c;公網帶寬也是影響4核8G服務器并發數的一大因素&#xff0c;假設公網帶寬太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU內存也會造成計算…

大數據報告檢測到風險等級太高是怎么回事呢?

隨著金融風控越來越多元化&#xff0c;大數據作為新興的技術被運用到貸前風控中去了&#xff0c;不少人也了解過自己的大數據&#xff0c;但是由于相關知識不足&#xff0c;看不懂報告&#xff0c;在常見的問題中&#xff0c;大數據檢測到風險等級太高是怎么回事呢?小易大數據…

《javascript高級程序設計》學習筆記 | 21.2.錯誤處理

關注[前端小謳]&#xff0c;閱讀更多原創技術文章 錯誤處理 相關代碼 → try/catch 語句 ES3 新增了try/catch語句&#xff0c;基本語法與 Java 中的 try/catch 一樣 try {// 可能出錯的代碼const a 3;a 4; } catch (error) {// 出錯時執行的代碼console.log("An er…

vsomeip源碼剖析--00環境搭建

環境 Win11 WSL2 Ubuntu22.04安裝依賴 sudo apt-get install cmake sudo apt-get install libboost-system1.71-dev libboost-thread1.71-dev libboost-log1.71-dev源碼編譯 獲取源碼 https://github.com/COVESA/vsomeip.git編譯 cd vsomeip mkdir build cd build// 一般…

漫漫數學之旅035

文章目錄 經典格言數學習題古今評注名人小傳 - 黎勒?笛卡爾 經典格言 完美的數和完美的人是同樣罕見的。——黎勒?笛卡爾&#xff08;Ren Descrates&#xff09; 完美的數和完美的人都是極為罕見的。這句話表達了一個哲學觀點&#xff0c;即無論是在數學領域還是人類自身&am…

Spring框架相關問題

RabbitMQ相關問題 Spring框架相關問題 一、Spring容器中的Bean是線程安全的嗎&#xff1f;二、如何保證Spring容器中的Bean是線程安全的呢&#xff1f;三、什么情況下會觸發Spring事務回滾&#xff1f;四、如果事務方法拋出IOException&#xff0c;是否會觸發Spring事務回滾&a…

Zookeeper學習2:原理、常用腳本、選舉機制、監聽器

文章目錄 原理選舉機制&#xff08;重點&#xff09;情況1&#xff1a;正常啟動集群情況2&#xff1a;集群啟動完&#xff0c;中途有機器掛了 監聽器客戶端向服務端寫入數據客戶端向服務端Leader節點寫入客戶端向服務端Follower節點寫入 Paxos算法&#xff08;每個節點都可以提…

AMDGPU KFD Test 編譯使用

ROCT-Thunk-Interface是一個用于在ROCm軟件堆棧中提供設備無關性的層。它是ROCm的一部分,允許不同的硬件平臺(如AMD GPU和Intel CPU)使用相同的API進行計算。 要安裝ROCT-Thunk-Interface,首先需要創建一個新的目錄,并進入該目錄: mkdir rocm-build cd rocm-build然后,…

ng : 無法將ng項識別為 cmdlet、函數、腳本文件或可運行程序的名稱

ng : 無法將“ng”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱”&#xff0c;出現這種錯誤&#xff0c;那說明你angular-cli沒有下載所以環境變量里沒有相應的東西 1、需要在cmd里輸入npm install -g angular/cli 2、之后運行angular命令時還可能出現這種錯誤 “ng : …

ruoyi 圖片等文件資源讀取

老是忘&#xff0c;記錄一下 ResourcesConfig 文件下 /** 本地文件上傳路徑 */ registry.addResourceHandler(Constants.RESOURCE_PREFIX "/**").addResourceLocations("file:" RuoYiConfig.getProfile() "/"); /*** 資源映射路徑 前綴*/ …

kafka消費者重平衡是什么?怎么避免?

消費者重平衡是指主題下的分區怎么分配給消費者的過程。下面這個圖可以看出該過程&#xff1a;原來有2個消費者&#xff0c;3個分區&#xff0c;其中一個消費者肯定就的處理2個分區了。那么當新加入消費者時&#xff0c;則每個消費者就只處理一個分區了。處理這個分區過程的叫協…

詳解Nacos注冊中心的使用

文章目錄 1、安裝2、服務注冊2.1、引入依賴2.2、配置nacos地址2.3、重啟 3、服務分級存儲模型3.1、給user-service配置集群3.2、同集群優先的負載均衡 4、權重配置5、環境隔離5.1、創建namespace5.2、配置namespace 6、Nacos與Eureka的區別7、代碼免費分享 ?&#x1f343;作者…