YOLOv7 在 ML.NET 中使用 ONNX 检测对象

本文介绍如何在 ML.NET 中使用 YOLOv7 的 ONNX 模型来检测图像中的对象。

什么是 YOLO

YOLO(You Only Look Once)是一种先进的实时目标检测系统。它是一个在COCO数据集上预训练的物体检测架构和模型系列,其版本也是在不断优化更新。2022年7月,YOLOv7 来临。官方版的YOLOv7相同体量下比YOLOv5 精度更高,速度更快。

论文地址:https://arxiv.org/abs/2207.02696.

YOLOv7 在 ML.NET 中使用 ONNX 检测对象

Yolov7

ONNX 模型

开放神经网络交换 (ONNX) 是 AI 模型的开放源代码格式。 ONNX 支持框架之间的互操作性,常见的机器学习框架都支持该模型的使用。

YOLOv7 的模型我们可以从一作 Chien-Yao Wang 的仓库获取:https://github.com/WongKinYiu/yolov7。在 Releases v0.1 中提供的 onnx 不能直接使用,我们需要下载预训练的 yolov7.pt 然后克隆项目,使用导出工具自行导出 onnx 模型。

python export.py --weights=yolov7.pt --grid --simplify

导出完成我们就可以得到 yolov7.onnx ,你也可以直接前往 CSDN 下载我分享的文件。

执行预测

1.首先创建控制台应用程序,选择 .NET 6 作为要使用的框架。

2.安装 Microsoft.ML.OnnxTransformer NuGet 包3.YOLOv7 整体结构与 YOLOv5 极其相似,我们可以直接使用 Yolov5Net NuGet 包里的分析器来处理模型输出。

剩下的工作,我们只需要编写执行预测的代码即可:

static readonly string assetsPath = GetAbsolutePath(@"../../../assets");static readonly string modelFilePath = Path.Combine(assetsPath, "Model", "yolov7.onnx");static readonly string imagesFolder = Path.Combine(assetsPath, "images");static readonly string outputFolder = Path.Combine(assetsPath, "images", "output");
private static void Main(string[] args){    if (!Directory.Exists(outputFolder))    {        Directory.CreateDirectory(outputFolder);    }    var imgs = Directory.GetFiles(imagesFolder).Where(filePath => Path.GetExtension(filePath) == ".jpg");
    using var scorer = new YoloScorer<YoloCocoP5Model>(modelFilePath);
    foreach (var imgsFile in imgs)    {        using var image = Image.FromFile(imgsFile);        List<YoloPrediction> predictions = scorer.Predict(image);        using var graphics = Graphics.FromImage(image);        foreach (var prediction in predictions)        {            double score = Math.Round(prediction.Score, 2);
            graphics.DrawRectangles(new Pen(prediction.Label.Color, 3),                new[] { prediction.Rectangle });
            var (x, y) = (prediction.Rectangle.X - 3, prediction.Rectangle.Y - 23);
            graphics.DrawString($"{prediction.Label.Name} ({score})",                new Font("Consolas", 16, GraphicsUnit.Pixel), new SolidBrush(prediction.Label.Color),                new PointF(x, y));        }
        image.Save(Path.Combine(outputFolder, $"result{DateTime.Now.Ticks}.jpg"));    }}
/// <summary>/// 获取程序启动目录/// </summary>/// <param name="relativePath">之下的某个路径</param>/// <returns></returns>private static string GetAbsolutePath(string relativePath){    FileInfo _dataRoot = new FileInfo(typeof(Program).Assembly.Location);    string assemblyFolderPath = _dataRoot.Directory!.FullName;
    string fullPath = Path.Combine(assemblyFolderPath, relativePath);
    return fullPath;}

完整的代码样例见:https://github.com/sangyuxiaowu/ml_yolov7

编写完成执行,然后我们就可以在 assets/images/output 目录看到样例图片的预测结果:

YOLOv7 在 ML.NET 中使用 ONNX 检测对象

预测结果

示例和参考

微软官方提供了 在 ML.NET 中使用 ONNX 检测对象 的更详细的教程,包含训练和预测,感兴趣的同学可前往查阅。