Segmentation universelle des images avec Mask2Former et OneFormer

Segmentation d'images avec Mask2Former et OneFormer.

Ce guide présente Mask2Former et OneFormer, deux réseaux neuronaux de pointe pour la segmentation d’images. Les modèles sont maintenant disponibles dans la bibliothèque open-source 🤗 transformers , qui offre des implémentations faciles à utiliser de modèles de pointe. En cours de route, vous apprendrez les différences entre les différentes formes de segmentation d’images.

Segmentation d’images

La segmentation d’images est la tâche d’identification de différents “segments” dans une image, comme des personnes ou des voitures. Plus techniquement, la segmentation d’images consiste à regrouper des pixels avec des sémantiques différentes. Consultez la page de tâches de Hugging Face pour une brève introduction.

La segmentation d’images peut être largement divisée en 3 sous-tâches – la segmentation par instance, la segmentation sémantique et la segmentation panoptique – avec de nombreuses méthodes et architectures de modèles pour chaque sous-tâche.

  • La segmentation par instance est la tâche d’identification de différents “instances”, comme des personnes individuelles, dans une image. La segmentation par instance est très similaire à la détection d’objets, sauf que nous voulons produire un ensemble de masques binaires de segmentation, plutôt que des boîtes englobantes, avec des étiquettes de classe correspondantes. Les instances sont souvent appelées “objets” ou “choses”. Notez que les instances individuelles peuvent se chevaucher.
  • La segmentation sémantique est la tâche d’identification de différentes “catégories sémantiques”, comme “personne” ou “ciel”, de chaque pixel dans une image. Contrairement à la segmentation par instance, aucune distinction n’est faite entre les instances individuelles d’une catégorie sémantique donnée ; on souhaite simplement obtenir un masque pour la catégorie “personne”, par exemple, plutôt que pour les personnes individuelles. Les catégories sémantiques qui n’ont pas d’instances individuelles, comme “ciel” ou “herbe”, sont souvent appelées “choses”, pour faire la distinction avec les “objets” (de grands noms, hein ?). Notez qu’aucun chevauchement entre les catégories sémantiques n’est possible, car chaque pixel appartient à une seule catégorie.
  • La segmentation panoptique, introduite en 2018 par Kirillov et al., vise à unifier la segmentation par instance et la segmentation sémantique, en faisant simplement identifier aux modèles un ensemble de “segments”, chacun avec un masque binaire correspondant et une étiquette de classe. Les segments peuvent être à la fois des “objets” ou des “choses”. Contrairement à la segmentation par instance, aucun chevauchement entre différents segments n’est possible.

L’illustration ci-dessous montre la différence entre les 3 sous-tâches (extraite de cet article de blog).

Au cours des dernières années, les chercheurs ont proposé plusieurs architectures qui étaient généralement très adaptées à la segmentation par instance, à la segmentation sémantique ou à la segmentation panoptique. La segmentation par instance et la segmentation panoptique étaient généralement résolues en produisant un ensemble de masques binaires + étiquettes correspondantes par instance d’objet (très similaire à la détection d’objets, sauf qu’un masque binaire est produit au lieu d’une boîte englobante par instance). On appelle souvent cela la “classification de masques binaires”. La segmentation sémantique, quant à elle, était généralement résolue en faisant en sorte que les modèles produisent une seule “carte de segmentation” avec une étiquette par pixel. Ainsi, la segmentation sémantique était traitée comme un problème de “classification par pixel”. Les modèles populaires de segmentation sémantique qui adoptent ce paradigme sont SegFormer, sur lequel nous avons écrit un article de blog approfondi, et UPerNet.

Segmentation d’images universelle

Heureusement, depuis environ 2020, les chercheurs ont commencé à proposer des modèles capables de résoudre les 3 tâches (segmentation par instance, sémantique et panoptique) avec une architecture unifiée, en utilisant le même paradigme. Cela a commencé avec DETR, qui était le premier modèle à résoudre la segmentation panoptique en utilisant le paradigme de la “classification de masques binaires”, en traitant de manière unifiée les classes “objets” et “choses”. L’innovation clé a été d’utiliser un décodeur Transformer pour produire un ensemble de masques binaires + classes de manière parallèle. Cela a ensuite été amélioré dans l’article MaskFormer, qui a montré que le paradigme de “classification de masques binaires” fonctionne également très bien pour la segmentation sémantique.

