1. 程式人生 > 其它 >【模型推理】教你用 C++ 實現一般模型推理圖片預處理模組

【模型推理】教你用 C++ 實現一般模型推理圖片預處理模組

歡迎關注我的公眾號 [極智視界],回覆001獲取Google程式設計規範

O_o >_< o_O O_o ~_~ o_O

大家好,我是極智視界,本文介紹了用 C++ 實現一般模型推理圖片預處理的方法,通用性較強。

大家知道,對於一個視覺深度學習應用來說,主要會涉及幾個流程:視訊編解碼、影象預處理、模型推理、後處理。這裡介紹一下影象預處理的實現。

以預設如下配置為例:opencv 讀圖、寬高均為512、三通道、均值 [0.485, 0.456, 0.406]、方差 [0.229, 0.224, 0.225]、需做歸一化、以 RGB 餵給模型。那麼你的預處理可以這麼寫:

cv::Mat source, frame;
source = cv::imread(img_path); // 讀圖

if (!source.data) // 異常判斷
{
std::cout << " read error" << std::endl;
}

int batchsize = 1;
int net_w = 512;
int net_h = 512;

cv::cvtColor(source, frame, cv::COLOR_BGR2RGB); // 通道轉換
cv::resize(frame, frame, cv::Size(net_w, net_h)); // resize

float* mat_data = new float[batchsize * net_w * net_h * 3];
int data_index = 0;

// 開啟影象預處理
for(int i = 0; i < net_h; i++)
{
const uchar* current = frame.ptr<uchar>(i); // 指向每行首地址
for(int j = 0; j < net_w; j++)
{
mat_data[data_index] = ((current[3*j + 0] / 255.0) - 0.485) / 0.229; // R
mat_data[net_w*net_h + data_index] = ((current[3*j + 1] / 255.0) - 0.456) / 0.224; // G
mat_data[2*net_w * net_h + data_index] = ((current[3*j + 2] / 255.0) - 0.406) / 0.225; // B
data_index++;
}
}

// 然後把 mat_data 餵給模型

// 用完之後別忘了 delete mat_data
delete mat_data;

解釋一下以上的程式碼,opencv 讀圖預設 BGR 排布,這個案例需要以 RGB 餵給模型,所以在做預處理的時候最重要的是要把通道對應起來。這裡的實現主要利用了指標偏移,每個內迴圈的起始位置都是指向每行首地址,然後慢慢往後偏移,在偏移的途中順便做一些預處理的操作,等走完一遍也就順便完成了影象預處理流程,這樣的處理方式,效率還是不錯的。

然後再說一下預處理完的資料排布,前面說了 opencv 讀進來是 BGR 的,經過了 cvtColor 轉換後成了 RGB,這個時候的資料排布是 RGBRGBRGBRGBRGB...,然後進我們的影象預處理,做完之後的資料排布是這樣的:RRRRRRRRRRRR...GGGGGGGGGGG...BBBBBBBBBBB,之後在餵給模型就行。

以上介紹了用 C++ 實現一般模型推理圖片預處理的方法,預處理是深度學習應用中必不可少的一個環節,程式碼還算比較通用,希望我的分享能對你的學習有一點幫助。

【公眾號傳送】

《【模型推理】教你用 C++ 實現一般模型推理圖片預處理模組