C# SwinV2 Stable Diffusion 提示词反推 Onnx Demo

目录

介绍

效果

模型信息

项目

代码

下载 


C# SwinV2 Stable Diffusion 提示词反推 Onnx Demo

介绍

模型出处github地址:https://github.com/SmilingWolf/SW-CV-ModelZoo

模型下载地址:https://huggingface.co/SmilingWolf/wd-v1-4-swinv2-tagger-v2

效果

模型信息

Model Properties
-------------------------
---------------------------------------------------------------

Inputs
-------------------------
name:input_1:0
tensor:Float[1, 448, 448, 3]
---------------------------------------------------------------

Outputs
-------------------------
name:predictions_sigmoid
tensor:Float[1, 9083]
---------------------------------------------------------------

项目

代码

using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string image_path = "";
        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;
        string model_path;
        Mat image;

        SessionOptions options;
        InferenceSession onnx_session;
        Tensor<float> input_tensor;
        List<NamedOnnxValue> input_container;
        IDisposableReadOnlyCollection<DisposableNamedOnnxValue> result_infer;
        DisposableNamedOnnxValue[] results_onnxvalue;

        Tensor<float> result_tensors;

        StringBuilder sb = new StringBuilder();

        public string[] class_names;

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
            pictureBox1.Image = null;
            image_path = ofd.FileName;
            pictureBox1.Image = new Bitmap(image_path);
            textBox1.Text = "";
            image = new Mat(image_path);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (image_path == "")
            {
                return;
            }

            button2.Enabled = false;
            textBox1.Text = "";
            sb.Clear();
            Application.DoEvents();

            //图片缩放
            image = new Mat(image_path);
            int max_image_length = image.Cols > image.Rows ? image.Cols : image.Rows;
            Mat max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);
            Rect roi = new Rect(0, 0, image.Cols, image.Rows);
            image.CopyTo(new Mat(max_image, roi));

            float[] result_array;

            // 将图片转为RGB通道
            Mat image_rgb = new Mat();
            Cv2.CvtColor(max_image, image_rgb, ColorConversionCodes.BGR2RGB);
            Mat resize_image = new Mat();
            Cv2.Resize(max_image, resize_image, new OpenCvSharp.Size(448, 448));

            // 输入Tensor
            for (int y = 0; y < resize_image.Height; y++)
            {
                for (int x = 0; x < resize_image.Width; x++)
                {
                    input_tensor[0, y, x, 0] = resize_image.At<Vec3b>(y, x)[0];
                    input_tensor[0, y, x, 1] = resize_image.At<Vec3b>(y, x)[1];
                    input_tensor[0, y, x, 2] = resize_image.At<Vec3b>(y, x)[2];
                }
            }

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

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

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

            // 读取第一个节点输出并转为Tensor数据
            result_tensors = results_onnxvalue[0].AsTensor<float>();

            result_array = result_tensors.ToArray();

            List<ScoreIndex> ltResult = new List<ScoreIndex>();
            ScoreIndex temp;
            for (int i = 0; i < result_array.Length; i++)
            {
                temp = new ScoreIndex(i, result_array[i]);
                ltResult.Add(temp);
            }

            //根据分数倒序排序,取前14个
            var SortedByScore = ltResult.OrderByDescending(p => p.Score).ToList().Take(14);

            foreach (var item in SortedByScore)
            {
                sb.Append(class_names[item.Index] + ",");
            }
            sb.Length--; // 将长度减1来移除最后一个字符

            sb.AppendLine("");
            sb.AppendLine("------------------");
            
            // 只取分数最高的
            // float max = result_array.Max();
            // int maxIndex = Array.IndexOf(result_array, max);
            // sb.AppendLine(class_names[maxIndex]+" "+ max.ToString("P2"));
           
            sb.AppendLine("推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms");
            textBox1.Text = sb.ToString();
            button2.Enabled = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            model_path = "model/model.onnx";

            // 创建输出会话,用于输出模型读取信息
            options = new SessionOptions();
            options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;
            options.AppendExecutionProvider_CPU(0);// 设置为CPU上运行

            // 创建推理模型类,读取本地模型文件
            onnx_session = new InferenceSession(model_path, options);//model_path 为onnx模型文件的路径

            // 输入Tensor
            input_tensor = new DenseTensor<float>(new[] { 1, 448, 448, 3 });
            // 创建输入容器
            input_container = new List<NamedOnnxValue>();

            image_path = "test_img/test.jpg";
            pictureBox1.Image = new Bitmap(image_path);
            image = new Mat(image_path);

            List<string> str = new List<string>();
            StreamReader sr = new StreamReader("model/lable.txt");
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                str.Add(line);
            }
            class_names = str.ToArray();
        }

    }
}

