google-ai-edge / mediapipe-samples

Apache License 2.0
1.56k stars 407 forks source link

Crash of PoseLandmarker example on Samsung Galaxy S7 Tablet #322

Open mgarbade opened 7 months ago

mgarbade commented 7 months ago

Just checking out the current master: 0fc6e2b809b13b7cb1de1792288409624f5f6007

And trying to run it on my Samsung Galaxy S7 Tablet, gives me the following error:

2024-03-05 17:17:56.865 23156-23239 native                  com...apipe.examples.poselandmarker  I  I20240305 17:17:56.865583 23239 gl_context.cc:342] GL version: 3.2 (OpenGL ES 3.2 V@0502.0 (GIT@193b2ee, I593c16c433, 1633593732) (Date:10/07/21)), renderer: Adreno (TM) 650
2024-03-05 17:17:56.866 23156-23231 tflite                  com...apipe.examples.poselandmarker  I  Initialized TensorFlow Lite runtime.
2024-03-05 17:17:56.868 23156-23231 libc                    com...apipe.examples.poselandmarker  E  Access denied finding property "ro.mediatek.platform"
2024-03-05 17:17:56.868 23156-23156 ViewRootIm...nActivity] com...apipe.examples.poselandmarker  I  [DP] dp(1) 1 android.view.ViewRootImpl.reportNextDraw:11261 android.view.ViewRootImpl.performTraversals:4088 android.view.ViewRootImpl.doTraversal:2832 
2024-03-05 17:17:56.870 23156-23231 tflite                  com...apipe.examples.poselandmarker  I  Created TensorFlow Lite XNNPACK delegate for CPU.
2024-03-05 17:17:56.891 23156-23192 BufferQueueProducer     com...apipe.examples.poselandmarker  I  [ViewRootImpl@2b919ca[MainActivity]#0(BLAST Consumer)0](id:5a7400000000,api:1,p:23156,c:23156) queueBuffer: queued for the first time.
2024-03-05 17:17:56.894 23156-23192 OpenGLRenderer          com...apipe.examples.poselandmarker  D  GPIS:: SetUp Pid : 23156    Tid : 23192
2024-03-05 17:17:56.896 23156-23156 ViewRootIm...nActivity] com...apipe.examples.poselandmarker  I  [DP] pdf(0) 1 android.view.ViewRootImpl.lambda$createFrameCompleteCallback$3$ViewRootImpl:4846 android.view.ViewRootImpl$$ExternalSyntheticLambda15.run:6 android.os.Handler.handleCallback:938 
2024-03-05 17:17:56.896 23156-23156 ViewRootIm...nActivity] com...apipe.examples.poselandmarker  I  [DP] rdf()
2024-03-05 17:17:56.897 23156-23156 ViewRootIm...nActivity] com...apipe.examples.poselandmarker  D  reportDrawFinished (fn: -1) 
2024-03-05 17:17:56.913 23156-23156 AndroidRuntime          com...apipe.examples.poselandmarker  D  Shutting down VM
2024-03-05 17:17:56.916 23156-23156 AndroidRuntime          com...apipe.examples.poselandmarker  E  FATAL EXCEPTION: main
                                                                                                    Process: com.google.mediapipe.examples.poselandmarker, PID: 23156
                                                                                                    kotlin.UninitializedPropertyAccessException: lateinit property poseLandmarkerHelper has not been initialized
                                                                                                        at com.google.mediapipe.examples.poselandmarker.fragment.CameraFragment$initBottomSheetControls$8.onItemSelected(CameraFragment.kt:256)
                                                                                                        at android.widget.AdapterView.fireOnSelected(AdapterView.java:1397)
                                                                                                        at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:1386)
                                                                                                        at android.widget.AdapterView.access$300(AdapterView.java:61)
                                                                                                        at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:1344)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:938)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:226)
                                                                                                        at android.os.Looper.loop(Looper.java:313)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8633)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)

Any idea how to fix this?

mgarbade commented 7 months ago

Seems to be a problem with the asynchronous initialization. This code replacement fixes the issue for me:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    // Initialize our background executor
    backgroundExecutor = Executors.newSingleThreadExecutor()

    // Initialize the PoseLandmarkerHelper here synchronously, before any background task starts.
    poseLandmarkerHelper = initializePoseLandmarkerHelper()

    // Wait for the views to be properly laid out
    fragmentCameraBinding.viewFinder.post {
        // Set up the camera and its use cases
        setUpCamera()
    }

    // Attach listeners to UI control widgets
    initBottomSheetControls()
}

private fun initializePoseLandmarkerHelper(): PoseLandmarkerHelper {
    // This initialization could still fail if the context or viewModel properties
    // are not ready. This method assumes they are initialized before calling.
    return PoseLandmarkerHelper(
        context = requireContext(),
        runningMode = RunningMode.LIVE_STREAM,
        minPoseDetectionConfidence = viewModel.currentMinPoseDetectionConfidence,
        minPoseTrackingConfidence = viewModel.currentMinPoseTrackingConfidence,
        minPosePresenceConfidence = viewModel.currentMinPosePresenceConfidence,
        currentDelegate = viewModel.currentDelegate,
        poseLandmarkerHelperListener = this
    ).also {
        // Setup or any initial processing required immediately after creation.
        it.setupPoseLandmarker()
    }
}
Trenton-Ruf commented 2 months ago

Pixel 8 Pro Master https://github.com/google-ai-edge/mediapipe-samples/commit/a07683d41766c702502549e361641598bfa85214

I was having the same issue as @mgarbade. The proposed fix also worked for me.