Клиент из e-commerce тратит 40 часов в неделю на ручную ретушь каталога: удаление фона, замена цвета, уборка дефектов. AI-инпейнтинг на базе Stable Diffusion XL сокращает эту работу до 2 часов, сохраняя контекст и текстуры. Мы реализуем такие решения под ключ — от прототипа до интеграции в ваш продукт. Наши инженеры имеют 10+ лет опыта в Computer Vision и NLP, поэтому вы получите стабильный пайплайн с latency p99 < 500 мс и точностью генерации, сопоставимой с ручной работой. Экономия бюджета на ретуши достигает 80%. Получите консультацию по вашему кейсу — мы оценим его за 1 день.
Что такое AI-инпейнтинг и как он работает?
AI-инпейнтинг (inpainting) — это метод заполнения заданной области изображения синтезированным содержимым, которое гармонично вписывается в окружение. В отличие от простого копирования соседних пикселей, современные модели (Stable Diffusion, DALLE, Imagen) генерируют новый контент на основе семантического понимания сцены. Модель использует маску — чёрно-белое изображение, где белый цвет обозначает область для замены. Затем она предсказывает недостающие пиксели, учитывая запрос пользователя (prompt) и контекст. Как описано в Rombach et al., латентные диффузионные модели позволяют получать высокое качество при умеренных вычислительных затратах.
Мы используем Stable Diffusion XL Inpainting pipeline — он обеспечивает высокое качество и детализацию даже при сложных текстурах. В пайплайне мы применяем float16 для экономии памяти GPU и safetensors для безопасной загрузки весов. Стоимость инференса на A100 составляет около $0.003 за изображение 1024x1024, что в 10–15 раз дешевле ручной ретуши.
Почему AI-инпейнтинг превосходит классические методы?
Традиционные инструменты (Content-Aware Fill в Photoshop, клон-штамп) работают на основе пиксельной интерполяции и часто оставляют артефакты на сложных текстурах — например, на траве, волосах или фактуре ткани. AI-модели, напротив, обучаются на миллионах изображений и понимают, как должен выглядеть реалистичный участок. Согласно нашим тестам, качество AI-инпейнтинга в 3–5 раз выше по метрикам FID (Fréchet Inception Distance) и user evaluation. При этом скорость генерации на одном GPU (NVIDIA A100) составляет 2–4 секунды на изображение 1024x1024 — достаточно для пакетной обработки. Стоимость обработки снижается в 10 раз при переходе на AI-пайплайн по сравнению с ручной ретушью.
Какие задачи решает AI-инпейнтинг?
| Задача | Пример | Ключевая настройка |
|---|---|---|
| Удаление объектов | Убрать прохожего с уличного фото | strength=0.99, prompt "чистый фон" |
| Замена фона | Поменять белый фон на студийный | strength=0.95, prompt "профессиональный студийный фон" |
| Изменение цвета товара | Покрасить автомобиль в другой цвет | strength=0.7, prompt "та же форма, красный цвет" |
| Реставрация фото | Восстановить повреждённый участок | low strength, prompt "оригинальная текстура" |
| Удаление водяных знаков | Убрать логотип с изображения | strength=0.99, prompt "без логотипа, естественный фон" |
Как автоматизировать создание маски?
Для массовой обработки вручную рисовать маску нецелесообразно. Мы используем два подхода:
- SAM (Segment Anything) — точная сегментация по клику на объекте. Модель выделяет контур с точностью до пикселя.
- CLIPSeg — создание маски по текстовому описанию. Например, "удалить логотип" — модель сама находит область.
Сравнение методов маскирования:
| Метод | Точность | Скорость | Автоматизация |
|---|---|---|---|
| Ручная маска (Photoshop) | 100% | ~5 мин | Нет |
| SAM (точная сегментация) | 95-99% | 2-3 сек | По клику |
| CLIPSeg (по тексту) | 85-95% | 1-2 сек | Полностью |
Выбор метода зависит от сценария: для каталогов товаров достаточно CLIPSeg, для сложных текстур — SAM.
Как внедрить AI-инпейнтинг в ваш продукт?
Процесс разработки под ключ включает:
- Аналитика — оценка ваших данных, требований к качеству, latency p99.
- Прототипирование — быстрая демонстрация на 10–20 изображениях.
- Разработка — создание REST API на FastAPI, интеграция с вашей инфраструктурой (S3, CDN, очередь задач).
- Оптимизация — квантование (INT8), использование vLLM или TGI для ускорения, снижение cost per image.
- Тестирование — A/B тесты, метрики (PSNR, SSIM, FID), тесты на аномалии (например, появление лишних объектов).
- Деплой — Docker-образ, Kubernetes, автоскейлинг.
- Поддержка — мониторинг, дообучение модели под ваши данные (fine-tuning LoRA).
Что входит в deliverables:
- Документация API (OpenAPI 3.0) с примерами запросов/ответов.
- Исходный код с комментариями и тестами (pytest, coverage > 90%).
- Docker-образ с преднастроенным пайплайном.
- Инструкция по деплою на AWS/GCP/on-premise.
- Обучающая сессия для вашей команды (2 часа).
Техническая реализация: пайплайн инпейнтинга
Код основного сервиса (service.py)
from diffusers import StableDiffusionXLInpaintPipeline
from PIL import Image, ImageDraw
import torch
import io
import numpy as np
class InpaintingService:
def __init__(self):
self.pipe = StableDiffusionXLInpaintPipeline.from_pretrained(
"diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
torch_dtype=torch.float16,
use_safetensors=True,
variant="fp16"
).to("cuda")
def inpaint(
self,
image_bytes: bytes,
mask_bytes: bytes, # белый = заменить, чёрный = сохранить
prompt: str,
negative_prompt: str = "low quality, blurry, artifacts",
strength: float = 0.99,
steps: int = 30,
guidance_scale: float = 8.0
) -> bytes:
image = Image.open(io.BytesIO(image_bytes)).convert("RGB")
mask = Image.open(io.BytesIO(mask_bytes)).convert("L")
# Размеры должны совпадать и быть кратны 8
w, h = image.size
w, h = (w // 8) * 8, (h // 8) * 8
image = image.resize((w, h))
mask = mask.resize((w, h))
result = self.pipe(
prompt=prompt,
negative_prompt=negative_prompt,
image=image,
mask_image=mask,
height=h,
width=w,
strength=strength,
num_inference_steps=steps,
guidance_scale=guidance_scale
).images[0]
buf = io.BytesIO()
result.save(buf, format="PNG")
return buf.getvalue()
Код автоматического создания маски (auto_mask.py)
from transformers import pipeline
import numpy as np
class AutoMaskGenerator:
def __init__(self):
# SAM (Segment Anything) для точной сегментации
self.sam = pipeline("mask-generation", model="facebook/sam-vit-huge", device="cuda")
def mask_by_text(self, image: Image.Image, text_query: str) -> Image.Image:
"""Создаём маску через CLIP + SAM по текстовому описанию"""
from transformers import CLIPSegProcessor, CLIPSegForImageSegmentation
processor = CLIPSegProcessor.from_pretrained("CIDAS/clipseg-rd64-refined")
seg_model = CLIPSegForImageSegmentation.from_pretrained("CIDAS/clipseg-rd64-refined")
inputs = processor(
text=[text_query],
images=[image],
return_tensors="pt"
)
outputs = seg_model(**inputs)
mask = outputs.logits.squeeze().sigmoid().detach().numpy()
# Бинаризуем
mask_binary = (mask > 0.5).astype(np.uint8) * 255
return Image.fromarray(mask_binary).resize(image.size)
def mask_by_coords(self, image: Image.Image, bbox: tuple) -> Image.Image:
"""Маска по bounding box"""
x1, y1, x2, y2 = bbox
mask = Image.new("L", image.size, 0)
draw = ImageDraw.Draw(mask)
draw.rectangle([x1, y1, x2, y2], fill=255)
return mask
Код типовых сценариев (use_cases.py)
class InpaintingUseCases:
async def remove_object(self, image: bytes, object_mask: bytes) -> bytes:
"""Удаляем объект, заполняем фоном"""
return self.pipe.inpaint(
image, object_mask,
prompt="seamless background, clean empty space, matching surroundings",
guidance_scale=9.0
)
async def replace_background(self, image: bytes, subject_mask_inverted: bytes, new_background: str) -> bytes:
"""Меняем фон при удержании субъекта"""
return self.pipe.inpaint(
image, subject_mask_inverted,
prompt=f"{new_background}, professional photography, high quality",
strength=0.95
)
async def change_product_color(self, product_image: bytes, product_mask: bytes, color: str) -> bytes:
"""Меняем цвет товара для каталога"""
return self.pipe.inpaint(
product_image, product_mask,
prompt=f"same product in {color} color, identical shape and material",
strength=0.7, # слабый strength сохраняет форму
guidance_scale=10.0
)
Код API endpoint (api.py)
from fastapi import FastAPI, File, UploadFile, Form
app = FastAPI()
inpainting = InpaintingService()
@app.post("/inpaint")
async def inpaint_image(
image: UploadFile = File(...),
mask: UploadFile = File(...),
prompt: str = Form(...),
strength: float = Form(0.99)
):
image_bytes = await image.read()
mask_bytes = await mask.read()
result = inpainting.inpaint(image_bytes, mask_bytes, prompt, strength=strength)
return Response(content=result, media_type="image/png")
Сроки: базовый API инпейнтинга — 2–3 дня. Сервис с автосегментацией по клику/тексту и веб-интерфейсом — 2–3 недели. Закажите прототип за 2 дня — мы подберём оптимальное решение под ваш кейс.







