Aller au contenu principal

API de suppression d’objets : créer un masque et télécharger l’image retouchée

Supprimez des objets avec un masque blanc sur noir à 0,03 $ par image : étapes Playground, masque, exemple Python et correctifs des échecs courants.

Auteur
Lydia
Publié
Lecture
9 min de lecture
Mis à jour
Illustration éditoriale d’une retoucheuse aux cheveux bouclés et à lunettes qui marque une lampe sur une feuille transparente posée sur un portrait au café ; ce n’est pas un résultat de l’API Object Eraser.

Utilisez spicyapi/object-eraser-v1/edit avec image_url et soit un prompt court, soit une mask_url, soit les deux. Pour un masque, le blanc signifie supprimer, le noir signifie conserver, et ses dimensions en pixels doivent correspondre à celles de la source. Le prix est de 0,03 $ par image produite, quel que soit le nombre d’objets supprimés par la requête. Le résultat garde la taille de canevas d’origine et remplit la zone sélectionnée avec le contenu de la scène environnante.

Choisir entre prompt et masque

Pour un objet bien distinct et entouré d’espace, commencez par une courte description :

le gobelet en carton blanc posé au sol à côté du pied avant droit de la chaise

Utilisez un nom, une couleur ou une matière visible, et une position. « Rends la scène propre et haut de gamme » n’identifie pas ce qui doit disparaître. Le prompt peut contenir de 1 à 1 000 caractères, mais une consigne plus longue ne sélectionne pas plus précisément.

SituationEntrée à utiliser
Un seul gobelet bien visible sur un sol dégagéprompt qui désigne ce gobelet
Deux gobelets semblables, un seul à retirermask_url sur le gobelet visé
Câble fin, ou objet qui touche le bord du cadremask_url ; les descriptions les manquent souvent
Une description pourrait désigner le mauvais objetEnvoyer les deux, en décrivant et en marquant la même cible
Besoin d’une chaise détourée sur fond transparentSuppression d’arrière-plan
Besoin de plus d’espace autour de la photoOutpainting après le nettoyage

Une description qui ne correspond à rien renvoie l’image inchangée, et la tâche réussit quand même. Comparez donc le résultat à la source avant de le considérer comme une suppression.

Un photographe adulte photographie un fauteuil bleu ; des cercles éditoriaux marquent un gobelet, un câble et un panneau de carton.

Illustration de sélections possibles. Tous les objets marqués sont encore présents ; ce n’est pas un résultat de l’API.

Essayer d’abord dans le Playground

  1. Ouvrez la page Object Eraser, restez sur l’onglet Playground en vue Form et connectez-vous avec un compte approvisionné pour lancer l’exécution.
  2. Ajoutez la photo sous Input image (JPG, PNG ou WebP, jusqu’à 10 Mo). Déposez un fichier, collez un lien avec Asset URL puis Add URL, ou parcourez vos fichiers.
  3. Décrivez la cible dans Prompt, ou ajoutez votre image en noir et blanc sous Mask, ou remplissez les deux. Le formulaire exige au moins l’un des deux.
  4. Laissez Output format sur PNG (JPEG et WebP donnent des fichiers plus légers) et lancez. Le prix est de 0,03 $ par image.
  5. Ouvrez le résultat à côté de l’original et du masque, puis consultez le tableau des échecs ci-dessous si quelque chose reste.

Le panneau Request body affiche le même JSON que celui de l’API : un prompt ou un masque qui fonctionne ici se copie tel quel dans le code. Si cela échoue ici, corrigez le prompt ou le masque avant d’écrire la moindre ligne de code.

Créer le masque d’après l’image exacte que vous enverrez

Si vous connaissez déjà la zone (boîte d’un détecteur ou sélection dans une interface), générez le masque dans le code. Sa taille vient de la source, il correspond donc toujours :

python
from PIL import Image, ImageDraw

