1. 程式人生 > 其它 >位元大陸bmnnsdk2視訊影象解碼和影象處理的開發原則

位元大陸bmnnsdk2視訊影象解碼和影象處理的開發原則

技術標籤:深度學習神經網路

本文主要針對研發人員在使用位元大陸bmnnsdk2編寫應用程式時,視訊影象解碼和影象處理部分的一些開發原則和注意事項。

1. 程式設計接觸的記憶體型別(Host Memory和Device Memory)

熟悉位元大陸BM168x AI晶片的同學,都瞭解BM168x晶片有兩種工作模式,對應不同的硬體產品。分別是 soc模式(SE5/SM5/SE3)和pcie模式(SC5/SC5+/SC3)。

無論是soc模式還是pcie模式,記憶體都有Host Memory和Device Memory兩種。

a) soc模式時,Host Memory是晶片上主控Cortex A53的記憶體,Device Memory是劃分給TPU/VPU 的裝置記憶體。

b) pcie模式時,Host Memory是主機的記憶體,Device Memory是PCIE板卡的裝置記憶體。

在整個程式的pipeline中,應儘量避免資料在Host Memory和Device Memory之間反覆拷貝。

2. 視訊影象解碼和影象處理的開發注意事項

視訊和影象的解碼,BM168x晶片都是有專門的硬體單元(VPU)來實現,分別通過擴充套件opencv和ffmpeg的介面來便於研發人員使用。參考文件(documents/Multimedia_Guide_zh.pdf)。

這裡需要特別注意,使用bmnnsdk2中的opencv解碼,解碼後的cv::Mat影象資料是在 Device Memory中,使用文件中沒提到的API(resize\cvtColor\clone等)做影象處理操作,都是在Host Memory操作。正確的做法是影象處理操作全部在cv::Mat轉成bm_image後(參考文件documents/BMCV_User_Guide.pdf),由bmcv來完成。

bmcv對影象的處理都是在Device Memory完成的,這就確保瞭解碼、影象處理、推理,影象的記憶體空間都在Device Memory裡,沒有和Host Memory的拷貝,從而達到最優的效率。

3. bmcv不支援的影象處理

如果遇到bmcv不支援的影象處理操作,必須要由opencv來完成。那就需要將Device Memory的資料拷貝到Host Memory裡來實現,參考下面的程式碼。

bm_image processed_img;
bm_image gray_img;
bm_image_create(bm_handle_, net_h_, net_w_,
                      FORMAT_BGR_PACKED,
                      DATA_TYPE_EXT_1N_BYTE, &processed_img, NULL);

bmcv_rect_t crop_rect = {face.left, face.top,
            face.right - face.left + 1, face.bot - face.top + 1};
bmcv_image_vpp_convert(bm_handle_, 1, input_img, &processed_img, &crop_rect);

cv::Mat cvImg(net_h_, net_w_, CV_8UC3, bgr_buf_);
cv::Mat cvGrayImg(net_h_, net_w_, CV_8UC1, gray_buf_);
bm_image_copy_device_to_host(processed_img, (void**)&bgr_buf_);
cv::cvtColor(cvImg, cvGrayImg, cv::COLOR_BGR2GRAY);
for (size_t i = 0; i < net_h_ * net_w_; i ++) {
	fp_gray_buf_[i] = static_cast<float>(gray_buf_[i]) / 255;
}
bm_image_copy_host_to_device(gray_img, (void**)&fp_gray_buf_);
bm_image_destroy(processed_img);