tensorRT 自带测试样例 sampleOnnxMNIST 源码分析

news2024/11/16 13:16:04

该测试样例是进行手写数字识别,使用 Visual Studio 2022 打开 tensorRT安装目录下的 samples 下的 sampleOnnxMNIST 工程( 例如我的是 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST ),执行输出结果:

 成功识别出数字0,再测试一下:

成功识别出数字4,但是我想手动识别一个手写数字的图片呢?如何传参呢?也没找见可以传图片的地方呀?怎么办?一个方法是看官方文档,例如 readme什么的,如果英文不好,或者懒得翻阅文档,可以根据日志顺腾摸瓜找到入口,我们 看控制台每次都会输出字符串 "Input:" 和 Output:,这个肯定是程序中例如使用 cout输出的,直接在 文件 sampleOnnxMNIST.cpp 中全局搜索 "Input:":

稍加阅读便可发现,该方法的主要作用是:

bool SampleOnnxMNIST::processInput(const samplesCommon::BufferManager& buffers){
    const int inputH = mInputDims.d[2];
    const int inputW = mInputDims.d[3];

    // Read a random digit file
    // 读取一个随机数字文件
    srand(unsigned(time(nullptr)));
    std::vector<uint8_t> fileData(inputH * inputW);
    // 计算一个随机的 0~9的数字
    mNumber = rand() % 10;
    // (locateFile(std::to_string(mNumber) + ".pgm", mParams.dataDirs) 的作用是 使用 文件夹集合 
    // mParams.dataDirs 和 一个文件名( 例如 1.pgm、2.pgm ...,这些文件其实在 D:\install\tensorRT\TensorRT-8.6.1.6\data\mnist 下 ) 来获取一个绝对文件路径
    // 所以我们改造下,直接写死 D:/code/python_code/test_0001/test.pgm 
    // readPGMFile(locateFile(std::to_string(mNumber) + ".pgm", mParams.dataDirs), fileData.data(), inputH, inputW);
    readPGMFile( "D:/code/python_code/test_0001/test.pgm", fileData.data(), inputH, inputW);

    // Print an ascii representation
    // 将数字文件以 ASCII 码的形式打印出来
    sample::gLogInfo << "Input:" << std::endl;
    for (int i = 0; i < inputH * inputW; i++){
        // 遍历数字图片中的每个像素,将像素的值转换成 可见的 ASCII 码( 每读到一个宽度( 28 )个,就换行 ),
        // 然后拼接到  sample::gLogInfo  中
        // 由于控制台输出的 图片的 ASCII 的形式的宽比较窄,所以这里我加了一个空格,即 '? ""' 改为了 '? " "' 
        sample::gLogInfo << (" .:-=+*#%@"[fileData[i] / 26]) << (((i + 1) % inputW) ? " " : "\n");
    }
    // 将 sample::gLogInfo 整个打印出来,也就是看到的类似一个图片的 28x28的区域
    sample::gLogInfo << std::endl;

    float* hostDataBuffer = static_cast<float*>(buffers.getHostBuffer(mParams.inputTensorNames[0]));
    for (int i = 0; i < inputH * inputW; i++){
        hostDataBuffer[i] = 1.0 - float(fileData[i] / 255.0);
    }

    return true;
}

.pgm 是什么文件:

.pgm是Portable Gray Map(便携式灰度图)的缩写,是灰度图像格式中一种最简单的格式标准1。PGM文件的后缀名为“.pgm”,它由两部分数据组成,分别是文件头部分和像素数据部分。文件头部分包含了PGM文件的格式类型(P2或P5)、图像的宽度、图像的高度以及图像灰度值可能的最大值,这些信息都是以ASCII码形式存储的,因此可以直接用记事本打开查看1。

PGM格式图像分为P2和P5两种类型:

P2类型:每个像素用字符串表示,每个像素之间用空格分开,图像每一行结束时要换行。当数据超过一定长度(如70个字节),会自动换行。P2格式是可读的,可以直接用记事本打开1。
P5类型:每个像素用二进制表示,每个像素之间及两行数据之间都没有空格或其他间隔。用记事本打开P5格式的PGM文件可能会看到乱码1。
PGM格式是一种灰度图像的存储格式,适用于存储单通道的图像数据,特别在黑白超声图像系统中经常使用23。它既可以用记事本等文本编辑器查看文件头信息,也可以用ACDSee、Photoshop等软件查看图像内容1。此外,在OpenCV库与Python结合使用的背景下,通过拍照选区生成PGM图片格式的文件是一个常见的需求,特别是在人脸识别领域,用于收集和准备训练数据2。

