目录
介绍
效果
模型信息
项目
代码
下载
C# RAM Stable Diffusion 提示词反推 Onnx Demo
介绍
github地址:GitHub - xinyu1205/recognize-anything: Open-source and h2 foundation image recognition models.
Open-source and h2 foundation image recognition models.
效果
模型信息
Model Properties
-------------------------
---------------------------------------------------------------
Inputs
-------------------------
name:input
tensor:Float[1, 3, 384, 384]
---------------------------------------------------------------
Outputs
-------------------------
name:output
tensor:Float[1, 4585]
---------------------------------------------------------------
项目
代码
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.Runtime.InteropServices; 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 sbTags = new StringBuilder(); StringBuilder sbTagsCN = new StringBuilder(); StringBuilder sb = new StringBuilder(); public string[] class_names; List<Tag> ltTag = new List<Tag>(); 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); } float[] mean = { 0.485f, 0.456f, 0.406f }; float[] std = { 0.229f, 0.224f, 0.225f }; public void Normalize(Mat src) { src.ConvertTo(src, MatType.CV_32FC3, 1.0 / 255); Mat[] bgr = src.Split(); for (int i = 0; i < bgr.Length; ++i) { bgr[i].ConvertTo(bgr[i], MatType.CV_32FC1, 1 / std[i], (0.0 - mean[i]) / std[i]); } Cv2.Merge(bgr, src); foreach (Mat channel in bgr) { channel.Dispose(); } } public float[] ExtractMat(Mat src) { OpenCvSharp.Size size = src.Size(); int channels = src.Channels(); float[] result = new float[size.Width * size.Height * channels]; GCHandle resultHandle = default; try { resultHandle = GCHandle.Alloc(result, GCHandleType.Pinned); IntPtr resultPtr = resultHandle.AddrOfPinnedObject(); for (int i = 0; i < channels; ++i) { Mat cmat = new Mat( src.Height, src.Width, MatType.CV_32FC1, resultPtr + i * size.Width * size.Height * sizeof(float)); Cv2.ExtractChannel(src, cmat, i); cmat.Dispose(); } } finally { resultHandle.Free(); } return result; } private void button2_Click(object sender, EventArgs e) { if (image_path == "") { return; } button2.Enabled = false; textBox1.Text = ""; sb.Clear(); sbTagsCN.Clear(); sbTags.Clear(); Application.DoEvents(); image = new Mat(image_path); //图片缩放 Mat resize_image = new Mat(); Cv2.Resize(image, resize_image, new OpenCvSharp.Size(384, 384)); Normalize(resize_image); var data = ExtractMat(resize_image); resize_image.Dispose(); image.Dispose(); // 输入Tensor input_tensor = new DenseTensor<float>(data, new[] { 1, 3, 384, 384 }); //将 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(); // 读取第一个节点输出并转为Tensor数据 result_tensors = results_onnxvalue[0].AsTensor<float>(); var result_array = result_tensors.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<Tag> tags = new List<Tag>(ltTag); List<Tag> topTags = new List<Tag>(); for (int i = 0; i < scores.Length; i++) { if (scores[i] > tags[i].Threshold) { tags[i].Score = scores[i]; topTags.Add(tags[i]); } } topTags.OrderByDescending(x => x.Score).ToList(); foreach (var item in topTags) { sbTagsCN.Append(item.NameCN + ","); sbTags.Append(item.Name + ","); } sbTagsCN.Length--; sbTags.Length--; sb.AppendLine("Tags:" + sbTags.ToString()); sb.AppendLine("标签:" + sbTagsCN.ToString()); sb.AppendLine("------------------"); sb.AppendLine("推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms"); textBox1.Text = sb.ToString(); button2.Enabled = true; } private void Form1_Load(object sender, EventArgs e) { model_path = "model/ram.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模型文件的路径 // 创建输入容器 input_container = new List<NamedOnnxValue>(); image_path = "test_img/1.jpg"; pictureBox1.Image = new Bitmap(image_path); image = new Mat(image_path); string[] thresholdLines = File.ReadAllLines("model/ram_tag_list_threshold.txt"); string[] tagChineseLines = File.ReadAllLines("model/ram_tag_list_chinese.txt"); string[] tagLines = File.ReadAllLines("model/ram_tag_list.txt"); for (int i = 0; i < tagLines.Length; i++) { ltTag.Add(new Tag { NameCN = tagChineseLines[i], Name = tagLines[i], Threshold = double.Parse(thresholdLines[i]) }); } } } }
下载
源码下载(带模型)
模型下载
onnxappstemivacpugithubcligittpumicrosoftcreateparsepngstable diffusionidewindows提示词diffusion