Android için yüz işareti algılama rehberi

MediaPipe Face Landmarker görevi, resim ve videolarda yüz işaretlerini ve yüz ifadelerini algılamanıza olanak tanır. Bu görevi kullanarak insan yüz ifadelerini belirleyebilir, yüz filtreleri ve efektleri uygulayabilir ve sanal avatarlar oluşturabilirsiniz. Bu görevde, tek resimlerle veya sürekli bir resim akışıyla çalışabilen makine öğrenimi (ML) modelleri kullanılır. Bu görev; ayrıntılı yüzeyleri gerçek zamanlı olarak tahmin etmek için 3 boyutlu yüz işaret noktaları, blendshape puanları (yüz ifadesini temsil eden katsayılar) ve efekt oluşturma için gereken dönüşümleri gerçekleştirmek üzere dönüşüm matrisleri çıkarır.

Bu talimatlarda açıklanan kod örneği GitHub'da mevcuttur. 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 Görevleri örnek kodu, Android için basit bir yüz işaretleyici uygulamasıdır. Örnekte, sürekli bir video akışındaki yüzleri algılamak için fiziksel bir Android cihazdaki kamera kullanılır. Uygulama, cihaz galerisindeki resim ve videolarda da yüzleri algılayabilir.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken bu uygulamadan yararlanabilirsiniz. Face Landmarker ö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ı nasıl oluşturacağınız 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 seyrek ödeme kullanacak şekilde yapılandırın. Böylece yalnızca Face Landmarker örnek uygulamasına ait dosyalarınız olur:
    cd mediapipe-samples
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_landmarker/android
    

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

Temel bileşenler

Aşağıdaki dosyalar, bu yüz işareti örneği uygulaması için önemli kodu içerir:

  • FaceLandmarkerHelper.kt: Yüz işaretçisini başlatır ve model ile temsilci seçimini yönetir.
  • CameraFragment.kt: Cihaz kamerasını yönetir, resim ve video giriş verilerini işler.
  • GalleryFragment.kt: Çıkış resmini veya videosunu göstermek için OverlayView ile etkileşime girer.
  • OverlayView.kt: Algılanan yüzler için yüz ağıyla ekranı uygular.

Kurulum

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

Bağımlılıklar

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

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

Model

MediaPipe Face Landmarker görevi, bu görevle uyumlu eğitilmiş bir model paketi gerektirir. Yüz İşaretleyici için kullanılabilen eğitilmiş modeller hakkında daha fazla bilgi edinmek istiyorsanız görev genel bakışındaki Modeller bölümüne bakın.

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

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

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

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

Görevi oluşturma

MediaPipe Face Landmarker görevi, görevi ayarlamak için createFromOptions() işlevini kullanır. createFromOptions() işlevi, yapılandırma seçeneklerinin değerlerini kabul eder. Yapılandırma seçenekleri hakkında daha fazla bilgi için Yapılandırma seçenekleri başlıklı makaleyi inceleyin.

Yüz İşaretleyici, aşağıdaki giriş verisi türlerini destekler: hareketsiz görüntüler, video dosyaları ve canlı video akışları. Görevi oluştururken giriş verisi türünüze karşılık gelen çalıştırma modunu belirtmeniz gerekir. Görevin nasıl oluşturulacağını ve çıkarımın nasıl çalıştırılacağını görmek için giriş veri türünüzün sekmesini seçin.

Resim

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

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

Video

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

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

Canlı yayın

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

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

Yüz İşaretçisi ö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, FaceLandmarkerHelper.kt dosyasındaki setupFaceLandmarker() 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 resim girişleri için mod.

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

LIVE_STREAM: Giriş verilerinin (ör. kameradan alınan veriler) canlı yayını için kullanılan mod. Bu modda, sonuçları eşzamansız olarak almak için bir dinleyici ayarlamak üzere resultListener çağrılmalıdır.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
numFaces FaceLandmarker tarafından algılanabilecek maksimum yüz sayısı. Yumuşatma yalnızca num_faces 1 olarak ayarlandığında uygulanır. Integer > 0 1
minFaceDetectionConfidence Yüz algılamanın başarılı sayılması için gereken minimum güven puanı. Float [0.0,1.0] 0.5
minFacePresenceConfidence Yüz işareti algılamada yüz varlığı puanının minimum güven puanı. Float [0.0,1.0] 0.5
minTrackingConfidence Yüz izlemenin başarılı olarak kabul edilmesi için gereken minimum güven puanı. Float [0.0,1.0] 0.5
outputFaceBlendshapes Yüz İşaretçisi'nin yüz karışım şekilleri çıkışı verip vermeyeceği. Yüz şekil harmanları, 3D yüz modelini oluşturmak için kullanılır. Boolean False
outputFacialTransformationMatrixes FaceLandmarker'ın yüz dönüşümü matrisini çıkış olarak verip vermeyeceği. FaceLandmarker, yüz işaretlerini kanonik bir yüz modelinden algılanan yüze dönüştürmek için matrisi kullanır. Böylece kullanıcılar, algılanan işaretlere efekt uygulayabilir. Boolean False
resultListener FaceLandmarker, canlı yayın modundayken yer işareti sonuçlarını eşzamansız olarak almak için sonuç dinleyicisini ayarlar. Yalnızca çalışma modu LIVE_STREAM olarak ayarlandığında kullanılabilir. ResultListener N/A
errorListener İsteğe bağlı bir hata işleyici ayarlar. ErrorListener N/A

