Table of Contents
Application scenarios
Effect
Model information
project
code
other
Application scenarios
Detect the seals and fingerprints in the document to determine whether the document is compliant (whether it is stamped or not)
Effect
Model information
Model Properties
———————–
author:Ultralytics
task: detect
license: AGPL-3.0 https://ultralytics.com/license
version:8.0.184
stride: 32
batch: 1
imgsz:[640, 640]
names: {0: ‘seal’, 1: ‘fingerprint’}
————————————————– ————-
Inputs
———————–
name:images
tensor: Float[1, 3, 640, 640]
————————————————– ————-
Outputs
———————–
name:output0
tensor: Float[1, 6, 8400]
————————————————– ————-
project
VS2022
.net framework 4.8
OpenCvSharp 4.8
Microsoft.ML.OnnxRuntime 1.16.2
code
draw_result function
///
///
/// Recognition result /// Draw an image ///
public Mat draw_result(Result result, Mat image)
{
// Draw the recognition results onto the picture
for (int i = 0; i < result.length; i + + )
{
//Console.WriteLine(result.rects[i]);
Cv2.Rectangle(image, result.rects[i], new Scalar(0, 0, 255), 2, LineTypes.Link8);
Cv2.Rectangle(image, new Point(result.rects[i].TopLeft.X-1, result.rects[i].TopLeft.Y – 20),
new Point(result.rects[i].BottomRight.X, result.rects[i].TopLeft.Y), new Scalar(0, 0, 255), -1);
Cv2.PutText(image, result.classes[i] + “-” + result.scores[i].ToString(“0.00”),
new Point(result.rects[i].X, result.rects[i].Y – 4),
HersheyFonts.HersheySimplex, 0.6, new Scalar(0, 0, 0), 1);
}
return image;
}
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); } } }
Other
C# PaddleDetection yolo seal detection
C# OpenVINO directly reads Baidu model to implement seal detection
The knowledge points of the article match the official knowledge files, and you can further learn related knowledge. OpenCV skill treeHomepage Overview 23597 people are learning the system