You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ML.NET中使用CenterFace ONNX?输入尺寸报错排查

解决ML.NET中CenterFace ONNX模型输入尺寸不匹配问题

你遇到的错误源于ML.NET默认严格遵循ONNX模型元数据声明的静态输入形状[10,3,32,32],但图像检测场景需要动态尺寸输入;而OpenCV Dnn模块会自动适配实际输入尺寸,因此能正常运行。以下是具体修复方案:


核心修复点

  1. 强制指定动态输入形状:在ApplyOnnxModel中通过shapeDictionary参数覆盖模型元数据的静态形状,用-1标记批量、高度、宽度为动态维度。
  2. 对齐图像预处理逻辑:确保ML.NET的图像预处理和OpenCV的BlobFromImage行为完全一致,包括通道顺序、缩放系数、均值设置。

修改后的完整代码

核心Pipeline代码

string modelPath = "centerface.onnx";
var mlContext = new MLContext();

string imagePath = "photo1.jpg";

var img = Image.FromFile(imagePath);
var DH = (int)(Math.Ceiling((float)img.Height / 32) * 32);
var DW = (int)(Math.Ceiling((float)img.Width / 32) * 32);

var inputData = new[] { new ModelInput { ImagePath = imagePath } };
IDataView imageData = mlContext.Data.LoadFromEnumerable(inputData);

// 定义动态输入形状:-1表示该维度支持动态变化
var inputShapes = new Dictionary<string, int[]>
{
    { "input.1", new[] { -1, 3, -1, -1 } }
};

var pipeline = mlContext.Transforms.LoadImages(outputColumnName: "input.1", imageFolder: "", inputColumnName: nameof(ModelInput.ImagePath))
    .Append(mlContext.Transforms.ResizeImages(outputColumnName: "input.1", imageWidth: DW, imageHeight: DH))
    .Append(mlContext.Transforms.ExtractPixels(
        outputColumnName: "input.1",
        scaleImage: 1f, // 和OpenCV的1.0缩放系数对齐
        mean: new[] { 0f, 0f, 0f }, // 和OpenCV的均值参数对齐
        interleavePixelColors: true, // 输出RGB通道顺序,对应OpenCV swapRB=true的结果
        outputAsFloatArray: true))
    .Append(mlContext.Transforms.ApplyOnnxModel(
        outputColumnNames: ["537", "538", "539", "540"],
        inputColumnNames: ["input.1"],
        modelFile: modelPath,
        shapeDictionary: inputShapes)); // 应用动态形状配置

var model = pipeline.Fit(imageData);
var predictionEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(model);
var prediction = predictionEngine.Predict(new ModelInput { ImagePath = imagePath });

模型类定义(保持不变)

public class ModelInput
{
    public string ImagePath { get; set; }
}

public class ModelOutput
{
    [ColumnName("537")] 
    public float[] HeatMap { get; set; }

    [ColumnName("538")]
    public float[] Scale { get; set; }

    [ColumnName("539")]
    public float[] Offset { get; set; }

    [ColumnName("540")]
    public float[] Landmarks { get; set; }
}

关键说明

  • 动态形状配置:shapeDictionary中的-1告诉ML.NET无需严格匹配模型元数据的静态尺寸,会自动使用实际输入的批量大小、图像高度和宽度,适配图像检测的动态输入需求。
  • 预处理对齐:
    • scaleImage:1f:与OpenCV的1.0缩放系数一致,不对像素值做额外缩放。
    • mean: new[] {0f,0f,0f}:与OpenCV的均值参数一致,不执行均值减法操作。
    • interleavePixelColors: true:ML.NET默认输出RGB通道顺序,对应OpenCV中swapRB=true将BGR转为RGB的操作,确保输入通道顺序与模型期望一致。

内容的提问来源于stack exchange,提问作者ervin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:25:55