Android için resim yerleştirme rehberi

MediaPipe Resim Yerleştirme görevi, resim verilerini sayısal bir gösterime dönüştürmenizi sağlar makine öğrenimiyle ilgili görüntü işleme görevlerini gerçekleştirmek için (örneğin, iki resmin benzerliği. Bu talimatlarda, Android uygulamalarıyla Resim Yerleştirme.

Ö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 Resim Yerleştirme aracının basit bir uygulamasıdır Android için uygulama. Örnekte, fiziksel bir Android cihazın kamerasıyla sürekli olarak resim yerleştirebilir ve ayrıca yerleştirmeyi, depolanan resim dosyalarında da çalıştırabilir. cihaz üzerinde.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya isteğe bağlı olarak yararlanabilirsiniz mevcut bir uygulamada değişiklik yaparken. Resim Yerleştirme örnek kodu şurada barındırılır: GitHub'a gidin.

Kodu indirme

Aşağıdaki talimatlarda, örneğin yerel bir kopyasını nasıl oluşturacağınız gösterilmektedir git komut satırı aracını kullanarak kod yazı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 Resim Yerleştirme örnek uygulamasına ait dosyaları içerir:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_embedder/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 resim yerleştirme örneği için önemli kodu içeriyor uygulama:

  • ImageEmbedderHelper.kt: Resim yerleştirmeyi başlatır, model ve yetki verme işlemini işler. seçim.
  • MainActivity.kt: Uygulamayı uygular ve kullanıcı arayüzü bileşenlerini derler.

Kurulum

Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili Resim Yerleştirme aracını kullanmak için projeleri kodlayın. platform sürümü de dahil olmak üzere MediaPipe görevlerini kullanmaya yönelik geliştirme ortamı daha fazla bilgi için Android.

Bağımlılıklar

Resim Yerleştirme aracı, com.google.mediapipe:tasks-vision kitaplığını kullanır. Bunu ekle build.gradle dosyasına bağımlılık. Aşağıdaki kodu kullanarak gerekli bağımlılıkları içe aktarın:

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

Model

MediaPipe Resim Yerleştirme görevi bu görevi görebilir. Görüntü Yerleştirme için eğitilmiş modellerle ilgili daha fazla bilgi için bkz. göreve genel bakış Modeller bölümü.

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

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

ModelAssetPath parametresi içinde modelin yolunu belirtin. bu model aşağıdaki örnekteki setupImageEmbedder() işlevinde tanımlanır: ImageEmbedderHelper.kt dosya:

Yolu belirtmek için BaseOptions.Builder.setModelAssetPath() yöntemini kullanın modeli tarafından kullanılır. Bu yöntem, bölümüne bakın.

Görevi oluşturma

Görevi oluşturmak için createFromOptions işlevini kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan createFromOptions işlevi, yerleştiriciyi ayarlamak için yapılandırma seçeneklerini kabul eder seçenekleri vardır. Yapılandırma seçenekleri hakkında daha fazla bilgi edinmek için Yapılandırma Genel Bakış.

Görüntü Yerleştirme görevi, 3 giriş verisi türünü destekler: hareketsiz resimler, video dosyaları, ve canlı video akışları kullanılabilir. Hedefe uygun koşu modunu giriş verilerinin türünü belirler. Şuna karşılık gelen sekmeyi seçin: giriş veri türünüzü inceleyerek görevi nasıl oluşturacağınızı ve çıkarımda bulunacağınızı öğrenin.

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 kullanabilirsiniz. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale getirir ve bir şablon görevi görür. Bu kodu setupImageEmbedder() fonksiyonu ImageEmbedderHelper.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
l2_normalize Döndürülen özellik vektörünün L2 normuyla normalleştirilip normalleştirilmeyeceği. Bu seçeneği yalnızca model zaten yerel bir öğe içermiyorsa kullanın L2_NORMALIZATION TFLite Op. Çoğu durumda bu zaten böyledir Böylece L2 normalleştirmesi, herhangi bir gerek kalmadan TFLite çıkarımıyla gerçekleştirilir bu seçeneği belirleyin. Boolean False
quantize Döndürülen yerleştirmenin skaler nicelemedir. Yerleştirmelerin dolaylı olarak birim normları Bu nedenle, tüm boyutların [-1,0, 1,0] aralığında bir değere sahip olması garanti edilir. Tekliflerinizi otomatikleştirmek ve optimize etmek için l2_normalize seçeneğini kullanın. Boolean False
resultListener Sonuç işleyiciyi yerleştirme sonuçlarını alacak şekilde ayarlar Resim Yerleştirme uygulaması canlı yayındayken eşzamansız olarak yatırım yapmanız önemlidir. Yalnızca koşu 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ştirme aracı; resimler, video dosyası ve canlı video yayını ile ç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.

Giriş resmini veya çerçevesini com.google.mediapipe.framework.image.MPImage nesnesini Görüntü Yerleştirme görevi.

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ı olarak kaydedebilirsiniz.

Görevi çalıştırma

Çalıştırma modunuza karşılık gelen embed işlevini çağırarak çıkarımlar. Image Yerleşik API, giriş için yerleştirme vektörlerini döndürür resim veya çerçeveyi seçin.

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 şunları da yapmanız gerekir: Resim Yerleştirme görevine giriş çerçevesinin zaman damgasını sağlayın.
  • Görüntü veya video modunda çalışırken Resim Yerleştirme görevi giriş resmini işlemeyi bitirene kadar geçerli iş parçacığını engeller veya çerçeve. Mevcut iş parçacığının engellenmesini önlemek için işlemeyi arka plan ileti dizisi.
  • Canlı yayın modunda çalışırken Resim Yerleştirme 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. Resim Yerleştirme aracı sırasında embedAsync işlevi çağrılırsa görev başka bir kareyi işlemekle meşgulse görev, yeni giriş çerçevesini yoksayar.

Örnek kodda embed işlevi ImageEmbedderHelper.kt dosyası olarak kaydedebilirsiniz.

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

Çıkarım çalıştırıldığında, Görüntü Yerleştirme görevi bir ImageEmbedderResult döndürüyor yerleştirme listesi içeren nesne (kayan nokta veya skaler olarak nicelikli) girmeniz gerekir.

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

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 resmin yerleştirilmesiyle elde edildi:

İki yerleştirmenin benzerliğini ImageEmbedder.cosineSimilarity işlevi. Aşağıdaki kodu inceleyerek örneğine bakalım.

// Compute cosine similarity.
double similarity = ImageEmbedder.cosineSimilarity(
  result.embeddingResult().embeddings().get(0),
  otherResult.embeddingResult().embeddings().get(0));