C# Onnx Yolov8 Detect seal fingerprint detection

Application scenarios

Detect the seals and fingerprints in the document to determine whether the document is compliant (whether it is stamped or not)

Effect

Project

Code

using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Onnx_Yolov8_Detect
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string image_path = "";
        string startupPath;
        string classer_path;
        string model_path;
 
        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;
 
        Mat image;
        Mat result_image;
 
        SessionOptions options;
        InferenceSession onnx_session;
        Tensor<float> input_tensor;
        List<NamedOnnxValue> input_ontainer;
        IDisposableReadOnlyCollection<DisposableNamedOnnxValue> result_infer;
        DisposableNamedOnnxValue[] results_onnxvalue;
 
        Tensor<float> result_tensors;
        float[] result_array;
        float[] factors = new float[2];
 
        Result result;
        DetectionResult result_pro;
        StringBuilder sb = new StringBuilder();
 
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
 
            pictureBox1.Image = null;
            pictureBox2.Image = null;
            textBox1.Text = "";
 
            image_path = ofd.FileName;
            pictureBox1.Image = new Bitmap(image_path);
            image = new Mat(image_path);
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            startupPath = Application.StartupPath + "\model";
 
            model_path = startupPath + "seal_fingerprint.onnx";
            classer_path = startupPath + "lable.txt";
 
            //Create output session
            options = new SessionOptions();
            options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;
            options.AppendExecutionProvider_CPU(0);//Set to run on CPU
 
            //Create an inference model class and read local model files
            onnx_session = new InferenceSession(model_path, options);
 
            //Input Tensor
            input_tensor = new DenseTensor<float>(new[] { 1, 3, 640, 640 });
 
            //Create input container
            input_ontainer = new List<NamedOnnxValue>();
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            if (image_path == "")
            {
                return;
            }
            textBox1.Text = "Detecting, please wait...";
            pictureBox2.Image = null;
            Application.DoEvents();
 
            //Picture zoom
            image = new Mat(image_path);
 
            int max_image_length = image.Cols > image.Rows ? image.Cols : image.Rows;
            Mat max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);
            Rect roi = new Rect(0, 0, image.Cols, image.Rows);
            image.CopyTo(new Mat(max_image, roi));
 
            factors[0] = factors[1] = (float)(max_image_length / 640.0);
 
            //Convert the image to RGB channel
            Mat image_rgb = new Mat();
            Cv2.CvtColor(max_image, image_rgb, ColorConversionCodes.BGR2RGB);
 
            Mat resize_image = new Mat();
            Cv2.Resize(image_rgb, resize_image, new OpenCvSharp.Size(640, 640));
 
            //Input Tensor
            for (int y = 0; y < resize_image.Height; y + + )
            {
                for (int x = 0; x < resize_image.Width; x + + )
                {
                    input_tensor[0, 0, y, x] = resize_image.At<Vec3b>(y, x)[0] / 255f;
                    input_tensor[0, 1, y, x] = resize_image.At<Vec3b>(y, x)[1] / 255f;
                    input_tensor[0, 2, y, x] = resize_image.At<Vec3b>(y, x)[2] / 255f;
                }
            }
 
            //Put input_tensor into a container of input parameters and specify a name
            input_ontainer.Add(NamedOnnxValue.CreateFromTensor("images", input_tensor));
 
            dt1 = DateTime.Now;
            //Run Inference and get the results
            result_infer = onnx_session.Run(input_ontainer);
            dt2 = DateTime.Now;
 
            //Convert the output result to the DisposableNamedOnnxValue array
            results_onnxvalue = result_infer.ToArray();
 
            //Read the first node output and convert it to Tensor data
            result_tensors = results_onnxvalue[0].AsTensor<float>();
 
            result_array = result_tensors.ToArray();
 
            resize_image.Dispose();
            image_rgb.Dispose();
 
            result_pro = new DetectionResult(classer_path, factors,0.7f);
            result = result_pro.process_result(result_array);
            result_image = result_pro.draw_result(result, image.Clone());
 
            if (!result_image.Empty())
            {
                pictureBox2.Image = new Bitmap(result_image.ToMemoryStream());
                sb.Clear();
                sb.AppendLine("Inference time consumption:" + (dt2 - dt1).TotalMilliseconds + "ms");
                sb.AppendLine("---------------------------------");
                for (int i = 0; i < result.length; i + + )
                {
                    sb.AppendLine(string.Format("{0}:{1},({2},{3},{4},{5})"
                        , result.classes[i]
                        , result.scores[i].ToString("0.00")
                        , result.rects[i].TopLeft.X
                        , result.rects[i].TopLeft.Y
                        , result.rects[i].BottomRight.X
                        , result.rects[i].BottomRight.Y
                        ));
                }
                textBox1.Text = sb.ToString();
            }
            else
            {
                textBox1.Text = "No information";
            }
        }
 
        private void pictureBox2_DoubleClick(object sender, EventArgs e)
        {
            Common.ShowNormalImg(pictureBox2.Image);
        }
 
        private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            Common.ShowNormalImg(pictureBox1.Image);
        }
    }
}

If necessary, contact QQ: 819069052