ProPainter - невидимая революция

Расскажу о чрезвычайно интересном инструменте редактирования видео и поделюсь эксклюзивным контентом. Судя по никакому обсуждению в сети, ProPainter — это незамеченная революция в невидимых спецэффектах.

ProPainter в действии

Говоря технически, ProPainter есть локальная нейронная сеть, обученная на inpainting, aka закрашивание областей.

Это могут быть как естественные части сцены вроде людей или машин, так и искусственные — водяные знаки или субтитры.

ProPainter со статичными масками

Кратко, о чём речь. ProPainter действительно эффективен, хоть и не всемогущ. Ограничен объёмом видеопамяти, но даже на 6 Гб есть жизнь. В оригинале поставляется в виде пачки скриптов и требует установки Python с библиотеками, но я сделал готовую сборку. В оригинале поддерживает только текстовый интерфейс, но я написал свой GUI. Дальше описание процесса установки, настроек и некоторого опыта использования, примеры.

1. Чем ProPainter так хорош

Качество работы можно оценить по примерам, на странице разработчиков есть ещё. Да, он хорош. Если сравнивать с инструментами «прошлого поколения» вроде Content Aware Fill в After Effects, ProPainter ощущается как Второе Пришествие (Первым когда-то был сам CAF). Из онлайн-сервисов могу сравнить с Runway — на первый взгляд получается похоже, а второго не было ;-)

С другой стороны, бесплатность и работа на локальном компьютере — немаловажные факторы. Это не Фотошоп крякнутый ставить, за онлайн-сервисы придется платить. Возможность обучаться ProPainter тоже поддерживает.

Обучи ProPainter сегодня, и терминаторы придут за тобой уже завтра
Обучи ProPainter сегодня, и терминаторы придут за тобой уже завтра

2. Недостатки и системные требования

Сеть требовательна к объёму видеопамяти. Думаю, 4-6 Гб выделенной видеопамяти это минимальный объём, с которым можно попробовать что-то сделать. Потребление зависит в первую очередь от разрешения видео, но вряд ли сейчас кто-то будет работать с источником меньше 1080р. Разработчики приводят следующую таблицу потребления.

OOM - Out Of Memory, вылет из-за нехватки памяти. Числа через дробь - режимы FP32 (полная) и FP16 (пониженная точность вычислений). Число кадров - длина одновременно анализируемого отрезка видео
OOM - Out Of Memory, вылет из-за нехватки памяти. Числа через дробь - режимы FP32 (полная) и FP16 (пониженная точность вычислений). Число кадров - длина одновременно анализируемого отрезка видео

Таблице нужно дать некоторое толкование. Учитывая специфику задачи, перед отправкой в ProPainter видео можно (и нужно) обрезать до небольших прямоугольников, которые после собираются вместе в стороннем редакторе. Т. е. реально с исходника в условных 1080р вырезается кусочек размером 700*350 и обрабатывается. Об этом в главе о работе.

Обрабатываемая область чуть подблюривается. Возможно, это связано с разрешением обучающего набора — 432*240, но тут не уверен. Акцент на «обрабатываемая», а не «закрашиваемая», о чём будет подробнее ниже. Лечится несложно, но нужно быть в курсе.

Поддерживаются только видеокарты Nvidia. Если вы грешным делом думали выполнить квоту дармовой видеопамятью из загашников AMD, то увы. В комментариях подсказали возможный вариант решения, но пока в альфа-версии и без гарантий.

Альтернативой выступает CPU mode, он же софтварный режим — работа на центральном процессоре. Функционирует, но очень медленно. Проверил его один раз, да и то случайно.

Сеть требует минимальной версии CUDA SDK 9.2, это аппаратная спецификация 3.0, карты GT 600 и GT 700. Сборка сделана на SDK 11.8, это спека 3.5, список там же.

В оригинальном виде сеть требует подготовки системы и предлагает установить Git, Anaconda, Python 3.8 и пачку библиотек. Если бы сам не писал на Питоне, не стал бы связываться. Тем более, что поддержку CUDA нужно гуглить и устанавливать отдельно. Ничего сложного, но как-то недружелюбно.

