对象检测器上的Tensorflow Lite GPU支持

时间:2019-01-29 14:49:01

标签: android tensorflow-lite

我已阅读页面https://www.tensorflow.org/lite/performance/gpu 我想知道是否有人可以帮助我确定如何调整“ MobileNet SSD对象检测”的输入。您只会得到一个文件:“ mobile_ssd_v2_float_coco.tflite”

我尝试了320x320 * 3 * 4,因为如果尝试使用300x300的“旧”图像分辨率,则会出现一个错误,提示数组大小不匹配,而新大小则匹配320x320。

但是现在当我调用run(input,output)时,该方法再也不会返回...没有错误或任何东西:(

有人建议吗,因为我现在真的在吸管。

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以通过在python How to convert output from interpreter.run in java中执行以下命令来检查某些型号的规格:

[{'name': 'normalized_input_image_tensor', 'index': 306, 'shape': array([  1, 320, 320,   3], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0)}]

阵列形状[1、320、320、3],因此输入必须是图像320x320。 输出详细信息:

[{'name': 'raw_outputs/box_encodings', 'index': 307, 'shape': array([   1, 2034,    4], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0)}, {'name': 'raw_outputs/class_predictions', 'index': 308, 'shape': array([   1, 2034,   91], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0)}]

我们有2个具有以下形状的输出:[1,2034,4]和[1,2034,91] 因此,准备2个具有精确大小的数组,例如在Java android

private float[][][] out1;
private float[][][] out2;
out1 = new float[1][2034][4];
out2 = new float[1][2034][91];

然后将它们添加到地图示例java:

private Map<Integer, Object> output_map = new TreeMap<>();
output_map.put(0, out1);
output_map.put(1, out2);

并运行:

tflite.runForMultipleInputsOutputs(input_data, output_map);

tflite-解释器,input_data-转换后的图像

您将获得数组中的数据。我假设在out1中将是边界框坐标,而在out2中是类/分数?您需要进行更多测试。

示例代码https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/java/demo/app/src/main/java/com/example/android/tflitecamerademo 当然,您需要进行一些更改,以便它可以与对象检测模型一起使用。