AI-видалення об'єктів з відео (Video Inpainting)
Видалення об'єктів із відео — завдання, яке здається простим, доки не зіткнешся з мерехтінням фону. Класичний підхід «inpainting кожного кадру» дає артефакти на межах, тому що кожен кадр обробляється незалежно. Сучасні методи використовують temporal consistency: беруть інформацію з сусідніх кадрів, щоб фон залишався стабільним.
Ми — команда AI/ML-інженерів з 10+ роками досвіду у відеоаналітиці. За нашими плечима понад 40 проектів із видалення об'єктів із відео, трекінгу та реставрації. Ми гарантуємо, що результат не міститиме артефактів, а ви отримаєте готовий 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' ) Як це працює: покроково
- Розбиваємо відео на кадри — конвертуємо MP4 у послідовність PNG (наприклад, ffmpeg).
- Запускаємо SAM2 — клікаємо на об'єкт у першому кадрі, отримуємо маски для всіх кадрів.
- Запускаємо ProPainter — передаємо відео та маски для inpaint'інгу з часовою узгодженістю.
- Постобробка — застосовуємо temporal smoothing для усунення залишкових артефактів.
- Збираємо відео — конвертуємо оброблені кадри назад у 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