Именно поэтому, и потому что был скучный вторник, Жаба накатил pyinstaller и сделал свою сборку. С Блэкджеком и экзешниками! С нормальными исполняемыми файлами, которые просто запускаются и работают, ничего не требуя взамен. Разве что пару гигов загрузить.

В оригинальном виде сеть общается с пользователем через текстовый интерфейс. Это полный отстой и не понятно вообще, что мешало нарисовать окошки. /с

Поэтому Жаба накатил tkinter сделал свой графический интерфейс. Не самая красивая вещь на свете и не поддерживает инструменты для обучения. Но всё необходимое для работы есть, и даже чуть-чуть сверху ;-)

3. Установка оригинальной версии

Для начала пару слов об оригинальном установочном процессе. Официальная инструкция предлагает сделать следующее:

  1. Скачать и установить Git, после чего клонировать к себе репозиторий командой: git clone https://github.com/sczhou/ProPainter.git
  2. Скачать и установить Anaconda, запустить Anaconda Prompt, выполнить команды:
    conda create -n propainter python=3.8 -y
    conda activate propainter
    pip3 install -r requirements. txt
  3. Дополнительные требования:
    CUDA >= 9.2
    PyTorch >= 1.7.1
    Torchvision >= 0.8.2

Если Git нет, то и первый шаг не нужен: скачать сеть можно по прямой ссылке и кинуть куда-нибудь в корень диска С.

Во втором пункте в списке библиотек из requirements.txt PyTorch и Torchvision уже прописаны, а CUDA — нет. Поэтому по умолчанию получается софтверный режим.

Здесь предложение моё такое: pip3 install -r requirements.txt не выполнять, а перейти на эту страничку сайта PyTorch и с помощью виджета сгенерировать код запроса для установки полного комплекта из PyTorch, Torchvision, Torchaudio и CUDA. Вариант для Windows 10 и CUDA 11.8:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

После можно проинсталлировать прочее содержимое файла requirements.txt, предварительно убрав из него строчки torch и torchvision, воизбежание.

4. Установка и требования сборки

Установка: распаковать архив, желательно в папку без кириллических символов.

Требования: поддержка CUDA SDK 11.8, аппаратная спецификация CUDA — 3.5. Список видеокарт.

Протестировано под Windows 10.

Сборка v 1.0 сделана на базе последней на момент 16.02.2024 версии сети и весов v 0.1.0. Никаких гарантий не даю, и честно признаюсь, что за такие дела берусь нечасто. Вроде должно работать ^^

Корневая папка выглядит так:

Ничего лишнего, только бизнес
Ничего лишнего, только бизнес

Соответственно, prop_gui.exe — экзешник графического интерфейса (тыкать сюда) , inference_propainter.exe — сеть ProPainter; папки inputs и results — входные и выходные данные; weights — веса сети (содержимое папки можно удалить, тогда при запуске сеть перекачает их заново); _internal — библиотеки.

Собранную сеть можно запустить через консоль, если в окошках чего-то нет. Делается это точно так же, как в примерах разработчиков для несобранной версии, только заменяя python inference_propainter.py на inference_propainter.exe

Так выглядит "холодный" запуск сети из сборки через консоль
Так выглядит "холодный" запуск сети из сборки через консоль

Для проверки работоспособности сети в папке …/inputs есть примеры.

5. Графический интерфейс

Единый prop_gui.exe работает как с собранной (.ехе), так и несобранной (.py) версиями.

В последнем случае просто распакуйте содержимое архива с интерфейсом в папку установленной сети. Программа проверяет сеть на распакованность по существованию директории /Scripts и ожидает, что Anaconda с окружением «propainter» уже настроены.

Окно интерфейса во всей красе
Окно интерфейса во всей красе

Описание рабочего процесса и настроек ProPainter будут ниже, тут только кратко затрону связанные с окошками особенности.

ProPainter предполагает два основных режима работы — Object Removal и Video Completion. Различаются они наборами входных данных: в первом случае маской будет видеофайл, во втором — статичная картинка.

В режиме Object Removal видео и маска могут быть либо .mp4-файлами, либо последовательностями картинок (но не комбинацией одного и другого) .

ProPainter - невидимая революция

