Przejdź do treści głównej

API do usuwania obiektów: utwórz maskę i pobierz edytowany obraz

Usuwaj obiekty maską w bieli na czerni za 0,03 $ za obraz: kroki w Playground, przygotowanie maski, przykład w Pythonie i naprawa typowych błędów.

Autor
Lydia
Opublikowano
Czas czytania
7 min czytania
Zaktualizowano
Ilustracja redakcyjna redaktorki z kręconymi włosami i w okularach, która zaznacza lampę na przezroczystej kartce nad portretem w kawiarni; to nie wynik API Object Eraser.

Użyj spicyapi/object-eraser-v1/edit z image_url oraz krótkim prompt, mask_url albo obydwoma. W masce biel oznacza usunięcie, a czerń zachowanie, a jej wymiary w pikselach muszą odpowiadać obrazowi źródłowemu. Cena to 0,03 $ za obraz wynikowy, niezależnie od tego, ile obiektów usuwa zapytanie. Wynik zachowuje oryginalny rozmiar kanwy, a zaznaczony obszar jest wypełniany treścią otaczającej sceny.

Wybierz prompt lub maskę

Przy wyraźnie wyróżniającym się obiekcie z wolną przestrzenią wokół zacznij od krótkiego opisu:

biały papierowy kubek na podłodze obok przedniej prawej nogi krzesła

Podaj rzeczownik, widoczny kolor lub materiał i położenie. „Zrób scenę czystą i premium" nie wskazuje, co ma zniknąć. Prompt może mieć od 1 do 1000 znaków, ale dłuższy opis nie wskazuje celu precyzyjniej.

SytuacjaKtóre dane wejściowe
Jeden niepodważalnie wyraźny kubek na pustej podłodzeprompt nazywający ten kubek
Dwa podobne kubki, tylko jeden niechcianymask_url na właściwym kubku
Cienki kabel albo obiekt dotykający krawędzi kadrumask_url; opisy często je pomijają
Opis mógłby wskazać zły obiektWyślij oba, opisując i zaznaczając ten sam cel
Potrzebne wycięcie krzesła na przezroczystym tleUsuwanie tła
Potrzeba więcej miejsca wokół zdjęciaOutpainting po oczyszczeniu

Opis, który do niczego nie pasuje, zwraca obraz bez zmian, a zadanie i tak kończy się sukcesem. Porównaj więc wynik ze źródłem, zanim uznasz go za usunięcie.

Dorosły fotograf fotografuje niebieski fotel; redakcyjne kółka zaznaczają kubek, kabel i kartonową płytę.

Ilustracja z możliwymi zaznaczeniami. Wszystkie zaznaczone obiekty nadal są na miejscu; to nie jest wynik API.

Najpierw wypróbuj w Playground

  1. Otwórz stronę Object Eraser, zostań na karcie Playground w widoku Form i zaloguj się na konto z saldem, aby uruchomić zadanie.
  2. Dodaj zdjęcie w polu Input image (JPG, PNG lub WebP, do 10 MB). Upuść plik, wklej link przez Asset URL i Add URL albo wybierz plik z dysku.
  3. Opisz cel w polu Prompt, dodaj czarno-biały obraz w polu Mask albo wypełnij oba. Formularz wymaga co najmniej jednego z nich.
  4. Zostaw Output format na PNG (JPEG i WebP dają mniejsze pliki) i uruchom. Cena to 0,03 $ za obraz.
  5. Otwórz wynik obok oryginału i maski, a jeśli coś zostało, skorzystaj z tabeli błędów poniżej.

Panel Request body pokazuje ten sam JSON, który przyjmuje API, więc prompt lub maskę, które działają tutaj, można skopiować prosto do kodu. Jeśli tu zawodzi, popraw prompt lub maskę, zanim napiszesz linijkę kodu.

Zrób maskę na dokładnie tym obrazie, który wyślesz

Jeśli znasz już obszar (ramka z detektora albo zaznaczenie w interfejsie), wygeneruj maskę w kodzie. Jej rozmiar pochodzi ze źródła, więc zawsze się zgadza:

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")

Dla nieregularnych kształtów na źródle 2400×1600 przygotuj w edytorze graficznym maskę 2400×1600:

  1. Najpierw zakończ obrót i kadrowanie źródła i zapisz ten roboczy obraz.
  2. Dodaj czarną warstwę w pełnym rozmiarze kanwy i obniż jej krycie podczas rysowania, żeby cel pozostał widoczny.
  3. Pomaluj kubek na biało, razem z jego niechcianą krawędzią i cieniem kontaktowym, z niewielkim zapasem tam, gdzie jest miejsce. Noga krzesła zostaje czarna.
  4. Przywróć warstwie pełne krycie i wyeksportuj ją samą jako nieprzezroczysty czarno-biały PNG, a nie przyciemnione zdjęcie ani kolorowe adnotacje.
  5. Nałóż wyeksportowaną maskę na obraz roboczy i sprawdź białą strefę.

Zgodne proporcje nie wystarczą: oba pliki muszą mieć tę samą szerokość, wysokość, kadr i orientację. Nieco hojny kształt sprawdza się tam, gdzie w pobliżu nie ma niczego innego. Przykładowa maska ze strony modelu dla regału na krawędzi kadru to czarna kanwa wielkości zdjęcia z jednym zwykłym białym prostokątem nad regałem.

