mediapipe icon indicating copy to clipboard operation
mediapipe copied to clipboard

Using two iOS frameworks in one app

Open ozgurshn opened this issue 4 years ago • 4 comments

System information

  • OS Platform and Distribution: iOS 14.5
  • Compiler version (e.g. gcc/g++ 8 /Apple clang version 12.0.0):
  • Programming Language and version ( e.g. C++ 14, Python 3.6, Java ):
  • Installed using virtualenv? pip? Conda? (if python):
  • MediaPipe version:
  • Bazel version: 3.7.2
  • XCode and Tulsi versions (if iOS): Xcode 12.5.1

Describe the problem: I built iOS frameworks for Hand and Full Range Face Detection models. When I try to use these two framework in the app, I got the following error. What's the right way to use two different models in iOS app? Note: I don't need to run the two models simultaneously.

objc[12033]: Class CaptureDelegate is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4760) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774628). One of the two will be used. Which one is undefined.
objc[12033]: Class CvAbstractCamera is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac47b0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774678). One of the two will be used. Which one is undefined.
objc[12033]: Class CvPhotoCamera is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4800) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x1037746c8). One of the two will be used. Which one is undefined.
objc[12033]: Class CvVideoCamera is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4850) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774718). One of the two will be used. Which one is undefined.
objc[12033]: Class AppDelegate is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4968) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x1037747e0). One of the two will be used. Which one is undefined.
objc[12033]: Class CommonViewController is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4990) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774808). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPCameraInputSource is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac49e0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774858). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPDisplayLinkWeakTarget is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4a30) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x1037748a8). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPInputSource is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4aa8) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774920). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPPlayerInputSource is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4ad0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774948). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPLayerRenderer is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4b20) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774998). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPGLViewRenderer is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4b70) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x1037749e8). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPGraph is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4bc0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774a38). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPTimestampConverter is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4c10) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774a88). One of the two will be used. Which one is undefined.
objc[12033]: Class GUSUtilStatusWrapper is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4c60) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774ad8). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPGraphGPUData is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4cb0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774b28). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPMetalHelper is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4e40) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774b78). One of the two will be used. Which one is undefined.
objc[12033]: Class MPPMetalUtil is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4df0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774bc8). One of the two will be used. Which one is undefined.
objc[12033]: Class TFLBufferConvert is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4d00) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774c18). One of the two will be used. Which one is undefined.

ozgurshn avatar Aug 04 '21 12:08 ozgurshn

Hi @ozgurshn, Could you please provide the steps to reproduce the above observation. Thanks!

sgowroji avatar Aug 05 '21 03:08 sgowroji

Hi @sgowroji, by the way I don't use holistic model because app should be able to detect landmarks when only hand is visible, I guess holistic model first run pose detector to detect human body pose. Here are the steps to reproduce: For the hand model, I use these files to build the iOS framework, and put them handtracker folder in ios folder https://github.com/ozgurshn/TestHandModel Build using this command bazel build -c opt --config=ios_arm64 mediapipe/examples/ios/handtracker:HandTracker

For the face model, I use these files and put them faceTracker folder in ios folder https://github.com/ozgurshn/TestMediaPipeFaceModel Build using this command bazel build -c opt --config=ios_arm64 faceTracker:FaceTracker Drag-drop the frameworks to new Xcode project. Select the project in Xcode, In general/frameworks tab select embed&sign for each framework. Create bridging header and import

#import <HandTracker/HandTracker.h>
#import <FaceTracker/FaceTracker.h>

in view controller, create instances of this classes

  lazy var faceTracker: FaceTracker = FaceTracker()
  lazy var handTracker: HandTracker = HandTracker()

In viewdidload() start camera and then start graphs for each model

faceTracker.startGraph()
faceTracker.delegate = self
handTracker.startGraph()
handTracker.delegate = self

and in captureOutput pass the pixelBuffer to models

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
      let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
      faceTracker.processVideoFrame(pixelBuffer)
      handTracker.processVideoFrame(pixelBuffer)
}

Import delegate functions

extension ViewController : TrackerDelegate
{

  func handTracker(_ handTracker: HandTracker!, didOutputLandmarks landmarks: [Landmark]!)  {
  }
  func handTracker(_ handTracker: HandTracker!, didOutputPixelBuffer pixelBuffer: CVPixelBuffer!) {

  }
}

extension ViewController:FaceTrackerDelegate
{
  func faceTracker(_ faceTracker: FaceTracker!, didOutputLandmarks faceArray: [Any]!) {
    print(faceArray.debugDescription)
  }

