ML.NET в Unity - PullRequest
       12

ML.NET в Unity

0 голосов
/ 14 декабря 2018

Я не могу понять, как использовать ML.NET в Unity.

Что я сделал: преобразовал мой проект для совместимости с framework 4.x.Преобразован уровень совместимости API в Framework 4.x.Сделал папку assets / plugins / ml и поместил в apis Microsoft.ML с соответствующим xmls.Все настройки платформы ml.dll помечены как совместимые только с 86_64 (это было избыточно).

Теперь я могу: вызвать apl ML и создать MlContext, TextLoader и выполнить обучение модели.Когда модель обучена, я также могу оценить обученную модель, но ...

Я не могу: При попытке получить прогноз из модели я получаю сообщение об ошибке: github комментарий по вопросу от 28.12.18 (там также прикреплен целый проект, вы можете увидеть код там) Тот же код работает в решении Visual Studio.

 public float TestSinglePrediction(List<double> signal, MLContext mlContext, string modelPath)
{
    ITransformer loadedModel;
    using (var stream = new FileStream(modelPath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        loadedModel = mlContext.Model.Load(stream);
    }
    var predictionFunction = loadedModel.MakePredictionFunction<AbstractSignal, PredictedRfd>(mlContext);
    var abstractSignal = new AbstractSignal()
    {
        Sig1 = (float)signal[0],
        Sig2 = (float)signal[1],
        Sig3 = (float)signal[2],
        Sig4 = (float)signal[3],
        Sig5 = (float)signal[4],
        Sig6 = (float)signal[5],
        Sig7 = (float)signal[6],
        Sig8 = (float)signal[7],
        Sig9 = (float)signal[8],
        Sig10 = (float)signal[9],
        Sig11 = (float)signal[10],
        Sig12 = (float)signal[11],
        Sig13 = (float)signal[12],
        Sig14 = (float)signal[13],
        Sig15 = (float)signal[14],
        Sig16 = (float)signal[15],
        Sig17 = (float)signal[16],
        Sig18 = (float)signal[17],
        Sig19 = (float)signal[18],
        Sig20 = (float)signal[19],
        RfdX = 0

    };
    var prediction = predictionFunction.Predict(abstractSignal);
    return prediction.RfdX;
}

Этот метод возвращает строку ошибки:var predictionFunction = loadedModel.MakePredictionFunction<AbstractSignal, PredictedRfd>(mlContext);

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Как сказал Ник в своем посте **, если вы будете следовать этим шагам, он должен работать с Unity.

Однако на момент написания этого поста команда ML.NET еще не сделала всестороннюю работу.тестирование с Unity, так что не удивительно, что он не работает из коробки. Эта проблема была открыта в ML.NET Github хранилище .Я предлагаю следить за этой проблемой за статусом поддержки Unity.

** Ник: Starting with Unity 2018.1, unity can target .net 4.x. So you would need to set the .net version to .NET 4.x Equivalent, or .net standard 2.0 (https://blogs.unity3d.com/2018/03/28/updated-scripting-runtime-in-unity-2018-1-what-does-the-future-hold/) and make sure you add your dll to the project as a reference in visual studio. If you don't add it as a reference, then visual sudio doesn't know about it.

0 голосов
/ 10 августа 2019

Немного модифицировано Пример Iris из https://docs.microsoft.com/en-us/dotnet/machine-learning/tutorials/iris-clustering (который больше не работает из-за некоторых изменений в ML API)

  1. Сначала убедитесь, чточто у вас установлена ​​последняя версия .net и ваша версия Unity имеет как минимум 2019.2.0f1 (это была предварительная версия) или выше.
  2. Создайте новый проект Unity.Создайте папку плагинов внутри вашей папки «Активы».Импортируйте все ML .Net API в эту папку (это может быть глупо, но я заранее создал визуальный студийный проект и добавил все эти API в это решение через nuget, а затем просто скопировал эти dll-файлы в папку Assets / Pluginsв моем проекте Unity).
  3. В папке Assets создайте папку Data и вставьте в нее файл iris.data из https://github.com/dotnet/machinelearning/blob/master/test/data/iris.data.
  4. Создайте скрипт с именем MLuTest ивставьте в него следующий код:

    общедоступный класс MLuTest: MonoBehaviour {

        static readonly string _dataPath = Path.Combine(Environment.CurrentDirectory, "Assets", "Data", "iris.data");
        static readonly string _modelPath = Path.Combine(Environment.CurrentDirectory, "Assets", "Data", "IrisClusteringModel.zip");
        MLContext mlContext;
        void Start()
        {
            Debug.Log("starting...");
            mlContext = new MLContext(seed: 0);
            IDataView dataView = mlContext.Data.ReadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
            string featuresColumnName = "Features";
            var pipeline = mlContext.Transforms
                .Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
                .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, clustersCount: 3));//read and format flowery data
            var model = pipeline.Fit(dataView);//train
            using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))//save trained model
            {
                mlContext.Model.Save(model, fileStream);
            }
            var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);//predict
            IrisData Setosa = new IrisData
            {
                SepalLength = 5.1f,
                SepalWidth = 3.5f,
                PetalLength = 1.4f,
                PetalWidth = 0.2f
            };
            Debug.Log(predictor.Predict(Setosa).PredictedClusterId);
            Debug.Log("...done predicting, now do what u like with it");
        }
    }
    
    public class IrisData
    {
        [LoadColumn(0)]
        public float SepalLength;
    
        [LoadColumn(1)]
        public float SepalWidth;
    
        [LoadColumn(2)]
        public float PetalLength;
    
        [LoadColumn(3)]
        public float PetalWidth;
    }
    public class ClusterPrediction
    {
        [ColumnName("PredictedLabel")]
        public uint PredictedClusterId;
    
        [ColumnName("Score")]
        public float[] Distances;
    }
    

Это должно работать прямо из коробки ... хорошо, это сделало для меня,Когда вы можете получить путаницу при получении файлов api, они могут отличаться от моей версии или просто совместимы с некоторыми .net Framework.Итак, получите содержимое моей папки плагинов (учтите, что все эти apis могут не быть необходимыми, сделайте чертовски себе): https://github.com/dotnet/machinelearning/issues/1886 Раньше (в предыдущих версиях Unity) некоторые параметры проигрывателя приходилось менять, ноя не должен был это делать.Но вот мое: slika

Надеюсь, это поможет, так как обновление Unity 19.2 У меня не было проблем, упомянутых в предыдущих сообщениях в этой теме.

0 голосов
/ 14 декабря 2018

Начиная с Unity 2018.1, единство может быть нацелено на .net 4.x.Таким образом, вам нужно будет установить версию .net на .NET 4.x Эквивалент или .net стандарт 2.0 (https://blogs.unity3d.com/2018/03/28/updated-scripting-runtime-in-unity-2018-1-what-does-the-future-hold/)) и убедиться, что вы добавляете свою dll в проект в качестве ссылки в Visual Studio. Если вы этого не сделаетене добавляйте его в качестве ссылки, тогда визуальная студия не знает об этом.

...