using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace Onnx_Demo
{public partial class Form1 : Form{public Form1(){InitializeComponent();}string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";string image_path = "";DateTime dt1 = DateTime.Now;DateTime dt2 = DateTime.Now;string model_path;Mat image;SessionOptions options;InferenceSession onnx_session;Tensor<float> input_tensor;List<NamedOnnxValue> input_container;IDisposableReadOnlyCollection<DisposableNamedOnnxValue> result_infer;DisposableNamedOnnxValue[] results_onnxvalue;Tensor<float> result_tensors;StringBuilder sb = new StringBuilder();public string[] class_names;private void button1_Click(object sender, EventArgs e){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = fileFilter;if (ofd.ShowDialog() != DialogResult.OK) return;pictureBox1.Image = null;image_path = ofd.FileName;pictureBox1.Image = new Bitmap(image_path);textBox1.Text = "";image = new Mat(image_path);}private void button2_Click(object sender, EventArgs e){if (image_path == ""){return;}button2.Enabled = false;textBox1.Text = "";sb.Clear();Application.DoEvents();//图片缩放image = new Mat(image_path);int max_image_length = image.Cols > image.Rows ? image.Cols : image.Rows;Mat max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);Rect roi = new Rect(0, 0, image.Cols, image.Rows);image.CopyTo(new Mat(max_image, roi));float[] result_array;// 将图片转为RGB通道Mat image_rgb = new Mat();Cv2.CvtColor(max_image, image_rgb, ColorConversionCodes.BGR2RGB);Mat resize_image = new Mat();Cv2.Resize(max_image, resize_image, new OpenCvSharp.Size(448, 448));// 输入Tensorfor (int y = 0; y < resize_image.Height; y++){for (int x = 0; x < resize_image.Width; x++){input_tensor[0, y, x, 0] = resize_image.At<Vec3b>(y, x)[0];input_tensor[0, y, x, 1] = resize_image.At<Vec3b>(y, x)[1];input_tensor[0, y, x, 2] = resize_image.At<Vec3b>(y, x)[2];}}//将 input_tensor 放入一个输入参数的容器,并指定名称input_container.Add(NamedOnnxValue.CreateFromTensor("input_1:0", input_tensor));dt1 = DateTime.Now;//运行 Inference 并获取结果result_infer = onnx_session.Run(input_container);dt2 = DateTime.Now;// 将输出结果转为DisposableNamedOnnxValue数组results_onnxvalue = result_infer.ToArray();// 读取第一个节点输出并转为Tensor数据result_tensors = results_onnxvalue[0].AsTensor<float>();result_array = result_tensors.ToArray();List<ScoreIndex> ltResult = new List<ScoreIndex>();ScoreIndex temp;for (int i = 0; i < result_array.Length; i++){temp = new ScoreIndex(i, result_array[i]);ltResult.Add(temp);}//根据分数倒序排序,取前14个var SortedByScore = ltResult.OrderByDescending(p => p.Score).ToList().Take(14);foreach (var item in SortedByScore){sb.Append(class_names[item.Index] + ",");}sb.Length--; // 将长度减1来移除最后一个字符sb.AppendLine("");sb.AppendLine("------------------");// 只取分数最高的// float max = result_array.Max();// int maxIndex = Array.IndexOf(result_array, max);// sb.AppendLine(class_names[maxIndex]+" "+ max.ToString("P2"));sb.AppendLine("推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms");textBox1.Text = sb.ToString();button2.Enabled = true;}private void Form1_Load(object sender, EventArgs e){model_path = "model/model.onnx";// 创建输出会话,用于输出模型读取信息options = new SessionOptions();options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;options.AppendExecutionProvider_CPU(0);// 设置为CPU上运行// 创建推理模型类,读取本地模型文件onnx_session = new InferenceSession(model_path, options);//model_path 为onnx模型文件的路径// 输入Tensorinput_tensor = new DenseTensor<float>(new[] { 1, 448, 448, 3 });// 创建输入容器input_container = new List<NamedOnnxValue>();image_path = "test_img/test.jpg";pictureBox1.Image = new Bitmap(image_path);image = new Mat(image_path);List<string> str = new List<string>();StreamReader sr = new StreamReader("model/lable.txt");string line;while ((line = sr.ReadLine()) != null){str.Add(line);}class_names = str.ToArray();}}
}

下载 

源码下载

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

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

相关文章

python-数组元素积的符号-LEETCODE

方法一&#xff1a;笨蛋方法&#xff0c;直接相乘 def arraySign(nums): sum1 for i in range(len(nums)): sumnums[i]*sum if sum>0: return 1 if sum<0: return -1 if sum0: return 0 方法二&#xff1a;判断是…

FPGA- RGB_TFT显示屏原理及驱动逻辑

下图是TFT显示屏的显示效果 该显示屏共分为 2 个版本&#xff0c;4.3 寸版本的 TFT4.3’’_V3.0 和 5.0 寸版本的 TFT5.0’’_V3.0。 两者 PCB 背板电路完全相同&#xff0c;接口脚位定义完全相同&#xff0c;接口时序完全相同&#xff0c;仅使用的显示屏 模组尺寸不同。设计两…

⭐每天一道leetcode:28.找出字符串中第一个匹配项的下标(简单;暴力解;KMP算法,有难度)

⭐今日份题目 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例1 输入&#xff1a;haystack &q…

Java多线程——信号量Semaphore是啥

目录 引出信号量Semaphore &#xff1f;Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——信号量Semaphore是啥 信号量Semaphore &#xff1f; Semaphore 通常我们叫它信号量&#xff0c; 可以用来控制同时访问特…

代码随想录算法训练营第三十二天|LeetCode122 买卖股票的最佳时机II 、LeetCode55 跳跃游戏、LeetCode45 跳跃游戏II

122.买卖股票的最佳时机II 思路&#xff1a;计算每天股票的盈利&#xff08;后一天于前一天的差值&#xff09;&#xff0c;将所有盈利的和加在一起&#xff0c;就是最大值。 class Solution { public:int maxProfit(vector<int>& prices) {int win 0;int diff 0…

喜讯!南大通用顺利通过全球软件领域最高级别认证

近日&#xff0c;在擎标顾问团的咨询辅导下&#xff0c;天津南大通用数据技术股份有限公司&#xff08;以下简称&#xff1a;南大通用&#xff09;顺利通过了全球软件领域最高级别CMMI-DEV V2.0成熟度5级评估认证&#xff0c;并荣获证书&#xff0c;标志着GBASE南大通用在软件技…

【Linux】文件传输工具lrzsz的安装与使用

目录 一、关于lrzsz 二、安装lrzsz 三、lrzsz的说明及使用 1、上传命令rz 2、下载命令sz 一、关于lrzsz 在开发的过程中&#xff0c;经常遇到 需要在 Linux 和 Windows 之间上传下载文件的情况 这时&#xff0c;一般都是使用 FTP 或者 WinSCP 工具进行上传下载, 虽然也能…

C++基础入门 --- 【学习指南】

文章目录 C基础入门1.初识C1.1 第一个C程序1.2 注释1.3 变量1.4 常量1.5 关键字1.6 标识符命名规则 2.数据类型2.1 整型2.2 sizeof关键字2.3 浮点型(实型)2.4 字符型2.5 转义字符2.6 字符串型2.7 布尔类型 bool2.8 数据的输入 3.运算符3.1 算术运算符3.2 赋值运算符3.3 比较运算…

QT:颜色选择器

普通 Qt提供了一个现成的QColorDialog类。 用法: #include <QColorDialog>QColor color QColorDialog::getColor(Qt::white, this); if(!color.isValid()){//点击 关闭 或 cancel 颜色无效 }else {ui->text->setText(color.name());//类似##ffffQRgb rgb colo…

“人工智能+”写入政府工作报告,哪吒汽车与主旋律同频共振

撰稿|行星 来源|贝多财经 在3月5日召开的第十四届全国人大二次会议上&#xff0c;“人工智能”被首次写入政府工作报告&#xff0c;明确深入推进数字经济创新发展&#xff0c;打造具有国际竞争力的数字产业集群的发展前景。 与此同时&#xff0c;以智能网联新能源汽车为代表…

Jmeter 对http接口压测

Jmeter相对于Loadrunner来说&#xff0c;更轻&#xff0c;易于安装&#xff0c;如果对过程数据收集不多、测试场景不复杂的情况下&#xff0c;可以优先考虑。 Jemeter进行HTTP接口压力测试的具体使用步骤&#xff1a; 1、首先添加一线程组&#xff08;即用户组&#xff1a;一…

HarmonyOS学习——HarmonyOS习题

harmonyOS开发学习课程 HarmonyOS第一课 1.【习题】运行Hello World工程 判断题 1. DevEco Studio是开发HarmonyOS应用的一站式集成开发环境。&#xff08;√&#xff09; 2. main_pages.json存放页面page路径配置信息。&#xff08;√&#xff09; 单选题 1. 在stage模…

慢SQL调优-索引详解

Mysql 慢SQL调优-索引详解 前言一、慢查询日志设置二、explain查看执行计划三、索引失效四、索引操作五、profile 分析执行耗时 前言 最新的 Java 面试题&#xff0c;技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linu…

腾讯云4核16G12M服务器优惠价格32元1个月、96元3个月、156元6个月、312元一年

腾讯云4核16G12M服务器优惠价格32元1个月、96元3个月、156元6个月、312元一年 一张表看懂腾讯云服务器租用优惠价格表&#xff0c;一目了然&#xff0c;腾讯云服务器分为轻量应用服务器和云服务器CVM&#xff0c;CPU内存配置从2核2G、2核4G、4核8G、8核16G、4核16G、8核32G、1…

MySQL 篇-深入了解多表设计、多表查询

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 多表设计概述 1.1 多表设计 - 一对多 1.2 多表设计 - 一对一 1.3 多表设计 - 多对多 2.0 多表查询概述 2.1 多表查询 - 内连接 2.2 多表查询 - 外连接 2.3 多表查…

Go 简单设计和实现可扩展、高性能的泛型本地缓存

相信大家对于缓存这个词都不陌生&#xff0c;但凡追求高性能的业务场景&#xff0c;一般都会使用缓存&#xff0c;它可以提高数据的检索速度&#xff0c;减少数据库的压力。缓存大体分为两类&#xff1a;本地缓存和分布式缓存&#xff08;如 Redis&#xff09;。本地缓存适用于…

【小智好书分享• 第二期】《低代码平台开发实践:基于React》

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…

磁性机器人在医学领域取得进展

磁性医疗机器人利用磁场梯度来控制设备的运动&#xff0c;并最终以高精度进入体内的目标组织。这些磁性机器人可以采用导管和微型或纳米机器人的形式&#xff0c;并由磁导航系统操纵。磁性机器人最近取得了一些进展&#xff0c;为临床诊断和治疗用途开辟了新的可能性。在本期的…

自然语言处理实战项目27-深入探究ALBERT模型:结构与原理及其在中文命名实体识别中的应用

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目27-深入探究ALBERT模型:结构与原理及其在中文命名实体识别中的应用。本文我将深入探究ALBERT模型的结构与原理,并详细介绍了其在中文命名实体识别中的应用。ALBERT模型作为一种轻量级预训练语言模型,采用了Trans…

一个测试OOM killer的程序未触发OOM所带来的问题

概述 我们知道&#xff0c;由于MMU实现了虚拟地址到物理地址的转换&#xff0c;所以我们在申请虚拟地址时往往可以申请一大块内存&#xff0c;这实际上是对资源的有效利用&#xff0c;毕竟只有内存真正被投入使用时&#xff08;如memset&#xff09;才会实际分配物理内存&…