src = Image.open("source.jpg")          # apply EXIF rotation and crop first
mask = Image.new("L", src.size, 0)      # black = keep
bbox = (src.width // 4, src.height // 3, src.width // 2, src.height // 2)
# Example coordinates only: adjust this box to the unwanted object in your photo.
ImageDraw.Draw(mask).rectangle(bbox, fill=255)  # white = remove
mask.save("mask.png")

Pour des formes irrégulières sur une source de 2 400 × 1 600 pixels, préparez un masque de 2 400 × 1 600 pixels dans un éditeur d’images :

  1. Terminez d’abord la rotation et le recadrage de la source, puis enregistrez cette image de travail.
  2. Ajoutez un calque noir à la taille complète du canevas et baissez son opacité pendant que vous dessinez, pour que la cible reste visible.
  3. Peignez le gobelet en blanc, avec son bord indésirable et son ombre de contact, en gardant une petite marge là où il y a de la place. Le pied de chaise reste noir.
  4. Remettez le calque à pleine opacité et exportez-le seul en PNG noir et blanc opaque, et non en photo assombrie ni avec des annotations en couleur.
  5. Superposez le masque exporté à la source de travail et vérifiez la zone blanche.

Des proportions identiques ne suffisent pas : les deux fichiers doivent avoir la même largeur, la même hauteur, le même recadrage et la même orientation. Une forme légèrement généreuse convient quand rien d’autre ne se trouve à proximité. Le masque d’exemple de la page du modèle, pour un support au bord du cadre, est un canevas noir de la taille de la photo avec un simple rectangle blanc sur le support.

Les ombres et les reflets peuvent dépasser la silhouette de l’objet. Peignez un reflet indésirable comme une zone blanche distincte. Quand l’ombre du gobelet chevauche l’ombre d’appui de la chaise, ne peignez pas toute la tache sombre en blanc, sinon la chaise peut sembler flotter. Le masque indique ce qu’il faut supprimer ; il ne fournit ni le sol caché ni la géométrie du produit.

Traitez les suppressions importantes ou qui se chevauchent en passes séparées, en construisant chaque masque sur le résultat précédent accepté. Deux petits objets dans une seule requête coûtent 0,03 $ ; deux requêtes séparées coûtent 0,06 $. Gardez ensemble les noms de fichiers du masque et de l’image afin qu’une ancienne sélection ne modifie pas en silence une photo plus récente.

Puis l’exécuter depuis le code

Installez le SDK Python (pip install spicyapi), définissez SPICY_API_KEY dans l’environnement de votre serveur et lancez la requête ci-dessous. Elle utilise la photo d’exemple de la page du modèle et fonctionne donc telle quelle. Les fichiers de votre ordinateur passent par client.upload_file et reviennent sous forme d’adresse spicy://. Pour un masque, ajoutez "mask_url" avec votre propre fichier, de même taille en pixels que la photo.

python
import uuid
from spicyapi import SpicyClient, output_assets

client = SpicyClient()  # reads SPICY_API_KEY from the environment

task = client.create_task(
    model="spicyapi/object-eraser-v1/edit",
    input_data={
        "image_url": "https://cdn.spicyapi.ai/models/examples/inputs/fbc8d531c80e6d0d.jpeg",
        "prompt": "the wooden ladle lying across the sauna stones at the left",
        "output_format": "png",
    },
    idempotency_key=str(uuid.uuid4()),
)

final = client.wait_for_terminal(task["taskId"])
if final["state"] != "succeeded":
    raise RuntimeError(f"{task['taskId']} ended as {final['state']}: {final.get('errorCode')}")
print(output_assets(final)[0]["url"])  # copy the image to your own storage now

Les envois de fichiers, la création, l’attente, le téléchargement, les nouvelles tentatives et les codes d’erreur sont traités dans le guide des tâches et la référence du SDK Python. Les fichiers générés sont conservés 14 jours au maximum : copiez le résultat dans votre propre stockage.

Ou laisser un agent l’exécuter

Quand un assistant doit réaliser la retouche, les trois outils officiels affichent le prix et vous demandent confirmation avant un appel payant.

  • CLI. Envoyez la photo et le masque, puis créez la tâche :

``bash spicyapi files upload photo.jpg spicyapi tasks create --model spicyapi/object-eraser-v1/edit --input-file input.json --wait ``

Placez les adresses spicy:// renvoyées dans input.json comme image_url et mask_url. Voir la documentation de la CLI ; npx @spicyapi/cli fonctionne sans installation.

  • Serveur MCP. Ajoutez le serveur MCP à votre assistant, puis demandez : « Supprime le gobelet en carton blanc de cette photo avec Object Eraser ; le fichier est dans /path/to/photo.jpg. » Il envoie le fichier avec spicyapi_upload_file, appelle spicyapi_task_create, qui s’arrête pour confirmer le prix, puis spicyapi_task_wait.
  • Skill. npx skills add spicyapi-ai/spicy-skill installe l’Agent Skill, qui fait lire à un assistant de code le schéma réel du modèle au lieu de deviner les champs.

Corriger l’échec précis que vous observez

Ouvrez erased.png à côté de l’original et du masque. Vérifiez d’abord où la sélection rejoint le contenu conservé, puis le centre du remplissage.

RésultatCe qu’il faut changer
Le gobelet est toujours là après une requête avec prompt seulPassez à un masque sur ce gobelet.
Le câble reste au bordPeignez toute sa longueur visible en blanc sur un masque en pleine résolution.
Un contour léger subsisteÉtendez légèrement la sélection au-delà du bord de l’objet, sans recouvrir les bords voisins du produit.
Le gobelet a disparu mais un ovale sombre resteAjoutez au masque l’ombre de contact du gobelet, séparément de l’ombre de la chaise.
Une partie du pied de chaise est mal reconstruiteRéduisez le masque là où il recouvre le pied. Si le gobelet cache le pied lui-même, utilisez une autre photo source.
Une comparaison par différence montre toute l’image modifiéeAlignez d’abord la rotation et la taille ; le bruit de compression seul n’est pas une retouche. Examinez des repères fixes.
La requête renvoie 400Vérifiez l’absence de prompt et de masque, ou des champs que le modèle n’a pas, comme strength, mask_blur ou transparent_background. Rien n’est facturé pour une requête rejetée.
Un retoucheur adulte examine une photographie d’intérieur imprimée, avec des cercles transparents autour de la zone du gobelet et une ligne sombre sur la table en verre.

Illustration de l’examen des ombres et des reflets. Elle ne montre pas une suppression terminée.

Le modèle reconstruit l’arrière-plan masqué ; il ne peut pas révéler ce qui se trouvait réellement derrière l’objet. Pour une fiche produit, n’acceptez pas une articulation de chaise inventée ou une couture de tapisserie modifiée sous prétexte que le sol paraît plus propre. Refaites la photo quand l’objet retiré cache un détail que la fiche doit montrer fidèlement.

SpicyAPI n’exécute aucun contrôle de sécurité sur ce modèle ; c’est le modèle lui-même qui décide de ce qu’il renvoie.

Conservez la source et le masque avec le résultat accepté, et n’ajoutez une passe que pour un objet précis qui reste. L’onglet Examples de la page du modèle montre de vrais résultats avant/après.

Aussi en English · 日本語 · 한국어 · Deutsch · Español · Português (Brasil) · Русский · Italiano · Polski