MediaPipe El İşaretçisi görevi, bir görüntüdeki ellerin önemli noktalarını algılamanızı sağlar. Bu talimatlarda, El İşaretçisi'nin Android uygulamalarıyla nasıl kullanılacağı gösterilmektedir. İlgili içeriği oluşturmak için kullanılan 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, bir El İşaretçisi işlevinin basit bir uygulamasıdır Android için uygulama. Örnekte, fiziksel bir Android cihazın kamerasıyla ellerin önemli noktalarını sürekli olarak algılar ve cihaz galerisini kullanarak el önemli noktalarını statik olarak algılayabilir.
Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya buna başvurabilirsiniz mevcut bir uygulamada değişiklik yaparken. El İş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:
- 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 yöntemini kullanacak şekilde yapılandırın,
Böylece, yalnızca El İşaretçisi örnek uygulamasına ait dosyalara sahip olursunuz:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/hand_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 Android için Kurulum Kılavuzu.
Temel bileşenler
Aşağıdaki dosyalar bu el işareti için önemli kodu içerir algılama örnek uygulaması:
- HandLandmarkerHelper.kt - El belirgin işareti dedektörünü başlatır, modeli ve yetkiyi işler seçim.
- MainActivity.kt
HandLandmarkerHelper
çağrısı da dahil olmak üzere uygulamayı uygular.
Kurulum
Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili özel olarak El İşaretçisi'ni kullanmak için projeleri kodlayabilirsiniz. Şu konularda genel bilgi için: dahil olmak üzere MediaPipe görevlerini kullanmak için geliştirme ortamınızı daha fazla bilgi için Android için kurulum kılavuzu.
Bağımlılıklar
El İşaretçisi görevi, com.google.mediapipe:tasks-vision
kullanır.
kitaplığını açar. Bu bağımlılığı Android uygulamanızın build.gradle
dosyasına ekleyin:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Model
MediaPipe El İşaretçisi görevi, oluşturacağım. El İş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.
örnek kod,
model şurada tanımlanmıştır: HandLandmarkerHelper.kt
dosya:
baseOptionBuilder.setModelAssetPath(MP_HAND_LANDMARKER_TASK)
Görevi oluşturma
MediaPipe El İş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 için bkz.
Yapılandırma seçenekleri.
El İşaretçisi, 3 giriş verisi türünü destekler: hareketsiz resimler, video dosyaları ve Canlı yayın. Hedefinize uygun koşu modunu temel veri türünü dikkate almanız gerekir. Size uygun olan sekmeyi veri türünü girin.
Resim
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_HAND_LANDMARKER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = HandLandmarker.HandLandmarkerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setNumHands(maxNumHands) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() handLandmarker = HandLandmarker.createFromOptions(context, options)
Video
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_HAND_LANDMARKER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = HandLandmarker.HandLandmarkerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setNumHands(maxNumHands) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() handLandmarker = HandLandmarker.createFromOptions(context, options)
Canlı yayın
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_HAND_LANDMARKER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = HandLandmarker.HandLandmarkerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setNumHands(maxNumHands) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() handLandmarker = HandLandmarker.createFromOptions(context, options)
El İş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
setupHandLandmarker()
fonksiyonu
HandLandmarkerHelper.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 |
numHands |
El önemli nokta dedektörü tarafından algılanan maksimum el sayısı. | Any integer > 0 |
1 |
minHandDetectionConfidence |
El algılama için minimum güven puanı için başarılı bir yöntem olarak nitelendiriliyor. | 0.0 - 1.0 |
0.5 |
minHandPresenceConfidence |
Eldeki el varlığı puanı için minimum güven puanı önemli nokta algılama modelidir. Video ve Canlı yayın modunda El yer işareti modelindeki el varlığı güven puanının altındaysa el İşaretçisi, avuç içi algılama modelini tetikler. Aksi halde, basit bir el izleme algoritması, kullanıcının nerede olduğunu ellerinizi rahatça kullanabileceksiniz. | 0.0 - 1.0 |
0.5 |
minTrackingConfidence |
El takibi için dikkate alınacak minimum güven puanı işidir. Bu, testteki eller arasındaki sınırlayıcı kutu IoU eşiğidir geçerli kareyi ve son kareyi gösterir. Video modunda ve Akış modunda: El İşaretçisi, takip başarısız olursa El İşaretçisi eli tetikler tespit edebilir. Aksi takdirde, el algılaması atlanır. | 0.0 - 1.0 |
0.5 |
resultListener |
Sonuç işleyiciyi algılama sonuçlarını alacak şekilde ayarlar
el işaretleyicisi canlı yayın modundayken eşzamansız olarak ayarlayabilirsiniz.
Yalnızca koşu modu LIVE_STREAM olarak ayarlandığında geçerlidir |
Yok | Yok |
errorListener |
İsteğe bağlı bir hata işleyici ayarlar. | Yok | Yok |
Verileri hazırlama
El İşaretçisi; resimler, video dosyası ve canlı yayın videoları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. Bunlar ö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()
El İşaretçisi örnek kodu ile birlikte, veri hazırlama işlemi
HandLandmarkerHelper.kt
dosyası olarak kaydedebilirsiniz.
Görevi çalıştırma
Üzerinde çalıştığınız veri türüne bağlı olarak
HandLandmarker.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, El İş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 = handLandmarker?.detect(mpImage)
Video
val timestampMs = i * inferenceIntervalMs handLandmarker?.detectForVideo(mpImage, timestampMs) ?.let { detectionResult -> resultList.add(detectionResult) }
Canlı yayın
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() handLandmarker?.detectAsync(mpImage, frameTime)
Aşağıdakileri göz önünde bulundurun:
- Video modunda veya canlı yayın modunda çalışırken şunları da yapmanız gerekir: El İşaretçi görevine giriş çerçevesinin zaman damgasını sağlar.
- Resimde veya video modunda çalışırken El İşaretçisi görevi giriş resmini işlemeyi bitirene kadar geçerli iş parçacığını engeller veya çerçeve. Kullanıcı arayüzünü engellememek için işlemeyi arka plan ileti dizisi.
- Canlı yayın modunda çalışırken El İşaretçi görevi, devam eder, ancak hemen geri döner. Sonucunu çağırır algılama sonucuyla birlikte gelen bir hata dinleyicisidir. giriş çerçevesine sahip. El İşaretçisi görevi başlatıldığında algılama işlevi çağrılırsa başka bir kareyi işlemekle meşgulse görev, yeni giriş çerçevesini yoksayacak.
El İşaretçisi örnek kodu, detect
, detectForVideo
ve
detectAsync
işlevleri
HandLandmarkerHelper.kt
dosyası olarak kaydedebilirsiniz.
Sonuçları işleme ve görüntüleme
El İşaretçisi, her algılama için bir el işaretleyici sonuç nesnesi oluşturur gerekir. Sonuç nesnesi, resim koordinatlarında el işaretleri, el algılanan önemli noktanın dünya koordinatlarındaki ve el görüşlerindeki(sol/sağ el) önemli noktalar eller.
Aşağıda, bu görevdeki çıkış verilerinin bir örneği gösterilmektedir:
HandLandmarkerResult
çıkışı üç bileşen içerir. Her bileşen bir dizidir. Burada her öğe, algılanan tek bir el için aşağıdaki sonuçları içerir:
Uygun Olduğu El
El tercihi, algılanan ellerin sol el mi yoksa sağ el mi olduğunu belirtir.
Önemli noktalar
Her biri
x
,y
vez
koordinatlarından oluşan 21 el önemli noktası vardır. İlgili içeriği oluşturmak için kullanılanx
vey
koordinatları, resim genişliğine göre [0,0, 1,0] değerine yüksekliğine dikkat edin.z
koordinatı, belirgin işaret derinliğini gösterir oryantasyon yani bilek derinliği. Değer ne kadar küçükse kameraya kadar uzanıyorum.z
boyutu ile yaklaşık olarak aynı ölçeği kullanırx
.Dünyanın Sınırları
21 el önemli noktaları da dünya koordinatlarıyla gösterilir. Her bir önemli nokta gerçek dünya 3D koordinatlarını temsil eden
x
,y
vez
birleşiminden oluşur metre cinsinden, başlangıç noktası avucunun geometrik merkezinde yer alır.
HandLandmarkerResult:
Handedness:
Categories #0:
index : 0
score : 0.98396
categoryName : Left
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : -3.41E-7
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
... (21 landmarks for a hand)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
... (21 world landmarks for a hand)
Aşağıdaki resimde, görev çıkışının görselleştirmesi gösterilmektedir:
El İşaretçisi örnek kodu, doğru işareti gösteren
daha fazla bilgi edinmek için
OverlayView
inceleyebilirsiniz.