L’état de la vision par ordinateur chez Hugging Face 🤗

État de la vision par ordinateur chez Hugging Face 🤗

Chez Hugging Face, nous sommes fiers de démocratiser le domaine de l’intelligence artificielle avec la communauté. Dans le cadre de cette mission, nous avons commencé à concentrer nos efforts sur la vision par ordinateur au cours de l’année écoulée. Ce qui a commencé comme une demande de création de Vision Transformers (ViT) dans les 🤗 Transformers est maintenant devenu quelque chose de beaucoup plus important – 8 tâches principales de vision, plus de 3000 modèles et plus de 100 ensembles de données sur le Hub Hugging Face.

Beaucoup de choses passionnantes se sont produites depuis l’arrivée des ViTs sur le Hub. Dans cet article de blog, nous résumerons ce qui s’est passé et ce qui arrive pour soutenir les progrès continus de la vision par ordinateur de l’écosystème 🤗.

Voici une liste des sujets que nous aborderons:

  • Tâches et pipelines de vision pris en charge
  • Formation de vos propres modèles de vision
  • Intégration avec timm
  • Diffuseurs
  • Prise en charge des bibliothèques tierces
  • Déploiement
  • et bien plus encore!

Favoriser la communauté: une tâche à la fois 👁

Le Hub Hugging Face est le foyer de plus de 100 000 modèles publics pour différentes tâches telles que la prédiction du mot suivant, le remplissage du masque, la classification des jetons, la classification des séquences, etc. Aujourd’hui, nous prenons en charge 8 tâches principales de vision fournissant de nombreux points de contrôle du modèle:

  • Classification d’image
  • Segmentation d’image
  • Détection d’objets (zéro-shot)
  • Classification vidéo
  • Estimation de la profondeur
  • Synthèse image-par-image
  • Génération d’image inconditionnelle
  • Classification d’image en zéro-shot

Chacune de ces tâches est accompagnée d’au moins 10 points de contrôle de modèle sur le Hub pour que vous puissiez explorer. De plus, nous prenons en charge des tâches situées à l’intersection de la vision et du langage, telles que:

  • Image-vers-texte (légendage d’image, OCR)
  • Texte-vers-image
  • Réponse à une question sur un document
  • Réponse à une question visuelle

Ces tâches impliquent non seulement des architectures basées sur les transformateurs de pointe telles que ViT, Swin, DETR, mais aussi des architectures purement convolutionnelles comme ConvNeXt, ResNet, RegNet, et bien d’autres! Les architectures telles que ResNets sont toujours très pertinentes pour une myriade de cas d’utilisation industriels, et c’est pourquoi nous prenons en charge ces architectures non-transformateurs dans les 🤗 Transformers.

Il est également important de noter que les modèles sur le Hub ne proviennent pas seulement de la bibliothèque Transformers, mais également d’autres bibliothèques tierces. Par exemple, même si nous prenons en charge des tâches telles que la génération d’images inconditionnelle sur le Hub, nous n’avons pas encore de modèles prenant en charge cette tâche dans Transformers (comme celui-ci). Prendre en charge toutes les tâches d’apprentissage automatique, qu’elles soient résolues avec des Transformers ou une bibliothèque tierce, fait partie de notre mission de favoriser un écosystème d’apprentissage automatique open source et collaboratif.

Prise en charge des pipelines

Nous avons développé des pipelines pour doter les praticiens des outils dont ils ont besoin pour intégrer facilement l’apprentissage automatique dans leur boîte à outils. Ils offrent un moyen facile d’effectuer une inférence sur une entrée donnée par rapport à une tâche. Nous prenons en charge sept tâches de vision dans les pipelines. Voici un exemple d’utilisation des pipelines pour l’estimation de la profondeur:

  from transformers import pipeline

estimation_de_profondeur = pipeline(task = "depth-estimation", model = "Intel / dpt-large")
output = estimation_de_profondeur("http://images.cocodataset.org/val2017/000000039769.jpg")

# Ceci est un tenseur avec les valeurs représentant la profondeur exprimée
# en mètres pour chaque pixel
output["profondeur"]  

L’interface reste la même même pour des tâches comme la réponse à une question visuelle:

  from transformers import pipeline

oracle = pipeline(model = "dandelin / vilt-b32-finetuned-vqa")
image_url = "https://huggingface.co/datasets/mishig/sample_images/resolve/main/tiger.jpg"

oracle(question = "Que fait l'animal?", image = image_url, top_k = 1)
# [{'score': 0.778620, 'answer': 'allongé'}]  

Former vos propres modèles

Bien qu’il soit possible d’utiliser un modèle pour une inférence prête à l’emploi, le fine-tuning est là où la communauté en tire le plus de bénéfices. Cela est particulièrement vrai lorsque vos ensembles de données sont personnalisés et que vous n’obtenez pas de bonnes performances avec les modèles pré-entraînés.

