-
Notifications
You must be signed in to change notification settings - Fork 0
/
SharedFaceDetection.swift
63 lines (52 loc) · 1.92 KB
/
SharedFaceDetection.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//
// SharedFaceDetection.swift
// LivelinessFaceDetection
//
// Created by Izaan Saleem on 05/12/2023.
//
import Foundation
import MLKitVision
import MLKitFaceDetection
import AVFoundation
import CoreMedia
class SharedFaceDetection {
static let shared = SharedFaceDetection()
var faceDetector: FaceDetector?
var options = FaceDetectorOptions()
func setupFaceDetection() {
// High-accuracy landmark detection and face classification
self.options.performanceMode = .fast
self.options.landmarkMode = .all
self.options.classificationMode = .all
self.options.minFaceSize = CGFloat(0.1)
// Real-time contour detection of multiple faces
// options.contourMode = .all
self.faceDetector = FaceDetector.faceDetector(options: self.options)
}
func predictUsingVision(pixelBuffer: CVPixelBuffer, completion: @escaping(_ face: [Face],_ pickedImage: UIImage) -> Void) {
let ciimage: CIImage = CIImage(cvImageBuffer: pixelBuffer)
let ciContext = CIContext()
guard let cgImage: CGImage = ciContext.createCGImage(ciimage, from: ciimage.extent) else {
// end of measure
return
}
let uiImage: UIImage = UIImage(cgImage: cgImage)
// predict!
self.detectFace(uiImage) { face, pickedImage in
completion(face, pickedImage)
}
}
func detectFace(_ pickedImage: UIImage, completion: @escaping(_ face: [Face],_ pickedImage: UIImage) -> Void) {
let visionImage = VisionImage (image: pickedImage)
self.faceDetector?.process (visionImage) { faces, error in
guard let faces = faces,
!faces.isEmpty,
faces.count >= 1,
let face = faces.first
else {
return
}
completion([face], pickedImage)
}
}
}