1

我已经用 tensorflow 训练了我自己的对象检测模型,并让它与适用于 android 的 Tensorflow mobile 一起工作。现在,自从 Tensorflow Lite 发布并在未来将取代移动设备后,我想开始使用它。Tensorflow 团队提供了一个用于对象检测的 TFLite 演示(您可以在此处找到它)。所以我试图让它与我的模型一起工作,但我在标题中得到了错误。这是日志猫:

05-17 11:18:50.624 25688-25688/? I/tensorflow: DetectorActivity: Camera orientation relative to screen canvas: 90
05-17 11:18:50.624 25688-25688/? I/tensorflow: DetectorActivity: Initializing at size 640x480
05-17 11:18:50.628 25688-25688/? I/tensorflow: MultiBoxTracker: Initializing ObjectTracker: 640x480
05-17 11:18:50.637 25688-25688/? I/tensorflow: DetectorActivity: Preparing image 1 for detection in bg thread.
05-17 11:18:50.689 25688-25707/? I/tensorflow: DetectorActivity: Running detection on image 1
05-17 11:18:52.496 25688-25707/? E/AndroidRuntime: FATAL EXCEPTION: inference
                                                   Process: org.tensorflow.lite.demo, PID: 25688
                                                   java.lang.IllegalArgumentException: Output error: Shape of output target [1, 1917, 4] does not match with the shape of the Tensor [1, 1917, 1, 4].
                                                       at org.tensorflow.lite.Tensor.copyTo(Tensor.java:44)
                                                       at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:154)
                                                       at org.tensorflow.demo.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:222)
                                                       at org.tensorflow.demo.DetectorActivity$3.run(DetectorActivity.java:242)
                                                       at android.os.Handler.handleCallback(Handler.java:761)
                                                       at android.os.Handler.dispatchMessage(Handler.java:98)
                                                       at android.os.Looper.loop(Looper.java:156)
                                                       at android.os.HandlerThread.run(HandlerThread.java:61)

注意:作为训练模型的检查点,我使用了 ssd_mobilenet_v1_coco_2017_11_17,我在代码中唯一更改的是这个(TFLiteObjectDetectionAPIModel.java):

  private static final int NUM_CLASSES = 3;

因为我只有两个物体要检测。任何帮助或信息将不胜感激。

4

1 回答 1

1

我也有同样的问题,但这是我用一个小技巧解决它的方法:
在“TFLiteObjectDetectionAPIModel.java”文件中创建一个新的变量数组:

float [][][][] temp1 = new float[1][NUM_RESULTS][1][4];

然后为您的“outputMap”对象替换:

outputMap.put(0, outputLocations);

经过:

outputMap.put(0, temp1);

这将解决形状不匹配问题。并确保放置正确数量的课程。例如,我只有一个类,但在 .txt 文件中,第一类被列为“???” 然后第二个是我的实际课程。因此我有:

private static final int NUM_CLASSES = 2;

即使我只有一节课。但是这两个黑客似乎解决了这个问题。

PS:Fronzen 模型的 TFLite 版本似乎比 .pb 扩展名运行得更慢(在我的三星 Galaxy S8 android API 26 上)。

于 2018-06-28T08:21:16.367 回答