java.lang.IllegalArgumentException:输出错误:输出目标[1,1917,4]的形状与Tensor [1,1917,1,4]的形状不匹配

时间:2018-05-17 09:46:30

标签: android tensorflow-lite

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

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;

因为我只有两个要检测的对象。任何帮助或信息都会非常感激。

1 个答案:

答案 0 :(得分:0)

我也遇到了同样的问题,但是这是我通过一个小技巧解决的方法:
在“ 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;

即使我只有一堂课。但是那两个骇客似乎可以解决问题。

P.S:fronzen模型的TFLite版本似乎比.pb扩展名运行得更慢(在我的Samsung Galaxy S8 android API 26上)。