我们打开 D:\install\tensorRT\TensorRT-8.6.1.6\data\mnist\1.pgm,发现是二进制形式的:

可以使用 python 将 图片文件转换为 .pgm 文件( 参考 windows环境 python + opencv 加载 onnx 人脸检测模型识别人脸测试  搭建 python + opencv 环境 )

image2pgm_test.py:

import cv2
# 读取图片并转换为灰度图像
img = cv2.imread('6.jpeg', cv2.IMREAD_GRAYSCALE)
# 保存为PGM格式
cv2.imwrite('test.pgm', img)

 下载一张数字6的手写图片:

将像素尺寸修改为 28x28,然后执行  python image2pgm_test.py 生成了 test.pgm,再在 Visual Studio 2022 中运行 sampleOnnxMNIST:

可以看出识别成6的相似度最高

数字4的测试效果:

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

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

相关文章

ai模特换装软件哪个好用?不知道怎么穿搭就用这几个

最近#紫色跑道的city穿搭#风靡全网&#xff0c;大家纷纷晒出自己的紫色风情。 可一想到衣橱里堆积如山的衣服和钱包的“瘦身计划”&#xff0c;是不是有点小纠结&#xff1f; 别怕&#xff0c;科技来救场&#xff01;那就是“一键换装在线工具”&#xff0c;让你无需剁手&…

【初阶数据结构】11.排序(2)

文章目录 2.3 交换排序2.3.1 冒泡排序2.3.2 快速排序2.3.2.1 hoare版本2.3.2.2 挖坑法2.3.2.3 lomuto前后指针2.3.2.4 非递归版本 2.4 归并排序2.5 测试代码&#xff1a;排序性能对比2.6 非比较排序2.6.1 计数排序 3.排序算法复杂度及稳定性分析 2.3 交换排序 交换排序基本思想…

2024最新 Navicat Premium 17 简体中文激活版详细安装教程(最简单的激活方式)

一、下载地址 下载链接&#xff1a;分享文件&#xff1a;Navicat Premium 17.0.8 (x64) 中文版.zip 二、安装步骤 1、解压后点击运行navicat170_premium_cs_x64.exe 2、开始安装 3、选择安装路径&#xff0c;最好不要放在系统盘C盘&#xff0c;后面两个步骤默认 4、安装中&a…

【小知识】黑白分明的计算机世界——关系表达式,逻辑表达式和三目运算符

【小知识】黑白分明的计算机世界——关系表达式&#xff0c;逻辑表达式和三目运算符 1.逻辑变量2.关系表达式和逻辑表达式2.1.关系表达式2.1.1.例题——a和b的关系2.1.2.浮点数精度误差 2.2.逻辑表达式2.2.1.常见的逻辑运算符2.2.2.优先级2.2.3.注意事项2.2.3.1.在写逻辑表达式…

书生大模型学习笔记 - 连接云端开发机

申请InternStudio开发机&#xff1a; 这里进去报名参加实战营即可获取 书生大模型实战营 InternStudio平台 创建开发机 SSH连接开发机&#xff1a; SSH免密码登录 本地创建SSH密钥 ssh-keygen -t rsa打开以下文件获取公钥 ~/.ssh/id_rsa.pub去InternStudio添加公钥 …

OPenCV高级编程——OpenCV常见的API及绘图知识详解

目录 引言 一、Mat类详解 1. Mat类的基本结构 2. Mat类的数据类型 3. Mat类的创建与初始化 4. Mat类的使用技巧 二、OpenCV核心功能模块 1. 基本的图像读取与显示 2. 图像的保存 3. 矩阵操作 4. 等待键盘输入与销毁窗口 5. 命名窗口 三、图像处理模块 1. 色彩空间…

一个简单的车辆目标检测和跟踪示例

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 介绍 目标检测&#xff1a;目标检测是指在图像或视频帧中识别和定位特定目标&#xff0c;并使用边界框来确定它们的位置。YOLO&#xff08;You Only Look Once&#xff09;是一种高效的单阶段目标检测算法&#xff0c;以…

普冉Puya 超高性价比M0 MCU 工业电子解决方案

普冉半导体(上海)股份有限公司成立于2016年&#xff0c;总部位于上海张江高科&#xff0c;公司目前主要产品包括微控制器芯片、非易失性存储器芯片及模拟产品。产品广泛应用于物联网、智能手机及周边、可穿戴、服务器、光模块、工业控制、汽车电子、安防等领域。公司在深圳、韩…

Spring Boot集成udp通讯

