【深度学习】MNN ImageProcess处理图像顺序,逻辑,均值,方差

文章目录

  • 介绍
  • Opencv numpy
  • 等效的MNN处理

介绍

MNN ImageProcess处理图像是先reisze还是后resize,均值方差怎么处理,是什么通道顺序?这篇文章告诉你答案。

Opencv numpy

这段代码是一个图像预处理函数,用于对输入的图像进行一系列处理,以便将其用于某些机器学习模型的输入。

  1. cv2.imdecode(np.fromfile(imgpath, dtype=np.uint8), 1):这行代码从文件中读取图像数据,并使用OpenCV库中的imdecode函数将其解码为图像矩阵。参数1表示图像应该按原样解码,即不进行颜色转换或通道重新排序。

  2. cv2.resize(img, (224, 224), interpolation=cv2.INTER_LINEAR):接下来,将图像调整大小为 (224, 224),这是因为一些深度学习模型(如AlexNet、VGG等)需要固定大小的输入图像。

  3. img = img.astype(np.float32):将图像数据类型转换为 32 位浮点数,通常这是深度学习模型期望的输入类型。

  4. img = img[..., ::-1]:颜色通道顺序调整,将图像从 BGR 格式转换为 RGB 格式。

  5. img_norm_cfg:定义了图像的归一化参数,包括均值和标准差。这些参数用于将图像像素值标准化到一个较小的范围,以便模型更好地处理图像数据。

  6. img -= img_norm_cfg['mean']:对图像进行均值归一化。

  7. img *= img_norm_cfg['std']:对图像进行标准差归一化。

  8. img = img.transpose((2, 0, 1)):调整图像的维度顺序,将通道维度置于第一个位置。

  9. img = np.expand_dims(img, axis=0):在图像的第一个维度(批处理维度)上添加一个维度,使其成为形状为 (1, C, H, W) 的批量图像数据,其中 C 是通道数,H 和 W 是图像的高度和宽度。

最终,函数返回预处理后的图像数据,可以直接用于输入深度学习模型进行训练或推断。

    def preprocess(self, imgpath: str):img = cv2.imdecode(np.fromfile(imgpath, dtype=np.uint8), 1)  # img是矩阵if img is None:raise Exception("image is None:" + imgpath)img = cv2.resize(img, (224, 224), interpolation=cv2.INTER_LINEAR)img = img.astype(np.float32)img = img[..., ::-1]img_norm_cfg = dict(mean=[103.53, 116.28, 123.675],std=[0.01712, 0.01750, 0.01742])img -= img_norm_cfg['mean']img *= img_norm_cfg['std']img = img.transpose((2, 0, 1))img = np.expand_dims(img, axis=0)return img

等效的MNN处理

下面是一个等效的MNN处理:

