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:
- 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 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));