Está en la página 1de 43

Escuela

Politécnica
Superior

Aplicación de
reconstrucción 3D
usando Nerf
Grado en Ingeniería Informática

Trabajo Fin de Grado


Autor:
Saúl Verdú Aparicio
Tutor/es:
Miguel A. Cazorla Quevedo
Francisco Gómez Donoso

Junio 2021
Aplicación de reconstrucción 3D usando
Nerf

Autor
Saúl Verdú Aparicio

Tutor/es
Miguel A. Cazorla Quevedo
Departamento de Ciencia de la Computación e Inteligencia Artificial
Francisco Gómez Donoso
Departamento de Ciencia de la Computación e Inteligencia Artificial

Grado en Ingeniería Informática

Escuela
Politécnica
Superior

ALICANTE, Junio 2021


Agradecimientos

Este trabajo no habría sido posible sin la ayuda y el apoyo incondicional de mi novia,
Paula Medina Cascales, quien ha estado a mi lado durante todo este trabajo. Gracias a ella
he conseguido superar muchos de los retos que se me han puesto por delante durante mi paso
por la UA.

También me gustaría agradecer a mi grupo de amigos (Team Rada Rada) y los amigos
que he conocido en la universidad, quienes me han visto pasar por toda la carrera hasta este
punto y han conseguido sacarme una sonrisa en los momentos duros. Aunque no me hayan
visto durante mucho tiempo por culpa de exámenes, trabajos o una pandemia siempre me
han esperado con los brazos abiertos.

No puedo terminar sin agradecer a mis familiares, quienes me impulsaron a dar el salto de
empezar una carrera y me animaron a conseguir todo lo que me propusiera en la vida. Sin
ellos no podría haber llegado hasta donde estoy hoy.

Este trabajo se lo dedico a ellos


La magia en el siglo XXI es la tecnología.
Aquel que sepa dominar la y exprimir al máximo sus posibilidades tiene poderes.

Carlos Santana (@dotCSV)

vii
Índice general

Agradecimientos v

1 Introducción 1

2 Estado del Arte 3


2.1 3D Generic Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Statical Shape-from-Shading . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3 3D Morphable Face Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.4 3D Morphable Face Shape Model . . . . . . . . . . . . . . . . . . . . . . . . . 5

3 Metodología 7
3.1 Google Colaboratory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 Google Drive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.3 Open3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.4 Ploty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.5 NeRF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.6 NeRF-W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.7 NeRFies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.8 Structure-from-Motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

4 Desarrollo 13
4.1 Preparación de un dataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2 Configuración de NeRFies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.3 Selección de cámaras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.4 Obtención de las nubes de puntos . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.5 Combinar las nubes de puntos . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5 Experimentacion 21
5.1 Primeras Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.2 Entrenamiento de NeRFies . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.3 Selección de las cámaras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.4 Aplicación de filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

6 Conclusiones 27

Bibliografía 29

Lista de Acrónimos y Abreviaturas 31

ix
Índice de figuras

1.1 Ejemplo del funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2.1 Reconstrucción facial mediante modelos genéricos. . . . . . . . . . . . . . . . 3


2.2 Reconstrucción facial usando Statistical Shape-from-Shading . . . . . . . . . 4
2.3 Reconstrucción facial usando 3D Morphable Face Model . . . . . . . . . . . . 4
2.4 Reconstrucción facial usando 3D Morphable Face Shape Model . . . . . . . . 5

3.1 Representación de una nube de puntos con Open3D. . . . . . . . . . . . . . . 8


3.2 Ejemplo de algunos de los gráficos que nos permite hacer Ploty . . . . . . . . 8
3.3 Esquema del paso de parámetros a NeRF. . . . . . . . . . . . . . . . . . . . . 9
3.4 Esquema de la renderización con NeRF. . . . . . . . . . . . . . . . . . . . . . 9
3.5 Ejemplo de renderizado con NeRF. . . . . . . . . . . . . . . . . . . . . . . . . 10
3.6 Ejemplo de escena renderizada utilizando NeRF-W. . . . . . . . . . . . . . . 10
3.7 Esquema del filtro de deformación de NeRFies. . . . . . . . . . . . . . . . . . 11
3.8 Puntos clave con SIFT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.9 Reconstrucción con SfM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

4.1 Estructura de directorios del dataset de NeRFies. . . . . . . . . . . . . . . . . 14


4.2 Función de error de Nerfies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.3 MSE Photometric Loss. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.4 Elastic Loss. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.5 Background Loss. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.6 Posiciones de cámara utilizadas. . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.7 Operaciones para convertir un píxel de una imagen a punto 3D . . . . . . . . 17
4.8 Aplicación de filtros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.9 Matriz de transición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.10 Ejemplo de ICP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

5.1 Resultados de las primeras pruebas . . . . . . . . . . . . . . . . . . . . . . . . 21


5.2 Resultados del experimento del dataset. . . . . . . . . . . . . . . . . . . . . . 22
5.3 Resultados del entrenamiento con 10000, 20000 y 50000 respectivamente. . . . 23
5.4 Reconstrucción de rostro utilizando 3 cámaras. . . . . . . . . . . . . . . . . . 23
5.5 Reconstrucción de rostro utilizando 12 cámaras. . . . . . . . . . . . . . . . . . 24
5.6 Ejemplo de eliminación de los puntos intermedios. . . . . . . . . . . . . . . . 24
5.7 Ejemplo de recorte de de una nube de puntos. . . . . . . . . . . . . . . . . . . 25

