Android için yüz algılama rehberi

MediaPipe Yüz Algılama görevi, bir resim veya videodaki yüzleri algılamanıza olanak tanır. Bir karedeki yüzleri ve yüz özelliklerini bulmak için bu görevi kullanabilirsiniz. Bu görevde, tek resimlerle veya sürekli bir resim akışıyla çalışan bir makine öğrenimi (ML) modeli kullanılır. Görev, yüz konumlarının yanı sıra aşağıdaki yüz kilit noktalarını da döndürür: sol göz, sağ göz, burun ucu, ağız, sol göz tragusu ve sağ göz tragusu.

Bu talimatlarda açıklanan kod örneğini GitHub'da bulabilirsiniz. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel bakış bölümüne bakın.

Kod örneği

MediaPipe Tasks örnek kodu, Android için bir Yüz Algılama uygulamasının basit bir uygulamasıdır. Bu örnekte, kesintisiz bir video akışında yüzleri algılamak için fiziksel bir Android cihazdaki kamera kullanılmaktadır. Uygulama, cihaz galerisindeki resim ve videolardaki yüzleri de algılayabilir.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken referans olarak kullanabilirsiniz. Yüz Tanıyıcı örnek kodu GitHub'da barındırılır.

Kodu indirme

Aşağıdaki talimatlarda, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasının nasıl oluşturulacağı gösterilmektedir.

Örnek kodu indirmek için:

  1. Aşağıdaki komutu kullanarak git deposunu klonlayın:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. İsteğe bağlı olarak git örneğinizi, yalnızca Yüz Tanıyıcı örnek uygulamasının dosyalarını içerecek şekilde seyrek kontrol kullanacak şekilde yapılandırın:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_detector/android
    

Örnek kodun yerel bir sürümünü oluşturduktan sonra projeyi Android Studio'ya aktarabilir ve uygulamayı çalıştırabilirsiniz. Talimatlar için Android için Kurulum Kılavuzu'na bakın.

Temel bileşenler

Aşağıdaki dosyalar, bu yüz algılama örnek uygulamasının önemli kodunu içerir:

  • FaceDetectorHelper.kt: Yüz algılayıcıyı başlatır, modeli ve temsilci seçimini yönetir.
  • CameraFragment.kt: Cihaz kamerasını yönetir ve resim ile video giriş verilerini işler.
  • GalleryFragment.kt: Çıkıştaki resmi veya videoyu görüntülemek için OverlayView ile etkileşim kurar.
  • OverlayView.kt: Algılanan yüzler için ekranı sınır kutularıyla uygular.

Kurulum

Bu bölümde, geliştirme ortamınızı ve kod projelerinizi özellikle Yüz Tanıyıcı'yı kullanacak şekilde ayarlamayla ilgili temel adımlar açıklanmaktadır. Platform sürümü gereksinimleri dahil olmak üzere, geliştirme ortamınızı MediaPipe görevlerini kullanmak için ayarlama hakkında genel bilgi için Android için kurulum kılavuzu başlıklı makaleyi inceleyin.

Bağımlılıklar

Yüz algılama görevi, com.google.mediapipe:tasks-visionkitaplığını kullanır. Bu bağımlılık, Android uygulamanızın build.gradle dosyasına eklenmelidir:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

Model

MediaPipe Yüz Algılama görevi, bu görevle uyumlu eğitilmiş bir model paketi gerektirir. Yüz algılayıcı için kullanılabilen eğitilmiş modeller hakkında daha fazla bilgi edinmek istiyorsanız göreve genel bakıştaki Modeller bölümüne bakın.

Modeli seçip indirin ve proje dizininizde saklayın:

<dev-project-root>/src/main/assets

ModelAssetPath parametresinde modelin yolunu belirtin. Örnek kodda model, FaceDetectorHelper.kt dosyasında tanımlanır:

