C# WinForm 部署 YOLOv11 目标检测的 ONNX 模型

引言

在计算机视觉领域,目标检测是一个重要的任务。YOLO(You Only Look Once)系列模型因其高效性和准确性而广受欢迎。随着深度学习技术的发展,ONNX(Open Neural Network Exchange)格式的出现使得模型的跨平台部署变得更加简便。本文将详细介绍如何在 C# WinForms 应用程序中部署 YOLOv11 的 ONNX 模型,并提供一些实际案例和应用场景。

目录

  1. YOLOv11 模型简介
  2. 环境准备
  3. 下载 YOLOv11 模型
  4. 创建 WinForm 项目
  5. 加载 ONNX 模型
  6. 图像预处理
  7. 进行目标检测
  8. 展示检测结果
  9. 案例与场景
  10. 总结

YOLOv11 模型简介

YOLOv11 是 YOLO 系列中的最新版本,采用了更先进的网络架构和训练策略,显著提高了检测速度和精度。YOLOv11 支持不同大小的输入图像,能够在保持高精度的同时,实时处理图像,适用于多种实际应用场景。

环境准备

所需工具

在开始之前,确保您的开发环境中安装了以下工具:

  • Visual Studio 2019 或更高版本
  • .NET 5.0 或更高版本
  • Python(用于模型转换)

安装 .NET Core

如果尚未安装 .NET Core,可以从 .NET 官网 下载并安装最新版本。

安装 NuGet 包

在 Visual Studio 中,打开 NuGet 包管理器控制台,安装以下依赖:

bashCopy Code
Install-Package Microsoft.ML.OnnxRuntime Install-Package Microsoft.ML.OnnxRuntime.MLImage Install-Package System.Drawing.Common

下载 YOLOv11 模型

访问 YOLOv11 GitHub 页面,下载最新的 YOLOv11 ONNX 模型文件。将其保存到项目目录中以便后续使用。

创建 WinForm 项目

  1. 打开 Visual Studio,选择“创建新项目”。
  2. 选择“Windows 窗体应用 (.NET)”模板。
  3. 输入项目名称,如 “YoloV11WinFormApp”,然后点击“创建”。

加载 ONNX 模型

在项目中,添加一个类 YoloModel.cs,用于加载和运行模型。

csharpCopy Code
using System; using System.Collections.Generic; using System.Drawing; using System.IO; using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; public class YoloModel { private InferenceSession _session; public YoloModel(string modelPath) { _session = new InferenceSession(modelPath); } public List<YoloResult> DetectObjects(Bitmap bitmap) { // 实现图像处理和模型推理的逻辑 // 返回检测到的物体列表 } private Tensor<float> PreprocessImage(Bitmap bitmap) { // 将 Bitmap 转换为 Tensor<float> } } public class YoloResult { public string Label { get; set; } public float Confidence { get; set; } public Rectangle BoundingBox { get; set; } }

图像预处理

YoloModel 类中实现 PreprocessImage 方法,将输入图像转换为适合模型的 Tensor 格式。

csharpCopy Code
private Tensor<float> PreprocessImage(Bitmap bitmap) { // 假设输入大小为640x640 var inputWidth = 640; var inputHeight = 640; // Resize and normalize the image var resizedBitmap = new Bitmap(bitmap, new Size(inputWidth, inputHeight)); var tensor = new float[1, 3, inputHeight, inputWidth]; for (int y = 0; y < inputHeight; y++) { for (int x = 0; x < inputWidth; x++) { var pixel = resizedBitmap.GetPixel(x, y); tensor[0, 0, y, x] = pixel.R / 255.0f; // Red channel tensor[0, 1, y, x] = pixel.G / 255.0f; // Green channel tensor[0, 2, y, x] = pixel.B / 255.0f; // Blue channel } } return new DenseTensor<float>(tensor, new[] { 1, 3, inputHeight, inputWidth }); }

进行目标检测

YoloModel 类中实现 DetectObjects 方法,执行模型推理并解析输出。

csharpCopy Code
public List<YoloResult> DetectObjects(Bitmap bitmap) { var inputTensor = PreprocessImage(bitmap); var inputs = new List<NamedOnnxValue> { NamedOnnxValue.CreateFromTensor("images", inputTensor) }; using (var results = _session.Run(inputs)) { // 解析结果 var output = results.First().AsTensor<float>(); return PostProcessOutput(output); } } private List<YoloResult> PostProcessOutput(Tensor<float> output) { var results = new List<YoloResult>(); // 解析输出张量,提取检测结果 return results; }

展示检测结果

在主窗体中,添加按钮和图片框,用于选择和显示图像。

csharpCopy Code
private void btnDetect_Click(object sender, EventArgs e) { var openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) { var bitmap = new Bitmap(openFileDialog.FileName); var detections = _yoloModel.DetectObjects(bitmap); DrawDetections(bitmap, detections); } } private void DrawDetections(Bitmap bitmap, List<YoloResult> detections) { using (var graphics = Graphics.FromImage(bitmap)) { foreach (var result in detections) { var rect = result.BoundingBox; graphics.DrawRectangle(Pens.Red, rect); graphics.DrawString($"{result.Label}: {result.Confidence:F2}", SystemFonts.DefaultFont, Brushes.Red, rect.Location); } } pictureBox.Image = bitmap; }

案例与场景

安防监控

在安防监控中,YOLOv11 可以实时检测入侵者、识别可疑行为等。通过将该系统集成到监控摄像头中,可以实现智能警报和安全监控。

自动驾驶

在自动驾驶领域,目标检测是保障行车安全的重要技术。利用 YOLOv11,车辆可以实时识别行人、交通标志和其他车辆,从而做出及时反应。

工业自动化

在工业自动化中,YOLOv11 可以用于产品质量检测、缺陷识别等场景。通过在生产线上部署相应的系统,可以大幅提升生产效率和产品质量。

总结

本文详细介绍了如何在 C# WinForms 应用程序中部署 YOLOv11 的 ONNX 模型,包括环境准备、模型加载、图像处理及目标检测等步骤。通过实际案例,我们展示了该技术在安防、自动驾驶和工业自动化等领域的广泛应用前景。希望通过本文的分享,能够帮助开发者更好地理解和应用目标检测技术。