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

目录

介绍

效果

模型信息

项目

代码

下载


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

介绍

github地址:https://github.com/xinyu1205/recognize-anything

Open-source and strong foundation image recognition models.

onnx模型下载地址:https://huggingface.co/CannotFindObject/RAM_ONNX

效果

模型信息

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]) });

}

}

}

}

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]) });
            }
        }

    }
}

下载

源码下载(带模型)

模型下载

相关推荐
o(╯□╰)o亚比囧囧囧1 小时前
李沐 过拟合和欠拟合【动手学深度学习v2】
人工智能·深度学习
钡铼技术1 小时前
通过MCGS在ARMxy边缘计算网关上实现物流自动化
人工智能·自动化·边缘计算·钡铼技术·armxy边缘计算网关
OpenTiny社区2 小时前
茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地
人工智能·低代码
chenkangck503 小时前
AI大模型之旅--milvus向量库安装
人工智能·aigc·milvus
学习前端的小z3 小时前
【AI视频】Runway:Gen-2 图文生视频与运动模式详解
人工智能·aigc·音视频
SpikeKing4 小时前
LLM - 理解 多模态大语言模型(MLLM) 的 指令微调(Instruction-Tuning) 与相关技术 (四)
人工智能·语言模型·指令微调·数据调整·自指令·数据混合·instruction
开MINI的工科男5 小时前
【笔记】自动驾驶预测与决策规划_Part3_路径与轨迹规划
人工智能·笔记·自动驾驶·预测与决策
D11_6 小时前
Pandas缺失值处理
python·机器学习·数据分析·numpy·pandas
xuanyu228 小时前
Linux常用指令
linux·运维·人工智能
静心问道8 小时前
WGAN算法
深度学习·算法·机器学习