C# 结合 YOLOv8 实现目标检测:从环境搭建到模型推理全流程指南

1次阅读
没有评论

共计 2682 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

技术背景

YOLOv8 是 Ultralytics 公司推出的最新目标检测模型,相比前代具有更高的精度和更快的推理速度。它特别适合实时应用场景,比如视频监控、自动驾驶等。对于 C# 开发者来说,通过 ONNX 格式可以方便地将训练好的 YOLOv8 模型集成到 .NET 应用中。

C# 结合 YOLOv8 实现目标检测:从环境搭建到模型推理全流程指南

环境准备

Python 环境配置

  1. 安装 Python 3.8 或更高版本
  2. 使用 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 模型

  1. 使用 Python 脚本导出模型:

    from ultralytics import YOLO
    
    # 加载预训练模型
    model = YOLO('yolov8n.pt')  # 可以选择不同尺寸的模型
    
    # 导出为 ONNX 格式
    model.export(format='onnx')

  2. 导出的 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 设备上性能可能较差

进阶建议

自定义数据集训练

  1. 准备标注好的数据集(YOLO 格式)
  2. 使用 Ultralytics 的训练脚本进行微调
  3. 导出为 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 进行目标检测的基本流程。在实际应用中,你可能需要根据具体需求调整参数和后处理逻辑。

正文完
 0
评论(没有评论)