百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

C# OnnxRuntime DIS高精度图像二类分割

haoteby 2025-01-10 13:47 11 浏览

说明

This is the repo for our new project Highly Accurate Dichotomous Image Segmentation

github地址:

https://github.com/xuebinqin/DIS

效果

模型信息

Inputs
-------------------------
name:input
tensor:Float[1, 3, 480, 640]
---------------------------------------------------------------

Outputs
-------------------------
name:output
tensor:Float[1, 1, 480, 640]
---------------------------------------------------------------

项目

VS2022

.net framework 4.8

OpenCvSharp 4.8

Microsoft.ML.OnnxRuntime 1.16.2

代码

using Microsoft.ML.OnnxRuntime.Tensors;
using Microsoft.ML.OnnxRuntime;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Linq;
using System.Drawing;
using static System.Net.Mime.MediaTypeNames;

namespace Onnx_Demo
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}

string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
string image_path = "";

DateTime dt1 = DateTime.Now;
DateTime dt2 = DateTime.Now;

int inpWidth;
int inpHeight;

int outHeight, outWidth;

Mat image;

string model_path = "";

SessionOptions options;
InferenceSession onnx_session;
Tensor<float> input_tensor;
Tensor<float> mask_tensor;
List<NamedOnnxValue> input_container;

IDisposableReadOnlyCollection<DisposableNamedOnnxValue> result_infer;
DisposableNamedOnnxValue[] results_onnxvalue;

private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = fileFilter;
if (ofd.ShowDialog() != DialogResult.OK) return;

pictureBox1.Image = ;
pictureBox2.Image = ;
textBox1.Text = "";

image_path = ofd.FileName;
pictureBox1.Image = new System.Drawing.Bitmap(image_path);
image = new Mat(image_path);
}

private void Form1_Load(object sender, EventArgs e)
{
// 创建输入容器
input_container = new List<NamedOnnxValue>();

// 创建输出会话
options = new SessionOptions();
options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;
options.AppendExecutionProvider_CPU(0);// 设置为CPU上运行

// 创建推理模型类,读取本地模型文件
model_path = "model/isnet_general_use_480x640.onnx";

inpHeight = 480;
inpWidth = 640;

outHeight = 480;
outWidth = 640;

onnx_session = new InferenceSession(model_path, options);

// 创建输入容器
input_container = new List<NamedOnnxValue>();

image_path = "test_img/bike.jpg";
pictureBox1.Image = new Bitmap(image_path);

}

private unsafe void button2_Click(object sender, EventArgs e)
{
if (image_path == "")
{
return;
}
textBox1.Text = "检测中,请稍等……";
pictureBox2.Image = ;
System.Windows.Forms.Application.DoEvents();

image = new Mat(image_path);

Mat resize_image = new Mat();
Cv2.Resize(image, resize_image, new OpenCvSharp.Size(inpWidth, inpHeight));

float[] input_tensor_data = new float[1 * 3 * inpWidth * inpHeight];

for (int c = 0; c < 3; c++)
{
for (int i = 0; i < inpHeight; i++)
{
for (int j = 0; j < inpWidth; j++)
{
float pix = ((byte*)(resize_image.Ptr(i).ToPointer()))[j * 3 + 2 - c];
input_tensor_data[c * inpHeight * inpWidth + i * inpWidth + j] = (float)(pix / 255.0 - 0.5);
}
}
}

input_tensor = new DenseTensor<float>(input_tensor_data, new[] { 1, 3, inpHeight, inpWidth });

//将 input_tensor 放入一个输入参数的容器,并指定名称
input_container.Add(NamedOnnxValue.CreateFromTensor("input", input_tensor));

dt1 = DateTime.Now;
//运行 Inference 并获取结果
result_infer = onnx_session.Run(input_container);
dt2 = DateTime.Now;

//将输出结果转为DisposableNamedOnnxValue数组
results_onnxvalue = result_infer.ToArray();

float[] pred = results_onnxvalue[0].AsTensor<float>().ToArray();

Mat mask = new Mat(outHeight, outWidth, MatType.CV_32FC1, pred);
double min_value, max_value;
Cv2.MinMaxLoc(mask, out min_value, out max_value);

mask = (mask - min_value) / (max_value - min_value);

mask *= 255;
mask.ConvertTo(mask, MatType.CV_8UC1);

Cv2.Resize(mask, mask, new OpenCvSharp.Size(image.Cols, image.Rows));

Mat result_image = mask.Clone();

if (pictureBox2.Image != )
{
pictureBox2.Image.Dispose();
}

pictureBox2.Image = new System.Drawing.Bitmap(result_image.ToMemoryStream());
textBox1.Text = "推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms";

mask.Dispose();
image.Dispose();
resize_image.Dispose();
result_image.Dispose();
}

