将dim4输入传递给C#Xamarin中的tflite

时间:2019-05-19 18:24:04

标签: c# xamarin tensorflow-lite

我有一个简单的pb图像识别器模型,并转换为tflite格式。 网络的输入为1,224,224,3

创建了一个 xamarin.forms android应用,并添加了 tflite nuget。 创建翻译

private Interpeter _tflite;

我可以加载模型和图像

图像存储在float [] 1维数组中。

float[] inputs = GetImageData();

当我尝试运行tflite推断时,由于输入dim!= 4

,它给了我一个例外。

_tflite.run(inputs, outputs); // outputs is an array to hold the result for classification

所以我尝试将图像存储在float [1,224,224,3]的多维数组中

float[,,,] input = GetImageData()

但是在这种情况下,_tflite.run(inputs, outputs)的输入不能转换为Java.Lang.Object。

我的问题是,如何将我的图像作为形状为1,224,224,3的输入传递到网络?

1 个答案:

答案 0 :(得分:0)

已解决

只需将float []数组转换为ByteBuffer 如果输出是一个多维数组,您还必须对输出执行相同的操作

_outputBuffer = ByteBuffer.Allocate(1008 * 4);  // 1008 number of labels
_floatInBytData = new byte[floatValues.Length * sizeof(float)];
System.Buffer.BlockCopy(floatValues, 0, _floatInBytData, 0, _floatInBytData.Length);
using (var bf = ByteBuffer.Wrap(_floatInBytData))
{
    _outputBuffer.Rewind();
    bf.Rewind();
    _tflite.Run(bf, _outputBuffer);
}
float[] outputs = new float[1008];
byte[] o = new byte[1008 * 4];
_outputBuffer.Position(0);
_outputBuffer.Get(o);
System.Buffer.BlockCopy(o, 0, outputs, 0, o.Length);