mediapipe
mediapipe copied to clipboard
Using two iOS frameworks in one app
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.
Hi @ozgurshn, Could you please provide the steps to reproduce the above observation. Thanks!
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
Reassign to the MediaPipe iOS owner.
hey, any updates on how to approach this?
Hi @ozgurshn , Are you still looking for the resolution on this issue.
Hi @sureshdagooglecom, it's expired for me, not looking for a solution anymore
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!
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.
Closing as stale. Please reopen if you'd like to work on this further.
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.
pls. help me... I will pay for your kind!
@ozgurshn @Epoch2022-iOS, were you able to solve this issue?