// 获取模型和会话
ModelData GetDetModel(const char* model_file_name) {using namespace MNN;ModelData modelData;// MNNstd::shared_ptr<Interpreter> interpreter(Interpreter::createFromFile(model_file_name));ScheduleConfig config_s;config_s.type = MNN_FORWARD_AUTO;Session* mSession = interpreter->createSession(config_s);Tensor* mInputTensor = interpreter->getSessionInput(mSession, NULL);Tensor* mOutputTensor = interpreter->getSessionOutput(mSession, NULL);// 输入处理,形成一个mnn张量// dst = (img - mean) * normalMNN::CV::ImageProcess::Config config;config.destFormat = MNN::CV::ImageFormat::RGB;config.sourceFormat = MNN::CV::ImageFormat::BGR;float mean_[4] = {103.53f, 116.28f, 123.675f, 0.0f};memcpy(config.mean, mean_, 4 * sizeof(float));float normal_[4] = {0.01712f, 0.01750f, 0.01742f, 0.0f};memcpy(config.normal, normal_, 4 * sizeof(float));config.filterType = MNN::CV::NEAREST;config.wrap = MNN::CV::ZERO;std::shared_ptr<MNN::CV::ImageProcess> image_process(MNN::CV::ImageProcess::create(config));//    MNN::CV::Matrix transform;//    image_process->setMatrix(transform);modelData.interpreter = interpreter;modelData.session = mSession;modelData.mInputTensor = mInputTensor;modelData.mOutputTensor = mOutputTensor;modelData.image_process = image_process;return modelData;
}// 释放资源
void ReleaseDetModel(ModelData& modelData) {using namespace MNN;auto interpreter = modelData.interpreter;auto mSession = modelData.session;auto mInputTensor = modelData.mInputTensor;auto mOutputTensor = modelData.mOutputTensor;auto image_process = modelData.image_process;interpreter->releaseModel();interpreter->releaseSession(mSession);
}std::vector<float> RunDetModel(ModelData& modelData,  // 模型和会话cv::Mat& img_bgr)      // 图片 opencv mat
{using namespace MNN;auto interpreter = modelData.interpreter;auto mSession = modelData.session;auto mInputTensor = modelData.mInputTensor;auto mOutputTensor = modelData.mOutputTensor;auto image_process = modelData.image_process;cv::Mat srcimgx;srcimgx = img_bgr.clone();cv::resize(srcimgx, srcimgx, cv::Size(224, 224), 0, 0, cv::INTER_LINEAR);int img_resize_height = srcimgx.rows;int img_resize_width = srcimgx.cols;// resizeSession//    interpreter->resizeTensor(mInputTensor, {1, 3, img_resize_height, img_resize_width});//    interpreter->resizeSession(mSession);// 输入处理,形成一个mnn张量std::vector<int> shape = {1, 3, img_resize_height, img_resize_width};std::shared_ptr<MNN::Tensor> input_tensor(MNN::Tensor::create<float>(shape, nullptr, MNN::Tensor::CAFFE));image_process->convert(srcimgx.data, img_resize_width, img_resize_height, 0, input_tensor.get());// 给入mInputTensormInputTensor->copyFromHostTensor(input_tensor.get());// Run mSessioninterpreter->runSession(mSession);// Get outputauto nchwTensorOt = new Tensor(mOutputTensor, Tensor::CAFFE);// 拷贝出去mOutputTensor->copyToHostTensor(nchwTensorOt);// 使用auto type = nchwTensorOt->getType();auto size = nchwTensorOt->elementSize();std::vector<int> shape_out = nchwTensorOt->shape();// values 输出形状是 img_fp_height, img_fp_width,直接给到cv::Matauto values = nchwTensorOt->host<float>();// log values sizestd::vector<float> outimg(values, values + size);delete nchwTensorOt;return outimg;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/657431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Django

Django 是一个用于构建 Web 应用程序的高级 Python Web 框架。它遵循 "Dont Repeat Yourself"&#xff08;不要重复自己&#xff09;和 "Convention over Configuration"&#xff08;约定大于配置&#xff09;的原则&#xff0c;以提高开发效率。 以下是 …

【数据结构 06】二叉树

一、原理 二叉树算法核心思维&#xff1a;递归 满二叉树&#xff1a;二叉树的层数为K&#xff0c;节点数为 完全二叉树&#xff1a;二叉树的层数为K&#xff0c;前K-1层是满的&#xff0c;第K层是连续的 满二叉树是完全二叉树的子集。 任意二叉树&#xff1a;若叶子节点的…

CRF条件随机场学习记录

阅读建议 仔细阅读书[1]对应的序列标注章节&#xff0c;理解该方法面向的问题以及相关背景&#xff0c;然后理解基础的概念。 引言 威胁情报挖掘的相关论文中&#xff0c;均涉及到两部分任务&#xff1a;命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER&a…

ubuntu+nginx+uwsgi部署django项目

相比较学习Django来说,部署应该是在整个环节中比较难的一项,特别是一些自学者,对liunx系统的命令行操作不熟悉,甚至是从来没有接触过服务器,这一块我相信劝退了很多人!当初我自己学习的时候也是如此! 但我仍然觉得自学是一件非常酷的事,虽说可能会走些弯路,但这些弯路…

android学习笔记----ListView和各种适配器简介

打气筒&#xff08;LayoutInflater对象&#xff09;介绍&#xff1a; MainActivity.java import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import an…

Springboot 实现基于用户和物品的协同过滤算法

目录 简介 协同过滤算法(简称CF) 算法详解 算法使用 基于用户 基于物品 总结 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停…

对作用域链的理解(详细解析)

文章目录 一、作用域全局作用域函数作用域块级作用域 二、词法作用域三、作用域链 一、作用域 作用域&#xff0c;即变量&#xff08;变量作用域又称上下文&#xff09;和函数生效&#xff08;能被访问&#xff09;的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变…

CSRF笔记整理

跨站请求伪造 类型 GET&#xff1a;基于url直接修改 POST&#xff1a;基于表单修该 基本原理 用户在同一浏览器登陆了网站A并访问了攻击者在网站B上构造的恶意链接&#xff08;针对网站A用户信息的一些数据操作&#xff09; 用户点击恶意链接瞬间会触发csrf攻击&#xff1b;通过…

Vue3前端框架:动态组件详解

当谈到现代前端开发框架时&#xff0c;Vue.js 通常是一个备受推崇的选择。在 Vue.js 3 中&#xff0c;动态组件是一个强大而灵活的功能&#xff0c;为开发人员提供了更多的控制权和创造性。本文将深入探讨 Vue.js 3 中动态组件的详细内容&#xff0c;探讨其用法、优势以及如何在…

腾讯云部署vue+node项目

文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…

已解决com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException异常的正确解决方法,亲测有效!!!

已解决com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 检查SQL语句的拼写和语法 核对数据库结构 阅读并理解…

php-fpm详细讲解

PHP-FPM&#xff08;FastCGI Process Manager&#xff09;是PHP的一种运行模式&#xff0c;用于处理动态HTTP请求。 它与传统的模块式PHP&#xff08;如Apache模块&#xff09;相比&#xff0c;将PHP解析和执行过程单独封装为一个独立的进程池&#xff0c;通过FastCGI协议与We…

腾讯云0基础10秒搭建幻兽帕鲁游戏联机服务器

幻兽帕鲁&#xff08;Palworld&#xff09;是一款多人在线游戏&#xff0c;为了获得更好的游戏体验&#xff0c;需要搭建一个稳定、高效的游戏联机服务器。腾讯云提供了一种简单、快速的方法&#xff0c;让新手小白也能0基础10秒搭建幻兽帕鲁游戏联机服务器&#xff01; 本文将…

计算机网络_1.2因特网概述

1.2因特网概述 一、网络、互联网与因特网的区别与联系1、网络2、互联网3、因特网4、 互联网与因特网辨析 二、因特网介绍1、因特网发展的三个阶段2、因特网简介&#xff08;1&#xff09;因特网服务提供者&#xff08;ISP&#xff09;&#xff08;2&#xff09;因特网已经发展成…

基于Springboot的视频网站系统的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的视频网站系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

ESP8266 传感器搭配 Node-RED实时显示数据,邮件告警 实验

前言 esp8266 12f,wif模块,接倾斜传感器,火焰传感器,烟雾传感器,水浸传感器,蜂鸣器。通过mqtt发布数据,并使用node-red实时获取数据,显示到页面上。并且通过邮件和页面两种方式报警。 需求如下: ①倾斜传感器:监测是否保持平衡。UI界面显示平衡度。如果不平衡,UI界…

Observability:在 Elastic Stack 8.12 中使用 Elastic Agent 性能预设

作者&#xff1a;来自 Elastic Nima Rezainia, Bill Easton 8.12 中 Elastic Agent 性能有了重大改进 最新版本 8.12 标志着 Elastic Agent 和 Beats 调整方面的重大转变。 在此更新中&#xff0c;Elastic 引入了 Performance Presets&#xff0c;旨在简化用户的调整过程并增强…

上位机图像处理和嵌入式模块部署(视频处理vs图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 从目前发展的情况来看&#xff0c;视频处理会慢慢变成一种主流趋势。这里面的原因很多&#xff0c;比如说现在嵌入式soc的算力越来越强、获取图像的…

如何从视频中提取高清图片?可以这样截取

如何从视频中提取高清图片&#xff1f;从视频中提取高清图片可以方便我们制作各种用途所需的素材&#xff0c;如海报、社交媒体配图等。此外&#xff0c;高清图片的细节和色彩也更丰富&#xff0c;可以更好地满足我们的视觉需求。从视频中提取高清图片是一项需要技巧的任务&…

Gateway API 实践之(六)FSM Gateway 的健康检查功能

FSM Gateway 流量管理策略系列&#xff1a; 故障注入黑白名单访问控制限速重试会话保持健康检查负载均衡算法TLS 上游双向 TLS 网关的健康检查功能是一种自动化监控机制&#xff0c;用于定期检查和验证后端服务的健康状况&#xff0c;确保流量只被转发到那些健康且能正常处理请…