Resimler ve videolardaki yüzleri algılamak için ML Kit'i kullanabilirsiniz.
Deneyin
- Bu API'nin örnek kullanımını görmek için örnek uygulamayla denemeler yapın.
- Kodu codelab ile kendiniz deneyin.
Başlamadan önce
- Aşağıdaki ML Kit kapsüllerini Podfile dosyanıza ekleyin:
pod 'GoogleMLKit/FaceDetection', '3.2.0'
- Projenizin Kapsüllerini yükledikten veya güncelledikten sonra,
.xcworkspace
kodunu kullanarak Xcode projenizi açın. ML Kit, Xcode'un 12.4 veya sonraki sürümlerinde desteklenir.
Giriş resmi yönergeleri
Yüz tanıma için, en az 480x360 piksel boyutunda bir resim kullanmanız gerekir. ML Kit'in yüzleri doğru şekilde algılaması için giriş resimleri yeterli piksel verisi tarafından temsil edilen yüzler içermelidir. Genel olarak, bir resimde tespit etmek istediğiniz her yüz en az 100x100 piksel olmalıdır. Yüzlerin kıvrımlarını tespit etmek istiyorsanız ML Kit'in daha yüksek çözünürlüklü girişi gerekir: Her yüzü en az 200x200 piksel olmalıdır.
Yüzleri gerçek zamanlı bir uygulamada algılıyorsanız giriş resimlerinin genel boyutlarını da dikkate almak isteyebilirsiniz. Küçük resimler daha hızlı işlenebilir. Bu nedenle, gecikmeyi azaltmak için görüntüleri daha düşük çözünürlüklerde yakalayın. Ancak yukarıdaki doğruluk koşullarını göz önünde bulundurun ve öznenin yüzünün resmin mümkün olduğunca fazla yer kaplamasını sağlayın. Ayrıca gerçek zamanlı performansı artırmak için ipuçlarına bakın.
Düşük resim odağı da doğruluğu etkileyebilir. Kabul edilebilir sonuçlar alamazsanız kullanıcıdan resmi yeniden yakalamasını isteyin.
Bir yüzün kameraya göre yönü de ML Kit'in algıladığı yüz özelliklerini etkileyebilir. Yüz Algılama Kavramları sayfasını inceleyin.
1. Yüz algılayıcıyı yapılandırma
Bir resme yüz algılama uygulamadan önce, yüz algılayıcının varsayılan ayarlarından birini değiştirmek isterseniz bu ayarları birFaceDetectorOptions
nesnesiyle belirtin. Aşağıdaki ayarları değiştirebilirsiniz:
Ayarlar | |
---|---|
performanceMode |
fast (varsayılan) | accurate
Yüzleri algılarken hızı veya doğruluğu tercih edin. |
landmarkMode |
none (varsayılan) | all
Algılanan tüm yüzlerin "yer işaretleri"ni (gözler, kulaklar, burun, yanak, ağız) tespit etmeye çalışın. |
contourMode |
none (varsayılan) | all
Yüz özelliklerinin konturlarının algılanıp algılanmayacağı. Konturlar, yalnızca görüntülerdeki en belirgin yüzler için algılanır. |
classificationMode |
none (varsayılan) | all
Yüzlerin "gülümseyen" ve "gözler açık" gibi kategorilerde sınıflandırılması gerekip gerekmediği. |
minFaceSize |
CGFloat (varsayılan: 0.1 )
Kafanın genişliğinin resmin genişliğine oranı olarak, istenen en küçük yüz boyutunu ayarlar. |
isTrackingEnabled |
false (varsayılan) | true
Yüzlere, bir kimlik atanıp atanmayacağı, resimlerdeki yüzleri izlemek için kullanılabilir. Kontur algılama etkinleştirildiğinde yalnızca bir yüz algılandığı için yüz izleme faydalı sonuçlar vermez. Bu nedenle ve algılama hızını artırmak için hem kontur algılamayı hem de yüz izlemeyi etkinleştirmeyin. |
Örneğin, aşağıdaki örneklerden biri gibi bir FaceDetectorOptions
nesnesi oluşturun:
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. Giriş resmini hazırlayın
Bir görüntüdeki yüzleri algılamak içinprocess(_:completion:)
veya results(in:)
yöntemini kullanarak resmi UIImage
veya CMSampleBufferRef
olarak FaceDetector
ile paylaşın:
UIImage
veya CMSampleBuffer
kullanarak bir VisionImage
nesnesi oluşturun.
UIImage
kullanıyorsanız şu adımları uygulayın:
UIImage
ile birVisionImage
nesnesi oluşturun. Doğru.orientation
'u belirttiğinizden emin olun.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
CMSampleBuffer
kullanıyorsanız şu adımları uygulayın:
-
CMSampleBuffer
içinde yer alan resim verilerinin yönünü belirtin.Resmin yönünü ayarlamak için:
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; } }
CMSampleBuffer
nesnesini ve yönünü kullanarakVisionImage
nesnesi oluşturun: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 örneğini alma
FaceDetector
örneğini alın:
Swift
let faceDetector = FaceDetector.faceDetector(options: options)
Objective-C
MLKFaceDetector *faceDetector = [MLKFaceDetector faceDetectorWithOptions:options];
4. Resmi işleyin
Ardından, resmiprocess()
yöntemine geçirin:
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. Algılanan yüzler hakkında bilgi alın
Yüz algılama işlemi başarılı olursa yüz algılayıcı, tamamlama işleyicisine bir diziFace
nesnesi iletir. Her Face
nesnesi, resimde algılanan bir yüzü temsil eder. Her yüz için sınırlayıcı koordinatlarını, giriş resminde ve yüz algılayıcısını bulacak şekilde yapılandırdığınız diğer tüm bilgilerde görebilirsiniz. Örneğin:
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; } }
Yüz konturları örneği
Yüz konturu algılamayı algıladığınızda, algılanan her yüz özelliği için bir nokta listesi alırsınız. Bu noktalar özelliğin şeklini temsil eder. Konturların nasıl temsil edildiğiyle ilgili ayrıntılar için Yüz Algılama Kavramları bölümüne göz atın.
Aşağıdaki resimde bu noktaların bir yüzle nasıl eşleştiği gösterilmektedir. Büyütmek için resmi tıklayın:
Gerçek zamanlı yüz algılama
Yüz algılamayı gerçek zamanlı bir uygulamada kullanmak istiyorsanız en iyi kare hızlarına ulaşmak için şu yönergeleri uygulayın:
Yüz algılamayı, yüz konturu algılama veya sınıflandırma ve önemli nokta algılama özelliklerini kullanacak şekilde yapılandırın. İkisini birden kullanmayın:
Kontur algılama
Önemli nokta algılama
Sınıflandırma
Önemli nokta algılama ve sınıflandırma
Kontur algılama ve önemli nokta algılama
Kontur algılama ve sınıflandırma
Kontur algılama, önemli nokta algılama ve sınıflandırmafast
modunu etkinleştirin (varsayılan olarak etkindir).Resimleri daha düşük çözünürlükte çekmeyi düşünebilirsiniz. Ancak, bu API'nin resim boyutu gereksinimlerini de unutmayın.
- Video çerçevelerini işlemek için algılayıcının
results(in:)
eşzamanlı API'sini kullanın. Belirtilen video çerçevesinden eşzamanlı olarak sonuç almak içinAVCaptureVideoDataOutputSampleBufferDelegate
captureOutput(_, didOutput:from:)
işlevinden bu yöntemi çağırın. Algılayıcının çağrılarını kısmak içinAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
değerinitrue
olarak tutun. Algılayıcı çalışırken yeni bir video çerçevesi kullanılabilir hale gelirse atlanır. - Algılayıcının çıkışını giriş resmine yer paylaşımlı olarak eklemek için kullanıyorsanız önce ML Kit'ten sonucu alın, ardından resmi ve yer paylaşımını tek bir adımda oluşturun. Bu şekilde, her bir işlenmiş giriş çerçevesi için ekranı yalnızca bir kez oluşturursunuz. Örnek için ML Kit hızlı başlangıç örneğindeki updatepreviewOverlayViewWithLastFrame konusuna bakın.