Microsoft.ML 1.5图像分类模型如何修改代码支持Bitmap格式输入
可以直接传入Bitmap格式的图像进行推理,不需要先存为本地文件再传路径。以下是Microsoft.ML 1.5版本下的具体修改方案:
步骤1:修改ModelInput.cs定义
保留原有训练用的路径属性,新增字节数组属性供推理时使用:
// This file was auto-generated by ML.NET Model Builder. using Microsoft.ML.Data; namespace MLTestAppML.Model { public class ModelInput { [ColumnName("Label"), LoadColumn(0)] public string Label { get; set; } [ColumnName("ImageSource"), LoadColumn(1)] public string ImageSource { get; set; } // 新增属性:推理时传入Bitmap转换后的原始图像字节 [ColumnName("ImageBytes")] public byte[] ImageBytes { get; set; } } // 管道转换用的中间输出类 public class IntermediateOutput { [ColumnName("ImageSource_featurized")] public byte[] ImageSource_featurized { get; set; } } }
步骤2:修改ModelBuilder.cs的训练管道
替换原有加载图像字节的逻辑,兼容路径输入和字节输入两种场景,原有训练流程完全不受影响:
找到BuildTrainingPipeline方法中的这一行:
.Append(mlContext.Transforms.LoadRawImageBytes("ImageSource_featurized", null, "ImageSource"))
替换为以下代码:
.Append(mlContext.Transforms.CustomMapping<ModelInput, IntermediateOutput>((input, output) => { // 优先用传入的图像字节,没有的话再从路径读取(训练场景走路径逻辑) if (input.ImageBytes != null) output.ImageSource_featurized = input.ImageBytes; else output.ImageSource_featurized = File.ReadAllBytes(input.ImageSource); }, contractName: "CustomImageLoadMapping"))
步骤3:添加Bitmap转字节数组的工具方法
在你的业务代码中新增转换方法:
using System.Drawing; using System.Drawing.Imaging; using System.IO; public static byte[] BitmapToImageBytes(Bitmap bitmap) { using (var ms = new MemoryStream()) { // 直接保存为原始Bitmap格式,不需要手动调整尺寸和编码 bitmap.Save(ms, bitmap.RawFormat); return ms.ToArray(); } }
注意:需提前安装System.Drawing.Common NuGet包,推荐版本4.7.2,和ML.NET 1.5完全兼容
步骤4:Bitmap输入推理示例
// 加载训练好的模型 var mlContext = new MLContext(); var model = mlContext.Model.Load(ModelBuilder.MODEL_FILEPATH, out _); var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(model); // 传入Bitmap进行推理 Bitmap yourBitmap = /* 你的Bitmap对象 */; var input = new ModelInput { Label = string.Empty, ImageBytes = BitmapToImageBytes(yourBitmap) }; var predictResult = predEngine.Predict(input);
临时兼容方案(无需修改训练代码)
如果不想改动自动生成的训练代码,可在推理时将Bitmap临时存为本地文件,传临时文件路径进行推理,仅适合低频调用场景,性能比直接传字节低30%以上。
内容的提问来源于stack exchange,提问作者xxx
相关产品推荐
相关产品推荐

