C# WinForm 部署 YOLOv11 目标检测的 ONNX 模型
引言
在计算机视觉领域,目标检测是一个重要的任务。YOLO(You Only Look Once)系列模型因其高效性和准确性而广受欢迎。随着深度学习技术的发展,ONNX(Open Neural Network Exchange)格式的出现使得模型的跨平台部署变得更加简便。本文将详细介绍如何在 C# WinForms 应用程序中部署 YOLOv11 的 ONNX 模型,并提供一些实际案例和应用场景。
目录
YOLOv11 模型简介
YOLOv11 是 YOLO 系列中的最新版本,采用了更先进的网络架构和训练策略,显著提高了检测速度和精度。YOLOv11 支持不同大小的输入图像,能够在保持高精度的同时,实时处理图像,适用于多种实际应用场景。
环境准备
所需工具
在开始之前,确保您的开发环境中安装了以下工具:
- Visual Studio 2019 或更高版本
- .NET 5.0 或更高版本
- Python(用于模型转换)
安装 .NET Core
如果尚未安装 .NET Core,可以从 .NET 官网 下载并安装最新版本。
安装 NuGet 包
在 Visual Studio 中,打开 NuGet 包管理器控制台,安装以下依赖:
bashCopy CodeInstall-Package Microsoft.ML.OnnxRuntime Install-Package Microsoft.ML.OnnxRuntime.MLImage Install-Package System.Drawing.Common
下载 YOLOv11 模型
访问 YOLOv11 GitHub 页面,下载最新的 YOLOv11 ONNX 模型文件。将其保存到项目目录中以便后续使用。
创建 WinForm 项目
- 打开 Visual Studio,选择“创建新项目”。
- 选择“Windows 窗体应用 (.NET)”模板。
- 输入项目名称,如 “YoloV11WinFormApp”,然后点击“创建”。
加载 ONNX 模型
在项目中,添加一个类 YoloModel.cs
,用于加载和运行模型。
csharpCopy Codeusing 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 Codeprivate 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 Codepublic 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 Codeprivate 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 模型,包括环境准备、模型加载、图像处理及目标检测等步骤。通过实际案例,我们展示了该技术在安防、自动驾驶和工业自动化等领域的广泛应用前景。希望通过本文的分享,能够帮助开发者更好地理解和应用目标检测技术。