Cienie i odbicia mogą wystawać poza sylwetkę obiektu. Niechciane odbicie pomaluj jako osobny biały obszar. Tam, gdzie cień kubka zachodzi na cień osadzenia krzesła, nie maluj całej ciemnej plamy na biało, bo krzesło może zacząć wisieć w powietrzu. Maska wskazuje, co usunąć; nie dostarcza ukrytej podłogi ani geometrii produktu.

Duże lub zachodzące na siebie usunięcia wykonuj w osobnych przebiegach, budując każdą maskę na zaakceptowanym poprzednim wyniku. Dwa małe obiekty w jednym zapytaniu kosztują 0,03 $; dwa osobne zapytania kosztują 0,06 $. Trzymaj nazwy plików maski i obrazu w parze, żeby starsze zaznaczenie nie zmieniło po cichu nowszego zdjęcia.

Potem uruchom z kodu

Zainstaluj SDK Pythona (pip install spicyapi), ustaw SPICY_API_KEY w środowisku serwera i uruchom poniższe zapytanie. Używa ono przykładowego zdjęcia ze strony modelu, więc działa bez zmian. Pliki z komputera przechodzą przez client.upload_file i wracają jako adres spicy://. Do maski dodaj "mask_url" z własnym plikiem o tych samych wymiarach w pikselach co zdjęcie.

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

Przesyłanie plików, tworzenie zadań, oczekiwanie, pobieranie, ponowne próby i kody błędów opisują przewodnik po zadaniach i dokumentacja SDK Pythona. Wygenerowane pliki są przechowywane najwyżej 14 dni, więc skopiuj wynik do własnego magazynu.

Albo pozwól uruchomić to agentowi

Gdy edycję ma wykonać asystent, wszystkie trzy oficjalne narzędzia pokazują cenę i pytają o zgodę przed płatnym wywołaniem.

  • CLI. Prześlij zdjęcie i maskę, a potem utwórz zadanie:

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

Wstaw zwrócone adresy spicy:// do input.json jako image_url i mask_url. Zobacz dokumentację CLI; npx @spicyapi/cli działa bez instalacji.

  • Serwer MCP. Dodaj serwer MCP do asystenta i poproś: „Usuń biały papierowy kubek z tego zdjęcia za pomocą Object Eraser; plik jest w /path/to/photo.jpg". Prześle plik przez spicyapi_upload_file, wywoła spicyapi_task_create, które zatrzyma się na potwierdzenie ceny, a potem spicyapi_task_wait.
  • Skill. npx skills add spicyapi-ai/spicy-skill instaluje Agent Skill, dzięki któremu asystent programistyczny czyta aktualny schemat modelu zamiast zgadywać pola.

Napraw konkretny błąd, który widzisz

Otwórz erased.png obok oryginału i maski. Najpierw sprawdź, gdzie zaznaczenie styka się z zachowaną treścią, potem środek wypełnienia.

WynikCo zmienić
Kubek nadal jest po zapytaniu tylko z promptemPrzełącz na maskę nałożoną na ten kubek.
Kabel zostaje przy krawędziPomaluj na biało całą jego widoczną długość na masce w pełnej rozdzielczości.
Zostaje słaby zarysRozszerz zaznaczenie nieco poza krawędź obiektu, nie zakrywając sąsiednich krawędzi produktu.
Kubka nie ma, ale został ciemny owalDodaj do maski cień kontaktowy kubka, osobno od cienia krzesła.
Część nogi krzesła jest źle odbudowanaZmniejsz maskę tam, gdzie zakrywa nogę. Jeśli kubek zasłania samą nogę, użyj innego zdjęcia źródłowego.
Porównanie różnic pokazuje zmianę na całym obrazieNajpierw wyrównaj obrót i rozmiar; sam szum kompresji nie jest edycją. Sprawdź stałe punkty odniesienia.
Zapytanie zwraca 400Sprawdź, czy brakuje promptu i maski albo czy wysłano pola, których model nie ma, np. strength, mask_blur lub transparent_background. Za odrzucone zapytanie nic się nie pobiera.
Dorosły redaktor ogląda wydrukowane zdjęcie wnętrza z przezroczystymi kółkami wokół miejsca kubka i ciemną linią przy szklanym stole.

Ilustracja przedstawiająca kontrolę cieni i odbić. Nie pokazuje zakończonego usunięcia.

Model odbudowuje ukryte tło; nie może ujawnić, co naprawdę było za obiektem. W ofercie produktu nie akceptuj wymyślonego łączenia krzesła ani zmienionego szwu tapicerki tylko dlatego, że podłoga wygląda czyściej. Zrób nowe zdjęcie, gdy usunięty obiekt zasłania szczegół, który oferta musi pokazać dokładnie.

SpicyAPI nie uruchamia dla tego modelu żadnej kontroli bezpieczeństwa; o tym, co wróci, decyduje sam model.

Przechowuj źródło i maskę razem z zaakceptowanym wynikiem, a kolejny przebieg dodawaj tylko dla konkretnego pozostałego obiektu. Karta Examples na stronie modelu pokazuje prawdziwe wyniki przed i po.

Także w językach English · 日本語 · 한국어 · Deutsch · Français · Español · Português (Brasil) · Русский · Italiano

Wypróbuj samodzielnie

Płacisz tylko za to, co uruchomisz — bez planów i subskrypcji.

Zrobione w MiniMax H3 · ByteDance Seedance 2.0 Fast