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

MediaPipe Yüz İşaretçisi görevi, fotoğraftaki yüzlerin önemli noktalarını ve yüz ifadelerini algılamanızı sağlar. resimler ve videolar. Bu görevi, insanların yüz ifadelerini tespit etmek, yüz filtreleri ve efektleri uygulayabilir, sanal avatarlar oluşturabilirsiniz. Bu görev tek bir görüntüyle veya sürekli bir görüntüyle çalışabilen makine öğrenimi (ML) görsel akışı anlamına gelir. Görev, 3 boyutlu yüz yer işaretleri, karışım şekli, Yüzle ilgili ayrıntılı bilgileri elde etmek için puanları (yüz ifadesini temsil eden katsayılar) gerçek zamanlı yüzeyler ve dönüşüm matrislerini kullanarak ve efekt oluşturmak için gereken dönüşüm işlemlerini yapabilirsiniz.

Bu talimatlarda açıklanan kod örneğini şu adreste bulabilirsiniz: GitHub'a gidin. Özellikler, modeller ve yapılandırma seçenekleri hakkında daha fazla bilgi Bu görev hakkında daha fazla bilgi için Genel Bakış'ı inceleyin.

Kod örneği

MediaPipe Tasks örnek kodu, Yüz İşaretçisi işlevinin basit bir uygulamasıdır Android için uygulama. Örnekte, fiziksel bir Android cihazın kamerasıyla Kesintisiz video akışı sırasında yüzler algılanır. Uygulama aşağıdaki yüzleri de algılayabilir: cihaz galerisinden resim ve videolar yükleyin.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya buna başvurabilirsiniz mevcut bir uygulamada değişiklik yaparken. Yüz İşaretçisi örnek kodu GitHub'a gidin.

Kodu indirme

Aşağıdaki talimatlarda, örneğin yerel bir kopyasını nasıl oluşturacağınız gösterilmektedir kodu oluşturmak için git komut satırı aracını kullanın.

Ö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 yöntemini kullanacak şekilde yapılandırın. Böylece, yalnızca Yüz İşaretçisi örnek uygulaması için dosyalar:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_landmarker/android
    

Örnek kodun yerel sürümünü oluşturduktan sonra projeyi içe aktarabilirsiniz. Android Studio'ya gidip uygulamayı çalıştırın. Talimatlar için bkz. Android.

Temel bileşenler

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

  • FaceLandmarkerHelper.kt: Yüz işaretleyiciyi başlatır, modeli ve yetkiyi işler seçim.
  • CameraFragment.kt - Cihaz kamerasını işleyip resim 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 - Algılanan yüzler için ekranı bir yüz bağlantılı ağıyla uygular.

Kurulum

Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili ve Yüz İşaretçisi'ni kullanmak için özel olarak kod projeleri oluşturabilirsiniz. Şu konularda genel bilgi için: dahil olmak üzere MediaPipe görevlerini kullanmak için geliştirme ortamınızı platform sürümü gereksinimleri hakkında daha fazla bilgi için Android.

Bağımlılıklar

Yüz İşaretçisi görevi, com.google.mediapipe:tasks-vision kitaplığını kullanır. Ekle bu bağımlılığı Android uygulamanızın build.gradle dosyasına eklemeniz gerekir:

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

Model

MediaPipe Yüz İşaretçisi görevi, oluşturacağım. Yüz İşaretçisi için mevcut eğitilmiş modeller hakkında daha fazla bilgi için göreve genel bakışın Modeller bölümünü inceleyin.

Modeli seçin, indirin ve proje dizininizde depolayın:

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

ModelAssetPath parametresi içinde modelin yolunu belirtin. varsa, model FaceLandmarkerHelper.kt dosya:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

Görevi oluşturma

MediaPipe Yüz İşaretçisi görevi,createFromOptions() görevi görebilir. createFromOptions() işlevi, yapılandırma için değerleri kabul eder seçenekleri vardır. Yapılandırma seçenekleri hakkında daha fazla bilgi edinmek için Yapılandırma seçenekleri bulabilirsiniz.

Yüz İşaretçisi şu giriş verisi türlerini destekler: hareketsiz resimler, video dosyaları ve canlı video akışları kullanılabilir. Koşu modunu belirtmeniz gerekiyor giriş veri türünüze karşılık gelen bir e-posta alırsınız. Sekmeyi seçin nasıl oluşturacağınızı ve görevi nasıl çalıştıracağınızı çıkarım.

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 farklı olabilir. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale kullanım alanınıza uygun olmayabilir. Bu kodu setupFaceLandmarker() fonksiyonu FaceLandmarkerHelper.kt dosyası olarak kaydedebilirsiniz.

