ITCooky Recetas

Vamos a cocinar it cositas

Rejuvenecemos, cambiamos el género del rostro en el video con la red neuronal STIT – Stitch it in Time

дата abril 17, 2022

Otro proyecto de effectos video con neuroprocesamiento STIT – Stitch it in Time puede rejuvenecer el rostro, envejecer, cambiar de sexo y mucho más, pero con un pero!

Primero las desventajas notadas:
– Mal descrito, nada en absoluto excepto un par de ejemplos.
– No hace un video completo con sonido, mostrará algún tipo de demo sin sonido (se puede corregir)
– No puede elegir una cara si hay muchas en el frame (no se puede corregir)
– No puede seleccionar una cara si le mete una mano encima

No hay funciones necesarias, y de las que existen, algunas esta mal hechas sospecho que aproposito, por lo que este proyecto es aplicable de forma limitada a los podcasters y otros presentadores que no rascan la cara.

Tomamos Ubuntu y una tarjeta de video Nvidia con CUDA
Mi 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

¡A y tambien tomamos al anfitrión español Arturo Valls!

Por supuesto, puede tomar Windows y trabajar con este proyecto a través de WSL2 como en este artículo ¡Aumentamos y mejoramos fotos antiguas con GFPGAN en Windows a través de WSL2 y una tarjeta con CUDA (o sin ella)!, pero considere una cosa, aca hay una gran cantidad de cálculos, y noté que CUDA en Windows a través de WSL2 funciona 20 veces más lento que en Linux

Instalamos CUDA
En la consola de Ubuntu, ejecuta, y mira el cdriver de 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 |
+-----------------------------------------------------------------------------+

El controlador NVIDIA ya está instalado, si no, instálelo usted mismo

Upgrade
sudo apt-get update && sudo apt-get upgrade -y

Instalamos CUDA, ya tengo todo lo que necesito instalado, pero generalmente esto se hace asi
sudo apt install nvidia-cuda-toolkit

Instalacion de Conda
Python tiene un problema o una característica: lo que está escrito en una versión puede no funcionar en otras, lo mismo se aplica a las diferentes versiones de los módulos. Y conda crea un entorno para cada programa con las versiones necesarias y ninguna actualización los romperá.

Descargando una versión minimalista de Conda
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh

Respondemos afirmativamente a todas las preguntas durante la instalación.

Hay que cerrar abrir la consola de Ubuntu ejecutar
conda config --show
Algo muestra eso significa que funciona

Instalacion STIT
Creación de un entorno de Python para GFPGAN versión 3.7

conda create --name STIT python=3.7
conda activate STIT

Hacemos lo que el sitio web de los creadores.
git clone https://github.com/rotemtzaban/STIT.git
cd STIT
pip install -r requirements.txt

Dicen que lo probaron en la versión tourch 1.10 y se entregará en el momento
pip install torch torchvision
pip install git+https://github.com/openai/CLIP.git

Descargar modelos
pip install gdown
bash ./download_models.sh

Empezamos a procesar
Hago una carpeta en STIT
mkdir arturo
Aquí tiro fotogramas del archivo de vídeo data.mp4
ffmpeg -i "data.mp4" "arturo/out%04d.png"

Creo otra carpeta
mkdir ./arturo/experiment_dir
Y ahí empiezo a crear un modelo.. muy parecido a un modelo de cara…
python train.py --input_folder ./arturo --output_folder ./arturo/experiment_dir --run_name arturo --num_pti_steps 80
Aquí tienes que cambiar
–input_folder – carpeta ./arturo donde antes ponemos fotogramas del video sobre el que superpondremos
–output_folder – carpeta ./arturo/experiment_dir de modelo
–run_name – un nombre arturo
Aquí podemos cambiar
–num_pti_steps – este es el número de iteraciones, afecta el tiempo de ejecución de este comando y presumiblemente la claridad del resultado

A continuación, creo una carpeta donde se arrojará el resultado.
mkdir arturo/edits

Rejuvenecemos el rostro en el video STIT
Efectto age valores -4 -4 1

A continuación, ejecuto el comando de rejuvenecimiento, contiene carpetas para el modelo ./arturo e indicó dónde poner./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
Aquí tienes que cambiar
–input_folder – carpeta ./arturo donde ponemos los fotogramas del vídeo sobre el que vamos a superponer
–output_folder – carpeta ./arturo/experiment_dir de donde viene el modelo
–run_name – un nombre solo un nombre arturo
–edit_name – efecto para aplicar age
–edit_range – ajustes de efectos -4 -4 1 significa que rejuvenecerá en 4 pasos
–outer_mask_dilation – se encuentra en los ejemplos 50 puse 1 y todo se volvió negro en lugar de la cara

Por cierto, después de examinar el contenido de la carpeta /STIT/editings/w_directions puedes hacerte una idea de los efectos disponibles por su nombre

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

Mi video es 1920×1080 y en una carpeta /STIT/arturo/edits/age/-4.0 aparece video out.mp4 de tamaño 5760×1344 como este

Pa uqe lo hacen asi…

Cortamos la pieza deseada
ffmpeg -i out.mp4 -filter:v "crop=1920:1080:3840:264" -c:a copy young.mp4

Resulta que STIT cambió la duración del video
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 young.mp4
3.040000 en vez de 2.240000

