共计 2682 个字符,预计需要花费 7 分钟才能阅读完成。
技术背景
YOLOv8 是 Ultralytics 公司推出的最新目标检测模型,相比前代具有更高的精度和更快的推理速度。它特别适合实时应用场景,比如视频监控、自动驾驶等。对于 C# 开发者来说,通过 ONNX 格式可以方便地将训练好的 YOLOv8 模型集成到 .NET 应用中。

环境准备
Python 环境配置
- 安装 Python 3.8 或更高版本
- 使用 pip 安装 ultralytics 包:
pip install ultralytics
.NET 环境
建议使用 .NET 6 或更高版本,确保支持最新的 ML.NET 功能。
必要的 NuGet 包
- Microsoft.ML
- Microsoft.ML.OnnxRuntime
可以通过 Visual Studio 的 NuGet 包管理器或命令行安装:
dotnet add package Microsoft.ML
dotnet add package Microsoft.ML.OnnxRuntime
模型准备
导出 ONNX 模型
-
使用 Python 脚本导出模型:
from ultralytics import YOLO # 加载预训练模型 model = YOLO('yolov8n.pt') # 可以选择不同尺寸的模型 # 导出为 ONNX 格式 model.export(format='onnx') -
导出的 ONNX 模型会包含输入输出节点的信息,这些信息在 C# 中加载模型时会用到。
模型输入输出格式
- 输入:1x3x640x640 的浮点型张量(归一化后的图像数据)
- 输出:1x84x8400 的张量(YOLOv8 的检测结果)
C# 实现
图像预处理
using Microsoft.ML;
using Microsoft.ML.Transforms.Image;
// 创建 MLContext
var mlContext = new MLContext();
// 定义输入数据结构
public class ImageInputData
{[ImageType(640, 640)]
public Bitmap Image {get; set;}
}
// 创建预处理管道
var pipeline = mlContext.Transforms
.ResizeImages("resized_image", 640, 640, "Image")
.Append(mlContext.Transforms.ExtractPixels("input", "resized_image",
interleavePixelColors: true,
offsetImage: 127.5f,
scaleImage: 1/255f));
// 创建预测引擎
var preprocessPipeline = pipeline.Fit(mlContext.Data.LoadFromEnumerable(new List<ImageInputData>()));
var predictionEngine = mlContext.Model.CreatePredictionEngine<ImageInputData, TensorInput>(preprocessPipeline);
ONNX 模型加载和推理
using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
// 加载 ONNX 模型
var session = new InferenceSession("yolov8n.onnx");
// 准备输入
var inputs = new List<NamedOnnxValue>
{NamedOnnxValue.CreateFromTensor("images", preprocessedTensor)
};
// 执行推理
using var results = session.Run(inputs);
var output = results.First().AsTensor<float>();
后处理代码
// 解析输出
var predictions = ParseModelOutput(output);
// 应用非极大值抑制 (NMS)
var finalPredictions = ApplyNMS(predictions, 0.5f, 0.45f);
private List<Prediction> ParseModelOutput(Tensor<float> output)
{// 实现解析逻辑}
private List<Prediction> ApplyNMS(List<Prediction> predictions, float confidenceThreshold, float iouThreshold)
{// 实现 NMS 算法}
性能优化
多线程处理
建议将图像预处理和模型推理放在不同的线程中,可以使用 Task Parallel Library 来实现。
GPU 加速
如果使用支持 CUDA 的 GPU,可以安装 ONNX Runtime 的 GPU 版本:
dotnet add package Microsoft.ML.OnnxRuntime.Gpu
然后在创建 InferenceSession 时指定 GPU 提供程序:
var sessionOptions = new SessionOptions();
sessionOptions.AppendExecutionProvider_CUDA();
var session = new InferenceSession("yolov8n.onnx", sessionOptions);
常见问题
模型尺寸与推理速度
YOLOv8 提供了多种尺寸的模型(n, s, m, l, x),小模型推理快但精度低,大模型相反。
内存泄漏预防
记得及时释放以下资源:
– InferenceSession
– IDisposable 类型的张量
– 预测引擎
跨平台部署
ONNX 模型可以跨平台运行,但需要注意:
– Linux 上可能需要安装额外的依赖
– ARM 设备上性能可能较差
进阶建议
自定义数据集训练
- 准备标注好的数据集(YOLO 格式)
- 使用 Ultralytics 的训练脚本进行微调
- 导出为 ONNX 格式
模型量化
可以使用 ONNX Runtime 的量化工具减少模型大小,提高推理速度。
进一步学习
- Ultralytics 官方文档:https://docs.ultralytics.com/
- ONNX Runtime 文档:https://onnxruntime.ai/
- ML.NET 文档:https://dotnet.microsoft.com/apps/machinelearning-ai/ml-dotnet
通过本教程,你应该已经掌握了在 C# 中使用 YOLOv8 进行目标检测的基本流程。在实际应用中,你可能需要根据具体需求调整参数和后处理逻辑。
