AI-удаление фона с изображений: пайплайн и точное матирование

AI-удаление фона с изображений

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    714
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1006

AI-удаление фона с изображений

Вручную вырезать товарные фото — медленно и дорого. Обработка каталога из 10 000 товаров занимает недели, а ошибки операторов приводят к браку. Мы автоматизируем эту задачу с помощью современных нейросетей: от быстрого батч-удаления фона до точного альфа-матирования волос и меха. Наш опыт — 5 лет, более 50 внедрённых решений, обработано свыше 1 млн изображений. В этой статье разберём, какие модели работают лучше всего, как построить пайплайн и какие подводные камни встречаются на практике.

Какие модели работают лучше всего?

Удаление фона делится на два класса: грубое (для прямоугольных объектов без полупрозрачности) и точное альфа-матирование (для волос, меха, стекла). Первое решается детекцией и бинарной маской, второе — предсказанием alpha-канала (0–1) на каждом пикселе. Мы подбираем инструмент под задачу: для e-commerce достаточно REMBG, для портретов — SAM2 с последующим матированием.

Когда нужен fine-tuning?

Предобученные модели хорошо справляются со стандартными объектами: люди, товары на белом фоне. Но если в вашем каталоге специфические предметы (ювелирка, стеклянная посуда, меховые изделия), качество падает. Fine-tuning на 20–50 размеченных фото повышает точность матирования на 15–20% по метрике MSE. Мы включаем этот этап в проект, если тесты показывают недостаточное качество.

Как работает SAM2 для удаления фона?

SAM2 (Segment Anything Model 2 от Meta) даёт state-of-the-art качество сегментации по текстовому запросу или bbox. Связка Grounding DINO + SAM2 — стандарт последних лет. Ниже — пример реализации на Python:

import torch import numpy as np from PIL import Image from sam2.build_sam import build_sam2 from sam2.sam2_image_predictor import SAM2ImagePredictor from groundingdino.util.inference import load_model, predict def remove_background_grounded_sam2( image_path: str, text_prompt: str = 'product', box_threshold: float = 0.3, text_threshold: float = 0.25, output_path: str = None ) -> Image.Image: image = Image.open(image_path).convert('RGB') image_np = np.array(image) gdino_model = load_model( 'groundingdino/config/GroundingDINO_SwinT_OGC.py', 'weights/groundingdino_swint_ogc.pth' ) boxes, _, _ = predict( model=gdino_model, image=image_np, caption=text_prompt, box_threshold=box_threshold, text_threshold=text_threshold ) if len(boxes) == 0: raise ValueError(f'Object "{text_prompt}" not found') sam2 = build_sam2( 'sam2_hiera_large.yaml', 'weights/sam2_hiera_large.pt', device='cuda' ) predictor = SAM2ImagePredictor(sam2) predictor.set_image(image_np) best_box = boxes[0].numpy() * np.array([ image_np.shape[1], image_np.shape[0], image_np.shape[1], image_np.shape[0] ]) masks, scores, _ = predictor.predict( box=best_box, multimask_output=True ) best_mask = masks[np.argmax(scores)] result_rgba = np.dstack([image_np, best_mask.astype(np.uint8) * 255]) result = Image.fromarray(result_rgba, 'RGBA') if output_path: result.save(output_path, 'PNG') return result 

Почему SAM2 + matting — оптимальный выбор для сложных краёв?

Сравним с U2-Net и RVM. RVM быстр (0.05 сек на фото), но края грубые — волосы превращаются в кашу. SAM2 с дообучением даёт alpha-карту с тонкими полупрозрачными краями. Для волос и меха мы комбинируем SAM2 с closed-form matting (источник: Wikipedia) — итоговое качество в 2–3 раза выше по метрике MSE. В таблице ниже — объективное сравнение.

