Перейти к основному контенту

API удаления объектов: создайте маску и скачайте обработанное изображение

Удаляйте объекты белой маской на чёрном за 0,03 $ за изображение: шаги в Playground, подготовка маски, пример на Python и решения типичных сбоев.

Автор
Lydia
Опубликовано
Время чтения
7 мин чтения
Обновлено
Редакционная иллюстрация: кудрявая редакторша в очках отмечает лампу на прозрачном листе поверх портрета в кафе; это не результат API Object Eraser.

Используйте spicyapi/object-eraser-v1/edit с image_url и коротким prompt, mask_url либо обоими полями сразу. В маске белый цвет означает «удалить», чёрный — «оставить», а размеры в пикселях должны совпадать с исходным изображением. Цена — 0,03 $ за выходное изображение, сколько бы объектов ни удалял запрос. Результат сохраняет исходный размер холста, а выделенная область заполняется содержимым окружающей сцены.

Выберите prompt или маску

Если объект хорошо заметен и вокруг него есть свободное место, начните с короткого описания:

белый бумажный стаканчик на полу рядом с передней правой ножкой стула

Укажите существительное, видимый цвет или материал и положение. Фраза «сделай сцену чистой и премиальной» не определяет, что должно исчезнуть. Prompt может содержать от 1 до 1000 символов, но более длинное описание не делает выбор точнее.

СитуацияЧто использовать
Один однозначный стаканчик на свободном полуprompt с названием этого стаканчика
Два похожих стаканчика, нужно убрать только одинmask_url поверх нужного стаканчика
Тонкий кабель или объект у края кадраmask_url; описания такие объекты часто упускают
Описание может указать на не тот объектОтправьте оба поля: опишите и отметьте одну и ту же цель
Нужна вырезка стула на прозрачном фонеУдаление фона
Нужно больше места вокруг фотоOutpainting после очистки

Если описание ни с чем не совпало, изображение возвращается без изменений, а задача всё равно завершается успешно. Сравните результат с исходником, прежде чем считать его удалением.

Взрослый фотограф снимает синее кресло; редакционные круги отмечают стаканчик, кабель и картонную панель.

Иллюстрация с возможными выделениями. Все отмеченные объекты на месте; это не результат API.

Сначала попробуйте в Playground

  1. Откройте страницу Object Eraser, оставайтесь на вкладке Playground в режиме Form и войдите в аккаунт с пополненным балансом, чтобы запустить задачу.
  2. Добавьте фото в поле Input image (JPG, PNG или WebP, до 10 МБ). Перетащите файл, вставьте ссылку через Asset URL и Add URL или выберите файл на диске.
  3. Опишите цель в поле Prompt, либо добавьте чёрно-белое изображение в поле Mask, либо заполните оба. Форме нужно хотя бы одно из двух.
  4. Оставьте Output format на PNG (JPEG и WebP дают файлы меньше) и запустите. Цена — 0,03 $ за изображение.
  5. Откройте результат рядом с оригиналом и маской; если что-то осталось, воспользуйтесь таблицей сбоев ниже.

Панель Request body показывает тот же JSON, который принимает API, поэтому prompt или маску, сработавшие здесь, можно скопировать прямо в код. Если здесь не получается, исправьте prompt или маску, прежде чем писать код.

Делайте маску по тому изображению, которое отправите

Если область уже известна (рамка детектора или выделение в интерфейсе), сгенерируйте маску в коде. Её размер берётся из исходника, поэтому всегда совпадает:

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

Для фигур неправильной формы на исходнике 2400×1600 подготовьте в графическом редакторе маску 2400×1600:

  1. Сначала завершите поворот и кадрирование исходника и сохраните это рабочее изображение.
  2. Добавьте чёрный слой на весь холст и снизьте его непрозрачность на время рисования, чтобы цель оставалась видна.
  3. Закрасьте стаканчик белым, включая его нежелательный край и контактную тень, с небольшим запасом там, где есть место. Ножка стула остаётся чёрной.
  4. Верните слою полную непрозрачность и экспортируйте его отдельно как непрозрачный чёрно-белый PNG, а не затемнённое фото и не цветные пометки.
  5. Наложите экспортированную маску на рабочий исходник и проверьте белую область.

Одинаковых пропорций недостаточно: у обоих файлов должны совпадать ширина, высота, кадрирование и ориентация. Чуть более широкая форма подходит там, где рядом нет ничего другого. Примерная маска на странице модели для стеллажа у края кадра — это чёрный холст размером с фото с одним простым белым прямоугольником поверх стеллажа.