xi
1 Introducción

El objetivo que se ha buscado conseguir mediante este trabajo es realizar una reconstrucción
3D con gran detalle de un rostro mediante imágenes 2D o vídeos capturados con cualquier
tipo de cámara haciendo uso de redes neuronales. El desarrollo de este trabajo se ha enfocado
en resolver o mejorar ciertos problemas que son habituales en los programas de reconstrucción
3D, como son la calidad y eficiencia.

Para hacer la reconstrucción se utilizará Deformable Neural Radiance Fields (NeRFies),


una nueva tecnología que hace uso de redes neuronales no convolucionales para aprender
la forma del rostro. Gracias a esta tecnología podremos obtener los mapas de profundidad
de diferentes partes del rostro, que posteriormente se convertirán en nubes de puntos y se
combinarán para obtener así el rostro completo, tal como se muestra en la Figura 1.1.

Figura 1.1: Ejemplo del funcionamiento

En la actualidad cada vez se hace más uso de este tipo de modelados 3D. Existen muchos
métodos y variedades para conseguir hacer esto pero siempre poseen ciertas limitaciones ya
sea porque necesitan de hardware específico o un excesivo uso de computación, lo cual hace
que no esté al alcance de todo el mundo. Es por esto que consideramos que este proyecto es
tanto útil como importante, ya que gracias a esta solución cualquier persona que posea un
ordenador y una cámara digital podrá hacer una reconstrucción de rostro.

Las posibles aplicaciones de este modelo pueden ir enfocadas en los apartados multimedia
como videojuegos, películas, series… los cuales reducirían la inversión realizada para el mode-
lado de personajes. Al no tener un gran coste de entrada haría posible que empresas pequeñas
puedan utilizarlo para sus producciones. Otra de las posibles utilidades sería la inclusión en
el campo de la medicina, por ejemplo en aplicaciones para así poder darle más información a
los médicos sobre una lesión o golpes en el rostro.

1
2 Estado del Arte

Con el paso del tiempo la reconstrucción de rostros mediante imágenes 2D ha ido evolucio-
nando dando lugar a numerosas técnicas. En esta apartado se va a hacer un breve repaso de
algunas de las técnicas que se enfocan en esto, para así tener un contexto para el proyecto.

2.1 3D Generic Model

Unos de los métodos más utilizados para la reconstrucción de rostros en 3D son los deno-
minados métodos genéricos, estos son los que generalmente se basan en la construcción de
un modelo genérico para posteriormente deformarlos y así ajustarlos a la y las imágenes que
se le han suministrado como input. Para conseguir esto se hace uso de modelos faciales de
diferentes personas.

Este método se centra en encontrar una serie de puntos característicos dentro de las imáge-
nes para luego buscarlos en los modelos genéricos (tono del color de la piel, separación de los
ojos, tamaño de la nariz...). En estos métodos suele primar la eficiencia antes que la calidad
de reconstrucción, esto hace que la calidad de las reconstrucciones sea baja.

Figura 2.1: Reconstrucción facial mediante modelos genéricos.

3
4 Estado del Arte

2.2 Statical Shape-from-Shading

Tanto este como los siguientes métodos son estadísticos, es decir, se apoyan sobre diferentes
herramientas del campo de la probabilidad y la estadística. Este en concreto utiliza un modelo
estadístico lineal sobre la superficie del rostro humano para realizar la reconstrucción. Este
modelo estadístico usa el escaneo de una colección de 200 cabezas con las que se realizar
un análisis de los componentes principales. Gracias a este análisis se puede definir cualquier
rostro en función de unos valores.

Esta técnica es capaz de realizar una reconstrucción bastante fiel de la realidad en muy poco
tiempo. Sin embargo, presenta algunos problemas como la baja calidad de las reconstrucciones
o que solo está optimizado para la parte frontal de la cara.

Figura 2.2: Reconstrucción facial usando Statistical Shape-from-Shading

2.3 3D Morphable Face Model

3D Morphable Face Model (3DMFM) es una técnica de reconstrucción facial muy reco-
nocida debido a la gran calidad que poseen las reconstrucciones que esta hace. Esta se basa
en hacer usos de dos modelos estadísticos lineales, uno para generar la forma de la cara y
otro modelo estadístico para obtener la textura. Aparte, 3DMFM utiliza un modelo iterativo
para calcular y reducir el error que se posee en la reconstrucción con respecto a las imágenes
tomadas como input.

Debido a los diversos modelos que utiliza esta técnica, los resultados obtenidos poseen una
gran calidad de reconstrucción, pero los costes computacionales son demasiado elevados, ya
que requiere de bastantes iteraciones para conseguir una solución aceptable.

Figura 2.3: Reconstrucción facial usando 3D Morphable Face Model


2.4. 3D Morphable Face Shape Model 5

2.4 3D Morphable Face Shape Model

La última de las técnicas que se va a presentar es 3D Morphable Face Shape Model


(3DMSM). Esta toma las bases de 3DMFM, crea un rostro humano utilizando únicamen-
te un modelo de forma. Las texturas de este modelo se obtienen en función de las imágenes
que se han utilizado como input, gracias a estos se consigue representar ciertos elementos
discriminativos de la piel. Otra de las características que lo distinguen de 3DMFM es el uso
de Structure-from-motion (SfM) para hacer el ajuste del error del modelo, esto hace que sea
más eficiente a la hora de procesar el rostro. Los resultados de estas técnicas no llegan al
nivel de detalle que se alcanza con 3DMFM pero son realmente buenos.

