如何在ML.NET中使用CenterFace ONNX?输入尺寸报错排查
解决ML.NET中CenterFace ONNX模型输入尺寸不匹配问题
你遇到的错误源于ML.NET默认严格遵循ONNX模型元数据声明的静态输入形状[10,3,32,32],但图像检测场景需要动态尺寸输入;而OpenCV Dnn模块会自动适配实际输入尺寸,因此能正常运行。以下是具体修复方案:
核心修复点
- 强制指定动态输入形状:在
ApplyOnnxModel中通过shapeDictionary参数覆盖模型元数据的静态形状,用-1标记批量、高度、宽度为动态维度。 - 对齐图像预处理逻辑:确保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
相关产品推荐
相关产品推荐

