android TfLiteGpuDelegate调用:GpuDelegate必须在初始化它的同一个线程上运行

q9rjltbz  于 2023-06-27  发布在  Android
关注(0)|答案(2)|浏览(361)

我正在尝试运行一个自定义的Tflie模型在Android的分割。它在CPU上运行良好,但在使用GPU委托时,它崩溃并出现以下错误:

  1. E/AndroidRuntime(30867): FATAL EXCEPTION: AsyncTask #2
  2. E/AndroidRuntime(30867): Process: com.apptec.scansdk, PID: 30867
  3. E/AndroidRuntime(30867): java.lang.RuntimeException: An error occurred while executing doInBackground()
  4. E/AndroidRuntime(30867): at android.os.AsyncTask$3.done(AsyncTask.java:309)
  5. E/AndroidRuntime(30867): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
  6. E/AndroidRuntime(30867): at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
  7. E/AndroidRuntime(30867): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
  8. E/AndroidRuntime(30867): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
  9. E/AndroidRuntime(30867): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
  10. E/AndroidRuntime(30867): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
  11. E/AndroidRuntime(30867): at java.lang.Thread.run(Thread.java:818)
  12. E/AndroidRuntime(30867): Caused by: java.lang.IllegalArgumentException: Internal error: Failed to run on the given Interpreter: TensorDescriptor don't have selector with name - Slice
  13. E/AndroidRuntime(30867): Falling back to OpenGL
  14. E/AndroidRuntime(30867): TfLiteGpuDelegate Invoke: GpuDelegate must run on the same thread where it was initialized.
  15. E/AndroidRuntime(30867): Node number 105 (TfLiteGpuDelegateV2) failed to invoke.
  16. E/AndroidRuntime(30867):
  17. E/AndroidRuntime(30867): at org.tensorflow.lite.NativeInterpreterWrapper.run(Native Method)
  18. E/AndroidRuntime(30867): at org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:158)
  19. E/AndroidRuntime(30867): at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:343)
  20. E/AndroidRuntime(30867): at org.tensorflow.lite.Interpreter.run(Interpreter.java:304)
  21. E/AndroidRuntime(30867): at com.apptec.scansdk.MainActivity$RunSegmentationOnBinary.runTflite(MainActivity.java:237)
  22. E/AndroidRuntime(30867): at com.apptec.scansdk.MainActivity$TfliteTask.doInBackground(MainActivity.java:310)
  23. E/AndroidRuntime(30867): at com.apptec.scansdk.MainActivity$TfliteTask.doInBackground(MainActivity.java:284)
  24. E/AndroidRuntime(30867): at android.os.AsyncTask$2.call(AsyncTask.java:295)
  25. E/AndroidRuntime(30867): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
  26. E/AndroidRuntime(30867): ... 4 more

下面是我的代码加载模型

  1. MappedByteBuffer buffer = null;
  2. buffer = FileUtil.loadMappedFile(context, "docScan.tflite");
  3. int numThreads = 4;
  4. boolean useGpuDelegate = true;
  5. final Interpreter.Options tfliteOptions = new Interpreter.Options();
  6. tfliteOptions.setNumThreads(numThreads);
  7. if (useGpuDelegate){
  8. GpuDelegate delegate = new GpuDelegate();
  9. tfliteOptions.addDelegate(delegate);
  10. }
  11. tfLite = new Interpreter(buffer, tfliteOptions);

奇怪的是,它适用于MI/Redmi/OPPO等手机,只在三星上崩溃。救命啊!

vnjpjtjt

vnjpjtjt1#

抛出的错误就是您的解决方案

你必须运行你的分类器和它的初始化在同一线程其他明智的它给予你这个错误

我得到了相同的错误,解决了

inKotlin:->

线程{
//你的分类器初始化和代码
}.start()

xxslljrj

xxslljrj2#

在AndroidManifest.xml中添加以下行:

  1. <application
  2. <uses-native-library
  3. android:name="libOpenCL.so"
  4. android:required="false" />
  5. <uses-native-library
  6. android:name="libOpenCL-car.so"
  7. android:required="false" />
  8. <uses-native-library
  9. android:name="libOpenCL-pixel.so"
  10. android:required="false" />
  11. </application>

将这些依赖项添加到您的build.gradle:

  1. implementation 'org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2'
  2. implementation 'org.tensorflow:tensorflow-lite-gpu:2.8.0'
  3. implementation 'org.tensorflow:tensorflow-lite-support:0.1.0'
  4. implementation 'org.tensorflow:tensorflow-lite-task-vision:0.1.0'
  5. implementation 'org.tensorflow:tensorflow-lite-task-text:0.1.0'
展开查看全部

相关问题