इमेज और वीडियो में चेहरों की पहचान करने के लिए, एमएल किट का इस्तेमाल किया जा सकता है.
इसे आज़माएं
- सैंपल वाले ऐप्लिकेशन को इस्तेमाल करके देखें, इस एपीआई के इस्तेमाल का एक उदाहरण देखें.
- कोडलैब (कोड बनाना सीखना).
शुरू करने से पहले
- अपनी Podfile में, नीचे दिए गए ML Kit पॉड शामिल करें:
pod 'GoogleMLKit/FaceDetection', '3.2.0'
- अपने प्रोजेक्ट के Pods को इंस्टॉल या अपडेट करने के बाद, इसके
.xcworkspace
. ML Kit, Xcode के 12.4 या इसके बाद के वर्शन पर काम करता है.
इनपुट इमेज के लिए दिशा-निर्देश
चेहरा पहचानने के लिए, आपको कम से कम 480x360 पिक्सेल के आयाम वाली इमेज का उपयोग करना चाहिए. एमएल किट में चेहरों की सटीक पहचान हो, इसके लिए इनपुट इमेज में चेहरे होने चाहिए जिन्हें काफ़ी पिक्सल डेटा से दिखाया जाता है. आम तौर पर, आपके हिसाब से बनाया गया हर चेहरा ताकि इमेज कम से कम 100x100 पिक्सल की हो. अगर आपको यह पता लगाना है कि चेहरों की बनावट, ML किट में हाई रिज़ॉल्यूशन इनपुट की ज़रूरत होती है: हर एक चेहरे यह कम से कम 200x200 पिक्सल का होना चाहिए.
अगर आपको रीयल-टाइम ऐप्लिकेशन में चेहरों का पता चलता है, तो आपको इनपुट इमेज के कुल डाइमेंशन पर विचार किया जा सकता है. छोटी इमेज तेज़ी से प्रोसेस होते हैं, इसलिए इंतज़ार का समय कम करने के लिए, इमेज को कम रिज़ॉल्यूशन में कैप्चर करें, को ध्यान में रखें और पक्का करें कि सब्जेक्ट का चेहरा, इमेज के ज़्यादातर हिस्से को घेर लेता है. यह भी देखें रीयल-टाइम में परफ़ॉर्मेंस को बेहतर बनाने के बारे में सलाह.
खराब इमेज फ़ोकस की वजह से भी सटीक जानकारी पर असर पड़ सकता है. मंज़ूरी न मिलने पर नतीजे के तौर पर, उपयोगकर्ता से इमेज को दोबारा कैप्चर करने के लिए कहें.
कैमरे के हिसाब से किसी चेहरे का ओरिएंटेशन इस बात पर भी असर डाल सकता है कि चेहरे की ML Kit की मदद से पता लगाना. यहां जाएं: चेहरे की पहचान के कॉन्सेप्ट.
1. चेहरे की पहचान करने वाली सुविधा को कॉन्फ़िगर करें
किसी इमेज पर चेहरे की पहचान करने वाली सुविधा लागू करने से पहले, अगर आप फ़ेस डिटेक्टर की डिफ़ॉल्ट सेटिंग का इस्तेमाल करती है, तोFaceDetectorOptions
ऑब्जेक्ट. इसे बदला जा सकता है
निम्न सेटिंग:
सेटिंग | |
---|---|
performanceMode |
fast (डिफ़ॉल्ट) | accurate
चेहरे की पहचान करते समय गति या सटीक जानकारी दें. |
landmarkMode |
none (डिफ़ॉल्ट) | all
क्या चेहरे के "लैंडमार्क" को पहचानने की कोशिश करनी है—आंखों, पहचान किए गए सभी चेहरों के कान, नाक, गाल, मुंह. |
contourMode |
none (डिफ़ॉल्ट) | all
चेहरे की बनावट का पता लगाना है या नहीं. कंटूर यह हैं जो किसी इमेज में सिर्फ़ सबसे साफ़ तौर पर दिखने वाले चेहरे के लिए पहचानी जाती है. |
classificationMode |
none (डिफ़ॉल्ट) | all
"मुस्कुराते हुए" जैसी कैटगरी में चेहरों को कैटगरी में बांटना है या नहीं और "आंखें खुली हों". |
minFaceSize |
CGFloat (डिफ़ॉल्ट: 0.1 )
चेहरे का सबसे छोटा आकार सेट करता है, जिसे सिर की चौड़ाई से इमेज की चौड़ाई. |
isTrackingEnabled |
false (डिफ़ॉल्ट) | true
चेहरों को कोई आईडी असाइन करें या नहीं, जिसका इस्तेमाल ट्रैक करने के लिए किया जा सकता है भी मिलते हैं. ध्यान दें कि जब कंटूर पहचान सक्षम हो, तो केवल एक ही चेहरा चेहरा ट्रैक करने की सुविधा से काम के नतीजे नहीं मिलते. इसके लिए और जांच की स्पीड को बेहतर बनाने के लिए, दोनों कंटूर को चालू न करें की सुविधा दी जाती है. |
उदाहरण के लिए, FaceDetectorOptions
बनाएं
ऑब्जेक्ट सबमिट करते हैं, जैसा कि नीचे दिए गए उदाहरणों में बताया गया है:
Swift
// High-accuracy landmark detection and face classification let options = FaceDetectorOptions() options.performanceMode = .accurate options.landmarkMode = .all options.classificationMode = .all // Real-time contour detection of multiple faces // options.contourMode = .all
Objective-C
// High-accuracy landmark detection and face classification MLKFaceDetectorOptions *options = [[MLKFaceDetectorOptions alloc] init]; options.performanceMode = MLKFaceDetectorPerformanceModeAccurate; options.landmarkMode = MLKFaceDetectorLandmarkModeAll; options.classificationMode = MLKFaceDetectorClassificationModeAll; // Real-time contour detection of multiple faces // options.contourMode = MLKFaceDetectorContourModeAll;
2. इनपुट इमेज तैयार करें
किसी इमेज में चेहरों का पता लगाने के लिए, इमेज कोUIImage
या
CMSampleBufferRef
से FaceDetector
तक में से किसी एक का इस्तेमाल करके
process(_:completion:)
या results(in:)
तरीका:
एक VisionImage
ऑब्जेक्ट को UIImage
या
CMSampleBuffer
.
अगर UIImage
का इस्तेमाल किया जाता है, तो यह तरीका अपनाएं:
UIImage
के साथ एकVisionImage
ऑब्जेक्ट बनाएं. पक्का करें कि आपने सही.orientation
तय किया हो.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
अगर CMSampleBuffer
का इस्तेमाल किया जाता है, तो यह तरीका अपनाएं:
-
इसमें शामिल इमेज डेटा का ओरिएंटेशन तय करें
CMSampleBuffer
.इमेज का ओरिएंटेशन पाने के लिए:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Objective-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
- इसका इस्तेमाल करके एक
VisionImage
ऑब्जेक्ट बनाएंCMSampleBuffer
ऑब्जेक्ट और ओरिएंटेशन:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3. FaceDetector का इंस्टेंस पाएं
FaceDetector
का इंस्टेंस पाएं:
Swift
let faceDetector = FaceDetector.faceDetector(options: options)
Objective-C
MLKFaceDetector *faceDetector = [MLKFaceDetector faceDetectorWithOptions:options];
4. इमेज प्रोसेस करें
इसके बाद,process()
तरीके से इमेज पास करें:
Swift
weak var weakSelf = self faceDetector.process(visionImage) { faces, error in guard let strongSelf = weakSelf else { print("Self is nil!") return } guard error == nil, let faces = faces, !faces.isEmpty else { // ... return } // Faces detected // ... }
Objective-C
[faceDetector processImage:image completion:^(NSArray<MLKFace *> *faces, NSError *error) { if (error != nil) { return; } if (faces.count > 0) { // Recognized faces } }];
5. पहचाने गए चेहरों की जानकारी पाएं
अगर चेहरे की पहचान करने की कार्रवाई पूरी हो जाती है, तो चेहरे की पहचान करने वाला डिवाइस एक अरे को पास कर देता है में सेFace
ऑब्जेक्ट को पूरा करने वाले हैंडलर में. हर
Face
ऑब्जेक्ट, इमेज में मिले चेहरे को दिखाता है. इसके लिए
हैं, तो आपको इनपुट इमेज में इसके बाउंडिंग कोऑर्डिनेट मिल सकते हैं. साथ ही,
कोई और जानकारी जिसे आपने ढूंढने के लिए फ़ेस डिटेक्टर कॉन्फ़िगर किया था. उदाहरण के लिए:
Swift
for face in faces { let frame = face.frame if face.hasHeadEulerAngleX { let rotX = face.headEulerAngleX // Head is rotated to the uptoward rotX degrees } if face.hasHeadEulerAngleY { let rotY = face.headEulerAngleY // Head is rotated to the right rotY degrees } if face.hasHeadEulerAngleZ { let rotZ = face.headEulerAngleZ // Head is tilted sideways rotZ degrees } // If landmark detection was enabled (mouth, ears, eyes, cheeks, and // nose available): if let leftEye = face.landmark(ofType: .leftEye) { let leftEyePosition = leftEye.position } // If contour detection was enabled: if let leftEyeContour = face.contour(ofType: .leftEye) { let leftEyePoints = leftEyeContour.points } if let upperLipBottomContour = face.contour(ofType: .upperLipBottom) { let upperLipBottomPoints = upperLipBottomContour.points } // If classification was enabled: if face.hasSmilingProbability { let smileProb = face.smilingProbability } if face.hasRightEyeOpenProbability { let rightEyeOpenProb = face.rightEyeOpenProbability } // If face tracking was enabled: if face.hasTrackingID { let trackingId = face.trackingID } }
Objective-C
for (MLKFace *face in faces) { // Boundaries of face in image CGRect frame = face.frame; if (face.hasHeadEulerAngleX) { CGFloat rotX = face.headEulerAngleX; // Head is rotated to the upward rotX degrees } if (face.hasHeadEulerAngleY) { CGFloat rotY = face.headEulerAngleY; // Head is rotated to the right rotY degrees } if (face.hasHeadEulerAngleZ) { CGFloat rotZ = face.headEulerAngleZ; // Head is tilted sideways rotZ degrees } // If landmark detection was enabled (mouth, ears, eyes, cheeks, and // nose available): MLKFaceLandmark *leftEar = [face landmarkOfType:FIRFaceLandmarkTypeLeftEar]; if (leftEar != nil) { MLKVisionPoint *leftEarPosition = leftEar.position; } // If contour detection was enabled: MLKFaceContour *upperLipBottomContour = [face contourOfType:FIRFaceContourTypeUpperLipBottom]; if (upperLipBottomContour != nil) { NSArray<MLKVisionPoint *> *upperLipBottomPoints = upperLipBottomContour.points; if (upperLipBottomPoints.count > 0) { NSLog("Detected the bottom contour of the subject's upper lip.") } } // If classification was enabled: if (face.hasSmilingProbability) { CGFloat smileProb = face.smilingProbability; } if (face.hasRightEyeOpenProbability) { CGFloat rightEyeOpenProb = face.rightEyeOpenProbability; } // If face tracking was enabled: if (face.hasTrackingID) { NSInteger trackingID = face.trackingID; } }
चेहरे की बनावट के उदाहरण
चेहरे की बनावट की पहचान करने वाली सुविधा चालू होने पर, आपको हर चेहरे की पहचान कर ली गई थी. ये बिंदु दिखाते हैं कि सुविधा. चेहरा देखें कंटूर के तरीके के बारे में जानने के लिए, डिटेक्शन कॉन्सेप्ट बताया गया है.
निम्न चित्र दिखाता है कि ये बिंदु किसी चेहरे से कैसे मैप होते हैं, इमेज को बड़ा करने के लिए:
रीयल-टाइम में चेहरे की पहचान करने की सुविधा
अगर आपको रीयल-टाइम ऐप्लिकेशन में चेहरे की पहचान करने की सुविधा का इस्तेमाल करना है, तो इन निर्देशों का पालन करें सबसे सही फ़्रेमरेट हासिल करने के लिए दिशा-निर्देश:
इनमें से किसी एक का इस्तेमाल करने के लिए, फ़ेस डिटेक्टर को कॉन्फ़िगर करें चेहरे की बनावट की पहचान करने या क्लासिफ़िकेशन और लैंडमार्क की पहचान करने के लिए किया जा सकता है, लेकिन दोनों नहीं:
कंटूर की पहचान
लैंडमार्क की पहचान
क्लासिफ़िकेशन
लैंडमार्क की पहचान करना और उसे अलग-अलग कैटगरी में बांटना
कंटूर की पहचान और लैंडमार्क की पहचान
कंटूर की पहचान और क्लासिफ़िकेशन
कंटूर की पहचान, लैंडमार्क की पहचान, और क्लासिफ़िकेशनfast
मोड चालू करें (डिफ़ॉल्ट रूप से चालू रहता है).कम रिज़ॉल्यूशन वाली इमेज कैप्चर करें. हालांकि, यह भी ध्यान रखें कि इस एपीआई की इमेज डाइमेंशन से जुड़ी ज़रूरी शर्तें.
- वीडियो फ़्रेम प्रोसेस करने के लिए, डिटेक्टर के
results(in:)
सिंक्रोनस एपीआई का इस्तेमाल करें. कॉल करेंAVCaptureVideoDataOutputSampleBufferDelegate
काcaptureOutput(_, didOutput:from:)
फ़ंक्शन का इस्तेमाल, दिए गए वीडियो से सिंक्रोनस रूप से नतीजे पाने के लिए किया जाता है फ़्रेम. रखेंAVCaptureVideoDataOutput
का डिटेक्टर को कॉल थ्रॉटल करने के लिए,alwaysDiscardsLateVideoFrames
कोtrue
के तौर पर सबमिट किया है. अगर नए डिटेक्टर के चलने के दौरान वीडियो फ़्रेम उपलब्ध हो जाता है. उसे छोड़ दिया जाएगा. - अगर ग्राफ़िक ओवरले करने के लिए डिटेक्टर के आउटपुट का इस्तेमाल किया जाता है, तो इनपुट इमेज को चुनने के बाद, पहले एमएल किट से नतीजा पाएं. इसके बाद, इमेज को रेंडर करें और ओवरले को एक ही चरण में पूरा करें. ऐसा करके, डिसप्ले सरफ़ेस पर रेंडर हो जाता है प्रोसेस किए गए हर इनपुट फ़्रेम के लिए, सिर्फ़ एक बार. updatePreviewOverlayViewWithLastFrame देखें उदाहरण के लिए, एमएल किट क्विकस्टार्ट सैंपल में.