android - 对象检测器上的 Tensorflow Lite GPU 支持
问题描述
我已阅读页面https://www.tensorflow.org/lite/performance/gpu 我想知道是否有人可以帮助我弄清楚如何调整我对“MobileNet SSD 对象检测”的输入。你只会得到一个文件:“mobile_ssd_v2_float_coco.tflite”
我试过 320x320*3*4,因为如果我尝试 300x300 的“旧”图像分辨率,我会收到错误消息,指出数组大小不匹配,而新大小与 320x320 匹配。
但是现在当我调用 run(input, output) 时,该方法永远不会返回......没有错误或任何东西:(
有没有人有任何建议,因为我现在真的抓住了稻草。
先感谢您。
解决方案
您可以通过在 python 中执行此命令来检查某些模型的规格How to convert output from interpreter.run in java打印 input_details 结果:
[{'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 当然需要做一些修改,因此它将与对象检测模型一起使用。
推荐阅读
- php - Wordpress - Jetpack 服务器无法与您站点的 XML-RPC URL 通信
- javascript - 避免重复的 Webpack 块
- amazon-web-services - 无法在 aws-lambda 中从 aws s3 执行 getobject
- android - Android AVD 在启动时崩溃
- c - 守护进程只执行一次
- python - 如何从 Raspberry Pi 写入 AD5754 DAC 寄存器?SPI接口
- javascript - 节点使用文件中的数据填充下拉框
- listview - ListView.builder 下面的小部件/灵活占用最小空间
- angular - 在 chrome 插件中的角度应用程序中出现错误
- xamarin.forms - Xamarin 表单模型刷新问题