【模型推理】教你用 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++ 實現一般模型推理圖片預處理模塊

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM