Установите имя столбца или тип вектора во время выполнения в ML.net c#

#c# #.net #object-detection #ml.net #onnx

Вопрос:

в настоящее время я пишу программу для использования обученных моделей ONNX для обнаружения объектов. Я хочу иметь возможность изменять модель (в идеале во время выполнения), поэтому я не знаю всех свойств моделей во время компиляции, но хочу сохранить их в одной (или, в идеале, в нескольких) Объекты, которые создаются(создаются) из текстового файла при запуске программы (MachineLearningModelObject). Но ML.net заставляет меня использовать константу для имени столбца или типа вектора, который я хотел бы установить во время выполнения.

     public MachineLearningModelObject MachineLearningModelObject = new MachineLearningModelObject();

    public void LoadModel()
    {
        MLContext mLContext = new MLContext();
        var pipeline = mLContext.Transforms.ResizeImages(inputColumnName: MachineLearningModelObject.ImageInputColumnName, outputColumnName: MachineLearningModelObject.ImageOutputColumnName, imageWidth: MachineLearningModelObject.ImageWidth, imageHeight: MachineLearningModelObject.ImageHeight, resizing: Microsoft.ML.Transforms.Image.ImageResizingEstimator.ResizingKind.Fill)
            .Append(mLContext.Transforms.ExtractPixels(outputColumnName: MachineLearningModelObject.ImageOutputColumnName, scaleImage: 1f / 255f, interleavePixelColors: false))
            .Append(mLContext.Transforms.ApplyOnnxModel(
                shapeDictionary: new Dictionary<string, int[]>()
                {
                    { MachineLearningModelObject.ModelInputColumnName, MachineLearningModelObject.ModelInputVector },
                    { MachineLearningModelObject.ModelOutputColumnName, MachineLearningModelObject.ModelOutputVector}
                },
                inputColumnName: MachineLearningModelObject.ModelInputColumnName,
                outputColumnName: MachineLearningModelObject.ModelOutputColumnName,
                modelFile: MachineLearningModelObject.ModelName
                ));

        var model = pipeline.Fit(mLContext.Data.LoadFromEnumerable(new List<MLImageObject>()));
        var predictionEngine = mLContext.Model.CreatePredictionEngine<MLImageObject, MLObjectDetectionPrediction>(model);

    }

    class MLObjectDetectionPrediction
    {
        [VectorType(MLObjectDetectionPipeline.MachineLearningModelObject.ModelInputVector)] //Must be a const?
        [ColumnName(MLObjectDetectionPipeline.MachineLearningModelObject.ModelInputColumnName)] // Must be a const?
        public float[] Output { get; set; }

        [ColumnName("width")]
        public float ImageWidth { get; set; }

        [ColumnName("height")]
        public float ImageHeight { get; set; }
}
 

Если я использую const, все работает нормально. Но я не могу понять, как установить эти переменные во время выполнения. Любые подсказки или примеры для моего кода приветствуются.