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