【TensorRT】TensorRT C# API 项目更新 (1):支持动态Bath输入模型推理(下篇)

4. 接口应用

关于该项目的调用方式在上一篇文章中已经进行了详细介绍,具体使用可以参考《最新发布!TensorRT C# API :基于C#与TensorRT部署深度学习模型》,下面结合Yolov8-cls模型详细介绍一下更新的接口使用方法。

4.1 创建并配置C#项目

  首先创建一个简单的C#项目,然后添加项目配置。

  首先是添加TensorRT C# API 项目引用,如下图所示,添加上文中C#项目生成的dll文件即可。

  接下来添加OpenCvSharp,此处通过NuGet Package安装即可,此处主要安装以下两个程序包即可:

  配置好项目后,项目的配置文件如下所示:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net6.0</TargetFramework><RootNamespace>TensorRT_CSharp_API_demo</RootNamespace><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable></PropertyGroup><ItemGroup><PackageReference Include="OpenCvSharp4.Extensions" Version="4.9.0.20240103" /><PackageReference Include="OpenCvSharp4.Windows" Version="4.9.0.20240103" /></ItemGroup><ItemGroup><Reference Include="TensorRtSharp"><HintPath>E:\GitSpace\TensorRT-CSharp-API\src\TensorRtSharp\bin\Release\net6.0\TensorRtSharp.dll</HintPath></Reference></ItemGroup></Project>

4.2 添加推理代码

  此处演示一个简单的图像分类项目,以Yolov8-cls项目为例:

(1) 转换engine模型

动态输入的模型在进行格式转换时,需要指定模型推理形状至此的范围,minShapes表示模型推理支持的最小形状,optShapes表示模型推理支持的最佳形状,maxShapes表示模型推理支持的最大形状,模型转换需要消耗较多时间,最终转换成功后会在模型同级目录下生成相同名字的.engine文件。

Dims minShapes = new Dims(1, 3, 224, 224);
Dims optShapes = new Dims(10, 3, 224, 224);
Dims maxShapes = new Dims(20, 3, 224, 224);
Nvinfer.OnnxToEngine(onnxPath, 20, "images", minShapes, optShapes, maxShapes);
(2) 定义模型预测方法

下面代码是定义的Yolov8-cls模型的预测方法,该方法支持动态Bath输入模型推理,可以根据用户输入图片数量,自动设置输入Bath,然后进行推理。

下面代码与上一篇文章中的代码差异主要是增加了predictor.SetBindingDimensions("images", new Dims(batchNum, 3, 224, 224));这一句代码。同时在初始化时,设置最大支持20Bath,这与上文模型转换时设置的一致。

public class Yolov8Cls
{public Dims InputDims;public int BatchNum;private Nvinfer predictor;public Yolov8Cls(string enginePath){predictor = new Nvinfer(enginePath, 20);InputDims = predictor.GetBindingDimensions("images");}public void Predict(List<Mat> images){BatchNum = images.Count;for (int begImgNo = 0; begImgNo < images.Count; begImgNo += BatchNum){DateTime start = DateTime.Now;int endImgNo = Math.Min(images.Count, begImgNo + BatchNum);int batchNum = endImgNo - begImgNo;List<Mat> normImgBatch = new List<Mat>();int imageLen = 3 * 224 * 224;float[] inputData = new float[BatchNum * imageLen];for (int ino = begImgNo; ino < endImgNo; ino++){Mat input_mat = CvDnn.BlobFromImage(images[ino], 1.0 / 255.0, new OpenCvSharp.Size(224, 224), 0, true, false);float[] data = new float[imageLen];Marshal.Copy(input_mat.Ptr(0), data, 0, imageLen);Array.Copy(data, 0, inputData, ino * imageLen, imageLen);}predictor.SetBindingDimensions("images", new Dims(batchNum, 3, 224, 224));predictor.LoadInferenceData("images", inputData);DateTime end = DateTime.Now;Console.WriteLine("[ INFO ] Input image data processing time: " + (end - start).TotalMilliseconds + " ms.");predictor.infer();start = DateTime.Now;predictor.infer();end = DateTime.Now;Console.WriteLine("[ INFO ] Model inference time: " + (end - start).TotalMilliseconds + " ms.");start = DateTime.Now;float[] outputData = predictor.GetInferenceResult("output0");for (int i = 0; i < batchNum; ++i){Console.WriteLine(string.Format("[ INFO ] Classification Top {0} result : ", 2));float[] data = new float[1000];Array.Copy(outputData, i * 1000, data, 0, 1000);List<int> sortResult = Argsort(new List<float>(data));for (int j = 0; j < 2; ++j){string msg = "";msg += ("index: " + sortResult[j] + "\t");msg += ("score: " + data[sortResult[j]] + "\t");Console.WriteLine("[ INFO ] " + msg);}}end = DateTime.Now;Console.WriteLine("[ INFO ] Inference result processing time: " + (end - start).TotalMilliseconds + " ms.\n");}}public static List<int> Argsort(List<float> array){int arrayLen = array.Count;List<float[]> newArray = new List<float[]> { };for (int i = 0; i < arrayLen; i++){newArray.Add(new float[] { array[i], i });}newArray.Sort((a, b) => b[0].CompareTo(a[0]));List<int> arrayIndex = new List<int>();foreach (float[] item in newArray){arrayIndex.Add((int)item[1]);}return arrayIndex;}
}
(3) 预测方法调用

