Прежде всего, мы должны прочитать 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