Figura 2.4: Reconstrucción facial usando 3D Morphable Face Shape Model

Como se ha podido observar, todos y cada uno de los métodos que existen en la actualidad
en el ámbito de la generación de rostros a partir de imágenes tienen limitaciones, de mayor o
menor rango, en cuanto a la calidad de la reconstrucción y/o en lo referente a la eficiencia del
modelo. Esto, aunque pueda parecer una desventaja, deja paso a otros investigadores para
poder desarrollar otros sistemas alternativos o simplemente implementar ciertas mejoras a
los ya existentes dentro de este campo de la informática.
3 Metodología

Dentro de este apartado se va a hacer mención de todas las herramientas que han sido
necesarias para la realización del proyecto, así como el proceso de desarrollo que se ha llevado
a cabo.

3.1 Google Colaboratory

Google Colaboratory es un servicio en la nube, basado en Jupyter Notebooks, que nos


permite escribir y ejecutar código en Python de forma remota. Esta herramienta nos permite
crear modelos de Machine Learning y entrenarlos haciendo uso de sus GPUs.

3.2 Google Drive

Google Drive es un servicio de almacenamiento en la nube, lanzado al mercado en 2012


por Google. Gracias a este servicio se puede hacer un manejo de ficheros mucho más rápido y
limpio con cualquiera de las aplicaciones de Google, entre las que se encuentra Colaboratory.

3.3 Open3D

Open3D es una librería de código abierto que permite hacer uso de estructuras de datos
y algoritmos sobre datos 3D tanto en C++ como en Python. Fue completado por Qian-Yi
Zhou, Jaesik Park y Vladlen Koltun. Open3D actualmente es compatible con las plataformas
Windows, OSX y Linux.

Esta librería permite un rápido desarrollo de software que trata con datos 3D, ya que posee
un backend altamente optimizado y preparado para hacer uso de la paralelización. En este
caso la utilizaremos para el tratamiento de nubes de puntos.

7
8 Metodología

Figura 3.1: Representación de una nube de puntos con Open3D.

3.4 Ploty

Ploty es una librería de código abierto que permita hacer gráficos de gran calidad. Esta
librería soporta más de 40 tipos distintos de gráficos que cubren una amplia gama de ca-
sos de uso estadístico, financiero geográfico científico y tridimensional. Ploty es una librería
compatible con Jupyter lo cual la hace excelente para ser usada en proyectos de Google Co-
laboratory. En nuestro caso lo utilizaremos para poder visualizar las nubes de puntos que
obtengamos.

Figura 3.2: Ejemplo de algunos de los gráficos que nos permite hacer Ploty

3.5 NeRF

Neural Radiance Fields (NeRF) es un método que consigue generar nuevas vistas de una
escena compleja utilizando un conjunto disperso de vistas de la escena. Esto se logra haciendo
uso de una red neuronal totalmente conectada (no convolucional), la cual sintetiza la función
de escena volumétrica subyacente en las vistas. La entrada para esta red neuronal es una
3.6. NeRF-W 9

coordenada 5D (ubicación espacial (x, y, z) y dirección de visualización (�, �)) y cuyo resultado
son los colores y densidad de la escena desde esa perspectiva.

Figura 3.3: Esquema del paso de parámetros a NeRF.

Para conseguir renderizar una vista en concreto con NeRF se lanzan rayos desde la pers-
pectiva de la cámara que atraviesan la escena para generar un muestreo de puntos 3D, los
cuales se utilizarán junto con sus direcciones para entrenar a la red neuronal, que nos devuel-
ve densidades y colores, y por último mediante técnicas clásicas de renderizado de volúmenes
se juntan esas densidades y colores para formar una imagen 2D, que servirá para comprobar
el error de la red.

Figura 3.4: Esquema de la renderización con NeRF.

Los resultados de NeRF consiguen capturar de forma correcta toda la iluminación, pro-
fundidad y reflejos de la escena. Aunque NeRF parezca una gran revolución para el campo
de los gráficos por ordenador esta posee ciertas limitaciones, ya que es muy sensible a los
cambios de iluminación en una escena y al movimiento dentro de la misma. Es por ello que
si se quiere utilizar se deben tener cuidado con el dataset que se va a utilizar para entrenar.

3.6 NeRF-W

Dadas las limitaciones presentadas en NeRF, en Agosto de 2020 se presentó NeRF in the
wild (NeRF-W), una tecnología que se enfocó en mejorar los resultados obtenidos por NeRF,
para así poder entrenar con diferentes bancos de datos. Para ello hace uso de varios embed-
dings que le permiten controlar la sensibilidad a los cambios en la imagen. Gracias a esto,
10 Metodología

(a) Renderizado correcto. (b) Renderizado fallido.

Figura 3.5: Ejemplo de renderizado con NeRF.

NeRF-W consigue resultados tan buenos como los ya vistos en NeRF tomando como input
imágenes con grandes cambios. A parte de todo esto NeRF-W al hacer uso de embeddings
permite la alteración de los mismos para poder variar parámetros de la escena, como por
ejemplo la iluminación, obteniendo así la misma escena en momentos distintos del día.

Figura 3.6: Ejemplo de escena renderizada utilizando NeRF-W.

