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

MediaPipe Yüz İşaretçisi görevi, resimlerdeki ve videolardaki yüzlerin yer işaretlerini ve yüz ifadelerini tespit etmenize olanak tanır. Bu görevi insanların yüz ifadelerini tanımlamak, yüz filtreleri ve efektleri uygulamak ve sanal avatarlar oluşturmak için kullanabilirsiniz. Bu görev, tek görüntülerle veya sürekli bir görüntü akışıyla çalışabilen makine öğrenimi (ML) modellerini kullanır. Görev, yüzlerin 3 boyutlu önemli noktalarını, ayrıntılı yüz yüzeylerini gerçek zamanlı olarak tahmin etmek için harmanlanan şekilleri puanları (yüz ifadesini temsil eden katsayılar) ve efekt oluşturmak için gereken dönüşümleri gerçekleştirmek için dönüşüm matrislerini üretir.

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 için Genel Bakış'a bakın.

Kod örneği

MediaPipe Tasks örnek kodu, Android için Yüz İşaretçisi 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. Face sitenizin ö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, git örneğinizi az ödeme yöntemini kullanacak şekilde yapılandırın. Böylece yalnızca Yüz İşaretçisi örnek uygulamasına ait dosyalara sahip olursunuz:
    cd mediapipe
    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 aktarabilir ve 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şaretleme örnek uygulaması için önemli kodu içerir:

  • FaceLandmarkerHelper.kt: Yüz işaretleyiciyi başlatır, modeli ve yetki verme işlemini gerçekleştirir.
  • CameraFragment.kt - Cihazın kamerasını işler, görüntü ve video giriş verilerini işler.
  • GalleryFragment.kt - Çıkış resmini veya videoyu görüntülemek için OverlayView ile etkileşim kurar.
  • OverlayView.kt - Görüntüyü, algılanan yüzler için bir yüz ağıyla uygular.

Kurulum

Bu bölümde, geliştirme ortamınızı kurmanın temel adımları açıklanmaktadır ve projelerinizi özellikle Yüz İşaretçisi'ni kullanacak şekilde kodlamalısınız. 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 İşaretçisi 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 İşaretçisi görevi, bu görevle uyumlu, eğitilmiş bir model paketi gerektirir. Yüz Tanımlayıcı için eğitilmiş modeller hakkında daha fazla bilgi edinmek üzere 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 FaceLandmarkerHelper.kt dosyasında tanımlanır:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

Görevi oluşturma

MediaPipe Yüz İşaretçisi 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 İşaretçisi ş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ımı nasıl çalıştıracağınızı görmek için giriş verisi türünüzle ilgili sekmeyi 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ı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 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 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
numFaces FaceLandmarker tarafından algılanabilen 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ı olarak kabul edilmesi için gereken minimum güven puanı. Float [0.0,1.0] 0.5
minFacePresenceConfidence Yüz belirgin işareti algılamada yüz varlığı için minimum güven puanı. Float [0.0,1.0] 0.5
minTrackingConfidence Yüz izlemenin başarılı 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ıştırma şekilleri oluşturup oluşturmayacağı. Yüz harmanlama şekilleri, 3D yüz modelini oluşturmak için kullanılır. Boolean False
outputFacialTransformationMatrixes FaceLandmarker'ın yüz dönüştürme matrisi oluşturup oluşturmayacağı. FaceLandmarker, yüz yer işaretlerini standart bir yüz modelinden algılanan yüze dönüştürmek için matrisi kullanır. Böylece kullanıcılar, algılanan önemli noktalara efekt uygulayabilir. Boolean False
resultListener Sonuç işleyiciyi, FaceLandmarker canlı yayın modundayken işaretçi sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Yalnızca çalıştırma 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 İşaretçisi 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 İşaretçisi örnek kodunda, veri hazırlığı FaceLandmarkerHelper.kt dosyası içinde gerçekleştirilir.

Görevi çalıştırma

Çalıştığınız veri türüne bağlı olarak, ilgili veri türüne özel FaceLandmarker.detect...() yöntemini kullanın. Tek tek 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 örneklerinde Yüz İşaretçisi'nin 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ışırken Yüz İşaretçisi görevine giriş karesinin zaman damgasını sağlamanız gerekir.
  • Yüz İşaretçisi 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 İşaretçisi 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 İşaretçisi örnek kodunda, detect, detectForVideo ve detectAsync işlevleri FaceLandmarkerHelper.kt dosyasında tanımlanmıştır.

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

Yüz İşaretçisi, 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ğı ve her yüz işareti için koordinatlar içerir. İsteğe bağlı olarak sonuç nesnesi, yüz ifadelerini belirten karışım şekilleri ve algılanan önemli noktalara yüz efektleri uygulamak için yüz dönüşüm matrisleri de içerebilir.

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

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

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