教程:在 ML.NET 中使用 ONNX 检测对象
- Visual Studio 2022。
- Microsoft.ML Nuget 包
- Microsoft.ML.ImageAnalytics NuGet 包
- Microsoft.ML.OnnxTransformer NuGet 包
ONNX 对象检测示例概述
此示例创建一个 .NET 核心控制台应用程序,该应用程序使用预训练的深度学习 ONNX 模型检测图像中的对象。
了解模型
对象检测是图像处理任务。 因此,训练解决该问题的大多数深度学习模型都是 CNN。 本教程中使用的模型是 Tiny YOLOv2 模型,
什么是 ONNX 模型?
开放神经网络交换 (ONNX) 是 AI 模型的开放源代码格式。 ONNX 支持框架之间的互操作性。 这意味着,你可以在许多常见的机器学习框架(如 pytorch)中训练模型,将其转换为 ONNX 格式,并在其他框架(如 ML.NET)中使用 ONNX 模型。 有关详细信息,请参阅 ONNX 网站。
创建桌面应用程序
-
创建名为“ObjectDetection”的 C# 控制台应用程序。 单击“下一步”按钮。
-
选择 .NET Framework 8.0 作为要使用的框架。 单击“创建” 按钮。
-
安装“Microsoft.ML”NuGet 包
创建类和定义路径
创建 DimensionsBase 类文件
public class DimensionsBase
{
public float X { get; set; }
public float Y { get; set; }
public float Height { get; set; }
public float Width { get; set; }
}
创建YoloBoundingBox.cs 文件
public class BoundingBoxDimensions : DimensionsBase { }
public class YoloBoundingBox
{
public BoundingBoxDimensions Dimensions { get; set; }
public string Label { get; set; }
public float Confidence { get; set; }
public RectangleF Rect
{
get { return new RectangleF(Dimensions.X, Dimensions.Y, Dimensions.Width, Dimensions.Height); }
}
public Color BoxColor { get; set; }
}
创建 YoloOutPutParser.cs 文件
class YoloOutputParser
{
class CellDimensions : DimensionsBase { }
public const int ROW_COUNT = 13;
public const int COL_COUNT = 13;
public const int CHANNEL_COUNT = 125;
public const int BOXES_PER_CELL = 5;
public const int BOX_INFO_FEATURE_COUNT = 5;
public const int CLASS_COUNT = 20;
public const float CELL_WIDTH = 32;
public const float CELL_HEIGHT = 32;
private int channelStride = ROW_COUNT * COL_COUNT;
private float[] anchors = new float[]
{
1.08F, 1.19F, 3.42F, 4.41F, 6.63F, 11.38F, 9.42F, 5.11F, 16.62F, 10.52F
};
private string[] labels = new string[]
{
"aeroplane", "bicycle", "bird", "boat", "bottle",
"bus", "car", "cat", "chair", "cow",
"diningtable", "dog", "horse", "motorbike", "person",
"pottedplant", "sheep", "sofa", "train", "tvmonitor"
};
private static Color[] classColors = new Color[]
{
Color.Khaki,
Color.Fuchsia,
Color.Silver,
Co