Yapılandırma seçenekleri

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

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
runningMode Görev için çalışma modunu ayarlar. Üç tane var modlar:

. IMAGE: Tek resimli giriş modu.
.
. VIDEO: Bir videonun kodu çözülmüş karelerine yönelik mod.
.
. LIVE_STREAM: Giriş canlı yayını modu kameradan alınan veriler gibi. Bu modda, resultListener, sonuçları almak üzere bir dinleyici ayarlamak için çağrıldı eşzamansız olarak ayarlayabilirsiniz.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
numFaces tarafından algılanabilecek maksimum yüz sayısı FaceLandmarker. Düzleştirme yalnızca num_faces 1 olarak ayarlandı. Integer > 0 1
minFaceDetectionConfidence Yüz tanıma için gereken minimum güven puanı kabul edilir. Float [0.0,1.0] 0.5
minFacePresenceConfidence Yüz tanımanın minimum güven puanı puanı. Float [0.0,1.0] 0.5
minTrackingConfidence Yüz izleme için minimum güven puanı kabul edilir. Float [0.0,1.0] 0.5
outputFaceBlendshapes Yüz İşaretçisi'nin yüz karışım şekillerini sağlayıp sağlamadığı. 3D yüz modelinin oluşturulması için yüz karışım şekilleri kullanılır. Boolean False
outputFacialTransformationMatrixes FaceLandmarker'ın yüz verilerini sağlayıp sağlamadığı ve dönüşüm matrisini gözden geçireceğiz. FaceLandmarker, yüzdeki yer işaretlerini standart bir yüz modelinden yüz modeli görünümüne dönüştürmek için Böylece, kullanıcılar algılanan önemli noktalara efekt uygulayabilir. Boolean False
resultListener Sonuç işleyiciyi işaretleyici sonuçlarını alacak şekilde ayarlar FaceLandmarker canlı yayın modundayken eşzamansız olarak. Yalnızca koşu 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 özelliği; resimler, video dosyaları ve canlı video akışlarıyla çalışır. Görev yeniden boyutlandırma, döndürme ve değer de dahil olmak üzere veri girişi ön işlemesini gerçekleştirir. yapabilirsiniz.

Aşağıdaki kod, verilerin işlenmek üzere nasıl aktarılacağını göstermektedir. Bu örnekler, resimlerden, video dosyalarından ve canlı yayınlardan verilerin nasıl işleneceğine dair ayrıntılar içerir video akışları üzerinden takip edebilirsiniz.

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ırlama işlemi FaceLandmarkerHelper.kt dosyası olarak kaydedebilirsiniz.

Görevi çalıştırma

Üzerinde çalıştığınız veri türüne bağlı olarak FaceLandmarker.detect...() yöntemini çağırın. Tekliflerinizi otomatikleştirmek ve optimize etmek için Ayrı resimler için detect(), video dosyalarındaki kareler için detectForVideo(), ve video akışları için detectAsync(). Bir makinede algılamalar bu sorunu önlemek için algılamaları ayrı bir iş parçacığında çalıştırdığınızdan emin olun. ileti dizisi engelleniyor.

Aşağıdaki kod örnekleri, Yüz İşaretçisi'nin nasıl çalıştırılacağına ilişkin basit örnekler göstermektedir. şu farklı veri modlarında kullanabilirsiniz:

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ş çerçevesinin zaman damgası.
  • Resimde veya video modunda çalışırken Yüz İşaretçisi görevi, devam eder. Alıcı: kullanıcı arayüzünü engellememek, işlemeyi arka planda yürütme ileti dizisi.
  • Canlı yayın modundayken Yüz İşaretçisi görevi geri dönüyor derhal geçerli olur ve mevcut ileti dizisi engellenmez. Sonucu çağırır dinleyiciye bir öğeyi işlemeyi bitirdiği her seferinde giriş çerçevesine sahip.

Yüz İşaretçisi örnek kodunda detect, detectForVideo ve detectAsync işlevleri FaceLandmarkerHelper.kt dosyası olarak kaydedebilirsiniz.

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

Yüz İşaretçisi, her algılama için bir FaceLandmarkerResult nesnesi döndürür. gerekir. Sonuç nesnesi, algılanan her yüz için bir yüz örgüsü içerir. koordinatlarını ekleyin. İsteğe bağlı olarak, sonuç nesnesi yüz ifadelerini ifade eden karışımlar ve yüz dönüşüm matrislerini kullanarak, algılanan önemli noktalara yüz efektleri uygulayabilirsiniz.

Aşağıda, bu görevdeki çı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örselleştirmesi gösterilmektedir:

Yüz İşaretçisi örnek kodu, döndürülen sonuçların nasıl görüntüleneceğini gösterir. bu görevlerin OverlayView inceleyebilirsiniz.