Mask2Former étend cela à la segmentation par instance en améliorant davantage l’architecture du réseau neuronal. Nous sommes donc passés d’architectures séparées à ce que les chercheurs appellent maintenant des architectures de “segmentation d’images universelles”, capables de résoudre n’importe quelle tâche de segmentation d’images. Fait intéressant, ces modèles universels adoptent tous le paradigme de “classification de masques”, en abandonnant entièrement le paradigme de “classification par pixel”. Une figure illustrant l’architecture de Mask2Former est représentée ci-dessous (extraite de l’article original).

En résumé, une image est d’abord envoyée à un “backbone” (qui, dans l’article, peut être soit ResNet soit Swin Transformer) pour obtenir une liste de cartes de caractéristiques à basse résolution. Ensuite, ces cartes de caractéristiques sont améliorées à l’aide d’un module de décodage de pixels pour obtenir des caractéristiques à haute résolution. Enfin, un décodeur Transformer prend un ensemble de requêtes et les transforme en un ensemble de prédictions de masque binaire et de classe, conditionné par les caractéristiques du décodeur de pixels.

Notez que Mask2Former doit encore être entraîné sur chaque tâche séparément pour obtenir des résultats de pointe. Cela a été amélioré par le modèle OneFormer, qui obtient des performances de pointe sur les 3 tâches en ne s’entraînant que sur une version panoptique de l’ensemble de données (!), en ajoutant un encodeur de texte pour conditionner le modèle sur des entrées “instance”, “sémantique” ou “panoptique”. Ce modèle est également disponible dès aujourd’hui dans les 🤗 transformers. Il est encore plus précis que Mask2Former, mais présente une latence plus élevée en raison de l’encodeur de texte supplémentaire. Consultez la figure ci-dessous pour un aperçu de OneFormer. Il utilise soit Swin Transformer, soit le nouveau modèle DiNAT en tant que base.

Inférence avec Mask2Former et OneFormer dans Transformers

L’utilisation de Mask2Former et OneFormer est assez simple et très similaire à leur prédécesseur MaskFormer. Instancions un modèle Mask2Former à partir du hub entraîné sur l’ensemble de données panoptique COCO, ainsi que son processeur. Notez que les auteurs ont publié pas moins de 30 points de contrôle entraînés sur divers ensembles de données.

from transformers import AutoImageProcessor, Mask2FormerForUniversalSegmentation

processor = AutoImageProcessor.from_pretrained("facebook/mask2former-swin-base-coco-panoptic")
model = Mask2FormerForUniversalSegmentation.from_pretrained("facebook/mask2former-swin-base-coco-panoptic")

Ensuite, chargeons l’image familière des chats à partir de l’ensemble de données COCO, sur laquelle nous effectuerons une inférence.

from PIL import Image

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

Nous préparons l’image pour le modèle en utilisant le processeur d’image, et nous la faisons passer à travers le modèle.

inputs = processor(image, return_tensors="pt")

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

Le modèle renvoie un ensemble de masques binaires et des logits de classe correspondants. Les sorties brutes de Mask2Former peuvent être facilement post-traitées en utilisant le processeur d’image pour obtenir les prédictions finales de segmentation d’instance, sémantique ou panoptique :

prediction = processor.post_process_panoptic_segmentation(outputs, target_sizes=[image.size[::-1]])[0]
print(prediction.keys())

Dans la segmentation panoptique, la prédiction finale prediction contient 2 choses : une carte de segmentation de forme (hauteur, largeur) où chaque valeur encode l’ID d’instance d’un pixel donné, ainsi qu’un segments_info correspondant. Le segments_info contient plus d’informations sur les segments individuels de la carte (comme leur ID de classe/catégorie). Notez que Mask2Former renvoie des propositions de masques binaires de forme (96, 96) pour des raisons d’efficacité, et l’argument target_sizes est utilisé pour redimensionner le masque final à la taille d’image d’origine.

Visualisons les résultats :

from collections import defaultdict
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib import cm

