任何人都可以帮助我,当将图像上传到模型时,应用程序崩溃并关闭,并给我这个错误,我使用了flutter

问题描述 投票:0回答:1

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 与设备的连接丢失。

将图像上传到模型时,应用程序崩溃并关闭

flutter artificial-intelligence tflite
1个回答
0
投票

错误消息表明 TensorFlow Lite 张量和 Java Buffer 的大小不匹配。具体来说,张量期望 90000 字节,但 Java 缓冲区只有 67500 字节。

此错误可能是由于 TensorFlow Lite 模型的输入形状与传递给它的图像数据的形状不匹配造成的。

以下是一些可能的解决方案:

  1. 检查模型的输入形状:确保 TensorFlow Lite 模型的输入形状与传递给它的图像数据的形状匹配。您可以通过查看模型的架构或使用 TensorFlow Lite 转换器工具来检查模型的输入形状。
  2. 调整图像数据大小:调整图像数据大小以匹配模型的输入形状。您可以使用 OpenCV 或 Android 内置
    Bitmap
    类等库来调整图像大小。
  3. 检查缓冲区分配:确保Java缓冲区分配有足够的容量来容纳整个图像数据。您可以使用
    ByteBuffer.allocate()
    方法分配正确大小的缓冲区。
  4. 验证数据类型:验证图像数据的数据类型是否与模型期望的数据类型匹配。 TensorFlow Lite 模型通常需要 float 或 uint8 数据类型。

在代码中,您可以尝试通过添加日志语句来检查图像数据和 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 进行测试-

© www.soinside.com 2019 - 2024. All rights reserved.