我已经使用Azure Custom Vision训练了一个模型(对象检测),并将模型导出为ONNX,然后将模型导入到我的WPF(.net core)项目中。
我使用ML.net从我的模型中得到预测,我发现结果与我在Custom Vision上看到的预测有巨大的不同。
我已经尝试了不同的提取顺序(ABGR,ARGB等),但结果是非常失望的,任何人可以给予我一些建议,因为没有这么多的在线文档关于使用自定义视觉的ONNX模型与WPF做对象检测。
下面是一些片段:
// Model creation and pipeline definition for images needs to run just once, so calling it from the constructor:
var pipeline = mlContext.Transforms
.ResizeImages(
resizing: ImageResizingEstimator.ResizingKind.Fill,
outputColumnName: MLObjectDetectionSettings.InputTensorName,
imageWidth: MLObjectDetectionSettings.ImageWidth,
imageHeight: MLObjectDetectionSettings.ImageHeight,
inputColumnName: nameof(MLObjectDetectionInputData.Image))
.Append(mlContext.Transforms.ExtractPixels(
colorsToExtract: ImagePixelExtractingEstimator.ColorBits.Rgb,
orderOfExtraction: ImagePixelExtractingEstimator.ColorsOrder.ABGR,
outputColumnName: MLObjectDetectionSettings.InputTensorName))
.Append(mlContext.Transforms.ApplyOnnxModel(modelFile: modelPath, outputColumnName: MLObjectDetectionSettings.OutputTensorName, inputColumnName: MLObjectDetectionSettings.InputTensorName));
//Create empty DataView. We just need the schema to call fit()
var emptyData = new List<MLObjectDetectionInputData>();
var dataView = mlContext.Data.LoadFromEnumerable(emptyData);
//Generate a model.
var model = pipeline.Fit(dataView);
然后我用这个模型来创建上下文。
//Create prediction engine.
var predictionEngine = _mlObjectDetectionContext.Model.CreatePredictionEngine<MLObjectDetectionInputData, MLObjectDetectionPrediction>(_mlObjectDetectionModel);
//Load tag labels.
var labels = File.ReadAllLines(LABELS_OBJECT_DETECTION_FILE_PATH);
//Create input data.
var imageInput = new MLObjectDetectionInputData { Image = this.originalImage };
//Predict.
var prediction = predictionEngine.Predict(imageInput);
2条答案
按热度按时间v8wbuo2f1#
当您为两个Resize参数准备管道时,您是否可以检查图像输入(imageInput)是否调整为与模型要求中相同的大小:图像宽度:MLObject检测设置。图像宽度、图像高度:MLObjectDetectionSettings.ImageHeight.
此外,对于Extract泛指els参数,尤其是ColorBits和ColorsOrder参数,应遵循模型要求。
希望这对
阿里夫
lkaoscv72#
这可能是因为在调整大小时未保留纵横比。
尝试使用以下大小的图像:
MLObject检测设置.图像宽度 * MLObject检测设置.图像高度
您将看到更好的结果。
我认为Azure会对图像进行初步处理,可能是填充(也在训练期间?)或裁剪。
也许在处理过程中,它还使用移动窗口(模型预期的大小),然后进行一些聚合