升级Microsoft.ML至2.0版本后遇System.ArgumentOutOfRangeException异常求助
解决ML.NET 2.0中Bitmap类型的SchemaDefinition异常
ML.NET 2.0对自定义类型的处理逻辑做了调整,不再隐式支持System.Drawing.Bitmap这类非原生数据类型,这是导致你遇到ArgumentOutOfRangeException的核心原因。以下是几种可行的解决方案:
方案一:改用ML.NET原生Image类型
替换数据类中的Bitmap属性为ML.NET提供的Microsoft.ML.Data.Image类型,搭配官方图像加载API处理图像,让框架自动识别类型:
using Microsoft.ML.Data; public class ObjectDetectionData { [LoadColumn(0)] public string ImagePath; // 用ML.NET原生Image类型替代Bitmap [LoadColumn(1)] public Image Image; } // 构建加载图像的管道 var mlContext = new MLContext(); var imageLoaderPipeline = mlContext.Transforms.LoadImage( outputColumnName: nameof(ObjectDetectionData.Image), imageFolder: "你的图像目录路径", inputColumnName: nameof(ObjectDetectionData.ImagePath));
方案二:显式注册Bitmap类型转换器
如果必须保留Bitmap类型,需实现自定义类型转换器并注册到MLContext,让框架能识别Bitmap与原生数据类型的映射:
using System.Drawing; using System.IO; using Microsoft.ML; using Microsoft.ML.Data; // 实现Bitmap与ML.NET Image的转换器 public class BitmapToImageConverter : ITypeConverter<Bitmap, Image> { public Image Convert(Bitmap input) { using var ms = new MemoryStream(); input.Save(ms, System.Drawing.Imaging.ImageFormat.Png); return Image.CreateFromBytes(ms.ToArray()); } public Bitmap ConvertBack(Image output) { using var ms = new MemoryStream(output.GetBytes()); return new Bitmap(ms); } } // 注册转换器到MLContext var mlContext = new MLContext(); mlContext.Model.RegisterTypeConverter(new BitmapToImageConverter()); // 后续构建SchemaDefinition时即可识别Bitmap类型 var schemaDef = SchemaDefinition.Create<你的数据类>();
方案三:直接使用字节数组存储图像数据
另一种方式是将Bitmap转换为字节数组,用byte[]类型作为数据类属性,ML.NET原生支持该类型,无需额外注册:
public class ObjectDetectionData { public byte[] ImageBytes; // 其他检测相关字段 } // 将Bitmap转为字节数组的示例代码 public byte[] BitmapToBytes(Bitmap bitmap) { using var ms = new MemoryStream(); bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png); return ms.ToArray(); }
内容的提问来源于stack exchange,提问作者Adrián Fontal
相关产品推荐
相关产品推荐

