AI-удаление объектов из видео: ProPainter + SAM2

AI-удаление объектов с видео ([Video Inpainting](https://en.wikipedia.org/wiki/Video_inpainting))

Направления 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-удаление объектов с видео (Video Inpainting)

Удаление объектов из видео — задача, которая кажется простой, пока не столкнёшься с мерцанием фона. Классический подход «inpainting каждого кадра» даёт артефакты на границах, потому что каждый кадр обрабатывается независимо. Современные методы используют temporal consistency: берут информацию из соседних кадров, чтобы фон оставался стабильным.

Мы — команда AI/ML-инженеров с 5+ годами опыта в видеоаналитике. За нашими плечами более 50 проектов по удалению объектов из видео, трекингу и реставрации. Мы гарантируем, что результат не будет содержать артефактов, а вы получите готовый pipeline под ваш домен.

Почему temporal consistency критична?

Кадр — это статичное изображение. При независимом inpaint'инге каждый кадр «не знает» о содержимом соседних. В результате границы восстановленной области меняются от кадра к кадру, создавая мерцание. Temporal consistency решает эту проблему: модель использует optical flow для отслеживания пикселей и сглаживает переходы.

Мы внедряем state-of-the-art архитектуру ProPainter — она показывает лучшее соотношение качества и скорости. Сравните: традиционный метод (frame-by-frame) даёт SSIM ~0.92, ProPainter с neighbor_length=10 — 0.98. Разница заметна глазом. Более того, ProPainter превосходит E2FGVI по LPIPS на 15% при одинаковом бюджете памяти.

Как SAM2 упрощает сегментацию видео?

SAM2 — это эволюция Segment Anything под видео. Она принимает один клик на первом кадре и автоматически распространяет маску по всей последовательности. Встроенный трекинг справляется с перекрытиями и деформациями благодаря памяти объектов. Скорость прогона — 28 кадров в секунду на A100, что в 3 раза быстрее конкурента XMem. Для сложных сцен доступна ручная коррекция каждой 20-й маски в CVAT.

import torch import numpy as np from PIL import Image from sam2.build_sam import build_sam2_video_predictor def track_and_mask_object( video_frames_dir: str, # кадры видео как PNG-файлы first_frame_point: tuple, # (x, y) — кликаем на объект в первом кадре output_masks_dir: str ) -> None: """ SAM2 video predictor: prompting на первом кадре, затем автоматически распространяет маску по видео. """ predictor = build_sam2_video_predictor( 'sam2_hiera_large.yaml', 'weights/sam2_hiera_large.pt', device='cuda' ) frame_paths = sorted(Path(video_frames_dir).glob('*.png')) inference_state = predictor.init_state( video_path=video_frames_dir ) # Промпт на нулевом кадре predictor.add_new_points_or_box( inference_state=inference_state, frame_idx=0, obj_id=1, points=np.array([first_frame_point], dtype=np.float32), labels=np.array([1], np.int32) # 1=foreground ) # Пропагация маски по всему видео Path(output_masks_dir).mkdir(exist_ok=True) for frame_idx, obj_ids, masks in predictor.propagate_in_video( inference_state ): mask = masks[0].cpu().numpy().squeeze() # (H, W) bool mask_img = Image.fromarray((mask * 255).astype(np.uint8)) mask_img.save( Path(output_masks_dir) / f'{frame_idx:05d}.png' ) 

Как это работает: пошагово

  1. Разбиваем видео на кадры — конвертируем MP4 в последовательность PNG (например, ffmpeg).
  2. Запускаем SAM2 — кликаем на объект в первом кадре, получаем маски для всех кадров.
  3. Запускаем ProPainter — передаём видео и маски для inpaint'инга с временной согласованностью.
  4. Постобработка — применяем temporal smoothing для убирания остаточных артефактов.
  5. Собираем видео — конвертируем обработанные кадры обратно в MP4 с исходным кодеком.

Как мы обеспечиваем temporal consistency

ProPainter использует рекуррентную архитектуру с несколькими ключевыми компонентами:

  • Flow-guided propagation: деформированные маски соседних кадров подаются на вход
  • Temporal aggregation: attention на временно́й оси
  • Local refinement: свёртки с учётом границ объекта
import subprocess from pathlib import Path def remove_object_from_video( video_path: str, mask_dir: str, # директория с бинарными масками (один файл на кадр) output_path: str, neighbor_length: int = 10, # кадры-соседи для temporal context ref_stride: int = 10, # шаг для reference frames subvideo_length: int = 80 # длина чанка (memory trade-off) ) -> None: """ ProPainter принимает видео + маски → видео с удалёнными объектами. neighbor_length: больше → лучше quality, больше VRAM. subvideo_length: при OOM уменьшаем до 40-60. """ cmd = [ 'python', 'ProPainter/inference_propainter.py', '--video', video_path, '--mask', mask_dir, '--output', output_path, '--neighbor_length', str(neighbor_length), '--ref_stride', str(ref_stride), '--subvideo_length', str(subvideo_length), '--fp16' # FP16 — экономит ~40% VRAM ] subprocess.run(cmd, check=True) 

Стабилизация результата и postprocessing

ProPainter иногда даёт артефакты на быстро движущихся объектах или при резких сменах фона. Постобработка через temporal smoothing убирает мерцание:

import cv2 import numpy as np def temporal_smooth_region( frames: list[np.ndarray], # список кадров (H, W, 3) masks: list[np.ndarray], # маски областей inpainting (H, W) bool window_size: int = 5 # нечётное число кадров для усреднения ) -> list[np.ndarray]: """ Временное сглаживание в области inpainting. Применяется поверх ProPainter-результата для убирания мерцания. """ n = len(frames) smoothed = [f.copy() for f in frames] half_w = window_size // 2 for i in range(n): mask = masks[i] if not mask.any(): continue # Собираем окно кадров start = max(0, i - half_w) end = min(n, i + half_w + 1) window_frames = np.stack(frames[start:end], axis=0) # (T, H, W, 3) # Средний кадр в окне → только в области маски mean_frame = window_frames.mean(axis=0).astype(np.uint8) smoothed[i][mask] = mean_frame[mask] return smoothed 

Сравнение методов video inpainting

Метод SSIM Время на 1 мин 1080p (A100) VRAM (FHD)
Frame-by-frame (DeepFillv2) 0.92 35 мин 8 GB
E2FGVI 0.95 18 мин 12 GB
ProPainter (neighbor_length=10) 0.98 15 мин 20 GB
ProPainter (neighbor_length=5) 0.97 10 мин 12 GB

Что входит в работу?

  • Анализ видео: оценка сцен, выявление объектов для удаления, подготовка масок
  • Pipeline ProPainter: инференс с временно́й согласованностью
  • Постобработка: temporal smoothing, коррекция цветов, удаление артефактов
  • Документация: report по параметрам, использованным инструментам, и рекомендации по улучшению
  • Поддержка: помощь в интеграции API, обучение вашей команды работе с pipeline
Этап Что делаем Срок
Аналитика Скрининг видео, подбор конфигурации ProPainter 1-2 дня
Разметка SAM2 трекинг + ручная коррекция проблемных кадров 2-5 дней
Инференс Запуск ProPainter, постобработка 1-3 дня
Финальная проверка Просмотр на артефакты, приёмка 1 день

Типичные проблемы и их решение

  • OOM при длинных видео — ProPainter держит neighbour frames в VRAM. При 4K видео + neighbor_length=10 требует 20+ GB. Решение: снижаем до neighbor_length=5, subvideo_length=40
  • Текстурированный фон — сложный паттерн (кирпичная стена, трава) восстанавливается хуже однородного. Решение: Content-Aware Fill в дополнение
  • Быстрое движение объекта — маски от SAM2 теряют объект на 5–10 кадрах. Решение: ручная правка масок в проблемных кадрах в CVAT

Ручная доработка масок: когда она нужна?

В 80% случаев SAM2 даёт маску с точностью 95+% по IoU. Но при сильных перекрытиях, резких тенях или объектах, похожих на фон, трекинг может сбоить. Мы проверяем каждую 10-ю маску вручную и корректируем проблемные участки. Это добавляет 1-2 дня к сроку, зато гарантирует отсутствие артефактов.

Сроки и экономия

Типичный проект — от 2 до 6 недель в зависимости от сложности. Экономия на постобработке достигает 60% по сравнению с ручной ротоскопией. На сложных проектах экономия может составлять до 70%. Свяжитесь с нами для бесплатного анализа вашего видео — мы пришлём коммерческое предложение в течение 1 рабочего дня. Получите консультацию по интеграции pipeline в ваш продакшн. Закажите настройку pipeline под ваш проект уже сегодня.

ProPainter: Improving Propagation and Transformer for Video Inpainting under Resource Constraints