val modelName = "face_detection_short_range.tflite"
baseOptionsBuilder.setModelAssetPath(modelName)

Görevi oluşturun

MediaPipe Yüz Tanıyıcısı görevi, görevi ayarlamak için createFromOptions() işlevini kullanır. createFromOptions() işlevi, yapılandırma seçenekleri için değerleri kabul eder. Yapılandırma seçenekleri hakkında daha fazla bilgi edinmek için Yapılandırma seçenekleri başlıklı makaleyi inceleyin.

Yüz algılama özelliği, aşağıdaki giriş veri türlerini destekler: sabit resimler, video dosyaları ve canlı video akışları. Görevi oluştururken giriş veri türünüze karşılık gelen çalışma modunu belirtmeniz gerekir. Görevi nasıl oluşturacağınızı ve çıkarım işlemini nasıl çalıştıracağınızı görmek için giriş veri türünüze karşılık gelen sekmeyi seçin.

Resim

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    FaceDetector.FaceDetectorOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinDetectionConfidence(threshold)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()

FaceDetector =
    FaceDetector.createFromOptions(context, options)
    

Video

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    FaceDetector.FaceDetectorOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinDetectionConfidence(threshold)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()

FaceDetector =
    FaceDetector.createFromOptions(context, options)
    

Canlı yayın

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    FaceDetector.FaceDetectorOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinDetectionConfidence(threshold)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()

FaceDetector =
    FaceDetector.createFromOptions(context, options)
    

Yüz algılama örnek kod uygulaması, kullanıcının işleme modları arasında geçiş yapmasına olanak tanır. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale getirir ve kullanım alanınız için uygun olmayabilir. Bu kodu, FaceDetectorHelper.kt dosyasında setupFaceDetector() işlevinde görebilirsiniz.

Yapılandırma seçenekleri

Bu görevde, Android uygulamaları için aşağıdaki yapılandırma seçenekleri bulunur:

Seçenek Adı Açıklama Değer Aralığı Varsayılan değer
runningMode Görevin çalışma modunu ayarlar. Üç mod vardır:

RESİM: Tek resim girişleri için kullanılan mod.

VIDEO: Bir videonun kod çözülmüş karelerinin modu.

LIVE_STREAM: Kameradan alınan giriş verilerinin canlı yayını için kullanılan mod. Bu modda, sonuçları asenkron olarak alacak bir dinleyici oluşturmak için resultListener çağrılmalıdır.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
minDetectionConfidence Yüz algılamanın başarılı olarak kabul edilmesi için gereken minimum güven puanı. Float [0,1] 0.5
minSuppressionThreshold Yüz algılamanın örtüşmüş olarak kabul edilmesi için minimum maksimum bastırma dışı eşik. Float [0,1] 0.3
resultListener Sonuç dinleyicisini, Yüz Algılayıcı canlı yayın modundayken algılama sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Yalnızca çalışma modu LIVE_STREAM olarak ayarlandığında kullanılabilir. N/A Not set
errorListener İsteğe bağlı bir hata işleyici ayarlar. N/A Not set

Verileri hazırlama

Yüz algılama özelliği resimler, video dosyaları ve canlı video yayınlarıyla çalışır. Görev, yeniden boyutlandırma, döndürme ve değer normalleştirme dahil olmak üzere veri girişi ön işleme işlemlerini yönetir.

Aşağıdaki kod, verilerin işlenmek üzere nasıl aktarılacağını göstermektedir. Bu örneklerde, resimlerden, video dosyalarından ve canlı video yayınlarından elde edilen verilerin nasıl işleneceğine dair ayrıntılar yer alır.

Resim

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()
    

Video

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

val argb8888Frame =
    if (frame.config == Bitmap.Config.ARGB_8888) frame
    else frame.copy(Bitmap.Config.ARGB_8888, false)

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(argb8888Frame).build()
    

Canlı yayın

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(rotatedBitmap).build()
    

