Guide sur l'intégration d'images pour le Web

La tâche d'embedding d'image MediaPipe vous permet de convertir les données d'image en représentation numérique pour effectuer des tâches de traitement d'image liées au ML, telles que la comparaison de la similarité de deux images. Ces instructions vous expliquent comment utiliser l'outil d'intégration d'images pour Node et les applications Web.

Pour en savoir plus sur les fonctionnalités, les modèles et les options de configuration de cette tâche, consultez la section Présentation.

Exemple de code

L'exemple de code de l'outil d'intégration d'images fournit une implémentation complète de cette tâche en JavaScript pour référence. Ce code vous aide à tester cette tâche et à commencer à créer votre propre application d'intégration d'images. Vous pouvez afficher, exécuter et modifier l'exemple de code de l'outil d'intégration d'images à l'aide de votre navigateur Web.

Configuration

Cette section décrit les étapes clés à suivre pour configurer votre environnement de développement et vos projets de code spécifiquement pour utiliser Image Embedder. Pour obtenir des informations générales sur la configuration de votre environnement de développement pour utiliser les tâches MediaPipe, y compris les exigences concernant les versions de la plate-forme, consultez le guide de configuration pour le Web.

Packages JavaScript

Le code de l'outil d'intégration d'images est disponible via le package @mediapipe/tasks-vision NPM MediaPipe. Vous pouvez trouver et télécharger ces bibliothèques à partir des liens fournis dans le guide de configuration de la plate-forme.

Vous pouvez installer les packages requis avec le code suivant pour le préproduction local à l'aide de la commande suivante:

npm install @mediapipe/tasks-vision

Si vous souhaitez importer le code de tâche via un service de réseau de diffusion de contenu (CDN), ajoutez le code suivant dans la balise de votre fichier HTML:

<!-- You can replace jsDelivr with your preferred CDN -->
<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.js"
    crossorigin="anonymous"></script>
</head>

Modèle

La tâche d'encapsulation d'image MediaPipe nécessite un modèle entraîné compatible avec cette tâche. Pour en savoir plus sur les modèles entraînés disponibles pour Image Embedder, consultez la section Modèles de la présentation de la tâche.

Sélectionnez et téléchargez un modèle, puis stockez-le dans le répertoire de votre projet:

<dev-project-root>/app/shared/models/

Créer la tâche

Spécifier un chemin d'accès au modèle

Vous pouvez créer une tâche avec les options par défaut à l'aide de la méthode createFromModelPath():

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
  const imageEmbedder = await ImageEmbedder.createFromOptions(vision, {
    baseOptions: {
      modelAssetPath: `https://storage.googleapis.com/mediapipe-models/image_embedder/mobilenet_v3_small/float32/1/mobilenet_v3_small.tflite`
    },
  });

Spécifier le tampon du modèle

Si votre modèle est déjà chargé en mémoire, vous pouvez utiliser la méthode createFromModelBuffer():

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const imageEmbedder = ImageEmbedder.createFromModelBuffer(
    vision, 
    new Uint8Array(...)
);

Spécifier des options personnalisées

La tâche d'encapsulation d'images MediaPipe utilise la fonction createFromOptions pour configurer la tâche. La fonction createFromOptions accepte des valeurs pour les options de configuration. Pour en savoir plus sur les options de configuration, consultez la section Options de configuration.

Le code suivant montre comment créer et configurer la tâche avec des options personnalisées:

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const imageEmbedder = await ImageEmbedder.createFromOptions(
    vision,
    {
      baseOptions: {
        modelAssetPath: "model.tflite"
      },
      quantize: true
    });

Options de configuration

Cette tâche propose les options de configuration suivantes pour les applications Web:

Nom de l'option Description Plage de valeurs Valeur par défaut
running_mode Définit le mode d'exécution de la tâche. Il existe deux modes:

IMAGE: mode pour les entrées d'une seule image.

VIDEO: mode des images décodées d'une vidéo ou d'un flux en direct de données d'entrée, par exemple d'une caméra.
{IMAGE, VIDEO} IMAGE
l2Normalize Indique si le vecteur de caractéristiques renvoyé doit être normalisé avec la norme L2. N'utilisez cette option que si le modèle ne contient pas déjà une opération TFLite L2_NORMALIZATION native. Dans la plupart des cas, c'est déjà le cas, et la normalisation L2 est donc obtenue via l'inférence TFLite sans avoir besoin de cette option. Boolean False
quantize Indique si l'embedding renvoyé doit être quantifié en octets via une quantification scalaire. Les représentations vectorielles continues sont implicitement supposées avoir une norme unitaire. Par conséquent, toute dimension a une valeur comprise dans la plage [-1,0, 1,0]. Utilisez l'option l2Normalize si ce n'est pas le cas. Boolean False

Préparer les données

Image Embedder peut intégrer des images dans n'importe quel format compatible avec le navigateur hôte. La tâche gère également le prétraitement de l'entrée des données, y compris le redimensionnement, la rotation et la normalisation des valeurs.

Les appels aux méthodes embed() et embedForVideo() de l'outil d'intégration d'images s'exécutent de manière synchrone et bloquent le thread de l'interface utilisateur. Si vous souhaitez extraire des vecteurs de caractéristiques à partir de frames vidéo, chaque intégration bloquera le thread principal. Pour éviter cela, implémentez des travailleurs Web pour exécuter les méthodes embed() et embedForVideo() sur un autre thread.

Exécuter la tâche

L'outil d'intégration d'images utilise les méthodes embed() (avec le mode d'exécution image) et embedForVideo() (avec le mode d'exécution video) pour déclencher des inférences. L'API Image Embedder renvoie les vecteurs d'embedding pour l'image d'entrée.

Le code suivant montre comment exécuter le traitement avec le modèle de tâche:

Image

const image = document.getElementById("image") as HTMLImageElement;
const imageEmbedderResult = imageEmbedder.embed(image);

Vidéo

  const video = document.getElementById("webcam");

  const startTimeMs = performance.now();
  const embedderResult = await imageEmbedder.embedForVideo(video, startTimeMs);

Gérer et afficher les résultats

Lors de l'exécution de l'inférence, la tâche Image Embedder renvoie un objet ImageEmbedderResult contenant les vecteurs d'embedding pour l'image ou le frame d'entrée.

Voici un exemple des données de sortie de cette tâche:

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

Ce résultat a été obtenu en encapsulant l'image suivante:

Plan moyen d&#39;un chat exotique

Vous pouvez comparer la similarité sémantique de deux embeddings à l'aide de la fonction ImageEmbedder.cosineSimilarity. Pour en savoir plus, consultez le code suivant.

// Compute cosine similarity.
const similarity = ImageEmbedder.cosineSimilarity(
  imageEmbedderResult.embeddings[0],
  otherEmbedderResult.embeddings[0]);

L'exemple de code de l'outil d'intégration d'images montre comment afficher les résultats de l'outil d'intégration renvoyés par la tâche. Pour en savoir plus, consultez l'exemple de code.