E/AndroidRuntime(10989):致命异常:AsyncTask #1 E/AndroidRuntime(10989):进程:com.example.graduation_project,PID:10989 E/AndroidRuntime(10989): java.lang.RuntimeException: 执行 doInBackground() 时发生错误 E / AndroidRuntime(10989):在android.os.AsyncTask $ 4.done(AsyncTask.java:415) E / AndroidRuntime(10989):在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) E / AndroidRuntime(10989):在java.util.concurrent.FutureTask.setException(FutureTask.java:252) E / AndroidRuntime(10989):在java.util.concurrent.FutureTask.run(FutureTask.java:271) E / AndroidRuntime(10989):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:305) E / AndroidRuntime(10989):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) E / AndroidRuntime(10989):在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:641) E / AndroidRuntime(10989):在java.lang.Thread.run(Thread.java:923) E/AndroidRuntime(10989):由以下原因引起:java.lang.IllegalArgumentException:无法从 67500 字节的 Java 缓冲区复制到 90000 字节的 TensorFlowLite 张量 (serving_default_conv2d_3_input:0)。 E / AndroidRuntime(10989):在 org.tensorflow.lite.TensorImpl.throwIfSrcShapeIsIncomplete(TensorImpl.java:426) E / AndroidRuntime(10989):在org.tensorflow.lite.TensorImpl.setTo(TensorImpl.java:150) E / AndroidRuntime(10989):在org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:260) E / AndroidRuntime(10989):在org.tensorflow.lite.InterpreterImpl.runForMultipleInputsOutputs(InterpreterImpl.java:101) E / AndroidRuntime(10989):在org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:95) E / AndroidRuntime(10989):在org.tensorflow.lite.InterpreterImpl.run(InterpreterImpl.java:94) E / AndroidRuntime(10989):在org.tensorflow.lite.Interpreter.run(Interpreter.java:95) E/AndroidRuntime(10989):位于 sq.flutter.tflite.TflitePlugin$RunModelOnImage.runTflite(TflitePlugin.java:504) E/AndroidRuntime(10989):位于 sq.flutter.tflite.TflitePlugin$TfliteTask.doInBackground(TflitePlugin.java:471) E/AndroidRuntime(10989):位于 sq.flutter.tflite.TflitePlugin$TfliteTask.doInBackground(TflitePlugin.java:445) E / AndroidRuntime(10989):在android.os.AsyncTask $ 3.call(AsyncTask.java:394) E / AndroidRuntime(10989):在java.util.concurrent.FutureTask.run(FutureTask.java:266) E/AndroidRuntime(10989): ... 4 更多 I/Process (10989):发送信号。 PID:10989 SIG:9 与设备的连接丢失。
将图像上传到模型时,应用程序崩溃并关闭
错误消息表明 TensorFlow Lite 张量和 Java Buffer 的大小不匹配。具体来说,张量期望 90000 字节,但 Java 缓冲区只有 67500 字节。
此错误可能是由于 TensorFlow Lite 模型的输入形状与传递给它的图像数据的形状不匹配造成的。
以下是一些可能的解决方案:
Bitmap
类等库来调整图像大小。ByteBuffer.allocate()
方法分配正确大小的缓冲区。在代码中,您可以尝试通过添加日志语句来检查图像数据和 Java 缓冲区的形状和大小来调试问题。您还可以尝试将图像数据调整为固定大小,看看是否可以解决问题。
以下是如何使用 Android 内置
Bitmap
类调整图像大小的示例:
Bitmap bitmap =...; // load the image
int width = 224; // desired width
int height = 224; // desired height
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
ByteBuffer buffer = ByteBuffer.allocate(resizedBitmap.getByteCount());
resizedBitmap.copyPixelsToBuffer(buffer);
请注意,这只是一个示例,您可能需要调整调整大小逻辑以匹配您的特定用例。
-Gentd by lm3 进行测试-