Android için yüz algılama rehberi

MediaPipe Yüz Dedektörü görevi, bir resimdeki veya videodaki yüzleri algılamanızı sağlar. Yüzleri ve yüz özelliklerini bir çerçeve içindeki yerini belirlemek için bu görevi kullanabilirsiniz. Bu görev, tek görüntülerle veya sürekli bir görüntü akışıyla çalışan bir makine öğrenimi (ML) modeli kullanır. Görev, yüzdeki konumları ve yüzdeki şu önemli noktaları sağlar: sol göz, sağ göz, burun ucu, ağız, sol göz trajyonu ve sağ göz trajyonu.

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

Kod örneği

MediaPipe Tasks örnek kodu, Android için Yüz Algılama uygulamasının basit bir uygulamasıdır. Örnekte, sürekli video akışındaki yüzleri algılamak için fiziksel bir Android cihazın kamerası 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 Dedektörü örnek kodu GitHub'da barındırılır.

Kodu indirme

Aşağıdaki talimatlar, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasını nasıl oluşturacağınızı göstermektedir.

Ö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, yalnızca Yüz dedektörü örnek uygulamasına ait dosyalara sahip olmak için git örneğinizi az ödeme yöntemini 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ı için önemli kodu içerir:

  • FaceDetectorHelper.kt: Yüz algılayıcıyı başlatır, modeli işler ve seçim yetkisi verir.
  • CameraFragment.kt - Cihazın kamerasını yönetir, görüntü ve video giriş verilerini işler.
  • GalleryFragment.kt - Çıkış resmini veya videosunu görüntülemek için OverlayView ile etkileşim kurar.
  • OverlayView.kt - Görüntüyü, algılanan yüzler için sınırlayıcı kutularla birlikte uygular.

Kurulum

Bu bölümde, geliştirme ortamınızı kurmanın önemli adımları ve projelerinizi özellikle Yüz Dedektörü'nü kullanacak şekilde kodlamak için izlemeniz gereken temel adımlar açıklanmaktadır. Platform sürümü gereksinimleri de dahil olmak üzere, MediaPipe görevlerini kullanmak amacıyla geliştirme ortamınızı ayarlama hakkında genel bilgiler için Android için kurulum kılavuzuna bakın.

Bağımlılıklar

Yüz Dedektörü görevi, com.google.mediapipe:tasks-vision kitaplığını kullanır. Bu bağımlılığı Android uygulamanızın build.gradle dosyasına ekleyin:

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

Model

MediaPipe Yüz Dedektörü görevi için bu görevle uyumlu, eğitilmiş bir model paketi gerekir. Yüz Dedektörü için eğitilmiş modeller hakkında daha fazla bilgi almak isterseniz göreve genel bakış Modeller bölümüne bakın.

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

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

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

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

Görevi oluşturma

MediaPipe Yüz Dedektörü 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 bölümüne bakın.

Yüz Dedektörü şu giriş verisi türlerini destekler: sabit resimler, video dosyaları ve canlı video akışları. Görevi oluştururken giriş verisi türünüze karşılık gelen çalışma modunu belirtmeniz gerekir. Görevi nasıl oluşturacağınızı ve çıkarımda bulunacağınızı görmek için girdiğiniz veri türüne 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 Dedektörü örnek kod uygulaması, kullanıcının işleme modları arasında geçiş yapmasını sağlar. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale getirir ve sizin kullanım alanınıza uygun olmayabilir. Bu kodu FaceDetectorHelper.kt dosyasındaki setupFaceDetector() işlevinde görebilirsiniz.

Yapılandırma seçenekleri

Bu görev, Android uygulamaları için aşağıdaki yapılandırma seçeneklerine sahiptir:

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 resimli girişler için mod.

VİDEO: Bir videonun kodu çözülmüş karelerine yönelik mod.

LIVE_STREAM: Kamera gibi giriş verilerini içeren bir canlı yayın modu. Bu modda, sonuçları eşzamansız olarak almak üzere bir işleyici ayarlamak 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 çakıştığı kabul edilmesi için maksimum olmayan minimum engelleme eşiği. Float [0,1] 0.3
resultListener Yüz Dedektörü canlı yayın modundayken sonuç işleyiciyi, algılama sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Yalnızca çalıştırma 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 Dedektörü; resimler, video dosyaları ve canlı video akışlarıyla çalışır. Görev; yeniden boyutlandırma, döndürme ve değer normalleştirmesi dahil olmak üzere, veri girişinin ön işlemesini yönetir.

Aşağıdaki kod, verilerin işlenmek üzere nasıl aktarılacağını gösterir. Bu örnekler resimler, video dosyaları ve canlı video akışlarındaki verilerin nasıl işleneceğine dair ayrıntılar içerir.

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 Dedektörü örnek kodunda, veri hazırlığı FaceDetectorHelper.kt dosyası içinde işlenir.

Görevi çalıştırma

Çalıştığınız veri türüne bağlı olarak, ilgili 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 yaparken 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 örnekleri, Yüz Dedektörü'nün bu farklı veri modlarında nasıl çalıştırılacağına dair basit örnekler gösterir:

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 Algılayıcı görevine giriş karesinin zaman damgasını sağlamanız gerekir.
  • Yüz Dedektörü görevi, resim veya video modunda çalışırken giriş resmini veya karesini işlemeyi bitirene kadar mevcut iş parçacığını engeller. Kullanıcı arayüzünün engellenmesini önlemek için işlemeyi bir arka plan iş parçacığında yürütün.
  • Canlı yayın modunda çalışırken Yüz Dedektörü görevi anında geri gelir ve mevcut ileti dizisini engellemez. Bir giriş karesini işlemeyi her tamamladığında algılama sonucuyla birlikte sonuç işleyiciyi çağırır. Yüz Dedektörü görevi başka bir kareyi işlemekle meşgulken algılama işlevi çağrılırsa görev yeni giriş çerçevesini yoksayar.

Yüz Dedektörü örnek kodunda detect, detectForVideo ve detectAsync işlevleri FaceDetectorHelper.kt dosyasında tanımlanmıştır.

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

Yüz Dedektörü, 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ırlayıcı kutular ve algılanan her yüz için bir güven puanı içerir.

Aşağıda, bu görevden alınan çıkış verilerinin bir örneği gösterilmektedir:

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 çıkışının görseli gösterilmektedir:

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

Yüz Algılama örnek kodu, görevden döndürülen sonuçların nasıl görüntüleneceğini gösterir. Daha fazla bilgi için OverlayView sınıfına bakın.