c#使用onnxruntime调用yolo模型导出的onnx模型分割图片

1.今天写下c#中怎么使用yolo模型系列导出的onnx分割图片
2.yolo训练好后,把模型导出为onnx模式。
3.导出模型为onnx模式后,在window中要引用,可以使用 Microsoft.ML.OnnxRuntime库
4.window系统要求win10或者更高,vs用vs2022或更高,.net使用的框架要在.net4.8或更高,才支持使用Microsoft.ML.OnnxRuntime库,。
5.下载 Microsoft.ML.OnnxRuntime。可以在vs2022的包管理器收索下载。
b站视频地址
添加链接描述
基本核心代码:

 if (_onnx_model_is_exit){_object_list.Clear();_break_off = false;#region 获取输入输出的名称var input_datas_ = _session.InputMetadata;var input_names_ = _session.InputNames;var out_datas_ = _session.OutputMetadata;var out_names_ = _session.OutputNames;#endregion#region 创建输入数据PixelFormat p_f_ = _image.PixelFormat;MemoryStream ms = new MemoryStream();_image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);byte[] bytes = ms.GetBuffer();  //byte[]   bytes=   ms.ToArray(); 这两句都可以ms.Close();int leng_ = bytes.GetLength(0);//float[] input_data_ = { 1, 2, 3, 4 };long[] input_shape_ = { 1, 3, 640, 640 };float[] input_data_ = new float[leng_];for (int i = 0; i < leng_; i++){input_data_[i] = ((float)bytes[i]) / 255;//初拟255归一化}var input_ort_value_ = OrtValue.CreateTensorValueFromMemory(input_data_, input_shape_);var inputs1_ = new Dictionary<string, OrtValue> { { "images", input_ort_value_ } };#endregion#region  创建推理获取结果//创建创建运行的要求var run_options_ = new RunOptions();//推理IDisposableReadOnlyCollection<OrtValue> results_ = _session.Run(run_options_, inputs1_, out_names_);#endregion#region  获取输出结果var output0_type_and_shape_ = results_[0].GetTensorTypeAndShape();var output1_type_and_shape_ = results_[1].GetTensorTypeAndShape();var out_put0_ = results_[0].GetTensorDataAsSpan<float>();var out_put1_ = results_[1].GetTensorDataAsSpan<float>();#endregion#region 转成矩阵float[,] out_put0_float_ = new float[116, 8400];float[,,] out_put1_float_ = new float[32, 160, 160];//第一个out_put0转成矩阵int out_put0_index_ = 0;for (int row_ = 0; row_ < 116; row_++){for (int column_ = 0; column_ < 8400; column_++){out_put0_float_[row_, column_] = out_put0_[out_put0_index_];out_put0_index_++;}}//第二个out_put1转成矩阵int out_put1_index_ = 0;for (int channel_ = 0; channel_ < 32; channel_++){for (int row_ = 0; row_ < 160; row_++){for (int column_ = 0; column_ < 160; column_++){out_put1_float_[channel_, row_, column_] = out_put1_[out_put1_index_];out_put1_index_++;}}}//out_put0_转置处理float[,] out_put0_float_transpose_ = new float[8400, 116];for (int row_ = 0; row_ < 116; row_++){for (int column_ = 0; column_ < 8400; column_++){out_put0_float_transpose_[column_, row_] = out_put0_float_[row_, column_];}}//out_put1_转置处理float[,] out_put1_float_transpose_ = new float[32, 160 * 160];for (int channel_ = 0; channel_ < 32; channel_++){int out_put1_float_transpose_column_ = 0;for (int row_ = 0; row_ < 160; row_++){for (int column_ = 0; column_ < 160; column_++){out_put1_float_transpose_[channel_, out_put1_float_transpose_column_] = out_put1_float_[channel_, row_, column_];out_put1_float_transpose_column_++;}}}#endregionList<ObjectStruct> object_temp_list_ = new List<ObjectStruct>();#region  提取结果  第一个矩阵out_put0结果/********** * 第一个矩阵out_put0结果 0-4 x_center,y_center,width,height of bounding box* * 第一个矩阵out_put0结果 4-84 object class probabilities for all 80 classes, that this yolov8 model can detect* * 第一个矩阵out_put0结果 84-116 need muplty out_put1 it represent mask.* * ************/for (int row_ = 0; row_ < 8400 && _break_off == false; row_++)//循环每一个对象{//获取最大分数float prob_ = out_put0_float_transpose_[row_, 4];float class_id_ = 0;for (int column_ = 4; column_ < 84; column_++)//检测最大分数{if (prob_ < out_put0_float_transpose_[row_, column_]){prob_ = out_put0_float_transpose_[row_, column_];class_id_ = column_ - 4;}}if (prob_ > _prob_min){ObjectStruct ob_ = new ObjectStruct();ob_._prob = prob_;ob_._class_id = class_id_;ob_._class_label = _yolo_classes[(int)class_id_];ob_._boxe_center_x_ = out_put0_float_transpose_[row_, 0];ob_._boxe_center_y_ = out_put0_float_transpose_[row_, 1];ob_._boxe_center_width_ = out_put0_float_transpose_[row_, 2];ob_._boxe_center_height_ = out_put0_float_transpose_[row_, 3];ob_._x1 = ob_._boxe_center_x_- ob_._boxe_center_width_/2;ob_._x2 = ob_._boxe_center_x_ + ob_._boxe_center_width_ / 2;ob_._y1 = ob_._boxe_center_y_ - ob_._boxe_center_height_ / 2;ob_._y2 = ob_._boxe_center_x_ + ob_._boxe_center_height_ / 2;//取出maskfloat[,] mask_ = new float[1, 32];for (int column_ = 84; column_ < 116; column_++)//检测最大分数{if (prob_ < out_put0_float_transpose_[row_, column_]){mask_[0, column_ - 84] = out_put0_float_transpose_[row_, column_];}}//矩阵相乘masks_*out_put1_float_transpose_float[,] masks_multiply_output1_float_transpose_ = MultiplyMatrices(mask_, out_put1_float_transpose_);ob_._mask = new float[160, 160];int masks_multiply_output1_float_transpose_index_ = 0;for (int row_mask_image_ = 0; row_mask_image_ < 160; row_mask_image_++){for (int column_mask_image_ = 0; column_mask_image_ < 160; column_mask_image_++){float num_ = masks_multiply_output1_float_transpose_[0, masks_multiply_output1_float_transpose_index_];float num1_ = (float)(1 / (1 + Math.Exp(-num_)));if (num1_ > 0.5){ob_._mask[row_mask_image_, column_mask_image_] = 1;}else{ob_._mask[row_mask_image_, column_mask_image_] = 0;}masks_multiply_output1_float_transpose_index_++;}}object_temp_list_.Add(ob_);}}#endregion#region 去除重叠while (object_temp_list_.Count > 0){ObjectStruct object_temp_ = object_temp_list_[0]; for (int i = 0; i < object_temp_list_.Count; i++){double dis1_ = Math.Abs(object_temp_._x1 - object_temp_list_[i]._x1);double dis2_ = Math.Abs(object_temp_._y1 - object_temp_list_[i]._y1);double dis3_ = Math.Abs(object_temp_._x2 - object_temp_list_[i]._x2);double dis4_ = Math.Abs(object_temp_._y2 - object_temp_list_[i]._y2);if (dis1_ < _overlap_distance&& dis2_ < _overlap_distance&& dis3_ < _overlap_distance&& dis4_ < _overlap_distance){object_temp_list_.RemoveAt(i);i--;}}_object_list.Add(object_temp_);}#endregion#region 释放资源for (int i = 0; i < results_.Count; i++){results_[i].Dispose();}results_.Dispose();input_ort_value_.Dispose();inputs1_.Clear();#endregion_break_off = false;GC.Collect();}

要完成代码可以在b站我的工房购买 https://gf.bilibili.com/item/detail/1105641118

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

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

相关文章

【Kotlin】扩展属性、扩展函数

1 类的扩展 Kotlin 提供了扩展类或接口的操作&#xff0c;而无需通过类继承或使用装饰器等设计模式&#xff0c;来为某个类添加一些额外的属性或函数&#xff0c;我们只需要通过一个被称为扩展的特殊声明来完成。通过这种机制&#xff0c;我们可以将那些第三方类不具备的功能强…

C语言例3-35:长度运算的例子

长度运算符的表现形式&#xff1a; sizeof(数据类型符&#xff09; 或 sizeof(变量&#xff09; 长度运算符的优先级&#xff1a; 与单目算术运算符、单目逻辑运算符、自增和自减运算符的优先级相同。上述优先级相同的运算符的结合性都是从右至左。 长度运算的例子 代码如…

二手交易平台|基于JSP技术+ Mysql+Java+ B/S结构的二手交易平台设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

关于在ArkTS中添加动画没有效果这件事

先来看看错的 Entry Component struct an {State a : number 0;State ang : number 0;build() {Row(){Text(^_^).fontSize(90).position({x : 0,y : this.a}).rotate({angle : this.ang,centerX : 50%,centerY : 50%}).onClick(() > {this.a 100;}).animation({duration…

okcc呼叫中心线路不通可以跳下一个线路吗?

在 OKCC&#xff08;呼叫中心系统&#xff09;中&#xff0c;通常可以通过设置线路故障跳过功能来实现在当前线路不通的情况下自动跳转到下一个可用线路进行呼叫。这项功能可以提高呼叫成功率和系统的稳定性。具体操作步骤可能会略有不同&#xff0c;技术问题欢迎微博主kelaile…

亚马逊等跨境电商平台自养号测评的五个核心因素

一、安全稳定的环境系统 尽管市场上存在大量现成的系统和软件包&#xff0c;卖个软件或设备给你&#xff0c;这种基本上都没有解决风控的能力&#xff0c;因此&#xff0c;小编推荐大家还是自己掌握相关技术&#xff0c;避免过度依赖于外部资源&#xff0c;目前&#xff0c;也…

通过电机相电流计算电机反电动势

要通过电机的相电流来计算电机的反电动势&#xff08;back electromotive force, BEMF&#xff09;&#xff0c;可以使用以下方法&#xff1a; 给定相电流和电机参数&#xff1a;首先&#xff0c;你需要测量或获取电机的相电流值&#xff0c;这通常是通过电流传感器实现的。同时…

.net core 接入nacos

安装nacos 安装nacos .net core 接入nacos 引用包 nacos-sdk-csharpnacos-sdk-csharp.Extensions.Configuration Program 代码 public static IHostBuilder CreateHostBuilder(String[] args) >Host.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostingCon…

联合和枚举

联合体类型的声明 联合体&#xff08;Union&#xff09;是一种特殊的数据类型&#xff0c;它允许在同一内存位置存储不同类型的数据。与结构体不同的是&#xff0c;联合体的所有成员共享同一块内存空间&#xff0c;因此联合体的大小取决于它最大的成员的大小。 所以联合体也叫…

Spring Web MVC入门(5)

响应 在我们前面的代码例子中, 都已经设置了响应数据Http响应结果可以是数据, 也可以是静态页面, 也可以针对响应设置状态码, Header信息等. 返回静态页面 创建前端页面index.html(注意路径) html代码如下: <!DOCTYPE html> <html lang"en"> <hea…

Java Maven项目实现自动化部署到Docker上

前言 目前项目是采用docker部署的, 由于需要新增一个微服务,最终是实现自动推送到远程的docker上,所以就顺便记录一下操作步骤 服务器层面配置 开启 docker 所在服务器远程访问 # 1、修改docker配置文件 vim /lib/systemd/system/docker.service 在ExecStart后面加上&#xff…

刷新金融知识库,与时代并进!社科院与杜兰大学金融管理硕士项目为职场注入新活力

在这个日新月异的时代&#xff0c;金融行业的变革如同翻涌的浪潮&#xff0c;不断冲刷着我们的知识体系。为了应对这一挑战&#xff0c;我们需要不断更新自己的金融知识库&#xff0c;掌握最新的行业动态和前沿理论。而社科院与杜兰大学联合推出的金融管理硕士项目&#xff0c;…

推荐系统中常用评价指标及其实现

推荐系统中常用评价指标及其实现 定义 0 符号系统 符号含义备注K, kTop-K 推荐中的 K 值, 比如 Top-5 表示给每个用户推荐 5 个物品 U U U用户总数量 I I I物品总数量 u u u代指一个用户 i i i代指一个物品 R ( u ) \mathcal{R}(u) R(u)给用户 u u u 推荐的物品列表 T ( u …

腾讯云服务器如何购买省钱?2024年优惠券和优惠活动整理

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

Windows 10中打开控制面板的13种方法,总有一种适合你

前言 虽然有传言称微软将取消控制面板,但它不会那么快消失。一些重要的设置仅在Windows 10的经典控制面板中找得到,它们不在设置应用程序中。本文有13种方法可以打开控制面板。 搜索开始菜单 你可以使用“开始”菜单的搜索功能搜索PC上的任何应用程序。在任务栏左侧的搜索…

设计模式|工厂模式

文章目录 1. 工厂模式的三种实现2. 简单工厂模式和工厂方法模式示例3. 抽象工厂模式示例4. 工厂模式与多态的关系5. 工程模式与策略模式的关系6. 面试中可能遇到的问题6.1 **工厂模式的概念是什么&#xff1f;**6.2 **工厂模式解决了什么问题&#xff1f;**6.3 **工厂模式的优点…

Redis如何设置键的生存时间或过期时间

键的生存时间或过期时间 概述。 通过EXPIRE命令或者PEXIPIRE命令&#xff0c;客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL)&#xff0c;在经过指定的秒数或者毫秒数之后&#xff0c;服务器就会自动删除生存时间为0的键: 127.0.0.1:6379>…

策略模式实战

项目推荐最近开发完成的项目中使用到了策略模式&#xff0c;实现多种支付方式&#xff0c;避免了后期支付方式if-else代码的冗余&#xff0c;也有利于后期支付的一个扩展。同时这个项目非常适合于做毕设&#xff0c;想了解这个项目的同学可以联系我QQ&#xff1a;3808898981 前…

Python学习:注释和运算符

python 注释 在Python中&#xff0c;注释用于在代码中添加解释、说明或者提醒&#xff0c;但并不会被解释器执行。Python中的注释以#开头&#xff0c;直到行末为止。下面是关于Python注释的详细解释和举例&#xff1a; 单行注释&#xff1a;使用#符号在行的开头添加注释&…

ARM汇编程序设计 注释 “每日读书“

熟悉了ARM体系结构和常用的汇编指令&#xff0c;我们就可以尝试编写简单的ARM汇编程序了。在一段完整的汇编程序中&#xff0c;不仅包含了各种汇编指令和伪指令&#xff0c;还包含了各种伪指令。伪操作可以让程序员更加方便的编写汇编程序&#xff0c;实现更加复杂的逻辑功能。…