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:Float1, 3, 384, 384


Outputs


name:output

tensor:Float1, 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)

{

bgri.ConvertTo(bgri, MatType.CV_32FC1, 1 / stdi, (0.0 - meani) / stdi);

}

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 floatsize.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_onnxvalue0.AsTensor<float>();

var result_array = result_tensors.ToArray();

double\[\] scores = new doubleresult_array.Length;

for (int i = 0; i < result_array.Length; i++)

{

double score = 1 / (1 + Math.Exp(result_arrayi * -1));

scoresi = score;

}

List<Tag> tags = new List<Tag>(ltTag);

List<Tag> topTags = new List<Tag>();

for (int i = 0; i < scores.Length; i++)

{

if (scoresi > tagsi.Threshold)

{

tagsi.Score = scoresi;

topTags.Add(tagsi);

}

}

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 = tagChineseLinesi, Name = tagLinesi, Threshold = double.Parse(thresholdLinesi) });

}

}

}

}

复制代码
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]) });
            }
        }

    }
}

下载

源码下载(带模型)

模型下载

相关推荐
YFJ_mily10 分钟前
【会议征稿】第八届人本计算与数据智能国际会议(HCC 2026)| 广州12月召开,EI/Scopus稳定检索,多届收录无忧
机器学习·人机交互·ei会议·数据智能·rdlink研发家·人本计算·广州会议
江畔柳前堤5 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术5 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客5 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术6 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO7 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术7 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架7 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab7 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI7 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算