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


    目录

    介绍

    效果

    CPU

    GPU

    模型信息

    项目

    代码

    下载 


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

    介绍

    模型出处github地址:GitHub - SmilingWolf/SW-CV-ModelZoo: Repo for my Tensorflow/Keras CV experiments. Mostly revolving around the Danbooru20xx dataset

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

    效果

    CPU

    GPU

     

    模型信息

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

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

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

    项目

    代码

    1. using Microsoft.ML.OnnxRuntime;
    2. using Microsoft.ML.OnnxRuntime.Tensors;
    3. using OpenCvSharp;
    4. using System;
    5. using System.Collections.Generic;
    6. using System.Drawing;
    7. using System.IO;
    8. using System.Linq;
    9. using System.Text;
    10. using System.Windows.Forms;
    11. namespace Onnx_Demo
    12. {
    13. public partial class Form1 : Form
    14. {
    15. public Form1()
    16. {
    17. InitializeComponent();
    18. }
    19. string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
    20. string image_path = "";
    21. DateTime dt1 = DateTime.Now;
    22. DateTime dt2 = DateTime.Now;
    23. string model_path;
    24. Mat image;
    25. SessionOptions options;
    26. InferenceSession onnx_session;
    27. Tensor<float> input_tensor;
    28. List<NamedOnnxValue> input_container;
    29. IDisposableReadOnlyCollection<DisposableNamedOnnxValue> result_infer;
    30. DisposableNamedOnnxValue[] results_onnxvalue;
    31. Tensor<float> result_tensors;
    32. StringBuilder sb = new StringBuilder();
    33. public string[] class_names;
    34. private void button1_Click(object sender, EventArgs e)
    35. {
    36. OpenFileDialog ofd = new OpenFileDialog();
    37. ofd.Filter = fileFilter;
    38. if (ofd.ShowDialog() != DialogResult.OK) return;
    39. pictureBox1.Image = null;
    40. image_path = ofd.FileName;
    41. pictureBox1.Image = new Bitmap(image_path);
    42. textBox1.Text = "";
    43. image = new Mat(image_path);
    44. }
    45. private void button2_Click(object sender, EventArgs e)
    46. {
    47. if (image_path == "")
    48. {
    49. return;
    50. }
    51. button2.Enabled = false;
    52. textBox1.Text = "";
    53. sb.Clear();
    54. Application.DoEvents();
    55. //图片缩放
    56. image = new Mat(image_path);
    57. int max_image_length = image.Cols > image.Rows ? image.Cols : image.Rows;
    58. Mat max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);
    59. Rect roi = new Rect(0, 0, image.Cols, image.Rows);
    60. image.CopyTo(new Mat(max_image, roi));
    61. float[] result_array;
    62. // 将图片转为RGB通道
    63. Mat image_rgb = new Mat();
    64. Cv2.CvtColor(max_image, image_rgb, ColorConversionCodes.BGR2RGB);
    65. Mat resize_image = new Mat();
    66. Cv2.Resize(max_image, resize_image, new OpenCvSharp.Size(448, 448));
    67. // 输入Tensor
    68. for (int y = 0; y < resize_image.Height; y++)
    69. {
    70. for (int x = 0; x < resize_image.Width; x++)
    71. {
    72. input_tensor[0, y, x, 0] = resize_image.At<Vec3b>(y, x)[0];
    73. input_tensor[0, y, x, 1] = resize_image.At<Vec3b>(y, x)[1];
    74. input_tensor[0, y, x, 2] = resize_image.At<Vec3b>(y, x)[2];
    75. }
    76. }
    77. //input_tensor 放入一个输入参数的容器,并指定名称
    78. input_container.Add(NamedOnnxValue.CreateFromTensor("input_1:0", input_tensor));
    79. dt1 = DateTime.Now;
    80. //运行 Inference 并获取结果
    81. result_infer = onnx_session.Run(input_container);
    82. dt2 = DateTime.Now;
    83. // 将输出结果转为DisposableNamedOnnxValue数组
    84. results_onnxvalue = result_infer.ToArray();
    85. // 读取第一个节点输出并转为Tensor数据
    86. result_tensors = results_onnxvalue[0].AsTensor<float>();
    87. result_array = result_tensors.ToArray();
    88. List<ScoreIndex> ltResult = new List<ScoreIndex>();
    89. ScoreIndex temp;
    90. for (int i = 0; i < result_array.Length; i++)
    91. {
    92. temp = new ScoreIndex(i, result_array[i]);
    93. ltResult.Add(temp);
    94. }
    95. //根据分数倒序排序,取前14
    96. var SortedByScore = ltResult.OrderByDescending(p => p.Score).ToList().Take(14);
    97. foreach (var item in SortedByScore)
    98. {
    99. sb.Append(class_names[item.Index] + ",");
    100. }
    101. sb.Length--; // 将长度减1来移除最后一个字符
    102. sb.AppendLine("");
    103. sb.AppendLine("------------------");
    104. // 只取分数最高的
    105. // float max = result_array.Max();
    106. // int maxIndex = Array.IndexOf(result_array, max);
    107. // sb.AppendLine(class_names[maxIndex]+" "+ max.ToString("P2"));
    108. sb.AppendLine("推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms");
    109. textBox1.Text = sb.ToString();
    110. button2.Enabled = true;
    111. }
    112. private void Form1_Load(object sender, EventArgs e)
    113. {
    114. model_path = "model/model.onnx";
    115. // 创建输出会话,用于输出模型读取信息
    116. options = new SessionOptions();
    117. options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;
    118. options.AppendExecutionProvider_CPU(0);// 设置为CPU上运行
    119. // 创建推理模型类,读取本地模型文件
    120. onnx_session = new InferenceSession(model_path, options);//model_path 为onnx模型文件的路径
    121. // 输入Tensor
    122. input_tensor = new DenseTensor<float>(new[] { 1, 448, 448, 3 });
    123. // 创建输入容器
    124. input_container = new List<NamedOnnxValue>();
    125. image_path = "test_img/test.jpg";
    126. pictureBox1.Image = new Bitmap(image_path);
    127. image = new Mat(image_path);
    128. List<string> str = new List<string>();
    129. StreamReader sr = new StreamReader("model/lable.txt");
    130. string line;
    131. while ((line = sr.ReadLine()) != null)
    132. {
    133. str.Add(line);
    134. }
    135. class_names = str.ToArray();
    136. }
    137. }
    138. }

    下载 

    源码下载

  • 相关阅读:
    三季报开启消费电子增长新纪元?看蓝思科技如何落子
    虚拟机的网络模式
    python基础学习笔记1
    Docker-mysql,redis安装
    React之useState hook
    python从入门到精通1:注释
    C语言三子棋,五子棋,n子棋的代码实现
    SOLIDWORKS焊件使用教程
    【可视化大屏设计学习1】正式开始建设可视化平台了,学习路径写下来!大家一起沟通呀!~
    Java8中实现函数式接口的Lambda表达式与方法引用详解
  • 原文地址:https://blog.csdn.net/weixin_46771779/article/details/136547367