Transformers fournit une API Trainer pour tout ce qui concerne la formation. Actuellement, Trainer prend en charge de manière transparente les tâches suivantes: classification d’image, segmentation d’image, classification vidéo, détection d’objets et estimation de la profondeur. Le fine-tuning des modèles pour d’autres tâches de vision est également pris en charge, mais pas par Trainer .

Tant que le calcul de la perte est inclus dans un modèle à partir duquel Transformers calcule la perte pour une tâche donnée, il devrait être éligible pour un ajustement fin pour la tâche. Si vous rencontrez des problèmes, veuillez les signaler sur GitHub.

Où puis-je trouver le code ?

  • Documentation du modèle
  • Notebooks Hugging Face
  • Scripts d’exemple Hugging Face
  • Pages de tâches

Les scripts d’exemple Hugging Face incluent différentes stratégies d’auto-apprentissage préalable supervisé comme MAE, et des stratégies d’auto-apprentissage préalable de l’image et du texte contrastés comme CLIP. Ces scripts sont des ressources précieuses pour la communauté de recherche ainsi que pour les praticiens souhaitant exécuter un pré-apprentissage à partir de zéro sur des corpus de données personnalisées.

Cependant, certaines tâches ne sont pas intrinsèquement destinées à un ajustement fin. Cela inclut la classification d’images sans apprentissage (comme CLIP), la détection d’objets sans apprentissage (comme OWL-ViT) et la segmentation sans apprentissage (comme CLIPSeg). Nous allons revoir ces modèles dans ce billet.

Intégrations avec les ensembles de données

Les ensembles de données permettent un accès facile à des milliers d’ensembles de données de modalités différentes. Comme mentionné précédemment, le Hub propose plus de 100 ensembles de données pour la vision par ordinateur. Voici quelques exemples intéressants : ImageNet-1k, Scene Parsing, NYU Depth V2, COYO-700M et LAION-400M. Avec ces ensembles de données disponibles sur le Hub, on peut facilement les charger avec seulement deux lignes de code :

from datasets import load_dataset

dataset = load_dataset("scene_parse_150")

En plus de ces ensembles de données, nous proposons également une prise en charge de l’intégration avec des bibliothèques d’augmentation telles que albumentations et Kornia. La communauté peut profiter de la flexibilité et des performances des ensembles de données ainsi que des transformations d’augmentation puissantes fournies par ces bibliothèques. En plus de cela, nous proposons également des guides de chargement de données dédiés pour les tâches de vision de base : classification d’images, segmentation d’images, détection d’objets et estimation de la profondeur.

🤗 🤝 timm

timm, également connu sous le nom de pytorch-image-models, est une collection open-source de modèles d’images PyTorch de pointe, de poids pré-entraînés et de scripts utilitaires pour l’entraînement, l’inférence et la validation.

Nous avons plus de 200 modèles de timm sur le Hub et d’autres sont en cours de développement. Consultez la documentation pour en savoir plus sur cette intégration.

🧨 Diffusers

Diffusers fournit des modèles de diffusion de vision et d’audio pré-entraînés, et sert de boîte à outils modulaire pour l’inférence et l’entraînement. Avec cette bibliothèque, vous pouvez générer des images plausibles à partir d’entrées de langage naturel, entre autres cas d’utilisation créatifs. Voici un exemple :

from diffusers import DiffusionPipeline

generator = DiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
generator.to("cuda")

image = generator("Une image d'un écureuil dans le style de Picasso").images[0]

Ce type de technologie peut permettre une nouvelle génération d’applications créatives et aider également les artistes issus de différents horizons. Pour en savoir plus sur Diffusers et les différents cas d’utilisation, consultez la documentation officielle.

La littérature sur les modèles basés sur la diffusion évolue rapidement, c’est pourquoi nous avons collaboré avec Jonathan Whitaker pour développer un cours à ce sujet. Le cours est gratuit, et vous pouvez le consulter ici.

Prise en charge des bibliothèques tierces

Le Hub Hugging Face, au cœur de l’écosystème Hugging Face, permet aux personnes de collaborer efficacement sur l’apprentissage automatique. Comme mentionné précédemment, nous prenons en charge non seulement les modèles 🤗 Transformers sur le Hub, mais aussi les modèles d’autres bibliothèques tierces. À cette fin, nous fournissons plusieurs utilitaires pour que vous puissiez intégrer votre propre bibliothèque avec le Hub. L’un des avantages principaux de cela est qu’il devient très facile de partager des artefacts (comme des modèles et des ensembles de données) avec la communauté, ce qui facilite l’essai de vos modèles par vos utilisateurs.

