Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

İOS'ta ML Kit ile Yüzleri Algılama

Görüntülerdeki ve videolardaki yüzleri algılamak için ML Kit'i kullanabilirsiniz.

Sen başlamadan önce

  1. Uygulamanıza daha önce Firebase eklemediyseniz, başlangıç kılavuzundaki adımları uygulayarak bunu yapın.
  2. Pod Kitinize ML Kit kitaplıklarını ekleyin:
    pod 'Firebase/MLVision', '6.25.0'
    # If you want to detect face contours (landmark detection and classification
    # don't require this additional model):
    pod 'Firebase/MLVisionFaceModel', '6.25.0'
    
    Projenizin .xcworkspace yükledikten veya güncelledikten sonra, Xcode projenizi .xcworkspace kullanarak açtığınızdan emin olun.
  3. Uygulamanızda Firebase'i içe aktarın:

    hızlı

    import Firebase

    Objective-C

    @import Firebase;

Giriş resmi yönergeleri

ML Kit'in yüzleri doğru bir şekilde algılaması için, giriş görüntüleri yeterli piksel verisi ile temsil edilen yüzler içermelidir. Genel olarak, bir görüntüde algılamak istediğiniz her yüz en az 100x100 piksel olmalıdır. Yüzlerin konturlarını tespit etmek istiyorsanız, ML Kit daha yüksek çözünürlüklü giriş gerektirir: her yüz en az 200x200 piksel olmalıdır.

Gerçek zamanlı bir uygulamada yüzleri tespit ediyorsanız, giriş görüntülerinin toplam boyutlarını da dikkate almak isteyebilirsiniz. Daha küçük görüntüler daha hızlı işlenebilir, bu nedenle gecikmeyi azaltmak, daha düşük çözünürlüklerde görüntü yakalamak (yukarıdaki doğruluk gereksinimlerini aklınızda tutarak) ve konunun yüzünün mümkün olduğunca fazla görüntüyü kaplamasını sağlayın. Ayrıca, gerçek zamanlı performansı artırmaya yönelik ipuçlarına bakın.

Kötü görüntü odaklama hassasiyeti bozabilir. Kabul edilebilir sonuçlar almıyorsanız kullanıcıdan kullanıcıdan görüntüyü yeniden yakalamasını isteyin.

Bir yüzün kameraya göre yönlendirilmesi, ML Kit'in tespit ettiği yüz özelliklerini de etkileyebilir. Bkz. Yüz Algılama Kavramları .

1. Yüz detektörünü yapılandırın

Bir görüntüye yüz tanıma uygulamadan önce, yüz algılayıcının varsayılan ayarlarından herhangi birini değiştirmek isterseniz, bu ayarları bir VisionFaceDetectorOptions nesnesiyle belirtin. Aşağıdaki ayarları değiştirebilirsiniz:

Ayarlar
performanceMode fast (varsayılan) | accurate

Yüzleri tespit ederken hız veya doğruluktan yararlanın.

landmarkMode none (varsayılan) | all

Algılanan tüm yüzlerin yüz "simgelerini" (gözler, kulaklar, burun, yanaklar, ağız) tespit etmeye çalışıp çalışmadığı.

contourMode none (varsayılan) | all

Yüz özelliklerinin konturlarını tespit edip etmeme. Konturlar görüntüdeki en belirgin yüz için algılanır.

classificationMode none (varsayılan) | all

Yüzleri "gülümsemek" ve "gözler açık" gibi kategorilere ayırıp ayırmamak.

minFaceSize CGFloat (varsayılan: 0.1 )

Algılanacak yüzlerin görüntüye göre minimum boyutu.

isTrackingEnabled false (varsayılan) | true

Yüzlerin atanıp atanmayacağı, görüntülerdeki yüzleri izlemek için kullanılabilecek bir kimlikle karşı karşıyadır.

Kontur algılama etkinleştirildiğinde, yalnızca bir yüz algılandığından, yüz izleme yararlı 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 VisionFaceDetectorOptions nesnesi oluşturun:

hızlı

// High-accuracy landmark detection and face classification
let options = VisionFaceDetectorOptions()
options.performanceMode = .accurate
options.landmarkMode = .all
options.classificationMode = .all

// Real-time contour detection of multiple faces
let options = VisionFaceDetectorOptions()
options.contourMode = .all

Objective-C

// High-accuracy landmark detection and face classification
FIRVisionFaceDetectorOptions *options = [[FIRVisionFaceDetectorOptions alloc] init];
options.performanceMode = FIRVisionFaceDetectorPerformanceModeAccurate;
options.landmarkMode = FIRVisionFaceDetectorLandmarkModeAll;
options.classificationMode = FIRVisionFaceDetectorClassificationModeAll;

// Real-time contour detection of multiple faces
FIRVisionFaceDetectorOptions *options = [[FIRVisionFaceDetectorOptions alloc] init];
options.contourMode = FIRVisionFaceDetectorContourModeAll;

2. Yüz detektörünü çalıştırın