Для импорта последовательности скопируйте видео и маску по адресам:
…proPainter/inputs/object_removal/xxx_video
…proPainter/inputs/object_removal/xxx_mask
Укажите «xxx» в качестве названия проекта и нажмите кнопку «Прочитать / Создать». Если папок не существует, они будут созданы — на случай, если вы будете рендерить исходники позже и хотите сразу сохранять их по готовым адресам. Правый клик по кнопкам «Открыть /video» и «Открыть /mask» копирует соответствующий путь в буфер обмена.

Для импорта .mp4-файлов аналогично скопируйте их в ...proPainter/inputs/object_removal/, после чего укажите имя проекта «xxx.mp4». Маска из файла xxx_mask.mp4 подтянется автоматически.

В режиме Video Completion маски статичные, и всегда представляются в виде одного .png или .jpg файла. В качестве видео принимаются последовательности картинок и .mp4.

ProPainter - невидимая революция

При импорте последовательности можно так же создать новую папку для видео или подгрузить существующую. Если оставить поле «Имя файла с маской» пустым, туда автоматически подставится путь до xxx_mask.png, путь до .jpg или файла с другим именем можно прописать руками.

Если импорт прошел успешно, можно настроить процесс. На самом деле процесс можно настраивать в любое время, это не важно. По умолчанию активен только флаг экспорта в PNG, и в общем за исключением ещё двух параметров здесь можно ничего не трогать. Можно и их не трогать.

Отмеченные настройки увеличивают скорость обработки и снижают потребление видеопамяти
Отмеченные настройки увеличивают скорость обработки и снижают потребление видеопамяти

Есть кнопка-калькулятор потребления VRAM, видеопамяти. Основан на таблице разработчиков. Цифры примерные, воспринимать их стоит не как гигабайты, а как условных «попугаев», оценку по сдвинутой шкале.

Для работы калькулятора разрешение видео нужно прописать в соответствующие поля
Для работы калькулятора разрешение видео нужно прописать в соответствующие поля

Когда всё настроено, можно нажать кнопку «Запустить выполнение команды». Откроется консоль Windows (в случае сборки) , или Анаконды (в случае запуска несобранной версии) .

6. Настройки ProPainter

Настройки наглядно
Настройки наглядно

Описание от разработчиков крайне скупое, а в их статье надо разбираться. Поэтому кратко, по-босяцки.

--save_frames / Экспорт в .PNG — сохранять ли результат в виде последовательности .png-картинок или единого .mp4-файла.

--fp16 / Точность FP16 — понизить точность вычислений с плавающей запятой до FP16 с дефолтного FP32. Бесплатное ускорение процесса на поддерживающем железе. Это на таком, что умеет CUDA Compute 6.1, видеокарты GTX 1050 и выше. Сильно увеличивает скорость выполнения, снижает потребление видеопамяти. Ниже будет небольшое сравнение качества в этих режимах.

--subvideo_length — устанавливает количество кадров, в рамках которых происходит анализ картинки для реконструкции (?) Уменьшение снижает потребление видеопамяти.

--neighbour_length (количество локальных соседей/local neighbors) и --ref_stride (глобальные ссылки/global references) — параметры анализа, уменьшение тоже снижает потребление видеопамяти.

--width --height / Изменить размер кадра — сжатие видео в произвольных пропорциях. Уменьшение снижает потребление видеопамяти.

--resize_ratio — Множитель, на который будут умножены ширина и высота кадра. Может быть дробным.

Для обычного использования достаточно переключалки «FP16 / FP32» и снижения subvideo_length до 50.

7. Работа с ProPainter

Чтобы задать нейронной сети задачу, ей нужно предложить два файла: один с видео, один с маской. Маска — это кадр, залитый чёрным цветом #000000, на котором белым цветом #ffffff закрашена область, которую сети нужно заполнить.

Анимированная маска

ProPainter имеет два режима работы. В первом, Object Removal, маска анимирована и представляет собой видеофайл (.mp4 или последовательность .png). Во втором, Video Completion, маска статична и представляет собой картинку (.jpg или .png). Видео тоже может быть .mp4-файлом или пачкой .png, но смешивать mp4 и png в одном задании нельзя.

Для начала берём исходник и определяем, от каких областей ему предстоит избавиться. Для этого рисуем маски где надо и анимируем их. Обучение видеоредакторам в программе вечера не заявлено ;-) Поэтому считаем, что в своём редакторе вы управляться умеете.

