menu icon

L'Art de la Vectorisation d'Images - Un Guide avec OpenSearch

BLIP-2 est un modèle qui combine les forces de la vision par ordinateur et des grands modèles de langage. Ce mélange puissant permet aux utilisateurs d'engager des conversations avec leurs propres images et de générer du contenu descriptif. Dans cet article, nous verrons comment tirer parti de BLIP-2 pour créer des descriptions d'images enrichies, suivies de leur indexation en tant que vecteurs dans Opensearch.

L'Art de la Vectorisation d'Images - Un Guide avec OpenSearch

Sommaire

  1. La multimodalité comme GPT-4
  2. BLIP-2 : qu’est-ce que c’est et comment ça fonctionne ?
  3. BLIP-2 vs BLIP : vue d’ensemble et principales différences
  4. De l’image au vecteur avec Opensearch
  5. Conclusion

Introduction : la multimodalité comme GPT-4

Récemment, OpenAI a dévoilé les capacités remarquables de GPT-4, qui est entré dans le domaine des grands modèles de langage multimodaux. Cela signifie que, alors qu’il y a peu de temps nos interactions avec le chatbot le plus célèbre étaient limitées aux demandes textuelles, nous pouvons maintenant engager des conversations directes en utilisant notre voix ou envoyer des images pour poser des questions à leur sujet.

ChatGPT peut maintenant voir, entendre et parler

Son fonctionnement est similaire à celui de BLIP-2, un modèle open source qui peut être utilisé pour la génération de texte conditionnelle en fonction d’une image et d’une demande de texte facultative.

Dans cet article, nous allons explorer les caractéristiques de BLIP-2 et ses différences par rapport à son prédécesseur. De plus, nous verrons comment utiliser ce modèle pour générer des descriptions enrichies de nos images avant de les indexer dans notre cluster Opensearch.

Blip-2 : qu’est-ce que c’est et comment ça fonctionne ?

Blip-2 est un modèle remarquable qui a fait d'énormes progrès dans le domaine de la compréhension de la vision par ordinateur. Il s’appuie sur les fondations posées dans l’article intitulé “BLIP-2 : Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models” de Junnan Li, Dongxu Li, Silvio Savarese et Steven Hoi. Blip-2 exploite la puissance des codeurs d’images pré-entraînés et des grands modèles de langage pour effectuer une danse complexe entre les images et le texte.

Texte alternatif
Vue d'ensemble de l'architecture du modèle

Avant d'être prêt à l’action, Blip-2 subit un processus de formation en deux étapes. Dans la première étape, Blip-2 apprend à reconnaître les objets et les scènes sur les images, et dans la deuxième étape, il apprend à comprendre la relation entre les images et le texte.

Pour comprendre comment cela fonctionne, nous allons travailler à travers des exemples :

import requests
from PIL import Image
from transformers import Blip2Processor, Blip2ForConditionalGeneration

processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b")
model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-opt-2.7b")

img_url = 'https://storage.googleapis.com/sfr-vision-language-research/BLIP/demo.jpg'
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert('RGB')

question = "Que voyez-vous ?"

qtext = f"Question : {question} Réponse :"

inputs = processor(raw_image, qtext, return_tensors="pt")

out = model.generate(**inputs, max_new_tokens=1000)
print(processor.decode(out[0], skip_special_tokens=True).strip())

Dans cet exemple, nous utilisons Blip-2 avec Opt-2 (un grand modèle de langage avec 2,7 milliards de paramètres). Nous fournissons au modèle une photo représentant une femme et son chien jouant sur la plage. Ensuite, nous interrogeons le modèle sur l’image, en demandant spécifiquement : “Que voyez-vous ?” Le modèle répond correctement qu’il y a une femme et son chien sur la plage.

BLIP-2 vs BLIP : vue d’ensemble et principales différences

Malgré le fait que les deux modèles aient été formés sur le même ensemble de données, BLIP-2 surpasse BLIP grâce à son architecture et à l’utilisation d’un LLM. Voici quelques comparaisons sur diverses tâches de vision par ordinateur :

Texte alternatif
Différences de performances

Nous avons effectué des tests pratiques en décrivant différentes images, et les résultats confirment de manière indiscutable l’efficacité des modèles dans la tâche d'étiquetage.

Image Description BLIP Description BLIP-2 avec OPT2.7 comme LLM
sac Un sac de voyage noir avec un motif à pois blancs Un sac de voyage noir avec une poche à fermeture éclair blanche
chaussures Une paire de chaussures posée sur une surface en béton Une paire de chaussures de course vert fluo posée sur un rebord
stylo Le stylo à bille noir avec des finitions dorées Un stylo à plume avec des finitions noires et dorées
lait Une boîte de lait avec une étiquette blanche et verte Everfresh lait entier 6 litres

 

