C# Onnx 百度PaddleSeg发布的实时人像抠图PP-MattingV2
目录
效果
模型信息
项目
代码
下载
效果


图片源自网络侵删
模型信息
Inputs
-------------------------
name:img
tensor:Float[1, 3, 480, 640]
---------------------------------------------------------------
Outputs
-------------------------
name:sigmoid_5.tmp_0
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;
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;
float conf_threshold = 0.65f;
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_ontainer;
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 = null;
pictureBox2.Image = null;
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_ontainer = new List<NamedOnnxValue>();
// 创建输出会话
options = new SessionOptions();
options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;
options.AppendExecutionProvider_CPU(0);// 设置为CPU上运行
// 创建推理模型类,读取本地模型文件
model_path = "model/ppmattingv2_stdc1_human_480x640.onnx";
inpHeight = 480;
inpWidth = 640;
outHeight = 480;
outWidth = 640;
onnx_session = new InferenceSession(model_path, options);
// 创建输入容器
input_ontainer = new List<NamedOnnxValue>();
image_path = "test_img/1.jpg";
pictureBox1.Image = new Bitmap(image_path);
}
private unsafe void button2_Click(object sender, EventArgs e)
{
if (image_path == "")
{
return;
}
textBox1.Text = "检测中,请稍等……";
pictureBox2.Image = null;
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);
}
}
}
input_tensor = new DenseTensor<float>(input_tensor_data, new[] { 1, 3, inpHeight, inpWidth });
//将 input_tensor 放入一个输入参数的容器,并指定名称
input_ontainer.Add(NamedOnnxValue.CreateFromTensor("img", input_tensor));
dt1 = DateTime.Now;
//运行 Inference 并获取结果
result_infer = onnx_session.Run(input_ontainer);
dt2 = DateTime.Now;
//将输出结果转为DisposableNamedOnnxValue数组
results_onnxvalue = result_infer.ToArray();
float[] mask = results_onnxvalue[0].AsTensor<float>().ToArray();
Mat mask_out = new Mat(outHeight, outWidth, MatType.CV_32FC1, mask);
mask_out *= 255;
mask_out.ConvertTo(mask_out, MatType.CV_8UC1);
Cv2.Resize(mask_out, mask_out, new OpenCvSharp.Size(image.Cols, image.Rows));
Mat result_image = mask_out.Clone();
if (pictureBox2.Image != null)
{
pictureBox2.Image.Dispose();
}
pictureBox2.Image = new System.Drawing.Bitmap(result_image.ToMemoryStream());
textBox1.Text = "推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms";
mask_out.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);
}
}
}
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;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;float conf_threshold = 0.65f;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_ontainer;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 = null;pictureBox2.Image = null;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_ontainer = new List<NamedOnnxValue>();// 创建输出会话options = new SessionOptions();options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;options.AppendExecutionProvider_CPU(0);// 设置为CPU上运行// 创建推理模型类,读取本地模型文件model_path = "model/ppmattingv2_stdc1_human_480x640.onnx";inpHeight = 480;inpWidth = 640;outHeight = 480;outWidth = 640;onnx_session = new InferenceSession(model_path, options);// 创建输入容器input_ontainer = new List<NamedOnnxValue>();image_path = "test_img/1.jpg";pictureBox1.Image = new Bitmap(image_path);}private unsafe void button2_Click(object sender, EventArgs e){if (image_path == ""){return;}textBox1.Text = "检测中,请稍等……";pictureBox2.Image = null;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);}}}input_tensor = new DenseTensor<float>(input_tensor_data, new[] { 1, 3, inpHeight, inpWidth });//将 input_tensor 放入一个输入参数的容器,并指定名称input_ontainer.Add(NamedOnnxValue.CreateFromTensor("img", input_tensor));dt1 = DateTime.Now;//运行 Inference 并获取结果result_infer = onnx_session.Run(input_ontainer);dt2 = DateTime.Now;//将输出结果转为DisposableNamedOnnxValue数组results_onnxvalue = result_infer.ToArray();float[] mask = results_onnxvalue[0].AsTensor<float>().ToArray();Mat mask_out = new Mat(outHeight, outWidth, MatType.CV_32FC1, mask);mask_out *= 255;mask_out.ConvertTo(mask_out, MatType.CV_8UC1);Cv2.Resize(mask_out, mask_out, new OpenCvSharp.Size(image.Cols, image.Rows));Mat result_image = mask_out.Clone();if (pictureBox2.Image != null){pictureBox2.Image.Dispose();}pictureBox2.Image = new System.Drawing.Bitmap(result_image.ToMemoryStream());textBox1.Text = "推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms";mask_out.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);}}
}
下载
源码下载
相关文章:
C# Onnx 百度PaddleSeg发布的实时人像抠图PP-MattingV2
目录 效果 模型信息 项目 代码 下载 效果 图片源自网络侵删 模型信息 Inputs ------------------------- name:img tensor:Float[1, 3, 480, 640] --------------------------------------------------------------- Outputs -----------------…...
linux shell操作 - 04 进程间通信
文章目录 Signal 信号信号定义信号的生命周期信号分类linux进程通信案例 Signal 信号 信号定义 Linux信号是进程间通信的一种方式,通过向目标进程发送一个特定的信号,让其执行相应的处理操作; 向目标进程发送信号时,内核会将信号…...
【Java并发】聊聊线程池原理以及实际应用
线程其实对于操作系统来说是宝贵的资源,java层面的线程其实本质还是依赖于操作系统内核的线程进行处理任务,如果频繁的创建、使用、销毁线程,那么势必会非常浪费资源以及性能不高,所以池化技术(数据库连接池、线程池&a…...
自然语言处理常用方法和评价指标
常用方法 文本分类:如情感分析、主题标签分类。使用方法如朴素贝叶斯、支持向量机、神经网络等。信息提取:从文本中提取结构化信息,如命名实体识别(NER)、关系提取。语义分析:理解文本的含义,包…...
FFmpeg常用命令行讲解及实战一
文章目录 前言一、学习资料参考二、FFmpeg 选项1、主要选项①、主要命令选项②、举例 2、视频选项①、主要命令选项②、举例1)提取固定帧2)禁止输出视频3)指定视频的纵横比 3、音频选项①、主要命令选项②、举例 4、字幕选项①、主要命令选项…...
Java的ArrayList中关于删除的常用操作及方法
目录 remove(int index)方法 remove(Object o)方法 removeAll(Collection c)方法 removeIf(Predicate filter)方法 removeRange(int fromIndex, int toIndex)方法 remove(int index)方法 remove(int index)是ArrayList类中用于删除指定位置元素的方法。它接收一个整…...
低成本打造便携式无线网络攻防学习环境
1.摘要 一直以来, 无线网络安全问题与大众的个人隐私息息相关, 例如: 为了节省流量, 连接到一个看似安全的免费WiFi, 在使用过程中泄露自己的各类密码信息甚至银行卡账号密码信息。随着家用智能电器的普及, 家中的各类智能设备连入家里的无线网络, 却突然失灵, 甚至无法正常连…...
Qt|QLabel显示刷新图像数据
参考:QImage、QClipboard(https://zhuanlan.zhihu.com/p/649611141) 获取图像数据并转换为QImage unsigned char *data 图像数据; QImage show_image_ QImage(data, imgInfo.width, imgInfo.height, imgInfo.width, QImage::Format_Grays…...
Java类加载那些事
Java源文件(.java文件)被编译器编译后变为字节码形式的类文件(.class文件),Java类加载的过程就是JVM加载.class的二进制文件并且放到内存中,将数据放到方法区,并且在堆区构造一个java.lang.clas…...
QSplitter分裂器
QSplitter QSplitter 是 Qt 框架提供的一个小部件(widget),用于在用户界面中创建可拖动的分割窗口,允许用户调整子部件的大小和布局。它可以将父部件分割为多个可调整大小的子部件,使用户能够自定义界面的布局和大小。…...
pgsql 时区查看和修改
建议使用UTC时区,或者和linux、后端程序的时区保持一致,否则容易出现时间的差别。 pgsql的时间字段有一个带时区的timestamp with time zone,如果业务涉及多个时区,建议使用这个字段。 相关链接参考: linux时区设置和…...
el-table 表格表头、单元格、滚动条样式修改
.2023.11.21今天我学习了如何对el-table表格样式进行修改,如图: 运用的两个样式主要是 1.header-cell-class-name(设置表头) 2.class-name(设置行单元格) 代码如下: <el-table :data&quo…...
dockerDesktop使用方法
安装软件 装在C盘会容易满,可以装在D盘, "path\to\Docker Desktop Installer.exe" install -accept-license --installation-dirD:\Docker\Docker --wsl-default-data-rootD:\Docker\data并且在软件的设置的Docker Engine里添加阿里镜像源…...
[Ubuntu]RT810xE--网线已拔出--问题解决
0 环境 ubuntu 22.04.3 LTSDell Inspiron 15 5547windows/ubuntu 双系统 1 问题说明 Dell 笔记本安装的 Ubutun 系统,有线网络无法使用,一直显示 “网线已拔出”。 网上一查,才了解到主要原因:网卡驱动安装错误。系统默认安装…...
美国DDoS服务器:如何保护你的网站免遭攻击?
在当今数字化时代,互联网已经成为人们生活中不可或缺的一部分。随着互联网的普及和发展,网络安全问题也日益严重。其中,DDoS攻击是目前最常见和具有破坏性的网络攻击之一。那么,如何保护你的网站免遭DDoS攻击呢?下面将介绍…...
R语言数据缩放-1到1
目录 普通scale -1到1限定范围scale 普通scale R语言实战:scale()函数 - 知乎 (zhihu.com) scale(x, center TRUE, scale TRUE) 过程: 对每个变量(列)计算平均值(mean)和标准…...
C语言第二十五弹--打印菱形
C语言打印菱形 思路:想要打印一个菱形,可以分为上下两部分,通过观察可以发现上半部分星号的规律是 1 3 5 7故理解为 2对应行数 1 ,空格是4 3 2 1故理解为 行数-对应行数-1。 上半部分代码如下 for (int i 0;i < line;i){//上…...
PyTorch微调终极指南1:预训练模型调整
如今,在训练深度学习模型时,通过根据自己的数据微调预训练模型来进行迁移学习(transfer learning)已成为首选方法。 通过微调这些模型,我们可以利用他们的专业知识并使它们适应我们的特定任务,从而节省宝贵…...
Uptime Kuma 企业微信群机器人告警
curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa \-H Content-Type: application/json \-d {"msgtype": "text","text": {"content": "hello world"}}企业微信群机器人ke…...
【网络安全】-网络安全的分类详解
文章目录 介绍1. 网络层安全(Network Layer Security)理论实操使用VPN保护隐私 2. 应用层安全(Application Layer Security)理论实操使用密码管理器 3. 端点安全(Endpoint Security)理论实操定期更新防病毒…...
把数组排成最小的数-C++
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/troubleshooter // 面试题45:把数组排成最小的数 // 题目:输入一…...
Nemotron-CC-Math数据集:提升LLM数学推理能力的关键
1. 项目背景与核心价值NVIDIA最新发布的Nemotron-CC-Math数据集正在改变大语言模型(LLM)数学能力训练的格局。这个专门针对数学领域优化的预训练语料库,解决了当前通用语料库在数学推理任务上的三大痛点:数据质量参差不齐、专业符…...
IgH EtherCAT 从入门到精通:第 25 章 添加新的邮箱协议
第 25 章 添加新的邮箱协议 导读摘要:当你需要支持一个新的 EtherCAT 邮箱协议时,IgH Master 提供了清晰的扩展框架。本章将以添加一个假想协议为例,讲解 FSM 实现、ioctl 接口扩展、命令行工具扩展和编译系统集成的完整流程。 25.1 邮箱协议扩展框架 回顾第 21 章的邮箱架…...
NVIDIA Profile Inspector完整指南:解锁隐藏显卡设置,彻底解决游戏性能问题
NVIDIA Profile Inspector完整指南:解锁隐藏显卡设置,彻底解决游戏性能问题 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否曾经在游戏中遇到画面撕裂、输入延迟过高或者帧…...
测绘工程就业有哪些坑?如何避开?
测绘工程专业,目前招聘市场上的岗位,目前主要分为测绘内业和外业。1、测绘外业外业需要外出,条件艰苦,如果在城郊还好一点,大部分时间是要去穷乡僻壤、高山、沼泽、沙漠、铁路、工地等......很多学测绘专业的同学不想干…...
2026年小程序商城需要多少成本呢?
2026年小程序商城需要多少钱?小程序商城的费用从最低698元到最高50万元,差异主要来自搭建方式。SaaS平台年费约698-5998元,模板搭建约800-3000元,定制开发约3-50万元。此外还有企业认证费300元/年、域名费约50-100元/年等固定支出。对于没有…...
基于在线优化的MPC快速模型预测控制研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Git代码分支管理模型TBD++ Flow
现代软件开发过程中要实现高效的团队协作,需要使用代码分支管理工具实现代码的共享、追溯、回滚及维护等功能。目前流行的代码管理工具,包括CVS,SVN,Git,Mercurial等。相比CVS和SVN的集中管理,Git具有非常明显的优势,例如:去中心化的代码管理方式减少了开发者对中心服务…...
NVIDIA AI Workbench:企业级AI开发与部署新范式
1. NVIDIA AI Workbench 深度解析:企业级AI工作流新范式NVIDIA AI Workbench的beta版本发布标志着企业AI开发流程的一次重大革新。作为一名长期从事AI落地的技术架构师,我亲身体验了这套工具如何从根本上改变我们构建和部署AI项目的方式。不同于传统的碎…...
3步轻松解密网易云音乐NCM文件:解锁你的音乐自由之旅
3步轻松解密网易云音乐NCM文件:解锁你的音乐自由之旅 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经下载了心爱的网易云音乐歌曲,却发现在其他播放器上无法播放?这并非你的设备问题&am…...