private void pictureBox2_DoubleClick(object sender, EventArgs e)
{
Common.ShowNormalImg(pictureBox2.Image);
}

private void pictureBox1_DoubleClick(object sender, EventArgs e)
{
Common.ShowNormalImg(pictureBox1.Image);
}
}
}


相关推荐

能跑源码,还提供数据集:这里有一个入门企业级验证码识别项目

机器之心专栏作者:kerlomz网上关于验证码识别的开源项目众多,但大多是学术型文章或者仅仅是一个测试demo,那么企业级的验证码识别究竟是怎样的呢?1.前言网上关于验证么识别的开源项目众多,但大...

kdj源码_kdj源码公式描述

N:=9;M1:=3;M2:=3;...

QT实现抖动文字和滚动文字,附源码

前言不知道大家有没有发现今天的文章有什么不一样,哈哈,我自己胡拼乱凑弄了一个logo,好不好看就先不说了,最起码萌萌哒...当然这不是今天的重点,在做logo的时候,我原本想让文字动起来的,奈何技术有...

我试图通过这篇文章告诉你,这行源码有多牛逼。

你好呀,我是歪歪。这次给你盘一个特别有意思的源码,正如我标题说的那样:看懂这行源码之后,我不禁鼓起掌来,直呼祖师爷牛逼。...

想了解Python源代码加密吗?现总结如下5大加密混淆手段!

我们在进行...

Android系统基础(03) Android系统源码下载

常规官方网站说明:Android源码官方网站为(google你懂的):https://source.android.com官网参考链接,对应的tag(tag是一种标签,我们可以根据tag来判断下载的...

真香,Python爬取B站弹幕原来如此简单,源码已附在文末

B站的弹幕区一直是人才圣地。今天我就用python来手把手教大家爬取B站排行榜热门视频,Python爬取视频也可以如此简单。...

最详细的 maven 教程,可以收藏_maven步骤

链接|cnblogs.com/hzg110/p/6936101.html正文目前所有的项目都在使用maven,可是一直没有时间去整理学习,这两天正好有时间,好好的整理一下。...

Python黑科技-VIP视频破解源码分享

《利用Python制作自己的VIP视频解析软件》想看的电视剧更新了还要充VIP?喜欢的电影你是VIP还得付费?学了Python哪要这些花里胡哨的,打开我自己的VIP付费视频解析软件,想怎么看就怎么看!...

抖音无水印解析网站源码_抖音无水印解析平台

链接:https://share.weiyun.com/59Ah44S密码:hv4dm7上传到主机解压不用安装,直接打开域名就可以了原文地址:https://www.xigsc.com/post/...

「电脑知识」USBOS 3.0 v2022.1.24 超级PE启动维护工具标准增强版

前几天一直在发PE类工具就是为了制作U盘PE启动重装系统教程的,今天小编继续分享有一篇关于pe的之前小编发布过一款微PE工具箱,今天发布另外一个无任何流氓行为功能超级强大虽然体积大了一点,但是这个...

模版网站建设制作的八步流程_模板的网站

  模版网站比较简单,一般我们按照如下流程就可以制作出来。  一、网站定位:  在建站之前,一定要了解你要建的网站是什么。你必须考虑你网站的标题(关键词)、网站描述以及你想要建立的网站。  二、选择域...

求职季必备,这几个免费的个人简历模板网站,你可千万不要错过!

晃晃悠悠又到了春招的季节,相信一定有很多小伙伴趁着这个金三银四求职季,四处投递简历。这时候一个亮眼优秀的简历,可以很好的祝你吸引HR的注意。今天就把我珍藏很久的5个免费简历模板网站分享给大家,简历模板...

简约时尚作品博客商店网站HTML5模板源码

Meduza是简约时尚和现代的博客HTML模板,带商店电商元素的博客页面。考虑所有的作品集网站需求页可以设计一个旅游网站。原生响应设计HTML5和CSS3(台式机、平板电脑、手机…)简单,干净的和专业...

13 款免费样机网站合集,UI设计、产品设计、VI设计全都有!

俗话说得好,人靠衣装,在作完设计后不少设计师都会为自己的作品套一个「样机」好让设计看过去更加高端大气上档次!今天,我就总结了无论是UI设计、包装设计、服装设计、品牌设计、logo设计,都能用到...