Это метод создания ВИДЕО с Roop (заменой лиц) с помощью расширения Roop от Automatic1111. Он немного запутанный, потому что делает то, что расширение якобы не должно делать, но сделать его несложно. Также не стоит расстраиваться из-за размера описания метода - оно такое большое потому, что я тщательно подхожу к делу, а также потому, что я привожу все необходимые команды FFMPEG и их объяснение. Простое руководство "по темам" было бы очень маленьким.
Итак, приступим:
Что вам понадобится:
- Automatic1111
- Расширение Roop, установленное в Automatic1111
- Установленный FFMPEG (https://ffmpeg.org/).
1) Создайте пустую папку, возьмите в нее входное видео и (для нашего примера) переименуйте его в "input.mp4". Как всегда, чем выше разрешение, тем больше времени потребуется на обработку, но тем лучше будет результат.
2) Время на выбор части видео, которую мы будем использовать. Можно просто использовать все видео (размер видео не ограничен), но каждая секунда видео добавит больше кадров и, следовательно, сделает процесс более длительным. В нашем примере мы будем обрезать исходное видео, чтобы сосредоточиться только на определенной части. Вы можете использовать любой инструмент по своему выбору, но если вы хотите использовать FFMPEG, просто откройте командную строку и перейдите в папку, где находится видео (*).
(*) СОВЕТ: Если вы находитесь внутри папки в проводнике Windows, просто щелкните на адресной строке, удалите то, что там находится, введите CMD и нажмите ENTER. В результате откроется командная строка внутри этой же папки.
Теперь в командной строке используйте следующую командную строку:
ffmpeg -ss 00:00:13 -to 00:00:16 -i input.mp4 -c copy -avoid_negative_ts make_zero output.mp4
Где:
-i : имя входного файла (input.mp4 в примере выше).
-ss: Используется вместе с -i и представляет собой время начала обрезки видео в формате hh:mm:ss (час, минута, секунда). В нашем примере это будет 00:00:13.
-to: Это время окончания обрезки видео. В нашем примере это будет 00:00:16 (т.е. результирующее обрезанное видео будет идти с 00:00:13 до 00:00:16 ВКЛЮЧАЯ ЭКСТРИМЫ, следовательно, всего четыре секунды)
-c copy: Это позволяет FFMPEG просто скопировать входной сигнал в выходной без повторного кодирования (это гораздо быстрее). Имя результирующего видео будет "output.mp4".
Чтобы понять, что такое "avoid_negative_ts make_zero", прочитайте этот комментарий: https://superuser.com/questions/1167958/video-cut-with-missing-frames-in-ffmpeg/1168028#1168028
3) Теперь у вас есть новое видео меньшего размера под названием "output.mp4". Чтобы продолжить работу, нам необходимо извлечь все кадры, которые мы хотим обработать в Roop. Во-первых, нам необходимо знать разрешение и частоту кадров (т.е. количество кадров в секунду) видеофайла "output.mp4", чтобы выбрать, сколько кадров в секунду мы будем извлекать и сохраним ли мы исходное разрешение или нет.
Для этого можно либо заглянуть в свойства файла в Windows (выделить файл, нажать правую кнопку мыши на файле, выбрать PROPERTIES, затем перейти на вкладку DETAILS), либо воспользоваться приведенной ниже командой FFPROBE (в той же командной строке, что и раньше):
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,width,height -of csv=s=x:p=0 output.mp4
Для видео нашего примера эта команда даст такой результат:
1280x720x24000/1001
Это означает, что наше видео имеет разрешение 1280 x 720 пикселей и 24000 кадров за 1001 секунду, что составляет примерно 24 кадра в секунду (точнее, 23,97).
Таким образом, если мы хотим получить результирующее видео с таким же качеством и плавностью, как у оригинала, нам нужно извлечь 24 кадра на каждую секунду видео, а затем обработать их все в полном исходном разрешении с помощью Roop. Это даст нам в общей сложности 24 x 4 изображения для обработки (количество кадров на каждую секунду, умноженное на общий размер видео в секундах), что составляет 96 изображений размером 1280 x 720 пикселей. Следует помнить, что чем больше кадров необходимо обработать на последующих этапах, тем больше времени потребуется на их обработку, поэтому количество кадров в секунду, которое вы будете извлекать, - это выбор между плавностью и временем обработки. Можно извлечь меньше кадров, чем было в исходном фреймрейте, но видео будет более "чопорным", а можно использовать меньшее разрешение, но качество при этом ухудшится.
В нашем случае мы будем использовать полные 24 кадра и исходное разрешение 1280 x 720.
4) Для извлечения кадров сначала создайте три папки внутри папки с видео (чтобы не смешивать кадры и видео): одну - "FRAMES", вторую - "READY", третью - "TRASH" (для чего они нужны, вы увидите позже). Затем выполните следующую команду (опять же, в том же командном интерпретаторе):
ffmpeg -i output.mp4 -r 24 -s 1280x720 -q:v 1 FRAMES\frame%04d.png
Где:
-i INPUT VIDEO
-r КАДРОВАЯ СКОРОСТЬ
-s OUTPUT RESOLUTION
-q:v КАЧЕСТВО (1 = лучшее)
А в качестве имени выходных изображений мы использовали папку, в которую они будут сохранены ("FRAMES", затем обратная косая черта и далее "frame%04d"). Это указывает FFMPEG на сохранение файлов в формате PNG, используя "frame", за которым следует четырехзначное число, начиная с 0000 и далее. Если вам необходимо извлечь более 9999 кадров, вы можете заменить "4" на любое другое число, чтобы определить количество цифр в имени (например, "06" даст вам файлы с именами "000000", "000001" и т.д.).
После выполнения команды, заглянув в папку "frames", вы увидите, что у вас есть последовательные файлы с именами от "frame0001.png" до "frame0099.png" (да, их должно быть 96, возможно, это связано с тем, что частота кадров в секунду составляет 23,97, или с тем, что FFMPEG не так точен) со всеми кадрами из исходного видео, сохраненными в виде файлов изображений PNG.
5) Теперь, когда у нас есть все кадры, которые нужно обработать, пора перейти в Automatic1111.
6) Откройте программу Automatic1111. На вкладке IMG2IMG выберите подвкладку "BATCH" и:
- В поле INPUT DIRECTORY укажите полный путь к папке, в которой находятся извлеченные кадры (папка "FRAMES", которую мы создали ранее).
- В поле OUTPUT DIRECTORY укажите полный путь к папке "TRASH", которую вы создали выше. Здесь будут сохранены кадры, обработанные методом стабильной диффузии (не Roop) - они НЕ будут ни для чего использоваться и фактически будут просто размытием из-за количества шагов, которые мы будем использовать.
- Выберите любую модель, так как Roop использует свою собственную модель. Я провел несколько тестов и не увидел никакой разницы в тех выводах, которые мы будем РЕАЛЬНО использовать (те, что от Roop, подробнее об этом ниже). В любом случае, если вы хотите выбрать одну из них, я предлагаю RealisticVision 3.0
- Игнорируйте все настройки (метод выборки, масштаб CFG и т.д.), кроме шага, который следует установить в "1" (да, один). Собственно IMG2IMG не будет использоваться, это только способ заставить Roop обрабатывать пакет, так что нет смысла терять время на обработку множества шагов для того, что вы не будете использовать. Вам также НЕ НУЖЕН НИКАКОЙ ПРИМЕР (положительный или отрицательный).
7) Спуститесь вниз по странице, откройте раздел ROOP и:
- Загрузите "новое" лицо в соответствующее поле. Используйте только хорошее фронтальное изображение лица с разумным разрешением (если нужно, обрежьте его). В моем примере я использую изображение из Википедии (сокращенная версия внизу страницы):
commons.wikimedia.org/wiki/File:Arnold_Schwarzenegger_%2833730956438%29.jpg
8) Теперь включите Roop и:
- УСТАНОВИТЕ флажок "Замена в исходном изображении
- УБРАТЬ флажок "Замена в сгенерированном образе".
Если эти опции установлены, то для каждого изображения в папке "FRAMES" произойдет следующее:
- Automatic1111 откроет изображение
- Затем Roop заменит оригинальное лицо на лицо из предоставленной картинки и сохранит полученное изображение в папке WINDOWS TEMP FOLDER. Именно эти изображения мы будем РЕАЛЬНО использовать в нашем процессе.
- Наконец, Automatic1111 запустит предоставленный запрос (в нашем случае пустой), используя предоставленные шаги (в нашем случае 1), и сохранит полученное изображение в папке "TRASH" (откуда мы их потом просто удалим)
9) Идем дальше: оставляем все как есть в Automatic1111 и открываем Проводник Windows. В адресной строке наберите "%TEMP%" (без двойных кавычек) и нажмите ENTER. В результате вы попадете в папку Windows TEMP. После этого отключите опцию "GROUP BY", если она включена (тогда файлы будут перечислены все вместе), выберите режим просмотра "DETAILS" (тогда они будут отображаться только в виде имен, дат и размеров, по одному в строке) и упорядочьте их по ДАТЕ, самый последний сверху. Обратите внимание на самый последний файл, который уже находится в папке TEMP, особенно если это файл изображения, так как в дальнейшем нам понадобится знать, какие файлы сгенерировал Roop.
10) Оставьте Проводник Windows как есть и вернитесь в Automatic1111. Нажмите GENERATE и, когда Automatic1111 начнет работать, вернитесь в проводник Windows, который вы оставили открытым в папке TEMP. Вы увидите, что в папке TEMP один за другим появляются новые изображения, упорядоченные по дате (от самого последнего к самому старому). Это те изображения, которые генерирует Roop и которые послужат входом для генерации Stable Diffusion, как было описано выше, и именно эти изображения мы будем реально использовать в нашем процессе. Теперь дождитесь окончания процесса, чтобы все 99 изображений были на месте.
РЕКОМЕНДАЦИЯ: Перед тем как пробовать весь набор изображений, можно скопировать несколько изображений (например, 5) в другую папку и обработать их. Таким образом, вы сможете убедиться, что все работает нормально и лицо было правильно заменено, прежде чем ждать долгое время, чтобы сделать весь набор изображений.
11) После того как процесс завершится и все изображения будут созданы, выделите все 99 новых изображений в папке TEMP и нажмите CONTROL+C, чтобы скопировать их в буфер обмена. Затем перейдите в созданную ранее папку "READY" и вставьте туда изображения. Будьте внимательны, возможно, что за это время Windows создала еще какие-то временные файлы, особенно если во время работы Automatic1111 вы занимались чем-то другим. В этом случае просто удалите ненужные изображения из папки READY после ее копирования и оставьте там только наши 99 файлов изображений.
12) В папке READY снова выберите опцию просмотра DETAILS и упорядочьте изображения по дате от самого старого (это очень важно, иначе видео будет идти задом наперед) до самого последнего. Таким образом, у вас будет список имен файлов, самый старый из которых находится вверху, а самый новый - внизу.
13) Упорядочив таким образом изображения, выделите их все (щелкните на первом и нажмите CTRL + A). Затем щелкните ПРАВОЙ кнопкой мыши на первом изображении и выберите пункт ПЕРЕименовать. После этого переименуйте его только в "IMG". После нажатия ENTER все изображения будут переименованы последовательно, начиная с "IMG (1).png" и заканчивая "IMG (99).png".
14) Теперь у нас есть все изображения, необходимые для воссоздания видеоролика с использованием нового лица. Поэтому снова откройте командную строку, перейдите в папку, где находятся эти изображения, и выполните следующую команду:
ffmpeg -framerate 24 -i "IMG (%d).png" -vf format=yuv420p FINAL.mp4
Где:
-framerate - желаемая частота кадров для результирующего видео (я использую 24, потому что мы извлекли из исходного видео 24 кадра в секунду - если бы мы извлекли 12 для каждой секунды, я бы использовал 12, и так далее)
-i "IMG (%d).png" указывает FFMPEG обрабатывать файлы с именами "IMG 1.png", "IMG 2.png" и т.д., пока не обработает их все
- vf format=yuv420p - желаемый выходной формат
15) После завершения работы команды в той же папке, где находятся изображения, должен появиться видеоролик с названием FINAL.mp4. Если вы его проиграете, то увидите, что это исходное видео, но с новым лицом. Теперь можно наложить на видео любую звуковую дорожку.