Обычный день на сервере TF2. Будем вырезать чат в левом углу и киллфид в правом
Обычный день на сервере TF2. Будем вырезать чат в левом углу и киллфид в правом

Теперь видео надо обрезать, чтобы не вылететь по видеопамяти. Прикидываем регион вокруг маски, инфа из которого понадобится сети в пределах времени, определенного subvideo_length. Отмечаем, кропаем кадр.

Сохраняем технический обрезок видео в ...proPainter/inputs/object_removal/xxx_video

Типичная проблема
Типичная проблема

Возвращаемся в редактор, перекрываем видео чёрным слоем, включаем маску. Рендерим обрезанное видео с маской, кладем его в ...proPainter/inputs/object_removal/xxx_mask

Типичная маска
Типичная маска

Для режима Video Completion путь меняется соответственно: ...proPainter/inputs/video_completion/xxx_video ...proPainter/inputs/video_completion/xxx_mask

Когда файлы готовы, идём в ProPainter.

Для пользователей графического интерфейса: порядок работы с файлами.

Для всех остальных: python inference_propainter.py --video inputs/object_removal/xxx_video --mask inputs/object_removal/xxx_mask

Настраиваем настройки, параметрим параметры.

python inference_propainter.py --video inputs/object_removal/xxx_video --mask inputs/object_removal/xxx_mask --параметр1 --параметр2

Жмём кнопку «Запустить выполнение команды« в графическом интерфейсе или Enter в консоли. Если всё в порядке, ProPainter крепко подумает и выдаст сообщение об успешном окончании операции:

Добавил вывод имени устройства CUDA 0 для проверки
Добавил вывод имени устройства CUDA 0 для проверки

Идём в …proPainter/results/xxx_video забирать результаты.

Теперь видео нужно собрать обратно. Импортируем папку из results в видеоредактор, возвращаемся в композицию с масками.

Если кусков было много, может получиться что-то такое.

Теперь о том, как ProPainter блюрит картинки. Примечательно, что заблюрена не только область под маской, но вообще всё видео, см. на скриншоте.

По центру: обработано в ProPainter, справа-слева - оригинал
По центру: обработано в ProPainter, справа-слева - оригинал

Поэтому вернувшись в редактор, открываем свойства маски. Далее банально +5 Expansion и +5 Feather. Получаются приятные, мягкие края. Ставим маску как Alpha Matte для слоя видео из ProPainter. Теперь комар носа не подточит:

По центру: обработано в ProPainter и обрезано маской, справа-слева - оригинал
По центру: обработано в ProPainter и обрезано маской, справа-слева - оригинал

И если на блюр точность вычислений с плавающей запятой не влияет вовсе, то содержимое закрашенной области всё же меняется. Иногда мне кажется, что в FP32 картинка получается чуточку менее шумной. Но в общем они скорее просто шумят по-разному.

На примере ниже я нарисовал большую круглую маску посередине видео, видео замедлено в 8 раз и увеличено. И всё равно ничего не видно. Тут надо класть кадр над кадром и смотреть на контрасте, тогда можно засечь.

Слева FP16, справа FP32

8. Чего тут нет

Нет главы, посвященной обучению сети. Разработчики в своём неизменно-лаконичном стиле дают пояснения, но у меня пока руки не дошли.

Графический интерфейс инструменты для обучения тоже не поддерживает.

9. Ссылки

Сборка v1.0. В составе сеть, веса, и графический интерфейс.

Графический интерфейс отдельно. Работает с собранной (.ехе), и с обычной (.py) вариантами установки.

Прямая ссылка на загрузку ProPainter с официального репозитория. Не содержит весов, они докачиваются вручную или автоматически при первом запуске.

Публикация разработчиков по теме ProPainter.

ProPainter на канале автора на YouTube.

493493
78 комментариев

Комментарий недоступен

190
Ответить

Хех, идеальное попадание. Я уже и забыл про этот мем.

20
Ответить

Прощай, воображаемый друг Захар.

Ответить

класс

53
Ответить

Оригинальное фото. Если вдруг кто не в курсе истории времен Сталина.

16
Ответить

ну все правильно, это же он говаривал нет человека нет проблемы)) как раз в тему

Ответить

В недостатках не указано, но по видео явно видно гигантский косяк, тени остаются.

12
Ответить