ITСooky

IT-рецепты съедобные и не очень!

Омолаживаем, меняем пол лица на видео с нейросетью STIT — Stitch it in Time

дата 17.04.2022

Еще один проект нейрообработки видео 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *