SAM : découpe n'importe quel objet d'une image, pixel par pixel, en Python

SAM : découpe n'importe quel objet d'une image, pixel par pixel, en Python

De quoi avez-vous besoin

Version de Python

3.x

Packages

  • {"nom":"transformers","version":"4.50.0"}
  • {"nom":"torch","version":"2.6.0"}
  • {"nom":"pillow","version":"11.1.0"}

Difficulté

Intermédiaire

Repérer un objet dans une image, c'est facile : on dessine un rectangle autour. Le découper, c'est une autre affaire. La segmentation consiste à dire, pour chaque pixel, s'il appartient ou non à l'objet. Le contour exact d'un chat, d'une voiture, d'une personne, au pixel près. Pendant des années, il fallait des labos, des jeux de données annotés à la main et des GPU par milliers. Puis Meta a publié SAM, le Segment Anything Model. Et la bonne nouvelle, c'est qu'on peut le faire tourner en quelques lignes de Python, sans entraîner quoi que ce soit.

SAM est un modèle « à tout segmenter » : donne-lui une image et un simple point (ou un rectangle), il te renvoie le masque de l'objet visé. Pas de dataset, pas de fine-tuning, pas de prompt alambiqué. Un point, un clic, et le masque suit les contours. On va le faire tourner en local, avec la bibliothèque transformers de Hugging Face, qui télécharge le modèle à notre place.

Concrètement, la segmentation sert partout : détourer un produit pour une fiche e-commerce, isoler une zone suspecte sur une image médicale, effacer l'arrière-plan d'une visio, ou préparer un dataset d'images annotées pour entraîner un autre modèle. SAM fait tout ça sans jamais avoir vu tes images, car Meta l'a entraîné sur plus d'un milliard de masques. Son talent n'est pas de reconnaître tel ou tel objet : c'est de comprendre ce que signifie « découper », quelle que soit la photo qu'on lui tend.

Étape 1 — Installe les dépendances

SAM s'appuie sur PyTorch, le moteur de calcul qui fait tourner les réseaux de neurones. transformers embarque le modèle et son préprocesseur, et Pillow ouvre les images. Si tu es sur CPU, pip installe une version compatible ; si tu as un GPU NVIDIA, regarde du côté de la version CUDA de PyTorch pour aller beaucoup plus vite.

bash
pip install torch transformers pillow

Étape 2 — Charge le modèle et l'image

Au premier lancement, transformers télécharge les poids du modèle (environ 375 Mo pour la version base). C'est une opération unique : ensuite, tout est en cache sur ton disque. Sur un simple processeur, la prédiction prend quelques secondes ; sur GPU, c'est quasi instantané.

python
from PIL import Image
from transformers import SamModel, SamProcessor

model = SamModel.from_pretrained("facebook/sam-vit-base")
processor = SamProcessor.from_pretrained("facebook/sam-vit-base")

image = Image.open("chat.jpg").convert("RGB")

Étape 3 — Pose un point sur l'objet

Le prompt de SAM, c'est une simple coordonnée (x, y) dans l'image. Ici, on vise le point (300, 200). Les coordonnées partent du coin en haut à gauche : (0, 0), puis elles augmentent vers la droite et vers le bas. Le processeur se charge de convertir ce point au format attendu par le modèle.

python
input_points = [[[300, 200]]]  # le point (x, y) posé sur l'objet
inputs = processor(image, input_points=input_points, return_tensors="pt")

Étape 4 — Lance la prédiction et récupère les masques

torch.no_grad() désactive le calcul des gradients, inutile en inférence : ça économise de la mémoire et accélère le tout. post_process_masks redimensionne les masques bruts à la taille de l'image d'origine et les transforme en booléens. Pour un même point, SAM propose trois masques, du plus local au plus englobant, chacun avec un score de confiance.

python
import torch

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

masks = processor.image_processor.post_process_masks(
    outputs.pred_masks.cpu(),
    inputs["original_sizes"].cpu(),
    inputs["reshaped_input_sizes"].cpu(),
)[0]  # 3 masques booléens, un par proposition

scores = outputs.iou_scores[0]  # la confiance de chaque masque

Étape 5 — Découpe et sauvegarde le résultat

On garde le masque le mieux noté, puis on le multiplie pixel à pixel avec l'image : l'objet reste intact, tout le reste passe au noir. Tu peux inverser la logique pour détourer au lieu de noircir : garde le masque comme canal alpha, et l'arrière-plan devient transparent.

python
import numpy as np

best = masks[scores.argmax()].numpy()  # True là où se trouve l'objet
resultat = np.array(image) * best[..., None]
Image.fromarray(resultat.astype("uint8")).save("resultat.png")

Étape 6 — Un rectangle plutôt qu'un point

Quand deux objets se ressemblent ou qu'un point est ambigu, on peut donner un rectangle englobant, au format (x1, y1, x2, y2) : coin haut-gauche, puis coin bas-droite. SAM s'en sert de repère plus strict, et la découpe est souvent plus propre.

python
input_boxes = [[[50, 40, 400, 380]]]  # [x1, y1, x2, y2]
inputs = processor(image, input_boxes=input_boxes, return_tensors="pt")

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

masks = processor.image_processor.post_process_masks(
    outputs.pred_masks.cpu(),
    inputs["original_sizes"].cpu(),
    inputs["reshaped_input_sizes"].cpu(),
)[0]

Sous le capot, SAM découpe le travail en deux. Un encodeur d'image transforme la photo en une carte de caractéristiques, une seule fois ; un décodeur, beaucoup plus léger, n'a plus qu'à répondre à ton point ou ton rectangle. C'est ce découplage qui rend l'inférence rapide : on ne recalcule pas l'image à chaque clic, seul le prompt change.

SAM transforme la segmentation — longtemps réservée aux labos qui annotaient des milliers d'images à la main — en un jeu d'enfant : un point, un modèle pré-entraîné, quelques lignes de Python. Remplace chat.jpg par ta photo, déplace le point, et regarde le masque épouser les contours. Les usages sérieux ne manquent pas : détourage automatique, annotation de datasets, retouche photo, suivi d'objet. La suite logique, c'est d'enchaîner SAM derrière une détection YOLO pour découper automatiquement tout ce qu'elle repère, ou de construire un petit outil où tu cliques sur l'image pour découper ce que tu veux.

Petit avertissement avant de te lancer : SAM découpe ce que tu lui pointes, pas forcément ce que tu voulais pointer. Un point posé entre deux objets donnera un masque hésitant. Si le résultat te semble fou, déplace le point de quelques pixels ou passe au rectangle. C'est tout l'intérêt du modèle : itérer coûte une fraction de seconde, alors teste plusieurs positions et garde la meilleure.

K

Auteur

Krugz

Développeur fullstack

Développeur fullstack qui tente, tant bien que mal, de suivre l'actualité de l'IA au milieu d'une marée d'informations imbuvables et des milliers d'outils et de modèles qui sortent chaque jour.