Görüntüdeki yüzleri algılamak için görüntüyü UIImage veya CMSampleBufferRef olarak VisionFaceDetector detect(in:) yöntemine VisionFaceDetector :

  1. VisionFaceDetector örneğini alın:

    hızlı

    lazy var vision = Vision.vision()
    
    let faceDetector = vision.faceDetector(options: options)
    

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionFaceDetector *faceDetector = [vision faceDetector];
    // Or, to change the default settings:
    // FIRVisionFaceDetector *faceDetector =
    //     [vision faceDetectorWithOptions:options];
    
  2. UIImage veya CMSampleBufferRef kullanarak bir VisionImage nesnesi oluşturun.

    Bir UIImage kullanmak için:

    1. Gerekirse onun böylece görüntüyü döndürmek imageOrientation özelliktir .up .
    2. Bir oluşturun VisionImage doğru-döndürülmüş kullanarak nesneyi UIImage . Herhangi bir döndürme meta verisi belirtmeyin; varsayılan değer olan .topLeft kullanılmalıdır.

      hızlı

      let image = VisionImage(image: uiImage)

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    Bir CMSampleBufferRef kullanmak için:

    1. CMSampleBufferRef arabelleğinde bulunan görüntü verilerinin yönünü belirten bir VisionImageMetadata nesnesi oluşturun.

      Görüntü yönlendirmesini almak için:

      hızlı

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Objective-C

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      Ardından, meta veri nesnesini oluşturun:

      hızlı

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Objective-C

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. CMSampleBufferRef nesnesini ve döndürme meta verilerini kullanarak bir VisionImage nesnesi oluşturun:

      hızlı

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Ardından, görüntüyü detect(in:) yöntemine iletin:

    hızlı

    faceDetector.process(visionImage) { faces, error in
      guard error == nil, let faces = faces, !faces.isEmpty else {
        // ...
        return
      }
    
      // Faces detected
      // ...
    }
    

    Objective-C

    [faceDetector detectInImage:image
                     completion:^(NSArray<FIRVisionFace *> *faces,
                                  NSError *error) {
      if (error != nil) {
        return;
      } else if (faces != nil) {
        // Recognized faces
      }
    }];
    

3. Algılanan yüzler hakkında bilgi alın

Yüz algılama işlemi başarılı olursa, yüz dedektörü tamamlama işleyicisine bir dizi VisionFace nesnesi VisionFace . Her VisionFace nesnesi görüntüde algılanan bir yüzü temsil eder. Her yüz için, sınırlayıcı koordinatlarını giriş görüntüsünde ve yüz dedektörünü bulmak için yapılandırdığınız diğer tüm bilgileri alabilirsiniz. Örneğin:

hızlı

for face in faces {
  let frame = face.frame
  if face.hasHeadEulerAngleY {
    let rotY = face.headEulerAngleY  // Head is rotated to the right rotY degrees
  }
  if face.hasHeadEulerAngleZ {
    let rotZ = face.headEulerAngleZ  // Head is rotated upward 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 (FIRVisionFace *face in faces) {
  // Boundaries of face in image
  CGRect frame = face.frame;

  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):
  FIRVisionFaceLandmark *leftEar = [face landmarkOfType:FIRFaceLandmarkTypeLeftEar];
  if (leftEar != nil) {
    FIRVisionPoint *leftEarPosition = leftEar.position;
  }

  // If contour detection was enabled:
  FIRVisionFaceContour *upperLipBottomContour = [face contourOfType:FIRFaceContourTypeUpperLipBottom];
  if (upperLipBottomContour != nil) {
    NSArray<FIRVisionPoint *> *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ına örnek

Yüz kontur algılamasını etkinleştirdiğinizde, algılanan her yüz özelliği için bir puan 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ına Genel Bakış konusuna bakın.

Aşağıdaki resim, bu noktaların bir yüzle nasıl eşleştiğini gösterir (büyütmek için resme tıklayın):

Gerçek zamanlı yüz algılama

Yüz algılamayı gerçek zamanlı bir uygulamada kullanmak istiyorsanız, en iyi kareleri elde etmek için aşağıdaki yönergeleri izleyin:

  • Yüz detektörünü yüz kontur algılama veya sınıflandırma ve yer işareti algılama kullanacak şekilde yapılandırın , ancak her ikisini birden kullanmayın:

    Kontur algılama
    Landmark algılama
    sınıflandırma
    Landmark algılama ve sınıflandırma
    Kontur algılama ve yer işareti algılama
    Kontur algılama ve sınıflandırma
    Kontur algılama, yer işareti algılama ve sınıflandırma

  • fast modu etkinleştir (varsayılan olarak etkindir).

  • Daha düşük çözünürlükte görüntü yakalamayı düşünün. Ancak, bu API'nın resim boyutu gereksinimlerini de unutmayın.

  • Gaz dedektörü çağırır. Dedektör çalışırken yeni bir video karesi çıkarsa, kareyi bırakın.
  • Giriş görüntüsünde grafikleri bindirmek için dedektör çıkışını kullanıyorsanız, önce ML Kit'ten sonucu alın, ardından görüntüyü ve bindirmeyi tek bir adımda oluşturun. Böylece, her giriş çerçevesi için ekran yüzeyine yalnızca bir kez render işlemi yaparsınız. Örnek için showcase örnek uygulamasındaki previewOverlayView ve FIRDetectionOverlayView sınıflarına bakın.