3.7 NeRFies

NeRFies es una tecnología que hace uso de NeRF y de los avances realizados por NeRF-W
para la reconstrucción de rostros en 3D de forma realista, convirtiéndose así en el primer
método capaz de realizar la reconstrucción hiperrealistas de un rostro tan solo utilizando
como input fotos o vídeos. NeRFies, con respecto a sus predecesores añade un filtro el cual
permite calcular la distorsión que sufre el objeto entre cada uno de los fotogramas, para así
poder corregir esta deformación de la imagen.
3.8. Structure-from-Motion 11

Figura 3.7: Esquema del filtro de deformación de NeRFies.

3.8 Structure-from-Motion

SfM es uno de los tantos métodos que existen a día de hoy para hacer la reconstrucción
de estructuras 3D. Esta técnica es considerada un método de alta resolución y bajo coste,
debido a que solo se necesita de una cámara y los resultados que ofrece son de una gran
calidad. En si este método busca realizar la reconstrucción 3D a partir de la superposición
de diferentes imágenes, al igual que en la fotogrametría. Sin embargo, en la fotogrametría se
requiere tener un conocimiento de la geometría y los parámetros extrínsecos e intrínsecos de
las cámaras, cosa que con SfM no es necesario, ya que calculan de forma automática. SfM
ha sido muy utilizada en los campos de la geología y de la ingeniería, para reconstrucción de
terreno, visión por ordenador, estudio de fósiles...

Para conseguir recuperar la escena 3D, SfM requiere hacer muchas imágenes de la escena
que tengan un alto grado de superposición. De cada una de ellas se hace una extracción
de puntos claves, estos son ciertas características distintivas de la imagen, a menudo son
esquinas o segmentos de línea, como podemos ver en la Figura 3.8. Estas características se
rastrean haciendo uso de algoritmos de detección. Algunos de los algoritmos más utilizados
son SIFT y SURF, ya que son rápidos y sencillos de aplicar. Después de haber obtenidos
todos los puntos claves se van rastreando las características de una imagen en otras para
hacer la estimación de los parámetros intrínsecos y extrínsecos de las cámaras en función de
un sistema de coordenadas genérico. Por último se genera un mapa de profundidad de cada
una de las imágenes y se superponen entre ellos siguiendo la posición y orientación de la
cámara correspondiente, como se puede apreciar en la Figura 3.9.
12 Metodología

Figura 3.8: Puntos clave con SIFT.

Figura 3.9: Reconstrucción con SfM.


4 Desarrollo

Dentro de este apartado se va exponer todo el proceso de desarrollo que se ha realizado en


el proyecto, describiendo paso a paso y de forma detallada todas las cosas que se han llevado
a cabo para finalizar el proyecto.

4.1 Preparación de un dataSet

Para poder trabajar con NeRFies es necesario crear un dataset compuesto por las imágenes
que queramos utilizar para entrenar a la red y la posición de la cámara de cada una de
las imágenes. Si se desea hacer esto de forma sencilla, los creadores de NeRFies tienen un
notebook1 de Google Colaboratory donde se crea paso a paso un dataset utilizando un vídeo,
en el que se mueva la cámara alrededor del rostro a una distancia constante.. En caso contrario,
si deseamos crear el dataset a mano deberemos obtener un mínimo de 100 imágenes de partes
distintas del rostro. Se recomienda tomar las fotos a una distancia entre los 60 y 70 cm de la
cara.

Una vez hecho esto se deberán sacar los valores relativos a la escena. Para conseguirlo
deberemos aplicar SfM, una técnica que nos devuelve como resultado una reconstrucción
tridimensional de la escena y los datos intrínsecos y extrínsecos de las imágenes. En esta
técnica primeramente se detectan y extraen los puntos característicos de cada una de las
imágenes aplicando un detector de características, como sería por ejemplo SIFT. Después se
hacen coincidir las características entre imágenes. Y por último, se hace la reconstrucción de
la escena, para ello se toma un par de fotos, se triangulan las posiciones de los puntos y se
va registrando gradualmente los puntos del resto de imágenes.

Todos estos datos se deberán almacenar con la estructura de directorios de la Figura 4.1.
Dentro de la carpeta cámara se deberán introducir toda la información de cada una de las
imágenes (identificadas cada una por su id). La carpeta camera-path se usa para almacenar la
información de las cámaras que queramos utilizar para hacer pruebas o renderizar un vídeo.
En la carpeta rgb se almacenarán subcarpetas con las imágenes que vamos a utilizar (en
formato PNG por defecto) que indican la escala a la que están las imágenes. En el fichero
metadata.json se almacenan los ids de los embedding de deformación y apariencia, y el id
para conjuntos de datos de plataformas de validación. Scene.json debe contener los valores
de escala, cercanía, lejanía y la posición del origen de la escena. En el fichero dataset.json
1
https://colab.research.google.com/github/google/nerfies/blob/main/notebooks/Nerfies_Capture
_Processing.ipynb

13
14 Desarrollo

se guardan los datos del entrenamiento y la validación, es decir, el número de imágenes que
tiene el dataset, el número de ejemplos que se van a usar para entrenar, una lista con los ids
del dataset, una segunda lista con los ids de las imágenes que se van a utilizar para entrenar y
una lista con los ids de las imágenes que se van a utilizar para validar. Por último, points.npy
es un archivo numpy que contiene una matriz de tamaño (N,3) que contiene los puntos del
background. Tenemos un ejemplo de cada uno de estos ficheros en Github2 de NeRFies.