Тени и отражения могут выходить за силуэт объекта. Нежелательное отражение закрасьте как отдельную белую область. Там, где тень стаканчика перекрывается с опорной тенью стула, не закрашивайте белым всё тёмное пятно, иначе стул может «повиснуть» в воздухе. Маска отмечает, что удалить; она не даёт скрытый пол или геометрию товара.

Крупные или перекрывающиеся удаления выполняйте отдельными проходами, строя каждую маску на принятом предыдущем результате. Два небольших объекта в одном запросе стоят 0,03 $; два отдельных запроса стоят 0,06 $. Держите имена файлов маски и изображения парными, чтобы старое выделение не изменило молча более новое фото.

Затем запустите из кода

Установите Python SDK (pip install spicyapi), задайте SPICY_API_KEY в окружении сервера и выполните запрос ниже. Он использует пример фото со страницы модели, поэтому работает как есть. Файлы с вашего компьютера загружаются через client.upload_file и возвращаются адресом spicy://. Для маски добавьте "mask_url" со своим файлом тех же размеров в пикселях, что и фото.

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

Загрузка файлов, создание, ожидание, скачивание, повторные попытки и коды ошибок описаны в руководстве по задачам и справочнике Python SDK. Созданные файлы хранятся не более 14 дней, поэтому скопируйте результат в собственное хранилище.

Или поручите запуск агенту

Когда правку должен выполнить ассистент, все три официальных инструмента показывают цену и спрашивают подтверждение перед платным вызовом.

  • CLI. Загрузите фото и маску, затем создайте задачу:

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

Подставьте возвращённые адреса spicy:// в input.json как image_url и mask_url. См. документацию CLI; npx @spicyapi/cli работает без установки.

  • MCP-сервер. Добавьте MCP-сервер в ассистента и попросите: «Удали белый бумажный стаканчик с этого фото через Object Eraser; файл лежит в /path/to/photo.jpg». Он загрузит файл через spicyapi_upload_file, вызовет spicyapi_task_create, который остановится для подтверждения цены, а затем spicyapi_task_wait.
  • Skill. npx skills add spicyapi-ai/spicy-skill устанавливает Agent Skill: ассистент для программирования читает актуальную схему модели, а не угадывает поля.

Исправьте конкретный сбой, который видите

Откройте erased.png рядом с оригиналом и маской. Сначала проверьте, где выделение граничит с сохранённым содержимым, затем центр заливки.

РезультатЧто изменить
Стаканчик остался после запроса только с promptПерейдите на маску поверх этого стаканчика.
Кабель остался у краяЗакрасьте белым всю его видимую длину на маске в полном разрешении.
Остался слабый контурСлегка расширьте выделение за край объекта, не закрывая соседние края товара.
Стаканчика нет, но остался тёмный овалДобавьте в маску контактную тень стаканчика отдельно от тени стула.
Часть ножки стула восстановлена неверноУменьшите маску там, где она закрывает ножку. Если стаканчик сам скрывает ножку, возьмите другое исходное фото.
Проверка разницы показывает изменение всей картинкиСначала выровняйте поворот и размер; один лишь шум сжатия — не правка. Сверьте неподвижные ориентиры.
Запрос возвращает 400Проверьте, нет ли пропущенных prompt и маски либо полей, которых у модели нет, например strength, mask_blur или transparent_background. За отклонённый запрос ничего не списывается.
Взрослый редактор рассматривает распечатанную фотографию интерьера с прозрачными кругами вокруг области стаканчика и тёмной линией у стеклянного стола.

Иллюстрация: проверка теней и отражений. Она не показывает завершённое удаление.

Модель восстанавливает скрытый фон; она не может показать, что на самом деле было за объектом. В карточке товара не принимайте выдуманное соединение стула или изменённый шов обивки только потому, что пол стал выглядеть чище. Переснимите, если удалённый объект скрывал деталь, которую карточка должна показывать точно.

SpicyAPI не запускает для этой модели проверку безопасности; что вернуть, решает сама модель.

Храните исходник и маску вместе с принятым результатом и добавляйте ещё один проход только для конкретного оставшегося объекта. Вкладка Examples на странице модели показывает реальные результаты «до» и «после».

Другие языки English · 日本語 · 한국어 · Deutsch · Français · Español · Português (Brasil) · Italiano · Polski