Table of Contents
Effect
Model information
project
code
download
Effect
Model information
Model Properties
————————–
author:Ultralytics
task: detect
license: AGPL-3.0 https://ultralytics.com/license
version:8.0.172
stride: 32
batch: 1
imgsz:[640, 640]
names: {0: ‘mask’, 1: ‘no-mask’}
————————————————– ————-
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
///
///
/// 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 + "mask.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); 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"; } } } }
Download
Source code download
The knowledge points of the article match the official knowledge files, and you can further learn related knowledge. OpenCV skill tree Home page Overview 23474 people are learning the system