无法在具有307200字节的TensorFlowLite缓冲区和具有270000字节的Java缓冲区之间转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在具有307200字节的TensorFlowLite缓冲区和具有270000字节的Java缓冲区之间转换相关的知识,希望对你有一定的参考价值。

我正在尝试从Tensorflow detection model zoo运行预训练的对象检测TensorFlowLite模型。我在[[Mobile Models标题下使用了此站点的ssd_mobilenet_v3_small_coco模型。根据android上运行我们的模型下的instructions,我注释掉了模型下载脚本以避免资产被覆盖:// apply from:'download_model.gradle'文件中的build.gradle并替换了detect.tflitelabelmap.txt文件在资产目录中。构建成功,没有任何错误,该应用已安装在我的android设备中,但启动后便崩溃了,并且logcat显示:

E/AndroidRuntime: FATAL EXCEPTION: inference Process: org.tensorflow.lite.examples.detection, PID: 16960 java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite buffer with 307200 bytes and a Java Buffer with 270000 bytes. at org.tensorflow.lite.Tensor.throwIfShapeIsIncompatible(Tensor.java:425) at org.tensorflow.lite.Tensor.throwIfDataIsIncompatible(Tensor.java:392) at org.tensorflow.lite.Tensor.setTo(Tensor.java:188) at org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:150) at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:314) at org.tensorflow.lite.examples.detection.tflite.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:196) at org.tensorflow.lite.examples.detection.DetectorActivity$2.run(DetectorActivity.java:185) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:201) at android.os.HandlerThread.run(HandlerThread.java:65)
我已经搜索了许多TensorFlowLite文档,但没有发现与此错误相关的任何内容,我发现了一些关于stackoverflow的问题,这些问题具有相同的错误消息,但是是针对定制训练模型的,因此没有帮助。即使在经过定制训练的模型上,也会继续出现相同的错误。我应该怎么做才能消除此错误?
答案
您应该调整输入张量的大小,以便模型可以获取任何大小,像素或批次的数据。

标签长度必须与您的输出张量长度匹配经过训练的模型。

int[] dimensions = new int[4]; dimensions[0] = 1; // Batch_size // No of frames at a time dimensions[1] = 224; // Image Width required by model dimensions[2] = 224; // Image Height required by model dimensions[3] = 3; // No of Pixels Tensor tensor = c.tfLite.getInputTensor(0); c.tfLite.resizeInput(0, dimensions); Tensor tensor1 = c.tfLite.getInputTensor(0);

Change input size

以上是关于无法在具有307200字节的TensorFlowLite缓冲区和具有270000字节的Java缓冲区之间转换的主要内容,如果未能解决你的问题,请参考以下文章

无法验证具有 7 字节 UID ACR122U 的 NFC 标签

Throwing OutOfMemoryError“无法分配带有空闲字节的字节分配,直到OOM为止”

spring webflux(netty)处理程序无法解析包含大于 750 字节的 json 的 ServerRequest

TensorFlow L2正则化

特定整数在运行时需要多少字节?

克服 rpc 字节序转换