Durante la última semana estuvimos con @okason97 desarrollando una app js con ReactJS la cual permite obtener imagenes de la webcam del usuario y realiza un reconocimiento y extracción del rostro de la persona que esté en frente utilizando Yolo.
Aquí se puede encontrar una descripción de Yolo y una comparación de performance con OpenCV.
Para esto se utiliza la librería face-api.js. face-api.js es una API de JavaScript para la detección y reconocimiento facial en el navegador implementado por encima de tensorflow.js.
Una de las principales propuestas de este desarrollo es delegar el correcto funcionamiento de la captura de imagenes al navegador, por lo que realizar la aplicación web resulta bastante conveniente en este sentido, y por otro lado, ejecutar los modelos de reconocimiento facial en el navegador no presenta reales perdidas de performance y la implementación de Yolo hace que sea realmente rápido.
Creo esta issue para dar lugar a la discución sobre que estandar de modelos utilizar y el pipeline de conversión entre cada una de las herramientas.
Basándome en la reunión de hoy investigué la posibilidad de migrar modelos de Keras a TF.js y de Pytorch a TF.js y para ambos casos encontré distintas variantes de conversión las cuales podrían funcionar.
deep-learning-model-convertor es un repositorio con mucha información sobre herramientas y pipelines que permiten conversión de modelos. En ese repo encontré esto pytorch-tf que permitiría pasar de Pythorch a TF, y posteriormente a TF.js. Por otro lado encontré import_keras que explica como importar modelos de keras en tfjs.
Además vi este post el cual explica que el pipeline más conveniente para migrar modelos de pytorch a tfjs sería PyTorch -> ONNX -> TensorFlow -> TensorFlow.js. Y leyendo un poco sobre ONNX se explica muy bien el porque de ese pipeline.
Sin embargo, siempre está la variante PyTorch -> Keras -> TensorFlow -> TensorFlow.js.
Las redes fueron entrenadas usando los 7 sentimientos.
El 70% de las imágenes de cada sentimiento fueron usadas para el entrenamiento, El 30% restante fueron usadas para obtener las métricas de rendimiento.
Para el entrenamiento se usó data augmentation (ImageDataGenerator) y como optimizador Adam.
Dataset: expressions in the wild
Usando la red entrenada con el dataset expressions in the wild.
Metrica
Angry
Disgust
Fear
Happy
Sad
Surprise
Neutral
precision
0%
50%
0%
58.36%
0%
33.33%
79.58%
recall
0%
4.87%
0%
89.34%
0%
0.90%
56.06%
accuracy
98.10%
98.98%
99.85%
69.07%
97.83%
97.23%
70.34%
f-measure
0%
8.88%
0%
70.60%
0%
1.76%
65.78%
Usando la red entrenada con el dataset facial_expressions.
Metrica
Angry
Disgust
Fear
Happy
Sad
Surprise
Neutral
precision
0%
0%
0%
53.83%
0%
28.57%
79.56%
recall
0%
0%
0%
93.77%
0%
10.90%
41.53%
accuracy
98.13%
98.98%
99.85%
63.98%
98.18%
96.81%
64.85%
f-measure
0%
0%
0%
68.39%
0%
15.78%
54.58%
Dataset: facial_expressions
Usando la red entrenada con el dataset facial_expressions.
Metrica
Angry
Disgust
Fear
Happy
Sad
Surprise
Neutral
precision
0%
0.5%
0%
58.36%
0%
33.33%
79.58%
recall
0%
4.87%
0%
89.34%
0%
0.90%
56.06%
accuracy
98.10%
98.98%
99.85%
69.07%
97.83%
97.23%
70.34%
f-measure
0%
8.88%
0%
70.60%
0%
1.76%
65.78%
Usando la red entrenada con el dataset expressions in the wild.