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:
- Aşağıdaki komutu kullanarak Git deposunu klonlayın:
git clone https://github.com/google-ai-edge/mediapipe-samples
- İ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
OverlayViewile 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:
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.