Nota : Esta es una biblioteca de seguimiento, no un programa independiente de titiritero de avatar. También estoy trabajando en VSeeFace, que permite animar modelos 3D VRM y VSFAvatar mediante el seguimiento de OpenSeeFace. VTube Studio utiliza OpenSeeFace para el seguimiento basado en cámara web para animar modelos Live2D. Puede encontrar un renderizador para el motor Godot aquí.
Este proyecto implementa un modelo de detección de puntos de referencia faciales basado en MobileNetV3.
Como la velocidad de inferencia de la CPU de Pytorch 1.3 en Windows es muy baja, el modelo se convirtió al formato ONNX. Usando onnxruntime, puede ejecutarse a 30 - 60 fps rastreando una sola cara. Hay cuatro modelos, con diferente velocidad para rastrear las compensaciones de calidad.
Si alguien tiene curiosidad, el nombre es un juego de palabras tonto sobre mar abierto y ver caras. No hay un significado más profundo.
Puede encontrar un vídeo de muestra actualizado aquí, que muestra el rendimiento del modelo de seguimiento predeterminado bajo diferentes niveles de ruido y luz.
Dado que los puntos de referencia utilizados por OpenSeeFace son un poco diferentes de los utilizados por otros enfoques (están cerca de iBUG 68, con dos puntos menos en las comisuras de la boca y contornos de cara casi 3D en lugar de contornos de cara que siguen el contorno visible), es Es difícil comparar numéricamente su precisión con la de otros enfoques que se encuentran comúnmente en la literatura científica. El rendimiento del seguimiento también está más optimizado para crear puntos de referencia que sean útiles para animar un avatar que para ajustar exactamente la imagen de la cara. Por ejemplo, siempre que los puntos de referencia de los ojos muestren si los ojos están abiertos o cerrados, incluso si su ubicación está algo desviada, pueden resultar útiles para este propósito.
Desde la observación general, OpenSeeFace funciona bien en condiciones adversas (poca luz, mucho ruido, baja resolución) y sigue rastreando rostros a través de una amplia gama de posturas de la cabeza con una estabilidad relativamente alta de las posiciones de los puntos de referencia. En comparación con MediaPipe, los puntos de referencia de OpenSeeFace permanecen más estables en condiciones difíciles y representa con precisión una gama más amplia de posturas de la boca. Sin embargo, el seguimiento de la región del ojo puede ser menos preciso.
Ejecuté OpenSeeFace en un clip de muestra de la presentación en video de Reconstrucción facial 3D con puntos de referencia densos de Wood et al. para compararlo con MediaPipe y su enfoque. Puedes ver el resultado aquí.
Puede encontrar un proyecto de Unity de muestra para animación de avatar basada en VRM aquí.
El seguimiento de rostros en sí lo realiza el script facetracker.py
Python 3.7. Es un programa de línea de comandos, por lo que debes iniciarlo manualmente desde cmd o escribir un archivo por lotes para iniciarlo. Si descargó una versión y está en Windows, puede ejecutar facetracker.exe
dentro de la carpeta Binary
sin tener Python instalado. También puedes usar run.bat
dentro de la carpeta Binary
para una demostración básica del rastreador.
El script realizará el seguimiento en la entrada de la cámara web o en el archivo de vídeo y enviará los datos de seguimiento a través de UDP. Este diseño también permite que el seguimiento se realice en una PC independiente de la que utiliza la información de seguimiento. Esto puede resultar útil para mejorar el rendimiento y evitar revelar accidentalmente imágenes de la cámara.
El componente OpenSee
Unity proporcionado puede recibir estos paquetes UDP y proporciona la información recibida a través de un campo público llamado trackingData
. El componente OpenSeeShowPoints
puede visualizar los puntos emblemáticos de una cara detectada. También sirve como ejemplo. Mírelo para ver cómo utilizar correctamente el componente OpenSee
. Se incluyen más ejemplos en la carpeta Examples
. Los paquetes UDP se reciben en un hilo separado, por lo que cualquier componente que utilice el campo trackingData
del componente OpenSee
primero debe copiar el campo y acceder a esta copia, porque de lo contrario la información podría sobrescribirse durante el procesamiento. Este diseño también significa que el campo seguirá actualizándose, incluso si el componente OpenSee
está deshabilitado.
Ejecute el script de Python con --help
para conocer las posibles opciones que puede configurar.
python facetracker.py --help
Se puede lograr una demostración simple creando una nueva escena en Unity, agregando un objeto de juego vacío y los componentes OpenSee
y OpenSeeShowPoints
. Mientras se reproduce la escena, ejecute el rastreador de rostros en un archivo de vídeo:
python facetracker.py --visualize 3 --pnp-points 1 --max-threads 4 -c video.mp4
Nota : Si las dependencias se instalaron usando poesía, los comandos deben ejecutarse desde un poetry shell
o deben tener el prefijo poetry run
.
De esta manera, el script de seguimiento generará su propia visualización de seguimiento y al mismo tiempo demostrará la transmisión de datos de seguimiento a Unity.
El componente OpenSeeLauncher
incluido permite iniciar el programa de seguimiento facial desde Unity. Está diseñado para funcionar con el ejecutable creado por pyinstaller distribuido en los paquetes de versión binaria. Proporciona tres funciones API públicas:
public string[] ListCameras()
devuelve los nombres de las cámaras disponibles. El índice de la cámara en la matriz corresponde a su ID para el campo cameraIndex
. Configurar el cameraIndex
en -1
deshabilitará la captura de la cámara web.public bool StartTracker()
iniciará el rastreador. Si ya se está ejecutando, cerrará la instancia en ejecución e iniciará una nueva con la configuración actual.public void StopTracker()
detendrá el rastreador. El rastreador se detiene automáticamente cuando se finaliza la aplicación o se destruye el objeto OpenSeeLauncher
. El componente OpenSeeLauncher
utiliza objetos de trabajo WinAPI para garantizar que el proceso secundario del rastreador finalice si la aplicación falla o se cierra sin terminar primero el proceso del rastreador.
Se deben agregar argumentos de línea de comando personalizados adicionales uno por uno en los elementos de la matriz commandlineArguments
. Por ejemplo, -v 1
debe agregarse como dos elementos, un elemento que contenga -v
y otro que contenga 1
, no uno que contenga ambas partes.
El componente OpenSeeIKTarget
incluido se puede utilizar junto con FinalIK u otras soluciones IK para animar el movimiento de la cabeza.
El componente OpenSeeExpression
se puede agregar al mismo componente que el componente OpenSeeFace
para detectar expresiones faciales específicas. Debe calibrarse por usuario. Se puede controlar a través de las casillas de verificación en el Editor de Unity o mediante los métodos públicos equivalentes que se pueden encontrar en su código fuente.
Para calibrar este sistema, debe recopilar datos de ejemplo para cada expresión. Si el proceso de captura va demasiado rápido, puede usar la opción recordingSkip
para ralentizarlo.
El proceso general es el siguiente:
Para eliminar los datos capturados para una expresión, escriba su nombre y marque la casilla "Borrar".
Para guardar tanto el modelo entrenado como los datos de entrenamiento capturados, escriba un nombre de archivo que incluya su ruta completa en el campo "Nombre de archivo" y marque la casilla "Guardar". Para cargarlo, ingrese el nombre del archivo y marque la casilla "Cargar".
--model 3
, el modelo más rápido con la calidad de seguimiento más baja es --model 0
.--scan-every
. Esto puede ralentizar las cosas, así que intenta configurar --faces
no más que el número real de caras que estás rastreando. Se incluyen cuatro modelos de puntos de referencia faciales previamente entrenados. Usando el interruptor --model
, es posible seleccionarlos para su seguimiento. Los valores de fps proporcionados son para ejecutar el modelo en un vídeo de una sola cara en un único núcleo de CPU. Reducir la velocidad de fotogramas reduciría el uso de la CPU en un grado correspondiente.
Las mediciones de FPS provienen de la ejecución en un núcleo de mi CPU.
Los pesos de Pytorch para usar con model.py
se pueden encontrar aquí. Algunos modelos ONNX no optimizados se pueden encontrar aquí.
Más muestras: Resultados3.png, Resultados4.png
El modelo de referencia es bastante robusto con respecto al tamaño y la orientación de las caras, por lo que el modelo de detección de caras personalizado se sale con la suya con cuadros delimitadores más toscos que otros enfoques. Tiene una relación velocidad-precisión favorable para los propósitos de este proyecto.
Las compilaciones en la sección de lanzamiento de este repositorio contienen un facetracker.exe
dentro de una carpeta Binary
que se creó con pyinstaller
y contiene todas las dependencias requeridas.
Para ejecutarlo, al menos la carpeta models
debe estar ubicada en la misma carpeta que facetracker.exe
. Colocarlo en una carpeta principal común también debería funcionar.
Al distribuirlo, también debe distribuir la carpeta Licenses
junto con él para asegurarse de cumplir con los requisitos establecidos por algunas de las bibliotecas de terceros. Los modelos no utilizados se pueden eliminar de los paquetes redistribuidos sin problemas.
Las versiones de lanzamiento contienen una versión personalizada de ONNX Runtime sin telemetría.
Las bibliotecas requeridas se pueden instalar usando pip:
pip install onnxruntime opencv-python pillow numpy
Alternativamente, se puede usar poesía para instalar todas las dependencias de este proyecto en un entorno virtual separado:
poetry install
Las bibliotecas requeridas se pueden instalar usando pip:
pip install onnxruntime opencv-python pillow numpy
El modelo se entrenó en una versión de 66 puntos del conjunto de datos LS3D-W.
@inproceedings{bulat2017far,
title={How far are we from solving the 2D & 3D Face Alignment problem? (and a dataset of 230,000 3D facial landmarks)},
author={Bulat, Adrian and Tzimiropoulos, Georgios},
booktitle={International Conference on Computer Vision},
year={2017}
}
Se realizó un entrenamiento adicional en el conjunto de datos WFLW después de reducirlo a 66 puntos y reemplazar los puntos del contorno y la punta de la nariz con puntos predichos por el modelo entrenado hasta este punto. Esta capacitación adicional se realiza para mejorar la adaptación a los ojos y las cejas.
@inproceedings{wayne2018lab,
author = {Wu, Wayne and Qian, Chen and Yang, Shuo and Wang, Quan and Cai, Yici and Zhou, Qiang},
title = {Look at Boundary: A Boundary-Aware Face Alignment Algorithm},
booktitle = {CVPR},
month = June,
year = {2018}
}
Para entrenar el modelo de detección de mirada y parpadeo, se utilizó el conjunto de datos MPIIGaze. Además, durante el entrenamiento se utilizaron alrededor de 125.000 ojos sintéticos generados con UnityEyes.
Cabe señalar que también se utilizaron datos personalizados adicionales durante el proceso de capacitación y que los puntos de referencia de los conjuntos de datos originales se modificaron de ciertas maneras para abordar diversos problemas. Probablemente no sea posible reproducir estos modelos solo con los conjuntos de datos originales LS3D-W y WFLW; sin embargo, los datos adicionales no son redistribuibles.
El modelo de detección de rostros basado en regresión de mapas de calor se entrenó en cultivos aleatorios de 224x224 del conjunto de datos WIDER FACE.
@inproceedings{yang2016wider,
Author = {Yang, Shuo and Luo, Ping and Loy, Chen Change and Tang, Xiaoou},
Booktitle = {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
Title = {WIDER FACE: A Face Detection Benchmark},
Year = {2016}
}
El algoritmo está inspirado en:
El código MobileNetV3 se tomó de aquí.
Para todos los entrenamientos se utilizó una versión modificada de Adaptive Wing Loss.
Para la detección de expresiones, se utiliza LIBSVM.
La detección de rostros se realiza mediante un modelo de detección de rostros basado en regresión de mapa de calor personalizado o RetinaFace.
@inproceedings{deng2019retinaface,
title={RetinaFace: Single-stage Dense Face Localisation in the Wild},
author={Deng, Jiankang and Guo, Jia and Yuxiang, Zhou and Jinke Yu and Irene Kotsia and Zafeiriou, Stefanos},
booktitle={arxiv},
year={2019}
}
La detección de RetinaFace se basa en esta implementación. El modelo previamente entrenado se modificó para eliminar la detección de puntos de referencia innecesarios y se convirtió al formato ONNX para una resolución de 640x640.
¡Muchas gracias a todos los que me ayudaron a probar cosas!
El código y los modelos se distribuyen bajo la licencia BSD de 2 cláusulas.
Puede encontrar licencias de bibliotecas de terceros utilizadas para compilaciones binarias en la carpeta Licenses
.