下面是上述定义的预测方法,为了测试不同Bath性能,此处读取了多张图片,并分别预测不同张数图片,如下所示:

Yolov8Cls yolov8Cls = new Yolov8Cls("E:\\Model\\yolov8\\yolov8s-cls_b.engine");
Mat image1 = Cv2.ImRead("E:\\ModelData\\image\\demo_4.jpg");
Mat image2 = Cv2.ImRead("E:\\ModelData\\image\\demo_5.jpg");
Mat image3 = Cv2.ImRead("E:\\ModelData\\image\\demo_6.jpg");
Mat image4 = Cv2.ImRead("E:\\ModelData\\image\\demo_7.jpg");
Mat image5 = Cv2.ImRead("E:\\ModelData\\image\\demo_8.jpg");yolov8Cls.Predict(new List<Mat> { image1, image2 });yolov8Cls.Predict(new List<Mat> { image1, image2, image3 });yolov8Cls.Predict(new List<Mat> { image1, image2, image3, image4 });yolov8Cls.Predict(new List<Mat> { image1, image2, image3, image4, image5 });

4.3 项目演示

  配置好项目并编写好代码后,运行该项目,项目输出如下所示:

[ INFO ] Input image data processing time: 5.5277 ms.
[ INFO ] Model inference time: 1.3685 ms.
[ INFO ] Classification Top 2 result :
[ INFO ] index: 386     score: 0.8754883
[ INFO ] index: 385     score: 0.08013916
[ INFO ] Classification Top 2 result :
[ INFO ] index: 293     score: 0.89160156
[ INFO ] index: 276     score: 0.05480957
[ INFO ] Inference result processing time: 3.0823 ms.[ INFO ] Input image data processing time: 2.7356 ms.
[ INFO ] Model inference time: 1.4435 ms.
[ INFO ] Classification Top 2 result :
[ INFO ] index: 386     score: 0.8754883
[ INFO ] index: 385     score: 0.08013916
[ INFO ] Classification Top 2 result :
[ INFO ] index: 293     score: 0.89160156
[ INFO ] index: 276     score: 0.05480957
[ INFO ] Classification Top 2 result :
[ INFO ] index: 14      score: 0.99853516
[ INFO ] index: 88      score: 0.0006980896
[ INFO ] Inference result processing time: 1.5137 ms.[ INFO ] Input image data processing time: 3.7277 ms.
[ INFO ] Model inference time: 1.5285 ms.
[ INFO ] Classification Top 2 result :
[ INFO ] index: 386     score: 0.8754883
[ INFO ] index: 385     score: 0.08013916
[ INFO ] Classification Top 2 result :
[ INFO ] index: 293     score: 0.89160156
[ INFO ] index: 276     score: 0.05480957
[ INFO ] Classification Top 2 result :
[ INFO ] index: 14      score: 0.99853516
[ INFO ] index: 88      score: 0.0006980896
[ INFO ] Classification Top 2 result :
[ INFO ] index: 294     score: 0.96533203
[ INFO ] index: 269     score: 0.0124435425
[ INFO ] Inference result processing time: 2.7328 ms.[ INFO ] Input image data processing time: 4.063 ms.
[ INFO ] Model inference time: 1.6947 ms.
[ INFO ] Classification Top 2 result :
[ INFO ] index: 386     score: 0.8754883
[ INFO ] index: 385     score: 0.08013916
[ INFO ] Classification Top 2 result :
[ INFO ] index: 293     score: 0.89160156
[ INFO ] index: 276     score: 0.05480957
[ INFO ] Classification Top 2 result :
[ INFO ] index: 14      score: 0.99853516
[ INFO ] index: 88      score: 0.0006980896
[ INFO ] Classification Top 2 result :
[ INFO ] index: 294     score: 0.96533203
[ INFO ] index: 269     score: 0.0124435425
[ INFO ] Classification Top 2 result :
[ INFO ] index: 127     score: 0.9008789
[ INFO ] index: 128     score: 0.07745361
[ INFO ] Inference result processing time: 3.5664 ms.

  通过上面输出可以看出,不同Bath模型推理时间在1.3685~1.6947ms,大大提升了模型的推理速度。

5. 总结

  在本项目中,我们扩展了TensorRT C# API 接口,使其支持动态输入模型。并结合分类模型部署流程向大家展示了TensorRT C# API 的使用方式,方便大家快速上手使用。

  为了方便各位开发者使用,此处开发了配套的演示项目,主要是基于Yolov8开发的目标检测、目标分割、人体关键点识别、图像分类以及旋转目标识别,并且支持动态输入模型,用户可以同时推理任意张图像。

  • Yolov8 Det 目标检测项目源码:
https://github.com/guojin-yan/TensorRT-CSharp-API-Samples/blob/master/model_samples/yolov8_custom_dynamic/Yolov8Det.cs
  • Yolov8 Seg 目标分割项目源码:
https://github.com/guojin-yan/TensorRT-CSharp-API-Samples/blob/master/model_samples/yolov8_custom_dynamic/Yolov8Seg.cs
  • Yolov8 Pose 人体关键点识别项目源码:
https://github.com/guojin-yan/TensorRT-CSharp-API-Samples/blob/master/model_samples/yolov8_custom_dynamic/Yolov8Pose.cs
  • Yolov8 Cls 图像分类项目源码:
https://github.com/guojin-yan/TensorRT-CSharp-API-Samples/blob/master/model_samples/yolov8_custom_dynamic/Yolov8Cls.cs
  • Yolov8 Obb 旋转目标识别项目源码:
https://github.com/guojin-yan/TensorRT-CSharp-API-Samples/blob/master/model_samples/yolov8_custom_dynamic/Yolov8Obb.cs

  同时对本项目开发的案例进行了时间测试,以下时间只是程序运行一次的时间,测试环境为:

  • CPU:i7-165G7

  • CUDA型号:12.2

  • Cudnn:8.9.3

  • TensorRT:8.6.1.6

ModelBatch数据预处理 (ms)模型推理 (ms)结果后处理 (ms)
Yolov8s-Det116.64.613.1
438.012.432.4
870.523.080.1
Yolov8s-Obb128.78.917.7
481.725.967.4
8148.444.6153.0
Yolov8s-Seg115.45.467.4
437.315.5220.6
878.726.9433.6
Yolov8s-Pose115.15.28.7
439.213.214.3
867.823.127.7
Yolov8s-Cls19.91.31.9
414.71.52.3
822.62.02.9

  最后如果各位开发者在使用中有任何问题,欢迎大家与我联系。

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

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

相关文章

Java SpringBoot基于微信小程序的高速公路服务区充电桩在线预定系统,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

中国传媒网CEO徐晓艺:第六届世界布商大会启幕 共探全球纺织业转型与合作

日前,2023国际纺织制造商联合会中国绍兴柯桥大会、2023第六届世界布商大会在浙江绍兴柯桥启幕,来自全球55个国家和地区的纺织行业代表围绕“绿色、循环、数字化——纺织工业新动源”主题,共探全球纺织业转型与合作。 “当前,纺织服装行业进入变革期,以数字、绿色为特征的产业变…

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具

文章目录 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具1. 介绍2. 下载3. 静音模式、平衡模式、增强模式配置4. 配置电源方案与模式切换绑定5. 启动Ghelper控制面板6. 目前支持的设备型号 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理…

Day99:云上攻防-云原生篇K8s安全实战场景攻击Pod污点Taint横向移动容器逃逸

目录 云原生-K8s安全-横向移动-污点Taint 云原生-K8s安全-Kubernetes实战场景 知识点&#xff1a; 1、云原生-K8s安全-横向移动-污点Taint 2、云原生-K8s安全-Kubernetes实战场景 云原生-K8s安全-横向移动-污点Taint 如何判断实战中能否利用污点Taint&#xff1f; 设置污点…

Qt对象池,单例模式,对象池可以存储其他类的对象指针

代码描述&#xff1a; 写了一个类&#xff0c;命名为对象池&#xff08;ObjectPool &#xff09;&#xff0c;里面放个map容器。 3个功能&#xff1a;添加对象&#xff0c;删除对象&#xff0c;查找对象 该类只构建一次&#xff0c;故采用单例模式功能描述&#xff1a;对象池可…

6-pytorch - 网络的保存和提取

前言 我们训练好的网络&#xff0c;怎么保存和提取呢&#xff1f; 总不可以一直不关闭电脑吧&#xff0c;训练到一半&#xff0c;想结束到明天再来训练&#xff0c;这就需要进行网络的保存和提取了。 本文以前面博客3-pytorch搭建一个简单的前馈全连接层网络&#xff08;回归问…

Aurora 协议学习理解与应用——Aurora 64B66B协议学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Aurora 协议学习理解与应用——Aurora 64B66B协议学习 概述数据发送和接收帧传输过程链路层帧描绘64B/66B 编码多lane传输 帧接收过程Control Block Stripping 控制块剥离多l…

武汉星起航:跨境电商新引擎,助力中国品牌全球崛起

在全球贸易体系日益紧密的今天&#xff0c;跨境电商以其独特的优势&#xff0c;正成为外贸发展的新引擎。武汉星起航电子商务有限公司&#xff0c;作为跨境电商领域的佼佼者&#xff0c;凭借其深厚的行业积累和前瞻的战略布局&#xff0c;在推动中国品牌全球崛起方面发挥着重要…

Qt+vstudio2022的报错信息积累

从今天开始记录一下平常开发工作中的报错记录&#xff0c;后续有错误动态补充&#xff01; 报错信息&#xff1a;【MSB8041】此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。 解决&#xff1a; 背景&#xff1a;换…

【Blockchain】连接智能合约与现实世界的桥梁Chainlink

去中心化预言机试图实现依赖因果关系而不是个人关系的去信任和确定性结果。它以与区块链网络相同的方式实现这些结果&#xff0c;即在许多网络参与者之间分配信任。通过利用许多不同的数据源并实施不受单个实体控制的预言机系统&#xff0c;去中心化的预言机网络有可能为智能合…

HTML段落标签、换行标签、文本格式化标签与水平线标签

目录 HTML段落标签 HTML换行标签 HTML格式化标签 加粗标签 倾斜标签 删除线标签 下划线标签 HTML水平线标签 HTML段落标签 在网页中&#xff0c;要把文字有条理地显示出来&#xff0c;就需要将这些文字分段显示。在 HTML 标签中&#xff0c;<p>标签用于定义段落…

三相交流电子负载的重要指标

三相交流电子负载是一种模拟实际负载的电子设备&#xff0c;主要用于测试电源、变频器、逆变器等电力电子设备的性能和稳定性。在选择和使用三相交流电子负载时&#xff0c;需要关注以下几个重要指标&#xff1a; 1. 额定功率&#xff1a;三相交流电子负载的额定功率是指其能够…

计算机体系架构

冯诺依曼架构 我们编写的程序存储在哪里呢&#xff1f;CPU内部的结构其实很简单&#xff0c;除了ALU、控制单元、寄存器和少量Cache&#xff0c;根本没有多余的空间存放我们编写的代码&#xff0c;我们需要额外的存储器来存放我们编写的程序&#xff08;指令序列&#xff09;。…

【机器学习】探究Q-Learning通过学习最优策略来解决AI序列决策问题

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

实现联系人前后端界面,实现分页查询04.15

实现联系人前后端界面&#xff0c;实现分页查询项目包-CSDN博客 项目结构 数据库中建立两个表&#xff1a; 完整的后端目录 建立联系人People表&#xff0c;分组Type表&#xff0c;实现对应实体类 根据需求在mapper中写对应的sql语句 查询所有&#xff0c;删除&#xff0c;添…

C语言学习笔记之指针(二)

指针基础知识&#xff1a;C语言学习笔记之指针&#xff08;一&#xff09;-CSDN博客 目录 字符指针 代码分析 指针数组 数组指针 函数指针 代码分析&#xff08;出自《C陷阱和缺陷》&#xff09; 函数指针数组 指向函数指针数组的指针 回调函数 qsort() 字符指针 一…

树莓派安装tensorflow

树莓派安装tensorflow 使用编译好的版本自己选择版本进行编译armv71 架构 教程转载 使用编译好的版本 下载tensorflow编译好的版本 https://github.com/lhelontra/tensorflow-on-arm/tags由于python版本支持有限可能需要自己安装python 安装对应的python 自己选择版本进行编译…

使用undetected-chromedriver遇到的问题及解决方法,以及它使用SOCKS代理的问题

环境&#xff1a;python3.8.10 uc的安装方法&#xff1a; pip38 install undetected-chromedriver 上测试代码&#xff1a; import undetected_chromedriver as uc driver uc.Chrome() driver.get(https://www.baidu.com) driver.save_screenshot(baidu.png)报错&#xff…

【C++学习】map和set

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 四、set 4.1 set的介绍 4.2 set的使用 4.2.1 set的模板参数列表 4.2.2 set的构造 4.2.3 set的容量 4.2.4 set修改操作 4.2.5 set的使用举例 五、map 5.1 map的介绍 5.2 map的使用 5.2.1 map的模板参数说…

STM32H7 QSPI的寄存器和功能介绍

目录 概述 1 认识QSPI 1.1 QSPI介绍 1.2 QUADSPI 主要特性 2 QUADSPI 功能说明 2.1 双闪存模式禁止 2.2 双闪存模式使能 3 QUADSPI 的用法 3.1 间接模式的操作步骤 3.1.1 QUADSPI 间接模式时配置帧模式 3.1.2 写控制寄存器 (QUADSPI_CR) 3.1.3 写通信配置寄存器 (…