Figura 4.1: Estructura de directorios del dataset de NeRFies.

4.2 Configuración de NeRFies

Después de haber creado un dataset podemos pasar al entrenamiento con NeRFies. En


este proceso lo que vamos ha hacer es entrenar a una red neuronal no convolucional ya
preconfigurada para que aprenda a codificar la información de la escena. Para esto, hay que
utilizar las posiciones de la cámara como input, y la red generará un color y un valor de
densidad para cada píxel de una imagen. Tras cada una de las iteraciones se calculará el error
de la red que en sí es una combinación de tres errores diferentes, tal como se puede apreciar
en la Figura 4.2. El primero de los términos de la ecuación es MSE Photometric Loss, el cual
nos sirve para medir el error cuadrático total entre los colores de los píxeles renderizados y
los verdaderos, este se puede ver descrito en la Figura 4.3. Gracias a este error se va a poder
controlar la generación de colores que va ha hacer la red. Después encontramos el Elastic
Loss, que sirve para medir la rigidez del modelo ante las pequeñas variaciones del rostro. En
la Figura 4.4 podemos ver cómo se calcula este error. Y por último, tenemos el Background
Loss, que nos sirve para llevar un control sobre la regularización del fondo de la escena, y
viene dada por la ecuación que vemos en la Figura 4.5. Cada uno de estos términos que
conforman el error del modelo pueden ser ajustados haciendo uso del descenso del gradiente.

2
https://github.com/google/nerfies
4.2. Configuración de NeRFies 15

Figura 4.2: Función de error de Nerfies.

Figura 4.3: MSE Photometric Loss.

Figura 4.4: Elastic Loss.

Figura 4.5: Background Loss.

A la hora de entrenar es necesario indicar algunos de los parámetros del modelo, para ello
el equipo de NeRFies ha proporcionado una serie de preconfiguraciones que podemos utilizar,
estas son:

• gpu_fullhd.gin: Está pensada para ser utilizada con 8 GPUs simultaneamente y utili-
zar imágenes de 1920x1080 pixels. Para que los resultados de esta configuración sean
óptimos el equipo de NeRFies ha estimado que se requieren de 3 días de entrenamiento.

• gpu_quarterhd.gin: Esta configuración está optimizada para obtener resultados de una


gran calidad reduciendo el tiempo de computación. Con esta configuración en concreto
se requieren de solo 14 horas para obtener buenos resultados con 8 GPUs.

• gpu_quarterhd_4gpu.gin: Esta posee los mismos valores que la anterior, la única dife-
rencia entre ambas es que en esta se ha indicado que se utilicen tan solo 4 GPUs.

• test_local.gin y test_vrig: Estas dos nos sirven para hacer pruebas y comprobar que
funciona correctamente Nerfies. Los resultados que ofrecen no son muy buenos pero
sirven para saber si no ha habido errores durante el entrenamiento.

• gpu_vrig_paper.gin: Esta configuración fue la que se utilizó durante el desarrollo de


NeRFies para crear las tablas de paper. Para ello han utilizado 8 GPUs.

Por otro lado, si se desea crear una configuración, primeramente deberemos importar el
16 Desarrollo

fichero warp_defaults.gin, que contiene la configuración base de NeRFies, a nuestro fichero.


Una vez hecho esto podremos configurar tanto los parámetros del entrenamiento como los
parámetros del modelo. Algunas de las variables que podemos definir las encontramos en la
Tabla 4.1.

Variable Descripción
max_steps Sirve para indicar el numero máximo de iteraciones que per-
mitimos.
image_scale Escala que se va a utilizar para el entrenar.
batch_size Tamaño del conjunto de que se va a usar en el entrenamiento.
TrainConfig.print_every Cada cuanto queremos que se muestre un resultado del en-
trenamiento.
TrainConfig.save_every Cada cuanto queremos que se guarden los datos del entre-
namiento.

Tabla 4.1: Ejemplos de variables que se pueden configurar para el entrenamiento.

4.3 Selección de cámaras

Una vez se haya entrenado NeRFies deberemos seleccionar las posiciones de cámara que
vamos a utilizar para hacer la reconstrucción. Para ello se van a tener que definir cada
cámara en función del sistema de coordenadas que se ha establecido con SfM en el dataset.
En nuestro caso, para obtener cada posición, primeramente hemos utilizado los valores de una
cámara del dataset que se encontrara cerca a la posición que nosotros buscábamos, y luego
hemos ido variando la posición y orientación hasta colocarla en el ángulo deseado. Para el
proyecto se han utilizado 3 cámaras, colocadas como se ve reflejado en la Figura 4.6, aunque
si se desea se pueden elegir tantas cámaras como se quiera. Cuanto mayor sea el número de
cámaras que utilicemos mejor será la reconstrucción final, pero tardará un mayor tiempo en
ser procesado. Hemos considerado que poner tres cámaras era lo idóneo, ya que el resultado
de la reconstrucción es bueno y de esta forma el tiempo que se tarda en procesar las vistas
no es excesivo. Hay que recalcar que las poses que se establecen en este paso no existen en
el dataset, es decir, que será el modelo entrenado el que genere las imágenes y los mapas de
profundidad correspondientes a estas tres vistas.

4.4 Obtención de las nubes de puntos

