Xamarin Android: Что такое вход и выход для обнаружения объекта TFLite? - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь осуществить обнаружение объекта. Я использую формы Xamarin и Xamarin.Tensorflow.Lite. Сначала я загружаю свою модель:

        AssetFileDescriptor fileDescriptor = assets.OpenFd("model.tflite");
        FileInputStream inputStream = new FileInputStream(fileDescriptor.FileDescriptor);
        FileChannel fileChannel = inputStream.Channel;
        long startOffset = fileDescriptor.StartOffset;
        long declaredLength = fileDescriptor.DeclaredLength;
        var asd = fileChannel.Map(FileChannel.MapMode.ReadOnly, startOffset, declaredLength);
        var model = new Xamarin.TensorFlow.Lite.Interpreter(asd);

Я знаю, что должен вызывать model.Run (), но я не совсем знаю, какие параметры ему дать. Я хочу дать ему изображение и прочитать данные обратно? Как это сделать?

1 Ответ

1 голос
/ 15 января 2020

Прежде всего, мы должны прочитать Image в bitmap

var bitmap = await BitmapFactory.DecodeStreamAsync(image.GetStreamWithImageRotatedForExternalStorage());

Затем преобразовать bitmap в float[], как в следующем коде.

      static float[] GetBitmapPixels(Bitmap bitmap)
    {
        var floatValues = new float[_inputSize * _inputSize * 3];

        using (var scaledBitmap = Bitmap.CreateScaledBitmap(bitmap, _inputSize, _inputSize, false))
        {
            using (var resizedBitmap = scaledBitmap.Copy(Bitmap.Config.Argb8888, false))
            {
                var intValues = new int[_inputSize * _inputSize];
                resizedBitmap.GetPixels(intValues, 0, resizedBitmap.Width, 0, 0, resizedBitmap.Width, resizedBitmap.Height);

                for (int i = 0; i < intValues.Length; ++i)
                {
                    var val = intValues[i];

                    floatValues[i * 3 + 0] = ((val & 0xFF) - 104);
                    floatValues[i * 3 + 1] = (((val >> 8) & 0xFF) - 117);
                    floatValues[i * 3 + 2] = (((val >> 16) & 0xFF) - 123);
                }

                resizedBitmap.Recycle();
            }

            scaledBitmap.Recycle();
        }

        return floatValues;
    }

В конце концов, мы можем прочитать данные обратно.

      public string RecognizeImage(Bitmap bitmap)
    {
        var outputNames = new[] { OutputName };
        var floatValues = GetBitmapPixels(bitmap);
        var outputs = new float[labels.Count];

        inferenceInterface.Feed(InputName, floatValues, 1, _inputSize, _inputSize, 3);
        inferenceInterface.Run(outputNames);
        inferenceInterface.Fetch(OutputName, outputs);

        var results = new List<Tuple<float, string>>();
        for (var i = 0; i < outputs.Length; ++i)
            results.Add(Tuple.Create(outputs[i], labels[i]));

        return results.OrderByDescending(t => t.Item1).First().Item2;
    }

Вот блог об этом. https://devblogs.microsoft.com/xamarin/android-apps-tensorflow/

А вот и демо. https://github.com/jimbobbennett/blog-samples/tree/master/UsingTensorFlowAndAzureInAndroid

...