C# danbooru Stable Diffusion 提示词反推 OpenVINO Demo

目录
说明
效果
模型信息
项目
代码
下载
说明
模型下载地址:https://huggingface.co/deepghs/ml-danbooru-onnx
效果

模型信息
OVVersion { BuildNumber = 2023.1.0-12185-9e6b00e51cd-releases/2023/1, Description = OpenVINO Runtime }
 ---------------------------------------------------------------
 本机可用设备
 CPU
 GNA
 GPU
 ---------------------------------------------------------------
 Inputs
 -------------------------
 name:input
 tensor:F32[?, 3, ?, ?]
 ---------------------------------------------------------------
 Outputs
 -------------------------
 name:output
 tensor:F32[?, 12547]
 ---------------------------------------------------------------
项目

代码
using OpenCvSharp;
 using Sdcb.OpenVINO;
 using System;
 using System.Collections.Generic;
 using System.Data;
 using System.Diagnostics;
 using System.Drawing;
 using System.IO;
 using System.Linq;
 using System.Text;
 using System.Windows.Forms;
namespace C__danbooru_Stable_Diffusion_提示词反推_OpenVINO__Demo
 {
     public partial class Form1 : Form
     {
         public Form1()
         {
             InitializeComponent();
         }
        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
         string image_path = "";
         string model_path;
         Mat image;
        StringBuilder sb = new StringBuilder();
         public string[] class_names;
        Model rawModel;
         PrePostProcessor pp;
         Model m;
         CompiledModel cm;
         InferRequest ir;
        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);
             image = new Mat(image_path);
             int w = image.Width;
             int h = image.Height;
            Stopwatch stopwatch = new Stopwatch();
             stopwatch.Start();
float[] input_tensor_data;
            image.ConvertTo(image, MatType.CV_32FC3, 1.0 / 255);
             input_tensor_data = Common.ExtractMat(image);
Tensor input_tensor = Tensor.FromArray(input_tensor_data, new Shape(1, 3, h, w));
ir.Inputs[0] = input_tensor;
            double preprocessTime = stopwatch.Elapsed.TotalMilliseconds;
             stopwatch.Restart();
ir.Run();
double inferTime = stopwatch.Elapsed.TotalMilliseconds;
stopwatch.Restart();
var result_array = ir.Outputs[0].GetData<float>().ToArray();
            double[] scores = new double[result_array.Length];
             for (int i = 0; i < result_array.Length; i++)
             {
                 double score = 1 / (1 + Math.Exp(result_array[i] * -1));
                 scores[i] = score;
             }
            List<ScoreIndex> ltResult = new List<ScoreIndex>();
             ScoreIndex temp;
             for (int i = 0; i < scores.Length; i++)
             {
                 temp = new ScoreIndex(i, scores[i]);
                 ltResult.Add(temp);
             }
            //根据分数倒序排序,取前10个
             var SortedByScore = ltResult.OrderByDescending(p => p.Score).ToList().Take(10);
            foreach (var item in SortedByScore)
             {
                 sb.Append(class_names[item.Index] + ",");
             }
             sb.Length--; // 将长度减1来移除最后一个字符
            sb.AppendLine("");
             sb.AppendLine("------------------");
             double postprocessTime = stopwatch.Elapsed.TotalMilliseconds;
             stopwatch.Stop();
double totalTime = preprocessTime + inferTime + postprocessTime;
            sb.AppendLine($"Preprocess: {preprocessTime:F2}ms");
             sb.AppendLine($"Infer: {inferTime:F2}ms");
             sb.AppendLine($"Postprocess: {postprocessTime:F2}ms");
             sb.AppendLine($"Total: {totalTime:F2}ms");
             textBox1.Text = sb.ToString();
             button2.Enabled = true;
         }
        private void Form1_Load(object sender, EventArgs e)
         {
             model_path = "model/ml_danbooru.onnx";
            image_path = "test_img/2.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();
             rawModel = OVCore.Shared.ReadModel(model_path);
             pp = rawModel.CreatePrePostProcessor();
            m = pp.BuildModel();
             cm = OVCore.Shared.CompileModel(m, "CPU");
             ir = cm.CreateInferRequest();
        }
     }
 }
using OpenCvSharp;
using Sdcb.OpenVINO;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace C__danbooru_Stable_Diffusion_提示词反推_OpenVINO__Demo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string image_path = "";
        string model_path;
        Mat image;
        StringBuilder sb = new StringBuilder();
        public string[] class_names;
        Model rawModel;
        PrePostProcessor pp;
        Model m;
        CompiledModel cm;
        InferRequest ir;
        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);
            image = new Mat(image_path);
            int w = image.Width;
            int h = image.Height;
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            float[] input_tensor_data;
            image.ConvertTo(image, MatType.CV_32FC3, 1.0 / 255);
            input_tensor_data = Common.ExtractMat(image);
            Tensor input_tensor = Tensor.FromArray(input_tensor_data, new Shape(1, 3, h, w));
            ir.Inputs[0] = input_tensor;
            double preprocessTime = stopwatch.Elapsed.TotalMilliseconds;
            stopwatch.Restart();
            ir.Run();
            double inferTime = stopwatch.Elapsed.TotalMilliseconds;
            stopwatch.Restart();
            var result_array = ir.Outputs[0].GetData<float>().ToArray();
            double[] scores = new double[result_array.Length];
            for (int i = 0; i < result_array.Length; i++)
            {
                double score = 1 / (1 + Math.Exp(result_array[i] * -1));
                scores[i] = score;
            }
            List<ScoreIndex> ltResult = new List<ScoreIndex>();
            ScoreIndex temp;
            for (int i = 0; i < scores.Length; i++)
            {
                temp = new ScoreIndex(i, scores[i]);
                ltResult.Add(temp);
            }
            //根据分数倒序排序,取前10个
            var SortedByScore = ltResult.OrderByDescending(p => p.Score).ToList().Take(10);
            foreach (var item in SortedByScore)
            {
                sb.Append(class_names[item.Index] + ",");
            }
            sb.Length--; // 将长度减1来移除最后一个字符
            sb.AppendLine("");
            sb.AppendLine("------------------");
            double postprocessTime = stopwatch.Elapsed.TotalMilliseconds;
            stopwatch.Stop();
            double totalTime = preprocessTime + inferTime + postprocessTime;
            sb.AppendLine($"Preprocess: {preprocessTime:F2}ms");
            sb.AppendLine($"Infer: {inferTime:F2}ms");
            sb.AppendLine($"Postprocess: {postprocessTime:F2}ms");
            sb.AppendLine($"Total: {totalTime:F2}ms");
            textBox1.Text = sb.ToString();
            button2.Enabled = true;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            model_path = "model/ml_danbooru.onnx";
            image_path = "test_img/2.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();
            rawModel = OVCore.Shared.ReadModel(model_path);
            pp = rawModel.CreatePrePostProcessor();
            m = pp.BuildModel();
            cm = OVCore.Shared.CompileModel(m, "CPU");
            ir = cm.CreateInferRequest();
        }
    }
}下载
源码下载



















