MediaPipe Resim Yerleştiricisi görevi, iki resmin benzerliğini karşılaştırma gibi makine öğrenimi ile ilgili resim işleme görevlerini gerçekleştirmek için resim verilerini sayısal bir temsile dönüştürmenize olanak tanır. Bu talimatlarda, resim yerleştiricinin Android uygulamalarıyla nasıl kullanılacağı gösterilmektedir.
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 Tasks örnek kodu, Android için bir resim yerleştirme uygulamasının basit bir uygulamasıdır. Örnekte, fiziksel bir Android cihazdaki kamera kullanılarak resimler sürekli olarak yerleştirilir. Yerleştirici, cihazda depolanan resim dosyalarında da çalıştırılabilir.
Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken referans olarak kullanabilirsiniz. Resim Yerleştirici ö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ın nasıl oluşturulacağı 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 kontrol kullanacak şekilde yapılandırın. Böylece, yalnızca resim yerleştirme örneği uygulamasının dosyalarına sahip olursunuz:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/image_embedder/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 için Kurulum Kılavuzu'na bakın.
Temel bileşenler
Aşağıdaki dosyalar, bu resim yerleştirici örnek uygulamasının önemli kodunu içerir:
- ImageEmbedderHelper.kt: Resim yerleştiriciyi başlatır ve model ile temsilci seçimini işler.
- MainActivity.kt: Uygulamayı uygular ve kullanıcı arayüzü bileşenlerini bir araya getirir.
Kurulum
Bu bölümde, geliştirme ortamınızı ve kod projelerinizi Resim Yerleştirici'yi kullanacak şekilde ayarlamayla ilgili temel adımlar açıklanmaktadır. Platform sürümü gereksinimleri dahil olmak üzere, geliştirme ortamınızı MediaPipe görevlerini kullanmak için ayarlama hakkında genel bilgi edinmek üzere Android için kurulum kılavuzuna göz atın.
Bağımlılıklar
Resim Yerleştirici, com.google.mediapipe:tasks-vision
kitaplığını kullanır. Bu bağımlılık, Android uygulama geliştirme projenizin build.gradle
dosyasına eklenmelidir.
Aşağıdaki kodla gerekli bağımlılıkları içe aktarın:
dependencies {
...
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Model
MediaPipe Resim Yerleştiricisi görevi, bu görevle uyumlu bir eğitimli model gerektirir. Resim Yerleştirici için mevcut eğitimli modeller hakkında daha fazla bilgi edinmek istiyorsanız göreve genel bakıştaki Modeller bölümüne göz atın.
Modeli seçip indirin ve proje dizininizde saklayın:
<dev-project-root>/src/main/assets
ModelAssetPath
parametresinde modelin yolunu belirtin. Örnek kodda model, ImageEmbedderHelper.kt dosyasında setupImageEmbedder()
işlevinde tanımlanmıştır:
Modelin kullandığı yolu belirtmek için BaseOptions.Builder.setModelAssetPath()
yöntemini kullanın. Bu yöntem, sonraki bölümdeki kod örneğinde belirtilmiştir.
Görevi oluşturun
Görevi oluşturmak için createFromOptions
işlevini kullanabilirsiniz. createFromOptions
işlevi, yerleştirici seçeneklerini ayarlamak için yapılandırma seçeneklerini kabul eder. Yapılandırma seçenekleri hakkında daha fazla bilgi için Yapılandırmaya Genel Bakış başlıklı makaleyi inceleyin.
Resim Yerleştirici görevi 3 giriş veri türünü destekler: sabit resimler, video dosyaları ve canlı video akışları. Görevi oluştururken giriş veri türünüze karşılık gelen çalışma modunu belirtmeniz gerekir. Görevi nasıl oluşturacağınızı ve çıkarım işlemini nasıl çalıştıracağınızı görmek için giriş veri türünüze karşılık gelen sekmeyi seçin.
Resim
ImageEmbedderOptions options = ImageEmbedderOptions.builder() .setBaseOptions( BaseOptions.builder().setModelAssetPath("model.tflite").build()) .setQuantize(true) .setRunningMode(RunningMode.IMAGE) .build(); imageEmbedder = ImageEmbedder.createFromOptions(context, options);
Video
ImageEmbedderOptions options = ImageEmbedderOptions.builder() .setBaseOptions( BaseOptions.builder().setModelAssetPath("model.tflite").build()) .setQuantize(true) .setRunningMode(RunningMode.VIDEO) .build(); imageEmbedder = ImageEmbedder.createFromOptions(context, options);
Canlı yayın
ImageEmbedderOptions options = ImageEmbedderOptions.builder() .setBaseOptions( BaseOptions.builder().setModelAssetPath("model.tflite").build()) .setQuantize(true) .setRunningMode(RunningMode.LIVE_STREAM) .setResultListener((result, inputImage) -> { // Process the embedding result here. }) .build(); imageEmbedder = ImageEmbedder.createFromOptions(context, options);
Ö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ıza uygun olmayabilir. Bu kodu, ImageEmbedderHelper.kt dosyasında setupImageEmbedder()
işlevinde görebilirsiniz.
Yapılandırma seçenekleri
Bu görevde, Android uygulamaları için aşağıdaki yapılandırma seçenekleri bulunur:
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 kullanılan mod. VIDEO: Bir videonun kod çözülmüş karelerinin modu. LIVE_STREAM: Kameradan alınan giriş verilerinin canlı yayını için kullanılan mod. Bu modda, sonuçları asenkron olarak alacak bir dinleyici oluşturmak için resultListener çağrılmalıdır. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
l2_normalize |
Döndürülen özellik vektörünün L2 normuyla normalleştirilip normalleştirilmeyeceği. Bu seçeneği yalnızca modelde halihazırda doğal bir L2_NORMALIZATION TFLite Op içermiyorsa kullanın. Çoğu durumda bu durum geçerlidir ve L2 normalleştirmesi, bu seçeneğe gerek kalmadan TFLite çıkarımıyla elde edilir. | Boolean |
False |
quantize |
Döndürülen yerleştirmenin skaler kesme işlemiyle baytlara bölünüp bölünmeyeceği. Yerleşimlerin birim normal olduğu varsayılır ve bu nedenle tüm boyutların [-1,0; 1,0] aralığında bir değere sahip olduğu garanti edilir. Aksi takdirde l2_normalize seçeneğini kullanın. | Boolean |
False |
resultListener |
Sonuç dinleyicisini, resim yerleştirici canlı yayın modundayken yerleştirme sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Yalnızca çalışma modu LIVE_STREAM olarak ayarlandığında kullanılabilir. |
Yok | Ayarlanmadı |
errorListener |
İsteğe bağlı bir hata işleyici ayarlar. | Yok | Ayarlanmadı |
Verileri hazırlama
Resim Yerleştirici, resimler, video dosyaları ve canlı yayın videolarıyla çalışır. Görev, yeniden boyutlandırma, döndürme ve değer normalleştirme dahil olmak üzere veri girişi ön işleme işlemlerini yönetir.
Giriş resmini veya çerçevesini, Resim Yerleştirici görevine iletmeden önce com.google.mediapipe.framework.image.MPImage
nesnesine dönüştürmeniz gerekir.
Resim
import com.google.mediapipe.framework.image.BitmapImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Load an image on the user’s device as a Bitmap object using BitmapFactory. // Convert an Android’s Bitmap object to a MediaPipe’s Image object. Image mpImage = new BitmapImageBuilder(bitmap).build();
Video
import com.google.mediapipe.framework.image.BitmapImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Load a video file on the user's device using MediaMetadataRetriever // From the video’s metadata, load the METADATA_KEY_DURATION and // METADATA_KEY_VIDEO_FRAME_COUNT value. You’ll need them // to calculate the timestamp of each frame later. // Loop through the video and load each frame as a Bitmap object. // Convert the Android’s Bitmap object to a MediaPipe’s Image object. Image mpImage = new BitmapImageBuilder(frame).build();
Canlı yayın
import com.google.mediapipe.framework.image.MediaImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Create a CameraX’s ImageAnalysis to continuously receive frames // from the device’s camera. Configure it to output frames in RGBA_8888 // format to match with what is required by the model. // For each Android’s ImageProxy object received from the ImageAnalysis, // extract the encapsulated Android’s Image object and convert it to // a MediaPipe’s Image object. android.media.Image mediaImage = imageProxy.getImage() Image mpImage = new MediaImageBuilder(mediaImage).build();
Örnek kodda veri hazırlama işlemi ImageEmbedderHelper.kt dosyasında gerçekleştirilir.
Görevi çalıştırma
Çıkarımları tetiklemek için çalışma modunuza karşılık gelen embed
işlevini çağırabilirsiniz. Resim Yerleştirici API, giriş resmi veya çerçeve için yerleştirme vektörlerini döndürür.
Resim
ImageEmbedderResult embedderResult = imageEmbedder.embed(image);
Video
// Calculate the timestamp in milliseconds of the current frame. long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count; // Run inference on the frame. ImageEmbedderResult embedderResult = imageEmbedder.embedForVideo(image, frameTimestampMs);
Canlı yayın
// Run inference on the frame. The embedding results will be available // via the `resultListener` provided in the `ImageEmbedderOptions` when // the image embedder was created. imageEmbedder.embedAsync(image, frameTimestampMs);
Aşağıdakileri göz önünde bulundurun:
- Video modunda veya canlı yayın modunda çalışırken Görüntü Yerleştirici görevine giriş çerçevesinin zaman damgasını da sağlamanız gerekir.
- Resim veya video modunda çalışırken Resim Yerleştirici görevi, giriş resmini veya çerçevesini işlemeyi tamamlayana kadar mevcut iş parçacığını engeller. Mevcut ileti dizisinin engellenmesini önlemek için işlemeyi arka planda bir ileti dizisinde yürütün.
- Canlı yayın modunda çalışırken resim yerleştirme görevi, geçerli mesaj dizisini engellemez ancak hemen döndürülür. Her giriş çerçevesini işlemeyi tamamladığında sonuç dinleyicisini algılama sonucuyla çağırır. Resim Yerleştirici görevi başka bir kareyi işlerken
embedAsync
işlevi çağrılırsa görev yeni giriş karesini yoksayar.
Örnek kodda embed
işlevi ImageEmbedderHelper.kt dosyasında tanımlanmıştır.
Sonuçları işleme ve görüntüleme
Görüntü Yerleştirici görevi, çıkarım çalıştırıldığında giriş resminin yerleştirilmelerinin (kayan nokta veya skaler olarak kesirli) listesini içeren bir ImageEmbedderResult
nesnesi döndürür.
Aşağıda, bu görevin çıkış verilerine örnek verilmiştir:
ImageEmbedderResult:
Embedding #0 (sole embedding head):
float_embedding: {0.0, 0.0, ..., 0.0, 1.0, 0.0, 0.0, 2.0}
head_index: 0
Bu sonuç, aşağıdaki resim yerleştirilerek elde edilmiştir:
ImageEmbedder.cosineSimilarity
işlevini kullanarak iki yerleştirmenin benzerliğini karşılaştırabilirsiniz. Örnek için aşağıdaki koda bakın.
// Compute cosine similarity.
double similarity = ImageEmbedder.cosineSimilarity(
result.embeddingResult().embeddings().get(0),
otherResult.embeddingResult().embeddings().get(0));