Клиент из 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 дня — мы подберём оптимальное решение под ваш кейс.