Lorsque vous hébergez vos modèles sur le Hub, vous pouvez également ajouter des widgets d’inférence personnalisés pour eux. Les widgets d’inférence permettent aux utilisateurs de vérifier rapidement les modèles. Cela contribue à améliorer l’engagement des utilisateurs.

Espaces pour les démonstrations de vision par ordinateur

Avec Spaces, il est possible de démontrer facilement ses modèles d’apprentissage automatique. Spaces prend en charge des intégrations directes avec Gradio, Streamlit et Docker, ce qui donne aux praticiens une grande flexibilité pour présenter leurs modèles. Vous pouvez intégrer votre propre framework d’apprentissage automatique pour créer une démo avec Spaces.

La bibliothèque Gradio fournit plusieurs composants pour construire des applications de vision par ordinateur sur des espaces tels que Vidéo , Galerie et Modèle3D . La communauté a travaillé dur pour construire des applications de vision par ordinateur incroyables alimentées par Spaces :

  • Générer des voxels 3D à partir d’une carte de profondeur prédite d’une image d’entrée
  • Ségmentation sémantique à vocabulaire ouvert
  • Narrer des vidéos en générant des légendes
  • Classer les vidéos de YouTube
  • Classification vidéo à zéro-shot
  • Question-réponse visuelle
  • Utiliser la classification d’image à zéro-shot pour trouver les meilleures légendes pour une image afin de générer des images similaires

🤗 AutoTrain

AutoTrain offre une solution “no-code” pour entraîner des modèles d’apprentissage automatique de pointe pour des tâches telles que la classification de texte, la résumé de texte, la reconnaissance d’entités nommées, et plus encore. Pour la vision par ordinateur, nous prenons actuellement en charge la classification d’image, mais on peut s’attendre à une plus grande couverture de tâches.

AutoTrain permet également une évaluation automatique des modèles . Cette application vous permet d’évaluer les modèles 🤗 Transformers sur une grande variété d’ensembles de données sur le Hub. Les résultats de votre évaluation seront affichés sur les tableaux de bord publics . Vous pouvez consulter ce billet de blog pour plus de détails.

La philosophie technique

Dans cette section, nous voulions partager notre philosophie concernant l’ajout de la prise en charge de la vision par ordinateur dans 🤗 Transformers afin que la communauté soit consciente des choix de conception spécifiques à ce domaine.

Même si Transformers a commencé avec le traitement du langage naturel (NLP), nous prenons aujourd’hui en charge plusieurs modalités, par exemple – vision, audio, vision-langage et apprentissage par renforcement. Pour toutes ces modalités, tous les modèles correspondants de Transformers bénéficient de certains avantages communs :

  • Téléchargement facile du modèle avec une seule ligne de code avec from_pretrained()
  • Chargement facile du modèle avec push_to_hub()
  • Prise en charge du chargement de checkpoints importants avec des techniques de partitionnement de checkpoints efficaces
  • Prise en charge de l’optimisation (avec des outils comme Optimum )
  • Initialisation à partir des configurations de modèle
  • Prise en charge à la fois de PyTorch et TensorFlow (non-exhaustif)
  • et bien d’autres

Contrairement aux tokenizers, nous avons des préprocesseurs (comme celui-ci ) qui se chargent de préparer les données pour les modèles de vision. Nous avons travaillé dur pour nous assurer que l’expérience utilisateur de l’utilisation d’un modèle de vision reste facile et similaire :

from transformers import ViTImageProcessor, ViTForImageClassification
import torch
from datasets import load_dataset

dataset = load_dataset("huggingface/cats-image")
image = dataset["test"]["image"][0]

image_processor  = ViTImageProcessor.from_pretrained("google/vit-base-patch16-224")
model = ViTForImageClassification.from_pretrained("google/vit-base-patch16-224")
inputs = image_processor(image, return_tensors="pt")

with torch.no_grad():
    logits = model(**inputs).logits

# le modèle prédit l'une des 1000 classes ImageNet
predicted_label = logits.argmax(-1).item()
print(model.config.id2label[predicted_label])
# Chat égyptien

Même pour une tâche difficile comme la détection d’objets, l’expérience utilisateur ne change pas beaucoup :

from transformers import AutoImageProcessor, AutoModelForObjectDetection
from PIL import Image
import requests

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

image_processor = AutoImageProcessor.from_pretrained("microsoft/conditional-detr-resnet-50")
model = AutoModelForObjectDetection.from_pretrained("microsoft/conditional-detr-resnet-50")
inputs = image_processor(images=image, return_tensors="pt")

outputs = model(**inputs)

# convertir les sorties (boîtes englobantes et logits de classe) en API COCO
target_sizes = torch.tensor([image.size[::-1]])
results = image_processor.post_process_object_detection(
    outputs, threshold=0.5, target_sizes=target_sizes
)[0]