Инструмент Скорость Качество краёв Волосы/мех Применение
REMBG (U2-Net) 0.3–0.8s/img Среднее Плохо Быстрый батч
REMBG (IS-Net) 0.5–1.2s/img Хорошее Удовлетворительно Товары
SAM2 0.8–2s/img Очень хорошее Хорошо Точная сегментация
SAM2 + matting 2–5s/img Отличное Отлично Портреты, мех
BiMatting 1–3s/img Отличное Отлично Профессиональный

Alpha matting для сложных краёв

Волосы, мех, тонкие ветки — SAM2 даёт грубую маску по bbox, края получаются пиксельными. Для этих случаев поверх SAM-маски применяется alpha matting — метод, восстанавливающий полупрозрачность на границах. Мы используем closed-form matting как наилучший компромисс скорости и качества. Пример реализации:

from pymatting import estimate_alpha_cf, estimate_foreground_ml import cv2 def refine_mask_with_matting( image: np.ndarray, rough_mask: np.ndarray, erosion_px: int = 10, dilation_px: int = 10 ) -> np.ndarray: kernel = np.ones((erosion_px, erosion_px), np.uint8) fg_mask = cv2.erode( rough_mask.astype(np.uint8) * 255, kernel ) bg_mask = cv2.dilate( rough_mask.astype(np.uint8) * 255, kernel ) trimap = np.full(rough_mask.shape, 128, dtype=np.uint8) trimap[fg_mask > 0] = 255 trimap[bg_mask == 0] = 0 image_float = image.astype(np.float64) / 255.0 trimap_float = trimap.astype(np.float64) / 255.0 alpha = estimate_alpha_cf(image_float, trimap_float) return (alpha * 255).astype(np.uint8) 

Батчевая обработка для e-commerce

from rembg import remove, new_session from PIL import Image from pathlib import Path import concurrent.futures def batch_remove_background( input_dir: str, output_dir: str, model_name: str = 'isnet-general-use', max_workers: int = 4 ) -> dict: session = new_session(model_name) input_paths = list(Path(input_dir).glob('*.{jpg,jpeg,png,webp}')) results = {'success': 0, 'failed': 0, 'errors': []} def process_one(img_path: Path) -> bool: try: with open(img_path, 'rb') as f: input_data = f.read() output_data = remove(input_data, session=session) out_path = Path(output_dir) / (img_path.stem + '.png') with open(out_path, 'wb') as f: f.write(output_data) return True except Exception as e: results['errors'].append(str(e)) return False with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as ex: futures = {ex.submit(process_one, p): p for p in input_paths} for fut in concurrent.futures.as_completed(futures): if fut.result(): results['success'] += 1 else: results['failed'] += 1 return results 

Для массового применения мы строим пайплайн на GPU (NVIDIA T4 или A100). Очередь задач через Redis + Celery, результат — PNG с прозрачностью. Время обработки 10 000 фото — 1–2 часа, в зависимости от разрешения и выбранной модели.

Что входит в нашу работу: пошаговый процесс

  1. Анализ данных: разметка 20–50 примеров для дообучения (если нужно).
  2. Выбор модели: RVM для скорости, SAM2 + matting для качества.
  3. Разработка API: REST/gRPC эндпоинты для интеграции.
  4. Контейнеризация: Docker + Triton Inference Server для деплоя.
  5. Мониторинг: метрики latency, throughput, количество ошибок сегментации.
  6. Документация: описание пайплайна, инструкция для операторов.
  7. Обучение: передаём модель и скрипты, помогаем наладить работу.

Сроки и стоимость

Этап Срок
API-сервис на REMBG 1–2 недели
Система с SAM2 + fine-tuning 3–5 недель
Полный pipeline с matting и QA 5–8 недель

Стоимость рассчитывается индивидуально — зависит от объёма данных, нужной скорости и качества. Оцениваем проект за 1–2 дня после знакомства с вашими изображениями. Свяжитесь с нами для консультации — подберём оптимальную архитектуру под ваш бюджет. Закажите разработку AI-пайплайна для вашего каталога уже сегодня.