iOS'te Makine Öğrenimi Kiti ile Yüzleri Algılama

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

Başlamadan önce

  1. Firebase'i uygulamanıza henüz eklemediyseniz başlangıç kılavuzundaki adımlara bakın.
  2. ML Kit kitaplıklarını Podfile'ınıza 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 kapsüllerini yükledikten veya güncelledikten sonra Xcode .xcworkspace kullanarak projenize dahil olabilir.
  3. Uygulamanızda Firebase'i içe aktarın:

    Swift

    import Firebase

    Objective-C

    @import Firebase;

Giriş resmi kuralları

ML Kit'in yüzleri doğru algılayabilmesi için giriş görüntülerinin yüzler içermesi gerekir temsil edilir. Genel olarak, görmek istediğiniz her yüz en az 100x100 piksel boyutunda olmalıdır. Belirli bir aktiviteyi Yüzlerin sınırları, makine öğrenimi kiti için daha yüksek çözünürlük girişi gerekir: her yüz en az 200x200 piksel olmalıdır.

Gerçek zamanlı bir uygulamada yüzleri algılıyorsanız giriş resimlerinin genel boyutlarını göz önünde bulundurun. Daha küçük resimler daha hızlı işlenir. Bu nedenle, gecikmeyi azaltmak için görüntüleri düşük çözünürlüklerde yakalayın. (yukarıdaki doğruluk şartlarını göz önünde bulundurarak) ve öznenin yüzü resmin olabildiğince büyük kısmını kaplar. Şunlara da bakabilirsiniz: Gerçek zamanlı performansı iyileştirmeye yönelik ipuçları.

Kötü bir resim odağı, doğruluğu azaltabilir. Kabul edilebilir sonuçlar alamıyorsanız kullanıcıdan resmi yeniden çekmesini istemeyi deneyin.

Bir yüzün kameraya göre yönü hangi yüzün üzerinde etkili olabilir Makine Öğrenimi Kiti'nin algıladığı özellikler. Görüntüleyin Yüz Algılama Kavramlar.

1. Yüz algılayıcıyı yapılandırma

Bir resme yüz algılama özelliğini uygulamadan önce, yüz dedektörünün varsayılan ayarlarını seçtikten sonra, bu ayarları VisionFaceDetectorOptions nesnesini tanımlayın. Şunları değiştirebilirsiniz: şu ayarlar:

Ayarlar
performanceMode fast (varsayılan) | accurate

Yüzleri algılarken hızı veya doğruluğu tercih edin.

landmarkMode none (varsayılan) | all

Yüzdeki "önemli noktaları" tespit etmeye çalışıp çalışmadığı kulak, burun, yanaklar, ağız.

contourMode none (varsayılan) | all

Yüz özelliklerinin konturlarının algılanıp algılanmayacağı. Kontürler bir görüntüdeki yalnızca en belirgin yüz için algılandı.

classificationMode none (varsayılan) | all

Yüzlerin "gülümseyen", ve "gözler açık" gibi.

minFaceSize CGFloat (varsayılan: 0.1)

Algılanacak yüzlerin resme göre minimum boyutu.

isTrackingEnabled false (varsayılan) | true

Aşağıdakileri izlemek için kullanılabilecek bir kimlik atanıp atanmayacağı görüntüler.

Kontür algılama etkinleştirildiğinde yalnızca bir yüzün bu yüzden yüz izleme faydalı sonuçlar üretmez. Bunun için algılama hızını artırmak için iki konturu da etkinleştirmeyin ve özellikleri bulunuyor.

Örneğin, bir VisionFaceDetectorOptions aşağıdaki örneklerden birine benzer:

Swift

// 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 algılayıcıyı çalıştırın

Bir resimdeki yüzleri algılamak için resmi UIImage veya CMSampleBufferRef - VisionFaceDetector detect(in:) yöntem:

  1. VisionFaceDetector öğesinin bir örneğini alın:

    Swift

    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. Bir VisionImage nesnesi oluşturmak için UIImage veya CMSampleBufferRef.

    UIImage kullanmak için:

    1. Gerekirse resmi, imageOrientation özellik değeri .up.
    2. Doğru şekilde döndürülen öğeyi kullanarak bir VisionImage nesnesi oluşturun UIImage. Herhangi bir rotasyon meta verisi belirtme (varsayılan) değeri (.topLeft) kullanılmalıdır.

      Swift

      let image = VisionImage(image: uiImage)

      Objective-C

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

    CMSampleBufferRef kullanmak için:

    1. Aşağıdakini belirten bir VisionImageMetadata nesnesi oluşturun: içerdiği resim verilerinin yönü CMSampleBufferRef arabellek.

      Resmin yönünü öğrenmek için:

      Swift

      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:

      Swift

      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. Şunu kullanarak bir VisionImage nesnesi oluşturun: CMSampleBufferRef nesnesi ve rotasyon meta verileri:

      Swift

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

      Objective-C

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

    Swift

    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

Yüz algılama işlemi başarılı olursa yüz dedektörü bir diziyi iletir Tamamlama işleyiciye VisionFace nesne. Her biri VisionFace nesnesi, resimde algılanan bir yüzü temsil eder. Örneğin, her bir yüzeyin sınırlayıcı koordinatlarını giriş görüntüsünde alabilirsiniz. Ayrıca, yüz dedektörünü bulacağı şekilde yapılandırdığınız diğer tüm bilgiler. Örneğin:

Swift

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 kontur örneği

Yüz kontur algılamayı etkinleştirdiğinizde, yüz konturu algılamayı etkinleştirdiğinizde Algılanan her yüz özelliği. Bu noktalar, noktanın şeklini özelliğini kullanabilirsiniz. Yüze bakın Kontürlerin nasıl göründüğüyle ilgili ayrıntılar için Algılama Kavramlarına Genel Bakış temsil edilir.

Aşağıdaki resimde bu noktaların bir yüzle nasıl eşlendiği gösterilmektedir ( büyütmek için resmi kullanabilirsiniz):

Gerçek zamanlı yüz algılama

Yüz algılamayı gerçek zamanlı bir uygulamada kullanmak istiyorsanız şuradaki talimatları uygulayın: talimatları uygulayın:

  • Aşağıdakilerden birini kullanmak için yüz algılayıcıyı yapılandırın yalnızca yüz kontur algılama veya sınıflandırma ve önemli nokta algılama özellikleri kullanılabilir.

    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ırma

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

  • Görüntüleri daha düşük çözünürlükte çekmeyi düşünün. Ancak unutmayın, resim boyutu şartlarına tabidir.

  • Algılayıcıya yapılan çağrıları hızlandırın. Yeni bir video karesi kullanılabilir durumdaysa çerçeveyi bırakın.
  • Algılayıcının çıkışını üzerine grafik yerleştirmek için kullanıyorsanız giriş görüntüsünü kullanın, önce ML Kit'ten sonucu alın ve ardından görüntüyü oluşturun tek bir adımda yapabilirsiniz. Bu şekilde, öğeleri ekran yüzeyinde her giriş karesi için yalnızca bir kez. Bkz. previewOverlayView ve FIRDetectionOverlayView sınıfları inceleyelim.