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
下一章我們繼續講解如何進行多模型串聯推理,