for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
    box = [round(i, 2) for i in box.tolist()]
    print(
        f"Détecté {model.config.id2label[label.item()]} avec une confiance "
        f"{round(score.item(), 3)} à l'emplacement {box}"
    )

Donne :

Détecté une télécommande avec une confiance de 0,833 à l'emplacement [38,31, 72,1, 177,63, 118,45]
Détecté un chat avec une confiance de 0,831 à l'emplacement [9,2, 51,38, 321,13, 469,0]
Détecté un chat avec une confiance de 0,804 à l'emplacement [340,3, 16,85, 642,93, 370,95]
Détecté une télécommande avec une confiance de 0,683 à l'emplacement [334,48, 73,49, 366,37, 190,01]
Détecté un canapé avec une confiance de 0,535 à l'emplacement [0,52, 1,19, 640,35, 475,1]

Modèles à zéro-shot pour la vision

Il y a eu une explosion de modèles qui reformulent les tâches de vision de base telles que la segmentation et la détection de manière intéressante et introduisent encore plus de flexibilité. Nous soutenons quelques-uns de ces modèles issus des Transformers :

  • CLIP qui permet la classification d’images à zéro-shot avec des instructions. Étant donnée une image, vous donneriez une instruction au modèle CLIP avec une requête en langage naturel comme “une image de {}”. L’espoir est d’obtenir le libellé de la classe en tant que réponse.
  • OWL-ViT qui permet la détection d’objets à zéro-shot conditionnée par le langage et la détection d’objets à un seul coup conditionnée par l’image. Cela signifie que vous pouvez détecter des objets dans une image même si le modèle sous-jacent n’a pas appris à les détecter pendant l’entraînement ! Vous pouvez vous référer à ce notebook pour en savoir plus.
  • CLIPSeg qui prend en charge la segmentation d’images à zéro-shot conditionnée par le langage et la segmentation d’images à un seul coup conditionnée par l’image. Cela signifie que vous pouvez segmenter des objets dans une image même si le modèle sous-jacent n’a pas appris à les segmenter pendant l’entraînement ! Vous pouvez vous référer à cet article de blog qui illustre cette idée. GroupViT prend également en charge la tâche de segmentation à zéro-shot.
  • X-CLIP qui présente une généralisation à zéro-shot pour les vidéos. Précisément, il prend en charge la classification de vidéos à zéro-shot. Consultez ce notebook pour plus de détails.

La communauté peut s’attendre à voir davantage de modèles à zéro-shot pour la vision par 🤗Transformers dans les prochains jours.

Déploiement

Comme le dit notre CTO Julien – “les vrais artistes livrent” 🚀

Nous soutenons le déploiement de ces modèles de vision grâce à 🤗Inference Endpoints. Inference Endpoints s’intègre directement aux modèles compatibles concernant la classification d’images, la détection d’objets et la segmentation d’images. Pour d’autres tâches, vous pouvez utiliser les gestionnaires personnalisés. Étant donné que nous fournissons également de nombreux modèles de vision en TensorFlow provenant de 🤗Transformers pour leur déploiement, nous recommandons soit d’utiliser les gestionnaires personnalisés, soit de suivre ces ressources :

  • Déploiement des modèles de vision TensorFlow dans Hugging Face avec TF Serving
  • Déploiement de 🤗 ViT sur Kubernetes avec TF Serving
  • Déploiement de 🤗 ViT sur Vertex AI
  • Déploiement de ViT avec TFX et Vertex AI

Conclusion

Dans cet article, nous vous avons présenté un aperçu des fonctionnalités actuellement prises en charge par l’écosystème Hugging Face pour permettre la prochaine génération d’applications de vision par ordinateur. Nous espérons que vous apprécierez d’utiliser ces offres pour construire de manière fiable et responsable.

Cependant, il reste encore beaucoup à faire. Voici certaines choses que vous pouvez attendre de voir :

  • Prise en charge directe des vidéos par 🤗Datasets
  • Prise en charge de tâches plus pertinentes pour l’industrie, comme la similarité d’images
  • Interopérabilité des jeux de données d’images avec TensorFlow
  • Un cours sur la vision par ordinateur de la communauté 🤗

Comme toujours, nous sommes ouverts à vos correctifs, pull requests, checkpoints de modèles, jeux de données et autres contributions ! 🤗

Remerciements : Merci à Omar Sanseviero, Nate Raw, Niels Rogge, Alara Dirik, Amy Roberts, Maria Khalusova et Lysandre Debut pour leurs relectures rigoureuses et opportunes du brouillon du blog. Merci à Chunte Lee pour la création de la vignette du blog.

We will continue to update IPGirl; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more