Ya con las cámaras seleccionadas se deben obtener las nubes de puntos correspondientes.
Para ello, lo primero que tenemos que hacer es generar la imagen RGB y el mapa de profun-
didad correspondiente a cada cámara.. Una forma de obtener estos datos sería hacer uso de
la función de renderización render_image() que trae integrada NeRFies, la cual ejecuta el sis-
tema ya entrenado para generar los píxeles de una imagen y calcular el valor de profundidad
4.4. Obtención de las nubes de puntos 17

Figura 4.6: Posiciones de cámara utilizadas.

que tienen asociados de las cámaras virtuales especificadas en la Sección 4.3.

Gracias a el mapa de profundidad y los parámetros intrínsecos, podemos obtener la posición


tridimensional de los puntos que conforman la nube. Para ello tendremos que aplicar las
operaciones que se ven en la Figura 4.7, donde d es el valor de profundidad del píxel, u y v
son las coordenadas del píxel dentro de la imagen, C es la posición del centro de la imagen
y F es la distancia focal. Para terminar de crear la nube de puntos utilizaremos la imagen
RGB para asignarle el color correspondiente a cada uno de los puntos.

Figura 4.7: Operaciones para convertir un píxel de una imagen a punto 3D

Una vez se hayan obtenido las nubes de puntos correspondientes es conveniente realizar un
filtrado. En este filtrado se seleccionaron los puntos que forman parte de la nube que no van
a ser relevantes para la reconstrucción. Para el proyecto se han utilizado dos tipos distintos
de filtrados. El primero de los filtros ha sido Statistical Outlier Removal, el cual se centra
en eliminar los puntos que estén más separados de sus vecinos. Esto se consigue marcando
una distancia media y número mínimo de vecinos, es decir, todo aquel punto que no tenga
el mínimo de vecinos o tenga una distancia promedio a sus vecinos mayor que el límite se
elimina. Cuanto mayor sea el número de vecinos y menor sea la distancia límite, este filtro
será más restrictivo. Gracias a este filtro se han conseguido eliminar los puntos dispersos que
se encuentran en la nube y que son claramente fruto de errores de estimación, como podemos
apreciar en la Figura 4.8a. El otro método que hemos utilizado para eliminar puntos ha sido
aplicar un filtro de corte, en el que creamos un volumen delimitador, en nuestro caso en la
18 Desarrollo

zona de la cabeza, para luego eliminar los puntos que se encontraban fuera de estos límites.
El resultado de este filtro se puede ver aplicado en la Figura 4.8b. El haber aplicado estos
filtros ha servido para obtener unas nubes de puntos más limpias, esto se traduce en una
mejor reconstrucción de rostros y en la eliminación del ruido dentro de la reconstrucción.

(a) Statistical Outlier Removal. (b) Filtro de corte.

Figura 4.8: Aplicación de filtros.

4.5 Combinar las nubes de puntos

Cuando hayamos obtenido las diferentes nubes de puntos solo quedará combinarlas entre
ellas para generar la reconstrucción final. El proceso que hemos seguido para unir las nubes
de puntos consta de dos partes. En la primera parte hemos generado la matriz de transfor-
mación correspondientes a cada una de las nubes de puntos y las hemos aplicado. Esta es
una matriz 4x4 con la estructura que se puede ver en la Figura 4.9 y sirve para definir una
serie de rotaciones y traslaciones que se le van aplicar a toda la nube de puntos en base a
los parámetros extrínsecos de la cámara. Utilizamos esta matriz para registrar las nubes de
puntos con respecto al eje de coordenadas establecido con SfM. Esto produce una fusión de
las nubes de puntos aproximada, pero no perfecta, ya que las nubes de puntos son estimadas
y tienen cierto error. La segunda parte del proceso, orientada a mejorar el registro final de
las nubes, consiste en la aplicación de Iterative Closest Points (ICP). Éste es un método ite-
rativo que sirve para para alinear de forma parcial (total en el mejor de los casos) dos nubes
de puntos, como se puede ver en la Figura 4.10. En cada una de las iteraciones de ICP se
emparejan los puntos de la nube origen con los puntos más cercanos de la nube de puntos
de referencia, se estiman las transformaciones (rotación + traslación) haciendo uso de esos
emparejamientos utilizando un enfoque de mínimos cuadrados y se aplica la transformación
sobre la escena. El resultado que se obtiene de aplicar la matriz de transformación y ICP son
dos nubes con todos sus puntos orientados correctamente según su la posición de su cámara.
Para acabar de unir las nubes de puntos tan solo tenemos que acumular sus puntos en una
única nubes.
4.5. Combinar las nubes de puntos 19

Figura 4.9: Matriz de transición.

(a) Sin ICP. (b) Con ICP.

Figura 4.10: Ejemplo de ICP.


5 Experimentacion

En este capítulo se van a explicar todos los experimentos que se han llevado a cabo du-
rante el desarrollo del proyecto. Para cada experimento se explicarán los parámetros se han
utilizado, así como los resultados que se han obtenido.

5.1 Primeras Pruebas

Al ser NeRFies una nueva tecnología se han tenido que realizar una serie de pruebas para
comprobar cómo funcionaba, antes de poder usarla para el proyecto. Para estas primeras
pruebas se utilizó un vídeo en el que no se controló la estética de la escena. Se utilizó la
configuración que NeRFies traía por defecto y se dejó entrenar durante unas 20000 iteraciones.
En la Figura 5.1 se pueden observar los resultados que obtuvimos tras renderizar varias de
las vistas.