L’une des caractéristiques les plus remarquables de BLIP-2 est son efficacité exceptionnelle pour répondre aux questions visuelles. Avec ce modèle, nous pouvons poser des questions sur divers aspects d’une image, ce qui s’avère inestimable pour extraire des informations. Par exemple, nous pouvons demander la marque des chaussures (le modèle identifie correctement celles de la photo comme des Saucony), demander la couleur des objets dans la scène ou demander d’autres détails spécifiques qui pourraient être utiles pour l’indexation.

De l’image au vecteur avec Opensearch

Une fois que les descriptions de l’image sont générées, les indexer en tant que vecteur est chose aisée. Pour l’incorporation de vecteurs, nous avons décidé d’utiliser le modèle “all-MiniLM-L12-v2”, qui est suffisamment efficace et relativement peu volumineux.

La première chose que nous devons faire est d’importer le modèle, qui s’exécutera sur notre nœud d’apprentissage automatique dédié.

 POST /_plugins/_ml/models/_upload
 {
 "name": "huggingface/sentence-transformers/all-MiniLM-L12-v2",
 "version": "1.0.1",
 "model_format": "TORCH_SCRIPT"
 }

Ensuite, nous pouvons créer un pipeline qui utilisera le modèle pour générer la sortie appropriée, qui est un vecteur de 384 dimensions. Chaque dimension de ce vecteur déterminera la position du document dans l’espace vectoriel. En d’autres termes, le vecteur définit le document en fonction de certaines caractéristiques.

PUT _ingest/pipeline/nlp-pipeline
{
  "description": "Pipeline de recherche neuronale pour vectoriser la description de notre image",
  "processors" : [
    {
      "text_embedding": {
        "model_id": "GyNHmYoB6VptOom2kytA",
        "field_map": {
           "image_description": "image_description_vector"
        }
      }
    }
  ]
}

Notez que field_map indique l’association entre le champ ‘image_description’ et le champ ‘image_description_vector’. Lorsque nous créons notre index, il est nécessaire de spécifier le deuxième champ, celui utilisé pour stocker le vecteur en tant que “knn_vector”. De plus, il est obligatoire de définir la dimension correcte pour le champ, qui dépend du modèle que nous utilisons : 384 dans notre cas, puisque nous utilisons le modèle all-MiniLM-L12-v2.

{
  "settings": {
    "index.knn": true,
    "default_pipeline": "nlp-pipeline"
  },
  "mappings": {
    "properties": {
      "image_description_vector": {
        "type": "knn_vector",
        "dimension": 384,
        "method": {
          "name": "hnsw",
          "engine": "lucene"
        }
      },
      "image_description": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

Une fois cela fait, chaque fois que nous indexerons la description générée à partir de nos images en utilisant Blip-2, elle sera stockée sous forme de texte dans le champ “image_description”, et sous forme de vecteur dans le champ “image_description_vector”, ce qui nous permettra d’effectuer à la fois une recherche sémantique et une recherche vectorielle.

Conclusion

Nous nous trouvons au cœur d’une ère de transformation où les technologies de l’apprentissage automatique et de la recherche avancent à un rythme stupéfiant. L'émergence des grands modèles de langage (LLM) et de la recherche vectorielle façonne l’avenir de la recherche de manière profonde, en conduisant les changements. Dans ce panorama, Blip-2 représente non seulement une étape importante dans le parcours de la compréhension de la vision par ordinateur, mais aussi une avancée significative vers l’avenir de la recherche.

Comprendre les différences entre les vecteurs sémantiques creux et denses

31/01/2024

De plus en plus fréquemment, nous entendons parler de la recherche sémantique et de nouvelles façons de la mettre en œuvre. Dans la dernière version d'OpenSearch (2.11), la recherche sémantique à travers des vecteurs creux a été introduite. Mais que signifie vecteur creux? Comment cela diffère-t-il d'une matrice dense? Tentons de clarifier cela dans cet article.

Lire l'article

Guide complet sur le RAG Open-Source

01/12/2023

Plongée dans le Retrieval-Augmented Generation (RAG). Dans cet article, nous explorons les concepts fondamentaux derrière le RAG, en mettant l'accent sur son rôle dans l'amélioration de la compréhension contextuelle et la synthèse d'informations. De plus, nous fournissons un guide pratique sur la mise en œuvre d'un système RAG en utilisant uniquement des outils open-source et des modèles de langage volumineux.

Lire l'article

Retour de la conférence DevFest Toulouse

19/11/2023

Nous sommes de retour du DevFest Toulouse, occasion pour nous d'assister à plusieurs conférences, nous former et partager une version personnalisée de notre presentation Cloner ChatGPT avec Hugging Face et Elasticsearch.

Lire l'article

NLP dans OpenSearch

18/06/2023

Un guide pratique sur l'importation et l'utilisation de modèles NLP dans OpenSearch pour l'analyse et l'inférence de texte dans vos flux de recherche et d'analyse.

Lire l'article

Plonger dans le NLP avec Elastic

01/04/2023

Un aperçu sur le NLP et un guide pratique sur la façon dont il peut être utilisé avec la Suite Elastic pour améliorer les capacités de recherche.

Lire l'article