  func faceTracker(_ faceTracker: FaceTracker!, didOutputPixelBuffer pixelBuffer: CVPixelBuffer!) {

  }
}

I uploaded sample project here containing two frameworks and running code https://github.com/ozgurshn/HandAndFaceTrackerMediaPipe

Update: This could be related to this bug

ozgurshn avatar Aug 05 '21 08:08 ozgurshn

Reassign to the MediaPipe iOS owner.

jiuqiant avatar Aug 24 '21 21:08 jiuqiant

hey, any updates on how to approach this?

shrey-rootally avatar Jul 29 '22 23:07 shrey-rootally

Hi @ozgurshn , Are you still looking for the resolution on this issue.

sureshdagooglecom avatar Sep 23 '22 05:09 sureshdagooglecom

Hi @sureshdagooglecom, it's expired for me, not looking for a solution anymore

ozgurshn avatar Sep 23 '22 15:09 ozgurshn

Hi @ozgurshn, The iOS builder is only designed to support a single iOS file per application. If you have successfully linked two solutions in a single library, we can consider some instructions for other users. Thank you!

kuaashish avatar Nov 08 '22 09:11 kuaashish

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you.

google-ml-butler[bot] avatar Nov 17 '22 06:11 google-ml-butler[bot]

Closing as stale. Please reopen if you'd like to work on this further.

google-ml-butler[bot] avatar Nov 24 '22 06:11 google-ml-butler[bot]

Are you satisfied with the resolution of your issue? Yes No

google-ml-butler[bot] avatar Nov 24 '22 06:11 google-ml-butler[bot]

hello, I'm trried to fine the answer, I imported the two mediapipe Framework in Xcode and got an error.

objc[12033]: Class CaptureDelegate is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4760) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774628). One of the two will be used. Which one is undefined. objc[12033]: Class CvAbstractCamera is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac47b0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774678). One of the two will be used. Which one is undefined. objc[12033]: Class CvPhotoCamera is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4800) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x1037746c8). One of the two will be used. Which one is undefined. objc[12033]: Class CvVideoCamera is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4850) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774718). One of the two will be used. Which one is undefined. objc[12033]: Class AppDelegate is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4968) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x1037747e0). One of the two will be used. Which one is undefined. objc[12033]: Class CommonViewController is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4990) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774808). One of the two will be used. Which one is undefined. objc[12033]: Class MPPCameraInputSource is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac49e0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774858). One of the two will be used. Which one is undefined. objc[12033]: Class MPPDisplayLinkWeakTarget is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4a30) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x1037748a8). One of the two will be used. Which one is undefined. objc[12033]: Class MPPInputSource is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4aa8) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774920). One of the two will be used. Which one is undefined. objc[12033]: Class MPPPlayerInputSource is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4ad0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774948). One of the two will be used. Which one is undefined. objc[12033]: Class MPPLayerRenderer is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4b20) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774998). One of the two will be used. Which one is undefined. objc[12033]: Class MPPGLViewRenderer is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4b70) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x1037749e8). One of the two will be used. Which one is undefined. objc[12033]: Class MPPGraph is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4bc0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774a38). One of the two will be used. Which one is undefined. objc[12033]: Class MPPTimestampConverter is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4c10) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774a88). One of the two will be used. Which one is undefined. objc[12033]: Class GUSUtilStatusWrapper is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4c60) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774ad8). One of the two will be used. Which one is undefined. objc[12033]: Class MPPGraphGPUData is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4cb0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774b28). One of the two will be used. Which one is undefined. objc[12033]: Class MPPMetalHelper is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4e40) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774b78). One of the two will be used. Which one is undefined. objc[12033]: Class MPPMetalUtil is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4df0) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774bc8). One of the two will be used. Which one is undefined. objc[12033]: Class TFLBufferConvert is implemented in both /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/HandTracker.framework/HandTracker (0x104ac4d00) and /private/var/containers/Bundle/Application/81F99537-3832-4F0D-A242-23371470AD83/DiamondTest.app/Frameworks/FaceTrackerFullRange.framework/FaceTrackerFullRange (0x103774c18). One of the two will be used. Which one is undefined.

Epoch2022-iOS avatar Dec 06 '22 08:12 Epoch2022-iOS

pls. help me... I will pay for your kind!

Epoch2022-iOS avatar Dec 06 '22 08:12 Epoch2022-iOS

@ozgurshn @Epoch2022-iOS, were you able to solve this issue?

rhytam avatar Apr 04 '24 09:04 rhytam