Yüz Tanıyıcı örnek kodunda veri hazırlama işlemi FaceDetectorHelper.kt dosyasında gerçekleştirilir.

Görevi çalıştırma

Çalıştığınız veri türüne bağlı olarak, söz konusu veri türüne özel faceDetector.detect...() yöntemini kullanın. Ayrı resimler için detect(), video dosyalarındaki kareler için detectForVideo() ve video akışları için detectAsync() kullanın. Bir video akışında algılama işlemi gerçekleştirirken kullanıcı arayüzü iş parçacığının engellenmesini önlemek için algılamaları ayrı bir iş parçacığında çalıştırdığınızdan emin olun.

Aşağıdaki kod örneklerinde, Yüz Tanıyıcı'nın bu farklı veri modlarında nasıl çalıştırılacağına dair basit örnekler gösterilmektedir:

Resim

val result = faceDetector.detect(mpImage)
    

Video

val timestampMs = i * inferenceIntervalMs

faceDetector.detectForVideo(mpImage, timestampMs)
    .let { detectionResult ->
        resultList.add(detectionResult)
    }
    

Canlı yayın

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

faceDetector.detectAsync(mpImage, frameTime)
    

Aşağıdakileri göz önünde bulundurun:

  • Video modunda veya canlı yayın modunda çalışırken Yüz Tanıyıcı görevine giriş çerçevesinin zaman damgasını sağlamanız gerekir.
  • Yüz algılama görevi, resim veya video modunda çalışırken giriş resmini ya da kareyi işlemeyi tamamlayana kadar mevcut iş parçacısını engeller. Kullanıcı arayüzünün engellenmesini önlemek için işlemeyi arka plan iş parçacığında yürütün.
  • Canlı yayın modunda çalışırken Yüz Tanıyıcı görevi hemen döndürülür ve mevcut iş parçacığı engellenmez. Her giriş karesini işlemeyi tamamladığında sonuç dinleyicisini algılama sonucuyla çağırır. Yüz algılama görevi başka bir kareyi işlemekle meşgulken algılama işlevi çağrılırsa görev yeni giriş karesini yoksayar.

Yüz Tanıyıcı örnek kodunda detect, detectForVideo ve detectAsync işlevleri FaceDetectorHelper.kt dosyasında tanımlanır.

Sonuçları işleme ve görüntüleme

Yüz algılama, her algılama çalıştırması için bir FaceDetectorResult nesnesi döndürür. Sonuç nesnesi, algılanan yüzler için sınır kutuları ve algılanan her yüz için güven puanı içerir.

Aşağıda, bu görevin çıkış verilerine örnek verilmiştir:

FaceDetectionResult:
  Detections:
    Detection #0:
      BoundingBox:
        origin_x: 126
        origin_y: 100
        width: 463
        height: 463
      Categories:
        Category #0:
          index: 0
          score: 0.9729152917861938
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.18298381567001343
          y: 0.2961040139198303
        NormalizedKeypoint #1:
          x: 0.3302789330482483
          y: 0.29289937019348145
        ... (6 keypoints for each face)
    Detection #1:
      BoundingBox:
        origin_x: 616
        origin_y: 193
        width: 430
        height: 430
      Categories:
        Category #0:
          index: 0
          score: 0.9251380562782288
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.6151331663131714
          y: 0.3713381886482239
        NormalizedKeypoint #1:
          x: 0.7460576295852661
          y: 0.38825345039367676
        ... (6 keypoints for each face)

Aşağıdaki resimde görev çıktısının görselleştirmesi gösterilmektedir:

Yüzlerinin etrafında sınırlayıcı kutular olan iki çocuk

Sınırlayıcı kutusu olmayan resim için orijinal resme bakın.

Yüz Tanıyıcı örnek kodunda, görevden döndürülen sonuçların nasıl gösterileceği gösterilmektedir. Daha fazla bilgi için OverlayView sınıfına bakın.