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