def draw_panoptic_segmentation(segmentation, segments_info):
    # obtenir la palette de couleurs utilisée
    viridis = cm.get_cmap('viridis', torch.max(segmentation))
    fig, ax = plt.subplots()
    ax.imshow(segmentation)
    instances_counter = defaultdict(int)
    handles = []
    # pour chaque segment, dessiner sa légende
    for segment in segments_info:
        segment_id = segment['id']
        segment_label_id = segment['label_id']
        segment_label = model.config.id2label[segment_label_id]
        label = f"{segment_label}-{instances_counter[segment_label_id]}"
        instances_counter[segment_label_id] += 1
        color = viridis(segment_id)
        handles.append(mpatches.Patch(color=color, label=label))
        
    ax.legend(handles=handles)

draw_panoptic_segmentation(**panoptic_segmentation)

Ici, nous pouvons voir que le modèle est capable de détecter les chats individuels et les télécommandes dans l’image. La segmentation sémantique, en revanche, créerait simplement un seul masque pour la catégorie “chat”.

Pour effectuer une inférence avec OneFormer, qui a une API identique sauf qu’il prend également une consigne textuelle supplémentaire en entrée, nous vous renvoyons au cahier de démonstration.

Affiner Mask2Former et OneFormer dans Transformers

Pour affiner Mask2Former/OneFormer sur un ensemble de données personnalisé pour l’instance, la sémantique et la segmentation panoptique, consultez nos cahiers de démonstration. MaskFormer, Mask2Former et OneFormer partagent une API similaire, il est donc facile de passer de MaskFormer à l’autre et ne nécessite que des modifications minimales.

Les cahiers de démonstration utilisent MaskFormerForInstanceSegmentation pour charger le modèle, alors que vous devrez passer à l’utilisation de Mask2FormerForUniversalSegmentation ou OneFormerForUniversalSegmentation. En cas de traitement d’image pour Mask2Former, vous devrez également passer à l’utilisation de Mask2FormerImageProcessor. Vous pouvez également charger le processeur d’image à l’aide de la classe AutoImageProcessor, qui se charge automatiquement de charger le processeur correspondant à votre modèle. OneFormer, en revanche, nécessite un OneFormerProcessor, qui prépare les images, ainsi qu’une entrée textuelle, pour le modèle.

C’est tout ! Vous savez maintenant quelle est la différence entre l’instance, la sémantique et la segmentation panoptique, ainsi que comment utiliser des “architectures universelles” telles que Mask2Former et OneFormer en utilisant la bibliothèque transformers de 🤗.

Nous espérons que vous avez apprécié cet article et que vous avez appris quelque chose. N’hésitez pas à nous faire savoir si vous êtes satisfait des résultats lors de l’affinage de Mask2Former ou OneFormer.

Si vous avez aimé ce sujet et que vous souhaitez en savoir plus, nous vous recommandons les ressources suivantes :

  • Nos cahiers de démonstration pour MaskFormer, Mask2Former et OneFormer, qui donnent un aperçu plus large de l’inférence (y compris la visualisation) ainsi que de l’affinage sur des données personnalisées.
  • Les [espaces de démonstration en direct] pour Mask2Former et OneFormer disponibles sur le Hugging Face Hub, que vous pouvez utiliser pour essayer rapidement les modèles sur des entrées d’échantillon de votre choix.

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

Apprentissage automatique

Le maître joueur d'IA de DeepMind apprend 26 jeux en 2 heures.

L’apprentissage par renforcement, un domaine de recherche essentiel de Google DeepMind, offre un immense potent...

AI

La superpuce NVIDIA Grace Hopper balaye les benchmarks d'inférence MLPerf

Lors de ses débuts sur les référentiels industriels MLPerf, la superpuce NVIDIA GH200 Grace Hopper a réussi tous les ...

AI

Les chercheurs de l'UCI et de Harvard présentent TalkToModel, qui explique les modèles d'apprentissage automatique à ses utilisateurs

Les modèles d’apprentissage automatique sont devenus des outils indispensables dans divers domaines professionn...

AI

Cet article sur l'IA de Chine propose HQTrack une architecture d'intelligence artificielle pour suivre avec précision n'importe quoi dans les vidéos.

Le suivi visuel d’objets est la base de nombreux sous-domaines de la vision par ordinateur, y compris la vision...

AI

L'ESA affirme que l'IA améliore les capacités de navigation par satellite

L'Agence spatiale européenne indique que l'IA et l'apprentissage automatique sont mis en œuvre pour améliorer les per...