Verileri hazırlama

Yüz İşaretleyici; 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şlemesini gerçekleştirir.

Aşağıdaki kodda, verilerin işlenmek üzere nasıl aktarılacağı gösterilmektedir. Bu örneklerde, resimlerden, video dosyalarından ve canlı video akışlarından gelen verilerin nasıl işleneceğiyle ilgili 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()
    

Face Landmarker örnek kodunda, veri hazırlama işlemi FaceLandmarkerHelper.kt dosyasında yapılır.

Görevi çalıştırma

Çalıştığınız verilerin türüne bağlı olarak, söz konusu veri türüne özel olan FaceLandmarker.detect...() yöntemini kullanın. Tek tek resimler için detect(), video dosyalarındaki kareler için detectForVideo(), video akışları için ise detectAsync() simgesini kullanın. Bir video akışında algılama işlemi gerçekleştirirken kullanıcı arayüzü iş parçacığını engellememek için algılama işlemlerini ayrı bir iş parçacığında çalıştırdığınızdan emin olun.

Aşağıdaki kod örneklerinde, Face Landmarker'ın bu farklı veri modlarında nasıl çalıştırılacağına dair basit örnekler gösterilmektedir:

Resim

val result = FaceLandmarker.detect(mpImage)
    

Video

val timestampMs = i * inferenceIntervalMs

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

Canlı yayın

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

FaceLandmarker.detectAsync(mpImage, frameTime)
    

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

  • Video modunda veya canlı yayın modunda çalıştırırken Face Landmarker görevine giriş çerçevesinin zaman damgasını sağlamanız gerekir.
  • Yüz İşaretleyici görevi, resim veya video modunda çalışırken giriş resmini ya da çerçeveyi işlemeyi tamamlayana kadar mevcut iş parçacığını engeller. Kullanıcı arayüzünün engellenmesini önlemek için işlemi arka plan iş parçacığında yürütün.
  • Canlı yayın modunda çalıştırıldığında Face Landmarker görevi hemen sonuç verir ve mevcut iş parçacığını engellemez. Bir giriş karesinin işlenmesi her tamamlandığında algılama sonucuyla sonuç dinleyicisini çağırır.

Yüz İşaretleyici örnek kodunda detect, detectForVideo ve detectAsync işlevleri FaceLandmarkerHelper.kt dosyasında tanımlanır.

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

Yüz İşaretleyici, her algılama çalıştırması için bir FaceLandmarkerResult nesnesi döndürür. Sonuç nesnesi, algılanan her yüz için bir yüz ağı içerir. Her yüz önemli noktasının koordinatları da bu nesnede yer alır. İsteğe bağlı olarak, sonuç nesnesi yüz ifadelerini belirten karışım şekilleri ve algılanan işaret noktalarına yüz efektleri uygulamak için yüz dönüştürme matrisleri de içerebilir.

Aşağıda bu görevden elde edilen çıkış verilerine bir örnek verilmiştir:

FaceLandmarkerResult:
  face_landmarks:
    NormalizedLandmark #0:
      x: 0.5971359014511108
      y: 0.485361784696579
      z: -0.038440968841314316
    NormalizedLandmark #1:
      x: 0.3302789330482483
      y: 0.29289937019348145
      z: -0.09489090740680695
    ... (478 landmarks for each face)
  face_blendshapes:
    browDownLeft: 0.8296722769737244
    browDownRight: 0.8096957206726074
    browInnerUp: 0.00035583582939580083
    browOuterUpLeft: 0.00035752105759456754
    ... (52 blendshapes for each face)
  facial_transformation_matrixes:
    [9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
    [1.66496094e-02,  9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
    ...

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

Yüzünün şeklini ve boyutlarını belirtmek için yüz bölgeleri geometrik olarak haritalandırılmış bir adam

Face Landmarker ö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.