Skip to content

Commit f07b875

Browse files
authored
IOS face landmarker add choose delegate (#361)
1 parent 2a712f8 commit f07b875

File tree

10 files changed

+145
-25
lines changed

10 files changed

+145
-25
lines changed

examples/face_landmarker/ios/FaceLandmarker/Base.lproj/Main.storyboard

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="52l-qN-uG0">
2+
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="52l-qN-uG0">
33
<device id="retina6_12" orientation="portrait" appearance="light"/>
44
<dependencies>
55
<deployment identifier="iOS"/>
6-
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
6+
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
77
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
88
<capability name="System colors in document resources" minToolsVersion="11.0"/>
9+
<capability name="UIMenu" message="Requires Xcode 11 or later." minToolsVersion="11.0" requiredIntegratedClassName="UICommandDiff"/>
910
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
1011
</dependencies>
1112
<scenes>
@@ -260,6 +261,44 @@
260261
<nil key="textColor"/>
261262
<nil key="highlightedColor"/>
262263
</label>
264+
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ncO-a4-P4g">
265+
<rect key="frame" x="0.0" y="264.66666666666669" width="393" height="32"/>
266+
<subviews>
267+
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Delegate" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nzM-Za-BTW">
268+
<rect key="frame" x="16" y="7.3333333333333144" width="58" height="17"/>
269+
<fontDescription key="fontDescription" type="system" pointSize="14"/>
270+
<nil key="textColor"/>
271+
<nil key="highlightedColor"/>
272+
</label>
273+
<button opaque="NO" contentMode="scaleToFill" showsMenuAsPrimaryAction="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="K43-wJ-xI8">
274+
<rect key="frame" x="353" y="0.0" width="24" height="32"/>
275+
<color key="backgroundColor" red="0.0" green="0.49803921569999998" blue="0.5450980392" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
276+
<constraints>
277+
<constraint firstAttribute="height" constant="32" id="XCw-VM-RIa"/>
278+
</constraints>
279+
<color key="tintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
280+
<menu key="menu" id="k0Y-Uu-EyI">
281+
<children>
282+
<command title="item1" id="nLW-62-17q"/>
283+
<command title="item2" id="YS2-JJ-5o6"/>
284+
</children>
285+
</menu>
286+
<buttonConfiguration key="configuration" style="plain"/>
287+
<userDefinedRuntimeAttributes>
288+
<userDefinedRuntimeAttribute type="string" keyPath="layer.cornerRadius" value="8"/>
289+
</userDefinedRuntimeAttributes>
290+
</button>
291+
</subviews>
292+
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
293+
<constraints>
294+
<constraint firstItem="K43-wJ-xI8" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="nzM-Za-BTW" secondAttribute="trailing" id="Bin-ou-0gP"/>
295+
<constraint firstItem="nzM-Za-BTW" firstAttribute="leading" secondItem="ncO-a4-P4g" secondAttribute="leading" constant="16" id="OcI-fm-9xd"/>
296+
<constraint firstAttribute="bottom" secondItem="K43-wJ-xI8" secondAttribute="bottom" id="Spr-hh-Lxt"/>
297+
<constraint firstItem="nzM-Za-BTW" firstAttribute="centerY" secondItem="K43-wJ-xI8" secondAttribute="centerY" id="WqV-2b-QKs"/>
298+
<constraint firstItem="K43-wJ-xI8" firstAttribute="top" secondItem="ncO-a4-P4g" secondAttribute="top" id="soh-79-j1x"/>
299+
<constraint firstAttribute="trailing" secondItem="K43-wJ-xI8" secondAttribute="trailing" constant="16" id="zFi-Xg-zDM"/>
300+
</constraints>
301+
</view>
263302
</subviews>
264303
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
265304
<constraints>
@@ -268,6 +307,7 @@
268307
<constraint firstItem="1fr-hY-4II" firstAttribute="trailing" secondItem="0nH-Zx-p69" secondAttribute="trailing" id="5T6-MD-Uko"/>
269308
<constraint firstAttribute="trailing" secondItem="0nH-Zx-p69" secondAttribute="trailing" constant="16" id="5xr-fC-LfQ"/>
270309
<constraint firstItem="jCg-YX-6ga" firstAttribute="leading" secondItem="iaZ-s2-My0" secondAttribute="leading" id="6kr-Ui-TIb"/>
310+
<constraint firstItem="ncO-a4-P4g" firstAttribute="leading" secondItem="AOI-Gh-SLK" secondAttribute="leading" id="7L8-t4-1uR"/>
271311
<constraint firstItem="jCg-YX-6ga" firstAttribute="centerY" secondItem="tad-jn-O5U" secondAttribute="centerY" id="9dd-nl-UN1"/>
272312
<constraint firstItem="0nH-Zx-p69" firstAttribute="leading" secondItem="s05-yK-gXh" secondAttribute="trailing" constant="4" id="Bda-ye-Je2"/>
273313
<constraint firstItem="J1Y-43-5yW" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="06h-cY-2bs" secondAttribute="trailing" id="GMM-8D-3Gb"/>
@@ -297,7 +337,9 @@
297337
<constraint firstItem="iaZ-s2-My0" firstAttribute="top" secondItem="d2C-9O-82c" secondAttribute="bottom" constant="26" id="pPe-bR-0qO"/>
298338
<constraint firstItem="0Hl-aV-l7w" firstAttribute="top" secondItem="AOI-Gh-SLK" secondAttribute="top" id="rl8-eu-Q06"/>
299339
<constraint firstItem="tad-jn-O5U" firstAttribute="leading" secondItem="ME8-eS-OTB" secondAttribute="trailing" constant="4" id="txK-t9-38i"/>
340+
<constraint firstAttribute="trailing" secondItem="ncO-a4-P4g" secondAttribute="trailing" id="uFa-hO-jLo"/>
300341
<constraint firstItem="dzb-pb-2Oi" firstAttribute="leading" secondItem="iaZ-s2-My0" secondAttribute="leading" id="uPl-xe-HGE"/>
342+
<constraint firstItem="ncO-a4-P4g" firstAttribute="top" secondItem="tad-jn-O5U" secondAttribute="bottom" constant="12" id="uuD-Lq-tTO"/>
301343
<constraint firstItem="1fr-hY-4II" firstAttribute="centerY" secondItem="06h-cY-2bs" secondAttribute="centerY" id="whL-o0-qmm"/>
302344
<constraint firstAttribute="trailing" secondItem="tZo-oH-ToE" secondAttribute="trailing" id="xSe-Ss-8WB"/>
303345
<constraint firstItem="tZo-oH-ToE" firstAttribute="top" secondItem="AOI-Gh-SLK" secondAttribute="top" id="yoR-Hn-w9J"/>
@@ -316,6 +358,7 @@
316358
</view>
317359
<navigationItem key="navigationItem" id="BIS-1q-gQH"/>
318360
<connections>
361+
<outlet property="chooseDelegateButton" destination="K43-wJ-xI8" id="vHs-yd-RCg"/>
319362
<outlet property="inferenceTimeLabel" destination="cRO-ho-FXh" id="E3e-km-74r"/>
320363
<outlet property="inferenceTimeNameLabel" destination="d2C-9O-82c" id="O7p-Pr-lsE"/>
321364
<outlet property="minFaceDetectionConfidenceStepper" destination="0nH-Zx-p69" id="UPk-Tc-SO0"/>

examples/face_landmarker/ios/FaceLandmarker/Configurations/DefaultConstants.swift

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import Foundation
1616
import UIKit
17+
import MediaPipeTasksVision
1718

1819
// MARK: Define default constants
1920
struct DefaultConstants {
@@ -35,4 +36,41 @@ struct DefaultConstants {
3536
static var minFacePresenceConfidence: Float = 0.5
3637
static var minTrackingConfidence: Float = 0.5
3738
static let modelPath: String? = Bundle.main.path(forResource: "face_landmarker", ofType: "task")
39+
static let delegate: FaceLandmarkerDelegate = .CPU
3840
}
41+
42+
// MARK: FaceLandmarkerDelegate
43+
enum FaceLandmarkerDelegate: CaseIterable {
44+
case GPU
45+
case CPU
46+
47+
var name: String {
48+
switch self {
49+
case .GPU:
50+
return "GPU"
51+
case .CPU:
52+
return "CPU"
53+
}
54+
}
55+
56+
var delegate: Delegate {
57+
switch self {
58+
case .GPU:
59+
return .GPU
60+
case .CPU:
61+
return .CPU
62+
}
63+
}
64+
65+
init?(name: String) {
66+
switch name {
67+
case FaceLandmarkerDelegate.CPU.name:
68+
self = FaceLandmarkerDelegate.CPU
69+
case FaceLandmarkerDelegate.GPU.name:
70+
self = FaceLandmarkerDelegate.GPU
71+
default:
72+
return nil
73+
}
74+
}
75+
}
76+

examples/face_landmarker/ios/FaceLandmarker/Configurations/InferenceConfigurationManager.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ class InferenceConfigurationManager: NSObject {
3838
didSet { postConfigChangedNotification() }
3939
}
4040

41+
var delegate: FaceLandmarkerDelegate = DefaultConstants.delegate {
42+
didSet { postConfigChangedNotification() }
43+
}
44+
4145
static let sharedInstance = InferenceConfigurationManager()
4246

4347
static let notificationName = Notification.Name.init(rawValue: "com.google.mediapipe.inferenceConfigChanged")
@@ -46,5 +50,4 @@ class InferenceConfigurationManager: NSObject {
4650
NotificationCenter.default
4751
.post(name: InferenceConfigurationManager.notificationName, object: nil)
4852
}
49-
5053
}

examples/face_landmarker/ios/FaceLandmarker/Services/FaceLandmarkerService.swift

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,26 @@ class FaceLandmarkerService: NSObject {
4848
private var minFaceDetectionConfidence: Float
4949
private var minFacePresenceConfidence: Float
5050
private var minTrackingConfidence: Float
51-
var modelPath: String
51+
private var modelPath: String
52+
private var delegate: FaceLandmarkerDelegate
53+
5254

5355
// MARK: - Custom Initializer
5456
private init?(modelPath: String?,
5557
runningMode:RunningMode,
5658
numFaces: Int,
5759
minFaceDetectionConfidence: Float,
5860
minFacePresenceConfidence: Float,
59-
minTrackingConfidence: Float) {
61+
minTrackingConfidence: Float,
62+
delegate: FaceLandmarkerDelegate) {
6063
guard let modelPath = modelPath else { return nil }
6164
self.modelPath = modelPath
6265
self.runningMode = runningMode
6366
self.numFaces = numFaces
6467
self.minFaceDetectionConfidence = minFaceDetectionConfidence
6568
self.minFacePresenceConfidence = minFacePresenceConfidence
6669
self.minTrackingConfidence = minTrackingConfidence
70+
self.delegate = delegate
6771
super.init()
6872

6973
createFaceLandmarker()
@@ -77,6 +81,7 @@ class FaceLandmarkerService: NSObject {
7781
faceLandmarkerOptions.minFacePresenceConfidence = minFacePresenceConfidence
7882
faceLandmarkerOptions.minTrackingConfidence = minTrackingConfidence
7983
faceLandmarkerOptions.baseOptions.modelAssetPath = modelPath
84+
faceLandmarkerOptions.baseOptions.delegate = delegate.delegate
8085
if runningMode == .liveStream {
8186
faceLandmarkerOptions.faceLandmarkerLiveStreamDelegate = self
8287
}
@@ -95,14 +100,16 @@ class FaceLandmarkerService: NSObject {
95100
minFaceDetectionConfidence: Float,
96101
minFacePresenceConfidence: Float,
97102
minTrackingConfidence: Float,
98-
videoDelegate: FaceLandmarkerServiceVideoDelegate?) -> FaceLandmarkerService? {
103+
videoDelegate: FaceLandmarkerServiceVideoDelegate?,
104+
delegate: FaceLandmarkerDelegate) -> FaceLandmarkerService? {
99105
let faceLandmarkerService = FaceLandmarkerService(
100106
modelPath: modelPath,
101107
runningMode: .video,
102108
numFaces: numFaces,
103109
minFaceDetectionConfidence: minFaceDetectionConfidence,
104110
minFacePresenceConfidence: minFacePresenceConfidence,
105-
minTrackingConfidence: minTrackingConfidence)
111+
minTrackingConfidence: minTrackingConfidence,
112+
delegate: delegate)
106113
faceLandmarkerService?.videoDelegate = videoDelegate
107114
return faceLandmarkerService
108115
}
@@ -113,14 +120,16 @@ class FaceLandmarkerService: NSObject {
113120
minFaceDetectionConfidence: Float,
114121
minFacePresenceConfidence: Float,
115122
minTrackingConfidence: Float,
116-
liveStreamDelegate: FaceLandmarkerServiceLiveStreamDelegate?) -> FaceLandmarkerService? {
123+
liveStreamDelegate: FaceLandmarkerServiceLiveStreamDelegate?,
124+
delegate: FaceLandmarkerDelegate) -> FaceLandmarkerService? {
117125
let faceLandmarkerService = FaceLandmarkerService(
118126
modelPath: modelPath,
119127
runningMode: .liveStream,
120128
numFaces: numFaces,
121129
minFaceDetectionConfidence: minFaceDetectionConfidence,
122130
minFacePresenceConfidence: minFacePresenceConfidence,
123-
minTrackingConfidence: minTrackingConfidence)
131+
minTrackingConfidence: minTrackingConfidence,
132+
delegate: delegate)
124133
faceLandmarkerService?.liveStreamDelegate = liveStreamDelegate
125134

126135
return faceLandmarkerService
@@ -131,14 +140,16 @@ class FaceLandmarkerService: NSObject {
131140
numFaces: Int,
132141
minFaceDetectionConfidence: Float,
133142
minFacePresenceConfidence: Float,
134-
minTrackingConfidence: Float) -> FaceLandmarkerService? {
143+
minTrackingConfidence: Float,
144+
delegate: FaceLandmarkerDelegate) -> FaceLandmarkerService? {
135145
let faceLandmarkerService = FaceLandmarkerService(
136146
modelPath: modelPath,
137147
runningMode: .image,
138148
numFaces: numFaces,
139149
minFaceDetectionConfidence: minFaceDetectionConfidence,
140150
minFacePresenceConfidence: minFacePresenceConfidence,
141-
minTrackingConfidence: minTrackingConfidence)
151+
minTrackingConfidence: minTrackingConfidence,
152+
delegate: delegate)
142153

143154
return faceLandmarkerService
144155
}

examples/face_landmarker/ios/FaceLandmarker/ViewContoller/BottomSheetViewController.swift

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class BottomSheetViewController: UIViewController {
4444
@IBOutlet weak var minTrackingConfidenceValueLabel: UILabel!
4545

4646
@IBOutlet weak var toggleBottomSheetButton: UIButton!
47+
@IBOutlet weak var chooseDelegateButton: UIButton!
4748

4849
// MARK: Instance Variables
4950
var isUIEnabled: Bool = false {
@@ -77,8 +78,29 @@ class BottomSheetViewController: UIViewController {
7778

7879
minTrackingConfidenceStepper.value = Double(InferenceConfigurationManager.sharedInstance.minTrackingConfidence)
7980
minTrackingConfidenceValueLabel.text = "\(InferenceConfigurationManager.sharedInstance.minTrackingConfidence)"
81+
82+
// Chose delegate option
83+
let selectedDelegateAction = {(action: UIAction) in
84+
self.updateDelegate(title: action.title)
85+
}
86+
let delegateActions: [UIAction] = FaceLandmarkerDelegate.allCases.compactMap { delegate in
87+
return UIAction(
88+
title: delegate.name,
89+
state: (InferenceConfigurationManager.sharedInstance.delegate == delegate) ? .on : .off,
90+
handler: selectedDelegateAction
91+
)
92+
}
93+
94+
chooseDelegateButton.menu = UIMenu(children: delegateActions)
95+
chooseDelegateButton.showsMenuAsPrimaryAction = true
96+
chooseDelegateButton.changesSelectionAsPrimaryAction = true
8097
}
81-
98+
99+
private func updateDelegate(title: String) {
100+
guard let delegate = FaceLandmarkerDelegate(name: title) else { return }
101+
InferenceConfigurationManager.sharedInstance.delegate = delegate
102+
}
103+
82104
private func enableOrDisableClicks() {
83105
numFacesStepper.isEnabled = isUIEnabled
84106
minFaceDetectionConfidenceStepper.isEnabled = isUIEnabled

examples/face_landmarker/ios/FaceLandmarker/ViewContoller/CameraViewController.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ class CameraViewController: UIViewController {
155155
minFaceDetectionConfidence: InferenceConfigurationManager.sharedInstance.minFaceDetectionConfidence,
156156
minFacePresenceConfidence: InferenceConfigurationManager.sharedInstance.minFacePresenceConfidence,
157157
minTrackingConfidence: InferenceConfigurationManager.sharedInstance.minTrackingConfidence,
158-
liveStreamDelegate: self)
158+
liveStreamDelegate: self,
159+
delegate: InferenceConfigurationManager.sharedInstance.delegate)
159160
}
160161

161162
private func clearFaceLandmarkerServiceOnSessionInterruption() {

examples/face_landmarker/ios/FaceLandmarker/ViewContoller/MediaLibraryViewController.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,15 +300,17 @@ extension MediaLibraryViewController: UIImagePickerControllerDelegate, UINavigat
300300
numFaces: InferenceConfigurationManager.sharedInstance.numFaces,
301301
minFaceDetectionConfidence: InferenceConfigurationManager.sharedInstance.minFaceDetectionConfidence,
302302
minFacePresenceConfidence: InferenceConfigurationManager.sharedInstance.minFacePresenceConfidence,
303-
minTrackingConfidence: InferenceConfigurationManager.sharedInstance.minTrackingConfidence)
303+
minTrackingConfidence: InferenceConfigurationManager.sharedInstance.minTrackingConfidence,
304+
delegate: InferenceConfigurationManager.sharedInstance.delegate)
304305
case .video:
305306
faceLandmarkerService = FaceLandmarkerService.videoFaceLandmarkerService(
306307
modelPath: InferenceConfigurationManager.sharedInstance.modelPath,
307308
numFaces: InferenceConfigurationManager.sharedInstance.numFaces,
308309
minFaceDetectionConfidence: InferenceConfigurationManager.sharedInstance.minFaceDetectionConfidence,
309310
minFacePresenceConfidence: InferenceConfigurationManager.sharedInstance.minFacePresenceConfidence,
310311
minTrackingConfidence: InferenceConfigurationManager.sharedInstance.minTrackingConfidence,
311-
videoDelegate: self)
312+
videoDelegate: self,
313+
delegate: InferenceConfigurationManager.sharedInstance.delegate)
312314
default:
313315
break;
314316
}

examples/face_landmarker/ios/FaceLandmarker/ViewContoller/RootViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class RootViewController: UIViewController {
3535

3636
// MARK: Constants
3737
private struct Constants {
38-
static let inferenceBottomHeight = 260.0
38+
static let inferenceBottomHeight = 304.0
3939
static let expandButtonHeight = 41.0
4040
static let expandButtonTopSpace = 10.0
4141
static let mediaLibraryViewControllerStoryBoardId = "MEDIA_LIBRARY_VIEW_CONTROLLER"

examples/face_landmarker/ios/Podfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ target 'FaceLandmarker' do
55
# Comment the next line if you don't want to use dynamic frameworks
66
use_frameworks!
77

8-
pod 'MediaPipeTasksVision', '0.10.5'
8+
pod 'MediaPipeTasksVision', '0.10.12'
99

1010
end
1111

0 commit comments

Comments
 (0)