Убрать предмет из видео: ProPainter

<!-- lesson: video-remove -->

Урок «video-remove» в группе Паки и инструменты списка уроков. Шагов: 8.

Чему вы научитесь

Предмет, отмеченный видеомаской, исчезает, а фон за ним дорисовывается по соседним кадрам.

Что понадобится

  • Урок продолжает Загрузить, обрезать и сохранить видео: VideoHelperSuite. Карточка говорит об этом; это подсказка, а не замок.
  • Паки нод: ComfyUI-VideoHelperSuite, ComfyUI_ProPainter_Nodes. Их вы ставите в ComfyUI сами, потом выбираете Синхронизация ▸ Синхронизировать сейчас. До тех пор карточка говорит, что урок не подходит, и называет пак.
  • Ноды: Load Video (Upload) 🎥🅥🅗🅢 / VHS_LoadVideoPath, Convert Image to Mask, ProPainter Inpainting, Video Combine 🎥🅥🅗🅢.
  • Приложение ничего не скачивает и не устанавливает. Тексты шагов ниже говорят, какие файлы, в какие папки и какой шаблон ComfyUI их называет.

Шаги

Слова каждого шага, как их показывает урок. Имена нод выделены.

  1. Сначала о цене (чтение)

    Для урока нужен пак ComfyUI_ProPainter_Nodes. Поставьте его сами через менеджер ComfyUI. Пак запускает на вашем компьютере чужой код, поэтому берите его с официальной страницы и обновляйте. Пример пака ещё берёт ComfyUI-VideoHelperSuite, чтобы загрузить и сохранить видео.

    ProPainter следит за движением между кадрами и заполняет место под маской тем, что за ним видно на других кадрах. Нужны два видео одной длины: сам ролик и видеомаска, где убираемый предмет красный (или белый), а всё остальное чёрное. Видеомаску делают в видеоредакторе или паком сегментации, например SAM2.

    Цена: модели у него маленькие, пак сам скачивает их в свою папку при первом запуске графа в ComfyUI. Память быстро растёт с размером и числом кадров; пример уменьшает размер вдвое и берёт 24 кадра.

    Если на холсте уже есть другой граф, начните с пустого: «Файл ▸ Новый проект».

  2. Загрузите ролик

    Добавьте ноду Load Video (Upload) 🎥🅥🅗🅢, выберите ролик в video и поставьте frame_load_cap 24.

    Сначала попробуйте короткий кусок: работа растёт с каждым кадром.

  3. Загрузите видеомаску

    Добавьте вторую ноду Load Video (Upload) 🎥🅥🅗🅢, выберите видеомаску в video и поставьте те же frame_load_cap и skip_first_frames, что у ролика.

    Маска должна совпадать с роликом кадр в кадр; сдвиг на один кадр оставит призрак предмета.

  4. Превратите видеомаску в маску

    Добавьте ноду Convert Image to Mask, подключите кадры видеомаски к её входу image и поставьте channel red.

    Нода читает один цвет каждого кадра как маску: где светло, там предмет убирается.

  5. Уберите предмет

    Добавьте ноду ProPainter Inpainting. Кадры ролика подключите к image, выход Convert Image to Mask к mask. Поставьте width 640 и height 480 (размер ваших кадров) и mask_dilates 5.

    mask_dilates расширяет маску на несколько пикселей, чтобы край предмета не остался.

    Если кадры большие, поставьте перед обоими входами ноду Upscale Image By со значением 0.5, как в примере; приложение принимает её на пути.

  6. Сохраните результат

    Добавьте ноду Video Combine 🎥🅥🅗🅢, подключите выход IMAGE ноды ProPainter Inpainting к images и поставьте frame_rate 24, частоту ролика.

  7. Если результат не тот (чтение)

    • Осталась тень или край предмета: поставьте mask_dilates 8-10 или расширьте саму маску.
    • Заполненное место размыто: фон за предметом нигде в ролике не виден, и ProPainter может только грубо его придумать.
    • Не хватает памяти: меньше кадров или меньше размер.
  8. Граф готов (чтение)

    Сохраните граф через «Файл ▸ Сохранить workflow для ComfyUI…», откройте файл в ComfyUI и запустите там. Само приложение в ComfyUI ничего не запускает.

Что проверяет урок

Шаг для чтения сделан, когда вы нажимаете Понятно, дальше. Шаг с делом отмечается сам, когда на холсте есть:

  • Шаг 2, Загрузите ролик:
    • нода Load Video (Upload) 🎥🅥🅗🅢 или VHS_LoadVideoPath.
    • video ноды Load Video (Upload) 🎥🅥🅗🅢 или VHS_LoadVideoPath (ролик): значение выбрано.
    • frame_load_cap ноды Load Video (Upload) 🎥🅥🅗🅢 или VHS_LoadVideoPath (ролик): от 1 до 300; «Сделать за меня» ставит 24.
  • Шаг 3, Загрузите видеомаску:
    • нода Load Video (Upload) 🎥🅥🅗🅢 или VHS_LoadVideoPath.
    • video ноды Load Video (Upload) 🎥🅥🅗🅢 или VHS_LoadVideoPath (видео маски): не тот же файл, что в поле video ноды Load Video (Upload) 🎥🅥🅗🅢 или VHS_LoadVideoPath (ролик).
    • frame_load_cap ноды Load Video (Upload) 🎥🅥🅗🅢 или VHS_LoadVideoPath (видео маски) равно полю frame_load_cap ноды Load Video (Upload) 🎥🅥🅗🅢 или VHS_LoadVideoPath (ролик).
  • Шаг 4, Превратите видеомаску в маску:
    • нода Convert Image to Mask.
    • IMAGE ноды Load Video (Upload) 🎥🅥🅗🅢 или VHS_LoadVideoPath (видео маски) во вход image ноды Convert Image to Mask (можно через Upscale Image или Upscale Image By или ImageFromBatch или ImageResizeKJv2 или Resize Image или GetImageRangeFromBatch или ResizeImageMaskNode).
    • channel ноды Convert Image to Mask: red.
  • Шаг 5, Уберите предмет:
    • нода ProPainter Inpainting.
    • IMAGE ноды Load Video (Upload) 🎥🅥🅗🅢 или VHS_LoadVideoPath (ролик) во вход image ноды ProPainter Inpainting (можно через Upscale Image или Upscale Image By или ImageFromBatch или ImageResizeKJv2 или Resize Image или GetImageRangeFromBatch или ResizeImageMaskNode).
    • MASK ноды Convert Image to Mask во вход mask ноды ProPainter Inpainting.
    • width ноды ProPainter Inpainting: от 64 до 2560; «Сделать за меня» ставит 640.
    • height ноды ProPainter Inpainting: от 64 до 2560; «Сделать за меня» ставит 480.
    • mask_dilates ноды ProPainter Inpainting: от 0 до 20; «Сделать за меня» ставит 5.
  • Шаг 6, Сохраните результат:
    • нода Video Combine 🎥🅥🅗🅢.
    • IMAGE ноды ProPainter Inpainting во вход images ноды Video Combine 🎥🅥🅗🅢.
    • frame_rate ноды Video Combine 🎥🅥🅗🅢: от 1 до 60; «Сделать за меня» ставит 24.

См. также

Страница перенесена из wiki репозитория приложения (docs/wiki/lessons/Video-Remove.ru.md, ревизия b8e3f71). То же руководство встроено в приложение: «Справка ▸ Руководство».

Чтобы обновить её, выполните npm run import, а затем npm run build в папке сайта.