Arreglando lo
ffmpeg -i younge.mp4 -filter:v "setpts=(2.24/3.04)*PTS" younge2.mp4
¡Video todavía roto 2.32 en lugar de 2.24 pero no tan notable!

Para comparar, pégalo con el original.
ffmpeg -i data.mp4 -i young2.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v]" -map "[v]" out_comp.mp4
Hacemos una captura de pantalla – rejuvenecimiento obvio

Por cierto, la duracion del video esta rota a proposito!!!

Cambiamos en archivosedit_video.py y edit_video_stitching_tuning.py en linea

imageio.mimwrite(os.path.join(folder_path, 'out.mp4'), frames, fps=18, output_params=['-vf', 'fps=25'])

18 a 25

imageio.mimwrite(os.path.join(folder_path, 'out.mp4'), frames, fps=25, output_params=['-vf', 'fps=25'])

Lancé el procesamiento de efecto nuevamente y la duración del video resultó ser 2.2, solo 0.04 más corta de lo que era.

Volveré a la creación del modelo, aumento –num_pti_steps hasta 420
python train.py --input_folder ./arturo --output_folder ./arturo/experiment_dir --run_name arturo --num_pti_steps 420
Procesar 55 frams (2,2 segundos de video) toma 70 minutos en mi PC

Y volveré a comenzar el rejuvenecimiento, intentaré sentir la diferencia en la imagen, el proceso dura 16 minutos.

Aquí y abajo comparo
Corté el video original del resultado STIT para que la coincidencia de tiempo sea 100
ffmpeg -i out.mp4 -filter:v "crop=1920:1080:0:264" -c:a copy src.mp4
Corté un pedazo de él con una cara de video
ffmpeg -i src.mp4 -filter:v "crop=860:1080:700:0" -c:a copy src0.mp4
Recorté una pieza con un efecto del resultado STIT
ffmpeg -i out.mp4 -filter:v "crop=1920:1080:3840:264" -c:a copy young.mp4
Corté un pedazo de él con una cara de video
ffmpeg -i young.mp4 -filter:v "crop=860:1080:700:0" -c:a copy young0.mp4
los uno, original a la izquierda
ffmpeg -i src0.mp4 -i young0.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v]" -map "[v]" young_comp.mp4
y hago una captura de pantalla para comparar

Mucha diferencia no hay, pero si miras de cerca los dientes, puedes ver que es un poco más claro y las arrugas en la frente son más claras.

Rejuvenecemos aún más el rostro en el vídeo con STIT
Efecto age valores -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
Parámetro agregado aquí
–border_loss_threshold – según tengo entendido esto afecta al final del procesamiento de algunas secciones y mas dedicacion de recursos a otras, para videos con fondo simple ponen 0.005 con complejo 0.002
–outer_mask_dilation – reducido aquí a 25

Cara vieja en video con STIT
Efecto age valores 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

Abrir los ojos al rostro en video con STIT
Efecto eyes_open valores 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
Efecto débilmente perceptible a los 32

Y a los 128

Cerrar los ojos al rostro en video con STIT
Efecto eye_ratio valores 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

Nuevamente abrir los ojos al video con STIT
Efecto eye_ratio valores -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

Tapar la boca en video con STIT
Efecto mouth_ratio valores 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

Abriendo más la boca en video con STIT
Efecto mouth_ratio valores -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

Abriendo más la boca de nuevo en video con STIT
También un efecto en la boca mouth_open valores 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

Cierra la boca de nuevo con STIT en video
También un efecto en la boca mouth_open valores -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

Reemplazar a un rostro con caracteristicas masculinas el rostro original en un video con STIT
Efecto gender valores 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

Reemplazar a un rostro con caracteristicas femeninas el rostro original en un video con STIT
Efecto gender valores -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

Sorprendentemente, Arturo se volvió muy parecido a Silvia Abril, erase una vez que ella lo reemplazó en Ahora Caigo

Gran sonrisa en la cara en video con STIT
Efecto smile valores 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

Sonrisa tensa en la cara en video conSTIT
Efecto smile valores -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

Nariz chata en video conSTIT
Efecto pitch valores 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

Nariz chata inversa en video con STIT
Efecto pitch valores -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

Aumentando la distancia entre la nariz y la boca en la cara en el video con STIT
Efecto nose_mouth_distance valores -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

Mal visible pero perceptible

Disminución de la distancia entre la nariz y la boca en la cara en el video con STIT
Efecto nose_mouth_distance valores -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

Reduce de forma muy inteligente la distancia entre la nariz y el labio – dejando al descubierto los dientes

La distancia de los ojos en la cara en el video con STIT
Efecto eye_distance valores 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

Creo que este filtro no hace lo que dice

Distancia de los ojos con un – en la cara en el video con STIT
Efecto eye_distance valores -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

Creo que este filtro no hace lo que dice

También probé efectos eye_eyebrow_distance, roll, lip_ratio, yaw, nose_ratio, nose_tip con valores -128 -64 -32 -8 8 32 64 128 no note algun efecto especial (en algúnos casos habia un defecto)!

Todos los efectos STIT en un video

Conclusión: se puede usar STIT para envejecer y sonreír. Creo agrega algunos defectos tambien al video; por ejemplo, me parece que hace que la cara sea más delgada. Y los efectos no son limpios: por ejemplo, le pones hacer género a una mujer, ¡y STIT también te abre la boca!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *