wpf ML.net预测与Custom Vision相比存在巨大差异

hvvq6cgz  于 2022-12-05  发布在  .NET
关注(0)|答案(2)|浏览(195)

我已经使用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);
v8wbuo2f

v8wbuo2f1#

当您为两个Resize参数准备管道时,您是否可以检查图像输入(imageInput)是否调整为与模型要求中相同的大小:图像宽度:MLObject检测设置。图像宽度、图像高度:MLObjectDetectionSettings.ImageHeight.
此外,对于Extract泛指els参数,尤其是ColorBits和ColorsOrder参数,应遵循模型要求。
希望这对
阿里夫

lkaoscv7

lkaoscv72#

这可能是因为在调整大小时未保留纵横比。
尝试使用以下大小的图像:
MLObject检测设置.图像宽度 * MLObject检测设置.图像高度

您将看到更好的结果。

我认为Azure会对图像进行初步处理,可能是填充(也在训练期间?)或裁剪。
也许在处理过程中,它还使用移动窗口(模型预期的大小),然后进行一些聚合

相关问题