Spring Boot集成udp通讯 加入依赖编辑配置文件配置相关属性具体业务类客户端调试 加入依赖 <!--加入UDP通信所需依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId&…

GD32 MCU电源复位和系统复位有什么区别

GD32 MCU的复位分为电源复位和系统复位&#xff0c;电源复位又称为冷复位&#xff0c;相较于系统复位&#xff0c;上电复位更彻底&#xff0c;下面为大家详细介绍上电复位和系统复位的实现以及区别。 电源复位包括上电/掉电复位或者从standby模式唤醒产生的复位&#xff0c;电…

HarmonyOS NEXT——奇妙的调用方式

注解调用一句话总结Extend抽取特定组件样式、事件&#xff0c;可以传递参数Style抽取公共样式、事件&#xff0c;不可以传递参数Builder抽取结构、样式、事件&#xff0c;可以传递参数BuilderParams自定义组件中传递UI组件多个BuilderParams自定义组件中传递多个UI组件 Extend…

echarts加载区域地图,并标注点

效果如下&#xff0c;加载了南海区域的地图&#xff0c;并标注几个气象站点&#xff1b; 1、下载区域地图的JSON&#xff1a;DataV.GeoAtlas地理小工具系列 新建nanhai.json&#xff0c;把下载的JSON数据放进来 说明&#xff1a;如果第二步不打勾&#xff0c;只显示省的名字&a…

全新微软语音合成网页版源码,短视频影视解说配音网页版系统-仿真人语音

源码介绍 最新微软语音合成网页版源码&#xff0c;可以用来给影视解说和短视频配音。它是TTS文本转语言&#xff0c;API接口和PHP源码。 这个微软语音合成接口的源码&#xff0c;超级简单&#xff0c;就几个文件搞定。用的是官方的API&#xff0c;试过了&#xff0c;合成速度…

InnoDB存储引擎(1)

InnoDB存储引擎的优点 InnoDB在设计时考虑到了处理大数据量时的性能&#xff0c;支持事务&#xff0c;回滚和崩溃修复的能力&#xff0c;通过多版本并发控制来减少锁定(降低了锁的争用),同时还支持外键的约束&#xff1b;通过缓冲池在内存中缓存数据来提高查询的性能&#xff…

内容营销专家刘鑫炜:驾驭AI为品牌服务,从成为卓越投喂师开始!

在这个信息爆炸、注意力稀缺的时代&#xff0c;品牌内容营销已成为企业连接消费者、塑造品牌形象的关键途径。而人工智能&#xff08;AI&#xff09;技术的融入&#xff0c;更是为内容营销带来了前所未有的变革与机遇。然而&#xff0c;要让AI真正为你的品牌内容营销高效服务&a…

vue3后台管理系统 vue3+vite+pinia+element-plus+axios上

前言 项目安装与启动 使用vite作为项目脚手架 # pnpm pnpm create vite my-vue-app --template vue安装相应依赖 # sass pnpm i sass # vue-router pnpm i vue-router # element-plus pnpm i element-plus # element-plus/icon pnpm i element-plus/icons-vue安装element-…

WebWorker处理百万数据

Home.vue <template><el-input v-model"Val" style"width: 400px"></el-input><el-button click"imgHandler">过滤</el-button><hr /><canvas id"myCanvas" width"500" height&quo…

不懂就问:EI论文真的很水吗?如何快速水一篇EI论文呢?

最近在有刷到一个这样的话题&#xff0c;发表一篇EI论文容易吗&#xff1f; 很多人可能会觉得EI没有什么用&#xff0c;但其实EI的含金量也很高。 比如目前有很多单位的老师在评选职称的时候&#xff0c;EI会议中的iee系列依然比发表一篇北大核心还高。 那发表EI论文到底容…

springboot家校共育平台-计算机毕业设计源码54235

摘 要 采用高效的SpringBoot框架&#xff0c;家校共育平台为家长与教师提供了便捷的沟通渠道。该平台整合了丰富的教育资源&#xff0c;实现了家校之间的即时信息互通&#xff0c;从而助力协同教育。 为进一步方便用户访问和使用&#xff0c;平台与微信小程序进行了深度整合。家…

WPF ViewBox,Canva之SVG

ViewBox Viewbox是WPF中的一个内容控件&#xff0c;它可以自动调整其内部子元素的大小以适应其自身的尺寸。Viewbox通过保持子元素原有的宽高比&#xff0c;对内容进行均匀的缩放&#xff0c;使其完全填充控件的空间。 Stretch Stretch属性决定了Viewbox如何缩放其内容。它可…