Еще один проект нейрообработки видео STIT — Stitch it in Time может омолодить лицо, состарить, поменять пол и много еще чего но есть нюанс!
Сразу о замеченных минусах:
— Плохо описан, вообще ничего нет кроме пары примеров
— Не делает готовое видео со звуком, выаускает какое то демо без звука(можно поправить)
— Не умеет выбирать одно лицо, если в кадре много(нельзя поправить)
— Не умеет выделять лицо если на него попала рука
Нужных функций нет, а из тех что есть некоторые специально поломаны так что этот проект ограниченно применим на подкастерах и прочих ведущих, кто не дергается и лицо не чешет!
Берем Ubuntu и видеокарту Nvidia c CUDA
Мой PC:
OS: Ubuntu 20.04.3 LTS
CPU: AMD® Ryzen 7 3700x 8-core processor × 16
MB: Gigabyte X570 I AORUS PRO WIFI
Mem: 64 GB DDR4 1330 Mhz
GPU: Nvidia GeForce RTX 2070 8Gb (2304 CUDA CORES)
Disk: Samsung SSD 512Gb EVO Plus
А и берем испанского ведущего Arturo Valls!
Можете конечно взять Windows и работать с этим проектом через WSL2 как в этой статье Увеличиваем улучшаем старые фотки с GFPGAN на Windows через WSL2 и картой с CUDA(можно и без)!, но учтите тут большой объем вычислений, а я заметил что CUDA на Windows через WSL2 работает в 20 раз медленно чем в Linux
Ставим CUDA
В консоли Ubuntu выполняем, смотрим драйвер Nvidia
nvidia-smi
Sun Apr 3 14:53:22 2022 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.103.01 Driver Version: 470.103.01 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... On | 00000000:0A:00.0 On | N/A | | 90% 73C P8 27W / 175W | 409MiB / 7979MiB | 7% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1736 G /usr/lib/xorg/Xorg 35MiB | | 0 N/A N/A 2362 G /usr/lib/xorg/Xorg 142MiB | | 0 N/A N/A 2476 G /usr/bin/gnome-shell 43MiB | | 0 N/A N/A 59650 G /usr/lib/firefox/firefox 155MiB | +-----------------------------------------------------------------------------+
Драйвер NVIDIA уже стоит, если нет установите сами
Обновляемся
sudo apt-get update && sudo apt-get upgrade -y
Ставим CUDA, у меня уже все нужное устновлено, но обычно это
sudo apt install nvidia-cuda-toolkit
Ставим Conda
У Python есть проблема или особенность — написанное на одной версии вполне может не работать в других, то же касается разных версий модулей. А конда создает среду для каждой программы с нужными версиями и никакой апдейт их не поломает.
Скачиваем минималистичную версию Conda
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh
На все вопросы отвечаем да при установке
Закрываем открываем консоль Ubuntu выполняем
conda config --show
Что-то показывает значит работает
Установка STIT
Создаем Python окружение для GFPGAN версии 3.7
conda create --name STIT python=3.7
conda activate STIT
Далее как на сайте создателей написано
git clone https://github.com/rotemtzaban/STIT.git
cd STIT
pip install -r requirements.txt
Они говорят что тестировали на версии tourch 1.10 она и поставится в данный момент времени
pip install torch torchvision
Описанный способ установки норм работает со старыми картам типа 2x(RTX 2070)
Для новых 3x(RTX A4500) надо конкретизировать версию toruch
pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113
Посмотреть версии
python -c "import torch; print(torch.__version__)"
вот такие должны быть
1.11.0+cu113
но все равно может не работать с ошибкой через какое то время, через каике-то апгрйеды Ubuntu
Failed to build CUDA kernels for
то есть не счbтает на видеокартеПомогает опять все в conda сделать с нуля!
ВОЗМОЖНО: Помогло то что я делал env с другой версие php
conda create --name STIT2 python=3.8
Дальше ставим
pip install git+https://github.com/openai/CLIP.git
Скачивание моделей
pip install gdown
bash ./download_models.sh
Начинаем обработку
Я делаю папку в STIT
mkdir arturo
Сюда кидаю кадры из видео файла data.mp4
ffmpeg -i "data.mp4" "arturo/out%04d.png"
Создаю еще одну папку
mkdir ./arturo/experiment_dir
И туда запускаю создании модели.. очень похоже на модель лица…
python train.py --input_folder ./arturo --output_folder ./arturo/experiment_dir --run_name arturo --num_pti_steps 80
Тут нужно поменять
—input_folder — папка ./arturo куда раньше мы клали кадры видео на которое будем накладывать
—output_folder — папка ./arturo/experiment_dir куда будет класться модель
—run_name — имя просто имя arturo
Тут можем поменять
—num_pti_steps — это количество итерация, влияет на время работы этой команды и предположительно на четкость результата
Далее создаю папку куда будет кидаться результат
mkdir arturo/edits
Омолаживаем лицо на видео с STIT
Эффект age со значением -4 -4 1
Далее запускаю команду на омоложение в ней указаны папки на модель ./arturo и указана куда класть ./arturo/edits
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name age --edit_range -4 -4 1 --outer_mask_dilation 50
Тут нужно поменять
—input_folder — папка ./arturo куда мы клали кадры видео на которое будем накладывать
—output_folder — папка ./arturo/experiment_dir от куда берется модель
—run_name — имя просто имя arturo
—edit_name — эффект который будем накладывать age
—edit_range — настройки эффекта -4 -4 1 значит что омолодится на 4 шага
—outer_mask_dilation — стоит в примерах 50 я поставил 1 и в место лица стало все черным
Кстати, изучив содержимое папки /STIT/editings/w_directions можно по их названию составить представление о доступных эффектах
age.npy eyes_open.npy mouth_ratio.npy pitch.npy eye_distance.npy gender.npy nose_mouth_distance.npy roll.npy eye_eyebrow_distance.npy lip_ratio.npy nose_ratio.npy smile.npy eye_ratio.npy mouth_open.npy nose_tip.npy yaw.npy
Видео у меня было 1920х1080 а в папку /STIT/arturo/edits/age/-4.0 кидается видео out.mp4 размером 5760×1344 вот такого вида
Вот на кой так делать….
Вырезаем нужный кусок
ffmpeg -i out.mp4 -filter:v "crop=1920:1080:3840:264" -c:a copy young.mp4
Выясняется что STIT изменил длительность видео смотрим
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 young.mp4
3.040000 а должно быть 2.240000
Исправляем это
ffmpeg -i younge.mp4 -filter:v "setpts=(2.24/3.04)*PTS" younge2.mp4
Видио все равно поломанной 2.32 вместо 2.24 но уже не так заметно!
Для сравнения склеиваем его с оригиналом
ffmpeg -i data.mp4 -i young2.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v]" -map "[v]" out_comp.mp4
Делаем скриншот — омоложение на лицо
Кстати длительность видео ломают специально!!!
Меняем в файлах edit_video.py и edit_video_stitching_tuning.py в строке
imageio.mimwrite(os.path.join(folder_path, 'out.mp4'), frames, fps=18, output_params=['-vf', 'fps=25'])
18 на 25
imageio.mimwrite(os.path.join(folder_path, 'out.mp4'), frames, fps=25, output_params=['-vf', 'fps=25'])
Запустил опять наложение эффетка и длина видео получилось 2.2 всего на 0.04 короче чем было
Вернусь к созданию модели увеличу —num_pti_steps до 420
python train.py --input_folder ./arturo --output_folder ./arturo/experiment_dir --run_name arturo --num_pti_steps 420
Процесс обработки 55(2.2 секунды видео) кадров занимает 70 минут на моем PC
И запущу опять омоложение, попытаюсь почустовать разницу в картине, процесс занимает 16 минут
Тут и далее сравниваю так
Вырезаю из результата STIT оригинальное видео, чтобы совпадение по времени было 100
ffmpeg -i out.mp4 -filter:v "crop=1920:1080:0:264" -c:a copy src.mp4
из него вырезаю куслк с видео лицом
ffmpeg -i src.mp4 -filter:v "crop=860:1080:700:0" -c:a copy src0.mp4
Вырезаю из результата STIT кусок с эффектом
ffmpeg -i out.mp4 -filter:v "crop=1920:1080:3840:264" -c:a copy young.mp4
из него вырезаю куслк с видео лицом
ffmpeg -i young.mp4 -filter:v "crop=860:1080:700:0" -c:a copy young0.mp4
соединяю из, оригнал с лева
ffmpeg -i src0.mp4 -i young0.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v]" -map "[v]" young_comp.mp4
и из него делаю скриншот для сравнения
Сильных различий нет, но если присмотрется к зубам то видно что чуть более четкое, и на лбу морщины четче
Еще сильнее омолаживаем лицо на видео с STIT
Эффект age со значением -8 -8 1
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name age --edit_range -8 -8 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Здесь добавляесят параметр
—border_loss_threshold — как я понял это влияет на конец обраобтки одних участков и больше уделению ресурсов другим, для видео с простым фоном ставят 0.005 со сложным 0.002
—outer_mask_dilation — тут уменьшил до 25
Старим лицо на видео с STIT
Эффект age но со значением 8 8 1
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name age --edit_range 8 8 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Открываем глаза на видео с STIT
Эффект eyes_open со значением 32 32
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name eyes_open --edit_range 32 32 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Слабо заметный эффект при 32
И при 128
Закрываем глаза на видео с STIT
Эффект eye_ratio со значением 32 32
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name eye_ratio --edit_range 32 32 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Опять открываем глаза на видео с STIT
Эффект eye_ratio со значением -32 -32
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name eye_ratio --edit_range -32 -32 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Прикрываем рот на видео с STIT
Эффект mouth_ratio со значением 32 32
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name mouth_ratio --edit_range 32 32 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Открываем шире рот на видео с STIT
Эффект mouth_ratio со значением -32 -32
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name mouth_ratio --edit_range -32 -32 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Открываем шире рот еще раз на видео с STIT
Тоже на рот эффект mouth_open со значением 32 32
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name mouth_open --edit_range 32 32 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Закрываем рот еще раз на видео с STIT
Тоже на рот эффект mouth_open со значением -32 -32
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name mouth_open --edit_range -32 -32 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Замена на мужское лицо на видео с STIT
Эффект gender со значением 8 8
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name gender --edit_range 8 8 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Замена на женское лицо на видео с STIT
Эффект gender со значением -8 -8
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name gender --edit_range -8 -8 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Удивительно но тут Arturo стал очень похож на Silvia Abril, она как то его подменяла в Ahora Caigo
Широкая улыбка на лицо на видео с STIT
Эффект smile со значением 4 4
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name smile --edit_range 4 4 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Узкая улыбка на лицо на видео с STIT
Эффект smile со значением -4 -4
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name smile --edit_range -4 -4 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Курносость на лице на видео с STIT
Эффект pitch со значением 8 8
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name pitch --edit_range 8 8 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Обратная курносость на лице на видео с STIT
Эффект pitch со значением -8 -8
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name pitch --edit_range -8 -8 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Увеличиваем расстояние между носом и ртом на лице на видео с STIT
Эффект nose_mouth_distance со значением -32 -32
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name nose_mouth_distance --edit_range 32 32 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Плохо заметно но заметно
Уменшаем расстояние между носом и ртом на лице на видео с STIT
Эффект nose_mouth_distance со значением -48 -48
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name nose_mouth_distance --edit_range -48 -48 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Очень интелектуально сокращает расстояние между носом и губой — обнажая зубы
Расстояние глаз на лице на видео с STIT
Эффект eye_distance со значением 64 64
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name eye_distance --edit_range 64 64 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Помоему этот фильтр не делает то что заявляет
Расстояние глаз с минусом на лице на видео с STIT
Эффект eye_distance со значением -64 -64
python edit_video_stitching_tuning.py --input_folder ./arturo --output_folder ./arturo/edits --run_name arturo --edit_name eye_distance --edit_range -64 -64 1 --outer_mask_dilation 25 --border_loss_threshold 0.005
Помоему этот фильтр не делает то что заявляет
Так же попробовал эффекты eye_eyebrow_distance, roll, lip_ratio, yaw, nose_ratio, nose_tip на -128 -64 -32 -8 8 32 64 128 какого-то особого эффекта(на некоторых натурально дефект) не заметно!
Все рассмотренные эффекты STIT в одном видео
Вывод: Можно применять STIT для состаривания и улыбания. Вместо эффектов все таки добавляет какие то дефекты в видео — мне например кажетcя что он делает лицо тоньше. И эффекты не чистые — например ставишь gender на женщину, а STIT еще и рот открывает!
UPDATE:
С этим флагом в команде результат должен писать в кадры а не в видео
--output_frames
Добавить комментарий