Descarga las dos carpetas de datos de entrenamiento y prueba: https://sadami.ddns.net/nextcloud/s/ProyectoCGNN
José Miguel Medina Pérez.
Nota: Se recomienda usar un tema obscuro para visualizar este cuaderno
En este trabajo se presenta la implementación de una red neuronal para la segmentación de vértices en una mall 3D usando pytorch, definiendo una capa personalizada con la operación de convolución en grafos descrita en el artículo: Semi-supervised Classification with Graph Convolutional Networks disponible en: https://arxiv.org/abs/1609.02907
Uno de los usos frecuentes del deep learning en grafos es el procesamiento de objetos tridimensionales basados en polígonos (mallas o superficies 3D), en este proyecto se presenta un caso particular en el cual los datos de entrada corresponden a objetos poligonales que modelan piezas de juguetes de construcción, en donde cada vértice pertenece a una de dos clases posibles: Stud (1) y No Stud (0), en donde los vértices "Stud" son aquellos que pertenecen a una estructura cilíndrica que permite que las piezas se interconecten entre sí.
En la figura 2.1 se puede observar un ejemplo con una pieza básica, los nodos Stud están marcados con verde y los No Stud con Magenta.
Figura 2.1- Superficie poligonal / nodos: Stud (verde) nodos: No Stud (magenta)De esta manera, se puede encontrar de manera directa una representación del objeto mediante un grafo, en el cual cada nodo representa un vértice del objeto poligonal y cada arista representa una arista del objeto poligonal. Adicionalmente los nodos pueden contener información mediante una función
Los objetos poligonales para formar la base de datos fueron descargados del sitio <www.mecabricks.com> y posteriormente procesados usando el software de animación Cinema 4D para obtener una única malla por cada pieza, ya que los archivos orginiales contienen distintas "islas de polígonos", es decir, multiples mallas poligonales forman parte del mismo objeto. La diferencia entre las piezas procesadas y no procesadas se puede observar en la figura 2.2.
Figura 2.3 Objeto original con cuatro islas poligonales/ malla procesada (todos los polígonos forman parte del mismo objeto)Teniendo esto en mente, todas las mallas procesadas en el conjunto de datos cuentan con las mismas características:
- No contienen islas poligonales ni aristas, puntos o polígonos aislados.
- Están compuestas por triángulos (son mallas triangulares).
En la figura 2.3 se muestran 8 piezas cuya malla ha sido procesada y etiquetada, es importante observar que losvértices etiquetados como Stud (los puntos verdes) son muy similares a otras estructuras cilíndricas que no corresponden a esa misma clase, y la diferencia principal es cómo se relacionan con el resto de vértices de la misma pieza.
Figura 2.3 - Mallas procesadas y etiquetadas en dos clasesSe obtuvieron y procesaron 237 piezas diferentes, de las cuales se generaron 5 archivos por cada una de ellas con formato 'csv' con la siguiente información:
- Nombre_edges.csv: Contiene todas las aristas del grafo, una en cada fila.
- Nombre_features.csv: Contiene las características de cada nodo (vértice) en donde cada columna es un nodo y cada fila es una característica.
- Nombre_target.csv: Contiene la etiqueta de cada nodo, en donde cada columna es un nodo.
- Nombre_coords.csv: Contiene las coordenadas de cada vértice, en donde el número de fila representa el id del vértice.
En este caso, se consideraron
- Curvatura Gaussiana
- Ángulo de apertura de los vecinos (normalizado con el módulo)
- Ángulo de apertura de los vecinos (normalizado con el máximo)
- Relación entre el vecino más cercano y el más lejano
- Distancia normalizada al centro de masa
- Ángulo promedio al vector normal unitario
- La desviación estándar normalizada de la distancia a los vecinos
- La relación entre el tamaño del perímetro de los vecinos y la máxima distancia a uno de ellos
- El promedio de la proyección del vector normal de polígonos vecinos al centro de masa
La curvatura gaussiana
En donde el ángulo de apertura
y el área
En donde
La curvatura Gaussiana representa la forma que tiene la superficie alrededor del vértice
Nótese que este valor depende de la escala de la malla (según el área de los triángulos), por lo que no es una propiedad invarainte a la escala, sin embargo, para evitar la variabilidad entre polígonos grandes y pequeños, se puede considerar únicamente el signo. Para ello se asigna un valor de
fuente: http://rodolphe-vaillant.fr/entry/33/curvature-of-a-triangle-mesh-definition-and-computation
El ángulo de paertura previamente definido es útil para concer el aspecto que tienen los triángulos adyacentes al vértice
-
Usando el operador "Móulo":
$$O_i = 2\pi - mod(\sum_{j\in\mathcal{N}(i)}\theta_j,\pi)$$ Es una manera de saber cuántos grados hacen falta para completar una vuelta de 360° usando todos los ángulos de apertura, y reiniciando a cero cad vez que una vuelta es completada. Para normalizar de$0$ a$1$ se puede dividir entre$2\pi$ , por lo que el rango de esta característica es$\mathbf{0 <= f_2(i) <= 1}$ . -
Usando el ángulo de apertura máximo y el número de triángulos vecinos: $$ \hat{O_i} = \frac{\sum_{j\in\mathcal{N}(i)}\theta_j }{|\mathcal{N}(i)|\pi} $$ Considerando que un triángulo con área cero y puntos colineales puede tener un ángulo de apertura máximo de
$\pi$ , y hay$|\mathcal{N}(i)|$ triángulos en el vecindario$\mathcal{N}(i)$ , esta característica tiene un rango de$\mathbf{0 <= f_3(i) <= 1}$ .
El rango de distancia normalizada del vecindario es la diferencia entre la distancia mínima y la máxima de un vecino
En donde
Cuando la distancia mínima y la máxima son la misma
El centro de masa (o centroide) puede ser interpretado como el promedio de los valores de los vértices en el vecindario
El centroide se puede calcular como:
Y la distancia (
Este valor por sí mismo no es invariante a la escala, ya que crece proporcionalmente al objeto, sin embargo,puede ser normalizada dividiendo entre la distancia máxima a un vecino:
Por lo que el rango de esta característica es
Otra característica importante que proporciona información sobre la "planitud" de la superficie alrededor del vértice
Este ángulo está definido como:
En donde
Esta característica tiene un rango de
Usando el vector de distancias previamente calculado para la característica
Para normalizar este valor, se divide entre la distancia máxima:
Por lo que el rango que puede tomar esta característica es de
La penúltima característica cnosiderada es la relación que existe entre la suma de las distancias entre vecinos adyacentes (perímetro
Esta relación se define como:
Dado que está normalizada, esta característica tiene un rango de
Finalmente, la última característica representa la orientación local del vértice
en donde
La información más relevante de esta característica es el signo del valor
Las
Característica | Rango | Rotación | Traslación | Escala |
---|---|---|---|---|
|
sí | sí | sí (usando el signo) | |
|
sí | sí | sí (modulo norm) | |
|
sí | sí | sí (max norm) | |
|
sí | sí | sí | |
|
sí | sí | sí (max norm) | |
|
sí | sí | sí | |
|
sí | sí | sí (max-min norm) | |
|
sí | sí | sí | |
|
sí | sí | sí |
Para la implementación de la red neurona el necesario iportar los datos en forma de grafo, para ello el primer paso es definir un objeto personalizado Graph para guardar cada grafo como un objeto independiente con el nombre y ruta de los archivos de origen, los parámetros iniciales para definirlo son las características de los nodos, la lista de aristas y las etiquetas del grafo:
- x: Características del nodo
$N \times F$
- edge_index: Lista de aristas
$2\times E$
- y: Etiqueta del nodo (una etiqueta por nodo de manera predeterminada)
$N \times C$
En donde:
-
$N$ Es el número de nodos, en este caso varía según la pieza -
$F$ Es el número de características (Features), en este caso son$9$ -
$E$ Es el número de aristas (Edges), varía según la pieza -
$C$ Es el número de clases/etiquetas, en este caso una varaible representa dos clases
El objeto internamente genera la matríz de adyacencia normalizada usando la información de conectividad de la lista de aristas, siguiendo la siguiente ecuación:
Para añadir la información del punto de origen y no solo de los vecinos, es útil agregar auto-conecciones (ciclos) a cada vértice mediante la suma de la matríz identidad. Cabe mencionar que esta matríz puede ser sustituída por cualquier otra que represente la misma información, como el laplaciano o el laplaciano normalizado.
Una vez que el objeto de tipo grafo está definido, se cargan las piezas desde los archivos .csv en una lista llamada dataset. Para tener una referencia de cómo se ven los datos, se pueden graficar los vértices y las aristas que los conectan, asignando el color de cada vértice según la etiqueta (Stud o No Stud) o tres de sus características; para ello se define una función que recibe el objeto de tipo grafo y como parámetros opcionales una predicción para comparar una vez que se ponga a prueba el modelo y una lista de índices para el color del punto según las características de cada vértice. (Ver el Notebook)
Una vez cargados los grafos, se hace un split para crear dos conjuntos de datos, uno para el entrenamiento (training dataset) y otro para la validación (validation dataset), en una proporciona de 80% y 20% respectivamente. El vector de índices se almacena para posteriormente pueda ser usado como referencia para verificar el desempeño del modelo al hacer predicciones.
Posteriormente, con los conjuntos de datos de entrenamiento y de validación se procede a definir la estructura del modelo. Para ello se define en primer lugar el tipo de capa a usar, que es una capa convolucional de grafos, que hereda de un torch Module y realiza la siguiente operación:
En donde
De manera que, para la primera capa
Con el tipo de capa definido se pueden definir distintos modelos variando tanto el número de capas
Finalmente, a la salida se aplica un clasificador lineal con dos salidas, correspondientes a las clases Stud
Se define el método de optimización y la función de pérdida, en este caso se optó por el método de momento adaptativo y la función de pérdida de entropía cruzada. Posteriormente se define la etapa de entrenamiento y la etapa validación, para verificar el desempeño del modelo en cada época se usa la función de balanced accuracy, ya que el dataset cuenta con una relación 35 - 65, y el accuracy clásico estaría sesgado.
Finalmente se entrena el modelo y se almacena el que tenga un mejor desempeño, para ello se llama a la función
Repitiendo el proceso a partir del split del conjunto de datos se obtienen modelos diferentes que llegan a un accuracy superior a 90%, sin embargo, esto no garantiza un mejor desempeño del modelo en el conjunto de prueba. En la siguientes imágenes se comparan tres modelos con accuracy de 95%, 96% y 98% respectivamente:
Figura 2.4 - Piezas del conjunto de prueba evaluada en modelos con 95, 96 y 98% de accuracy respectivamente