Figura 5.1: Resultados de las primeras pruebas

Como se puede observar los resultados son aceptables pero se genera una ligera distorsión
cerca de los ojos. De la misma forma NeRFies coloca las cámara muy bajas debido a la
perspectiva desde donde se ha grabado el vídeo. Cabe recalcar que estos han sido los peores
resultados ya que ha sido la vez que menos hemos dejado que entrene NeRFies. Gracias a
este experimento pudimos deducir que el vídeo o las imágenes que se vayan a utilizar para

21
22 Experimentacion

entrenar deben de estar tomados desde una distancia mayor de 30cm y que si la persona que
se está usando de modelo se mueve (es decir, girar los ojos, mover la nariz, abrir la boca,
etc.) entre cada una de las imágenes generará una distorsión en el resultado.

5.2 Entrenamiento de NeRFies

La siguiente de las pruebas que se realizó consistió en determinar los parámetros óptimos
para obtener modelos de alta calidad. Para ello se probaron diferentes vídeos, en los que se
variaron la cantidad de imágenes utilizadas y el número de iteraciones que entrenaba NeRFies.

El primero de los vídeos que se utilizó tenía una duración de unos 15 segundos del que se
sacaron 80 fotogramas diferentes. Debido al bajo número de imágenes que se tenían no se
pudo entrenar. A partir de esto se utilizaron vídeos de más de 20 segundos de duración para
hacer las próximas pruebas. Los siguientes vídeos que se usaron fueron de 30 y 45 segundos de
los cuales se utilizaron alrededor de 100 fotogramas. Los resultados de ambos vídeos fueron
satisfactorios, como se puede ver en la Figura 5.2, esto nos indica que a partir de las 100
imágenes NeRFies puede conseguir arrojar buenos resultados.

(a) Resultado con 30 segundos. (b) Resultado con 45 segundos.

Figura 5.2: Resultados del experimento del dataset.

Sabiendo ya el número mínimo de imágenes necesarias, se procedió a comprobar cómo


de influyentes eran el número de iteraciones que se dejaba entrenar a NeRFies. Para ello
se entrenó hasta las 10000, 20000 y 50000 iteraciones una escena. Como podemos ver en la
Figura 5.3 cuánto más tiempo se pase la red entrenando nos ofrecerá unos rasgos faciales más
realistas y un mayor detalle en las zonas en las que haya tenido mayor incertidumbre. Viendo
estos resultados es recomendable que se entrene hasta mínimo unas 35000 iteraciones, para
así tener unas facciones realistas.
5.3. Selección de las cámaras 23

Figura 5.3: Resultados del entrenamiento con 10000, 20000 y 50000 respectivamente.

5.3 Selección de las cámaras

Otro de los parámetros con los que se experimentó durante la prácticas fueron las cámaras
que se utilizaron para hacer la reconstrucción. Este experimento fue necesario para poder
determinar el número de cámaras mínimo que son necesarias para que se pueda hacer una
reconstrucción por medio de este método, así como para ver cómo evoluciona la reconstrucción
en función del número de cámaras que se usase.

De partida utilizamos 3 cámaras para hacer la reconstrucción de rostros, dos que apuntan
a los perfiles de la cara y una que apunte directamente a la cara. La reconstrucción realizada
con estas tres cámaras daba unos resultados aceptables pero sufrían de pequeños conflictos
por la parte frontal.

Figura 5.4: Reconstrucción de rostro utilizando 3 cámaras.

Después de esto se pasó a ir aumentando el número de cámaras que se usaban para la


reconstrucción para así saber las cámaras que eran necesarias para tener una buena recons-
trucción de rostros. Tras haber aumentado varias veces las cámaras que se usaban en cada
prueba se comprobó que a partir de las 10 cámaras ya se conseguía unos mejores resultados.
24 Experimentacion

Figura 5.5: Reconstrucción de rostro utilizando 12 cámaras.

5.4 Aplicación de filtros

Tras haber obtenido las nubes de puntos se tuvo que hacer un filtrado de puntos para
poder tener así una imagen más clara del rostro. Para esto se necesitaron dos tipos de filtros
diferentes, el primero de ellos tenía que eliminar los puntos que se encontraban dispersos
dentro de la nube de puntos, y otro que nos sirviera para eliminar todo el contenido de la
escena que no fuese relevante.

Los métodos de filtrado con los que se experimentó para eliminar los puntos dispersos
fueron, Radius Outlier Removal, el cual elimina los puntos que no alcancen a tener un número
n de vecinos en un determinado radio, y Statistical Outlier Remove que elimina los puntos
que no tienen vecinos a partir de cierta distancia. Debido a los mejores resultados obtenidos
se optó por utilizar Statistical Outlier Remove para la eliminación de los puntos dispersos.
Para ello se utilizo un numero mínimo de vecinos de 30 a una distancia de 2 unidades del
sistema de coordenadas, el resultado se puede ver en la Figura 5.6.

(b) Nube de puntos tras aplicar Static


(a) Nube de puntos sin aplicar filtros Outlier Remove.

Figura 5.6: Ejemplo de eliminación de los puntos intermedios.


5.4. Aplicación de filtros 25

