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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:51:03