什么網(wǎng)站教做醫(yī)學(xué)實驗報告免費(fèi)網(wǎng)站制作成品
1.前言
? ? ? ? 在我們進(jìn)行實際的應(yīng)用開發(fā)時,都會隨著對一款產(chǎn)品或者AI芯片的了解加深,大家都會想到有什么可以加速預(yù)處理啊或者后處理的手段?常見的不同廠家對于應(yīng)用開發(fā)的時候,都會提供一個硬件解碼和硬件編碼的能力,這也是拋棄了傳統(tǒng)的opencv或者pl等在cpu上話費(fèi)多的時間進(jìn)行視頻解碼和編碼,而對于昇騰產(chǎn)品,310一系列產(chǎn)品來說,他也會有自己的數(shù)據(jù)媒體處理單元,如下圖所示:參考學(xué)習(xí)鏈接:
昇騰社區(qū)-官網(wǎng)丨昇騰萬里 讓智能無所不及
????????
硬件產(chǎn)品結(jié)構(gòu)示意圖,內(nèi)置的有dvpp模塊用于數(shù)據(jù)預(yù)處理,AI core用于矩陣、向量等計算;不會占用cpu的資源,剛了解昇騰框架的伙伴可能會用下面的開發(fā)順序進(jìn)行編寫代碼:
(1)首先輸入視頻源的選擇:rtsp流、視頻、圖片等
(2)直接使用opencv的api進(jìn)行讀取,也就是解碼,其實opencv讀取視頻還是蠻快的,讀取rtsp確實有一些慢,而且還占用cpu的資源,
(3)使用opencv解碼出來之后的圖片是,bgr,uint8,NHWC格式的圖片,對于不同的模型輸入,需要進(jìn)行轉(zhuǎn)換為模型需要的輸入,比如resize縮放圖片指定大小,數(shù)據(jù)格式轉(zhuǎn)換從uint8 到float32 16\以及通道的變換,這一步也是大家的預(yù)處理。
(4)送入模型進(jìn)行推理,大家可以做int8量化之類的操作
(5)模型后處理,對輸出的數(shù)據(jù)進(jìn)行篩選,獲取最終的目標(biāo)。
(6)opencv直接顯示或者數(shù)據(jù)編碼使用ffmpeg或者其他工具進(jìn)行推流
以下是使用ACL我在整個端到端應(yīng)用開發(fā)時總結(jié)的比較優(yōu)選方案:
(1)使用dvpp進(jìn)行rtsp和視頻的解碼,dvpp解碼之后的數(shù)據(jù)為yuv420sp,是在device中的數(shù)據(jù),無需內(nèi)存拷貝,這個過程是將h264/h265的碼流解碼為yuv的數(shù)據(jù),這一過程會在npu硬件執(zhí)行,但是底層的實現(xiàn)是先通過ffmpeg進(jìn)行解封裝,再進(jìn)行dvpp解碼,內(nèi)部實現(xiàn)了多線程:參考樣例如下:
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);
將解碼數(shù)據(jù)傳送到testpic結(jié)構(gòu)體中:
這個ImageDATA 結(jié)構(gòu)體如下:
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進(jìn)行圖像縮放,由于dvpp解碼之后的數(shù)據(jù)為YUV格式,所以模型轉(zhuǎn)換的時候需要配合aipp,將模型的輸入改為yuv輸入與模型對齊。
ImageData resizedImage;ret = g_dvpp_.Resize(resizedImage, testPic, g_modelInputWidth, g_modelInputHeight);
(3)將數(shù)據(jù)直接存入模型中進(jìn)行推理:
(4)模型的后處理,怎么和原圖進(jìn)行畫框,可以將原始的yuv圖片轉(zhuǎn)換為opencv的圖片進(jìn)行畫框,或者使用frretype直接在yuv上進(jìn)行畫框,參考案例如下:
方法一:將device的原圖拷貝到cpu測轉(zhuǎn)換為cv::mat類型進(jìn)行畫框:
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上進(jìn)行繪制目標(biāo)框圖:參考案例如下:
samples: CANN Samples - Gitee.com
(5)將畫框后的數(shù)據(jù)硬件編碼為h264文件用于ffmpeg進(jìn)行推流,編碼代碼流程參考案例:
samples: CANN Samples - Gitee.com
由于ACL僅支持編碼yuv的圖片到h264/265所以建議大家可以使用第二種方法進(jìn)行編碼,不需要再次使用ffmpeg進(jìn)行軟件編碼,大大可以節(jié)約時間。
整個流程可以在原來的軟件編碼情況下快1.5倍左右。關(guān)于ffmpeg推流可以加我學(xué)習(xí)群或者網(wǎng)上找一些簡單的源碼推流工具,如果大家有興趣可以加入a群:855986726
下一章我們繼續(xù)講解如何進(jìn)行多模型串聯(lián)推理,