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

简介: 大家好,我是极智视界,本文介绍了用 C++ 实现一般模型推理图片预处理的方法,通用性较强。

大家好,我是极智视界,本文介绍了用 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++ 实现一般模型推理图片预处理的方法,预处理是深度学习应用中必不可少的一个环节,代码还算比较通用,希望我的分享能对你的学习有一点帮助。


logo_show.gif


相关文章
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
当大火的文图生成模型遇见知识图谱,AI画像趋近于真实世界
本文介绍了阿里云机器学习PAI团队开发的名为ARTIST的中文文图生成模型,该模型融合了知识图谱信息,能够生成更加符合常识的图像。ARTIST基于Transformer架构,将文图生成任务分为图像矢量量化和文本引导的图像序列生成两个阶段。在第一阶段,模型使用VQGAN对图像进行矢量量化;在第二阶段,通过GPT模型并结合知识图谱中的实体知识来生成图像序列。在MUGE中文文图生成评测基准上,ARTIST表现出色,其生成效果优于其他模型。此外,EasyNLP框架提供了简单易用的接口,用户可以基于公开的Checkpoint进行少量领域相关的微调,实现各种艺术创作。
|
3天前
|
人工智能 vr&ar
[译][AI Research] AI 模型中的“it”是数据集
模型效果的好坏,最重要的是数据集,而不是架构,超参数,优化器。
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
大模型和传统ai的区别
在人工智能(AI)领域,大模型一直是一个热议的话题。从之前的谷歌 DeepMind、百度 Big. AI等,再到今天的百度GPT-3,人工智能技术经历了从“有”到“大”的转变。那么,大模型与传统 ai的区别在哪里?这对未来人工智能发展会产生什么影响?
|
4天前
|
人工智能 监控 安全
|
5天前
|
存储 安全 算法
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
22 0
|
5天前
|
算法 Linux 数据安全/隐私保护
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
12 0
|
6天前
|
存储 机器学习/深度学习 人工智能
RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术
RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术
RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
对大模型和AI的认识与思考
2023年,笔者也参与了各种学习和实践,从大语言模型、多模态算法,文生图(Stable Diffusion)技术,到prompt工程实践和搭建文生图(Stable Diffusion)webui实操环境。在此对谈谈对大模型和AI的认识与思考,是为总结。5月更文挑战第3天
28 1
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
【AI 生成式】如何利用生成式人工智能进行机器学习的数据增强?
【5月更文挑战第4天】【AI 生成式】如何利用生成式人工智能进行机器学习的数据增强?
|
10天前
|
机器学习/深度学习 人工智能 算法
【AI 初识】讨论深度学习和机器学习之间的区别
【5月更文挑战第3天】【AI 初识】讨论深度学习和机器学习之间的区别

热门文章

最新文章