Para obtener la sección de la cabeza de la nube de puntos utilizamos una función de corte
para nube de puntos que venía incluida en Open3D, en la que poniendo las coordenadas de
una sección se realizaba un corte alrededor de ese área. Según el sistema de coordenadas se
creo un bounding box con unos valores mínimos de (-9, -9, 0) y (9, 0.000007, 0.000272), esto
nos dio como resultado lo que aparece en la Figura 5.7

Figura 5.7: Ejemplo de recorte de de una nube de puntos.


6 Conclusiones

Para concluir, en este apartado vamos a hacer un breve repaso sobre lo que hemos desa-
rrollado a lo largo de todo el proyecto. También se van a comentar algunas posibles futuras
mejoras o cambios que se pueden hacer a futuro.

Estos son algunos de los objetivos que hemos conseguido alcanzar durante la práctica:

• Se ha conseguido entender y adaptar una nueva herramienta del campo del Deep Lear-
ning como es NeRFies.

• Se ha aprendido a analizar y adaptar un dataset con el fin de que consiga sacar los
mejores resultados posibles.

• Se ha aprendido a analizar los resultados para así poder implementar mejoras en la


arquitectura del proyecto.

• Se han adquirido conocimientos sobre los campos del renderizado por ordenador y las
nubes de puntos.

• Se ha aprendido a utilizar con soltura Google Colaboratory y las librerías de Open3D


y Ploty.

Por otro lado las posibles mejoras que se pueden llevar a cabo de cara al futuro en relación
con este proyecto son:

• Se podría añadir una red neuronal que ayude a combinar de mejor forma las nubes de
puntos, ya que los métodos utilizados en este proyecto han dejado resultados no muy
buenos.

• Realizar un estudio sobre los embeddings que utiliza nerfies para así optimizarlos.

27
Bibliografía

Alejo-Combarro, A., Larin-Fonseca, R., y Méndez-Vázquez, H. (s.f.). Reconstrucción de


modelos faciales 3d a partir de imágenes bi-dimensionales.

COLMAP. (2021). Colmap. https://colmap.github.io/tutorial.html. ([Online; accessed 26-


Mayo-2021])

Dellaert, F. (2021). Nerf explosion 2020. https://dellaert.github.io/NeRF/. ([Online;


accessed 25-Mayo-2021])

Google. (2021a). Google drive. https://www.google.com/intl/es_es/drive/. ([Online; acces-


sed 25-Mayo-2021])

Google. (2021b). ¿qué es colaboratory? https://colab.research.google.com/notebooks/


intro.ipynb. ([Online; accessed 25-Mayo-2021])

Martin-Brualla, R., Radwan, N., Sajjadi, M. S., Barron, J. T., Dosovitskiy, A., y Duckworth,
D. (2020). Nerf in the wild: Neural radiance fields for unconstrained photo collections.
arXiv preprint arXiv:2008.02268.

Mildenhall, B., Srinivasan, P. P., Tancik, M., Barron, J. T., Ramamoorthi, R., y Ng, R.
(2020). Nerf: Representing scenes as neural radiance fields for view synthesis. En European
conference on computer vision (pp. 405–421).

Online, H. S. G. (2021). Structure from motion (sfm).


https://gsp.humboldt.edu/OLM/Courses/GSP_216_Online/lesson8-2/SfM.html. ([Onli-
ne; accessed 31-Mayo-2021])

Open3D. (2021a). Open3d. http://www.open3d.org/. ([Online; accessed 25-Mayo-2021])

Open3D. (2021b). open3d.feometry.pointcloud. http://www.open3d.org/docs/release/python_api/open3d.ge


([Online; accessed 25-Mayo-2021])

Park, K., Sinha, U., Barron, J. T., Bouaziz, S., Goldman, D. B., Seitz, S. M., y Brualla, R.-M.
(2020). Deformable neural radiance fields. arXiv preprint arXiv:2011.12948.

Ploty. (2021). Ploty. https://plotly.com/. ([Online; accessed 25-Mayo-2021])

Rybkin, O. (2021). The reasonable ineffectiveness of pixel metrics for future pre-
diction. https://medium.com/@olegrybkin_20684/the-reasonable-ineffectiveness-of-mse-
pixel-loss-for-future-prediction-and-what-to-do-about-it-4dca8152355d. ([Online; accessed
30-Mayo-2021])

29
30 Bibliografía

San Tan, J., Venkat, I., Liao, I. Y., De Wilde, P., y Broga, J. (2016). General human traits
oriented generic elastic model for 3d face reconstruction. En Bmvc.

Tomás-Jover, R., Guill, A. J. R., González, M. C., Fernández, A. A., y Jordá, L. (2016).
Structure from motion (sfm): una técnica fotogramétrica de bajo coste para la caracte-
rización y monitoreo de macizos rocosos. En Reconocimiento, tratamiento y mejora del
terreno: 10º simposio nacional de ingeniería geotécnica: A coruña, 19, 20 y 21 de octubre
de 2016 (pp. 209–216).

yodayoda. (2021). From depth map to point cloudfrom depth map to point cloud.
https://medium.com/yodayoda/from-depth-map-to-point-cloud-7473721d3f. ([Online; ac-
cessed 27-Mayo-2021])
Lista de Acrónimos y Abreviaturas

3DMFM 3D Morphable Face Model.


3DMSM 3D Morphable Face Shape Model.
ICP Iterative Closest Points.
NeRF Neural Radiance Fields.
NeRF-W NeRF in the wild.
NeRFies Deformable Neural Radiance Fields.
SfM Structure-from-motion.

31

También podría gustarte