模型推理教你用 C++ 实现一般模型推理图片预处理模块

Posted 极智视界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模型推理教你用 C++ 实现一般模型推理图片预处理模块相关的知识,希望对你有一定的参考价值。

欢迎关注我的公众号 [极智视界],回复001获取Google编程规范

O_o>_<o_OO_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++ 实现一般模型推理图片预处理模块》



扫描下方二维码即可关注我的微信公众号【极智视界】,获取更多AI经验分享,让我们用极致+极客的心态来迎接AI !

以上是关于模型推理教你用 C++ 实现一般模型推理图片预处理模块的主要内容,如果未能解决你的问题,请参考以下文章

模型推理教你 tensorrt 实现 mish 算子

不用写代码神器!教你用4行命令轻松使用nnUNet训练自己的医学图像分割模型

基于Caffe ResNet-50网络实现图片分类(仅推理)的实验复现

基于Caffe ResNet-50网络实现图片分类(仅推理)的实验复现

模型推理教你简化 onnx upsample 算子

TensorRT C++网络模型接口推理