Utilice PyTorch para generar modelos 3D
Este artículo presentará cómo utilizar PyTorch y PolyGen para generar modelos 3D utilizando tecnología de aprendizaje profundo.
Existe un campo emergente de investigación sobre aprendizaje profundo centrado en la aplicación de técnicas de aprendizaje profundo a aplicaciones de geometría 3D y gráficos por ordenador, como lo demuestra este conjunto de estudios a largo plazo. Para los usuarios de PyTorch que quieran probar el aprendizaje profundo 3D por sí mismos, vale la pena probar la biblioteca Kaolin. Para los usuarios de TensorFlow, también existen TensorFlow Graphics. La generación de modelos 3D es un subcampo particularmente popular. La combinación creativa de modelos 3D, la generación rápida de modelos 3D a partir de imágenes y la creación de datos sintéticos para otras aplicaciones y simulaciones de aprendizaje automático son solo algunos de los innumerables casos de uso de la generación de modelos 3D.
Sin embargo, en la investigación de aprendizaje profundo 3D, elegir la representación adecuada para sus datos es la mitad de la batalla. En visión por computadora, la estructura de los datos es muy simple: una imagen consta de píxeles densos dispuestos ordenadamente en una cuadrícula precisa. Los modelos 3D se pueden representar como vóxeles, nubes de puntos, mallas, conjuntos de imágenes multivista, etc. Cada representación de entrada tiene sus propios inconvenientes. Por ejemplo, los vóxeles, aunque son costosos desde el punto de vista computacional, tienen una resolución de salida baja. Las nubes de puntos no tienen el concepto de codificar superficies o sus normales, por lo que la topología no se puede inferir únicamente a partir de las nubes de puntos. Una malla tampoco codifica de forma única la topología, ya que cualquier malla se puede subdividir para producir superficies similares. PolyGen es un modelo generativo neuronal de mallas que estima conjuntamente las caras y vértices de un modelo para generar mallas directamente.
El ahora clásico artículo de PointNet proporcionó un modelo para modelar datos de nubes de puntos, como los vértices de un modelo tridimensional. Es un algoritmo general y no modela las caras ni las huellas de un modelo 3D, por lo que no se puede generar una malla impermeable única utilizando PointNet únicamente. 3D-R2N2 adopta un enfoque de vóxel que extiende la familiar convolución 2D a 3D y genera naturalmente mallas impermeables a partir de imágenes RGB. Sin embargo, a altas resoluciones espaciales, la representación de vóxeles es computacionalmente costosa, lo que limita efectivamente el tamaño de la cuadrícula que puede generar.
Pixel2Mesh puede predecir los vértices y caras de un modelo 3D a partir de una única imagen deformando una malla de plantilla (normalmente un elipsoide). El modelo de destino debe ser concéntrico con la malla de la plantilla, por lo que el uso de una malla de plantilla convexa (como un elipsoide) producirá muchas superficies falsas en objetos muy no convexos (como sillas y lámparas). La Red de Modificación de Topología (TMN) itera en Pixel2Mesh introduciendo dos nuevas etapas: la etapa de modificación de topología se usa para podar la máscara que aumenta el error de reconstrucción del modelo, mientras que la etapa de refinamiento de límites se usa para suavizar los límites irregulares introducidos al podar la máscara. . Si está interesado, le recomiendo que consulte AtlasNet y la predicción jerárquica de superficies.
Si bien el método común de deformar y refinar la malla de la plantilla funciona bien, comienza con suposiciones clave sobre la topología del modelo. En esencia, un modelo 3D es solo un conjunto de vértices en el espacio 3D, unidos por una sola faceta. ¿Es posible evitar la representación intermedia y predecir directamente estos vértices y caras?
PolyGen adopta un enfoque bastante singular para la tarea de generación de modelos al representar modelos 3D como secuencias estrictamente ordenadas de vértices y caras, en lugar de imágenes, vóxeles o nubes de puntos. Este orden estricto les permitió aplicar métodos de modelado de secuencias basados en la atención para generar mallas 3D, de forma muy similar a como los modelos BERT o GPT generan texto.
El objetivo general de PolyGen es doble: primero generar un conjunto razonable de vértices para un modelo 3D (tal vez condicionado a imágenes, vóxeles o etiquetas de clase) y luego generar una secuencia de caras, una tras otro. Los vértices están conectados entre sí y proporcionan una superficie razonable para el modelo.
El modelo combinado representa la distribución p(M) en la malla como una distribución conjunta entre dos modelos: el modelo de vértice p(V) representa los vértices y el modelo de cara p(F|V) representa las caras condicionadas a los vértices.
Un modelo de vértice es un decodificador que intenta predecir el siguiente token en una secuencia basándose en el token anterior (imagen opcional, campo de vóxel o etiqueta de clase). El modelo de superficie consta de una red de punteros codificador y decodificador. La red de punteros decodificador representa la distribución de secuencias de vértices. La red de punteros "selecciona" efectivamente un vértice a la vez para agregarlo a la secuencia actual y construir las caras del modelo. El modelo está condicionado a la secuencia anterior de caras y a toda la secuencia de vértices. Dado que la arquitectura PolyGen es bastante compleja y se basa en múltiples conceptos, este artículo se limitará al modelado de vértices.
Cada modelo del popular conjunto de datos ShapeNetCore se puede representar como una colección de vértices y caras. Cada vértice consta de una coordenada (x, y, z) que describe un punto en la cuadrícula tridimensional. Cada cara es una lista de índices que apuntan a los vértices que forman las esquinas de la cara. Para caras triangulares, la lista tiene 3 índices. Para polígonos de n lados, la longitud de la lista es variable. El conjunto de datos original es bastante grande, por lo que para ahorrar tiempo le proporciono aquí un subconjunto más pequeño del conjunto de datos preprocesado para que pueda experimentar. Este subconjunto contiene solo modelos de 5 categorías de formas y tiene menos de 800 vértices después de la conversión a formas de n lados (que se describe a continuación).
Para que los métodos de modelado de secuencias funcionen, los datos deben representarse de forma restringida y determinista para eliminar la mayor variabilidad posible. Con este fin, los autores hicieron algunas simplificaciones al conjunto de datos. Primero, convirtieron todos los modelos de entrada de triángulos (caras que conectan 3 vértices) a n-gonos (caras que conectan n vértices) y fusionaron las caras usando el modificador Extracción de planos de Blender. Esto permite una representación más compacta de la misma topología y reduce la ambigüedad en la triangulación, ya que las mallas grandes no siempre tienen triangulaciones únicas. Debido a limitaciones de espacio, no discutiré las secuencias de comandos de Blender en este artículo, pero hay muchos recursos, incluida la documentación oficial y este excelente conjunto de ejemplos en GitHub, que cubren bien el tema. El conjunto de datos que proporciono está preextraído.
Para continuar, descargue este archivo cube.obj de muestra. El modelo es un cubo básico con 8 vértices y 6 caras. El siguiente fragmento de código simple leerá todos los vértices de un único archivo .obj.
En segundo lugar, los vértices se ordenan en orden ascendente primero por el eje Z (eje vertical en este caso), luego por el eje Y y finalmente por el eje X. De esta forma, los vértices del modelo se representan de abajo hacia arriba. En un modelo PolyGen normal, los vértices están conectados en un vector de secuencia unidimensional, que puede ser muy largo para modelos más grandes. Los autores describen algunas de las modificaciones realizadas para reducir esta carga en el Apéndice E del artículo.
Para ordenar una secuencia de vértices, podemos utilizar la clasificación por diccionario. Esta es la misma forma en que se clasifican las palabras en un diccionario. Para ordenar dos palabras, miras la primera letra, si las dos letras son iguales, miras la segunda letra, y así sucesivamente. Para las palabras "aardvark" y "apple", las primeras letras son "a" y "a", así que vamos a las segundas letras "a" y "p" para decir "aardvark" antes de "apple", " oso hormiguero" antes de "oso hormiguero". En este caso, nuestras "letras" son simplemente coordenadas z, y y x consecutivas.
Finalmente, las coordenadas de los vértices se normalizan y luego se cuantifican para convertirlas en valores discretos de 8 bits. Este enfoque ha sido utilizado por Pixel Recurrent Neural Networks y WaveNet para el modelado de señales de audio, lo que les permite imponer distribuciones categóricas en los valores de los vértices.
En el artículo original de WaveNet, los autores comentaron: "La distribución categórica es más flexible y puede modelar más fácilmente distribuciones arbitrarias porque no hace suposiciones sobre la forma de la distribución. Esta propiedad es importante para modelar dependencias complejas, como simetrías entre vértices". en un modelo 3D
El modelo de vértice consta de una red de decodificador con todas las características estándar del modelo de transformador: incrustación de entrada, apilamiento de 18 capas de decodificador de transformador, normalización de capas y, finalmente, una distribución softmax representada sobre todo. posibles tokens de secuencia
A diferencia de LSTM, el modelo de transformador es capaz de procesar la entrada de secuencia de manera paralela y al mismo tiempo permite que una parte de la secuencia sea utilizada por otra parte. Todo esto es gracias a. su módulo de atención. Los vértices de un modelo 3D contienen dependencias complejas entre varias simetrías y puntos lejanos. Por ejemplo, en una mesa típica, las diagonales del modelo son imágenes especulares entre sí. patrones a modelar.
La incrustación de capas es una técnica comúnmente utilizada en el modelado de secuencias para convertir un número limitado de tokens en un conjunto de características. En el modelado de lenguajes, las palabras "país" y "nación" pueden tener muchos significados. significados similares pero están lejos de la palabra "manzana". Cuando las palabras se representan mediante tokens únicos, no existe ningún concepto de similitud o diferencia inherente. Las capas de incrustación convierten estos marcadores en representaciones vectoriales para construir modelos de distancia significativos. > PolyGen usa tres tipos de capas de incrustación para los vértices. Se usa para indicar si la etiqueta de entrada es una coordenada x, yoz; el valor se usa para indicar el valor de la etiqueta y se usa para codificar el orden de los vértices. Cada capa pasará una información sobre la etiqueta al modelo porque nuestros vértices solo se ingresan uno a la vez, por lo que la incrustación de coordenadas proporciona la información de coordenadas básica para que el modelo sepa el tipo de coordenada que corresponde. valor dado.
La incrustación de valores funciona en los vértices cuantificados que creamos anteriormente. Los valores también están codificados. También necesitamos algunos puntos de control de secuencia: marcadores de inicio y parada adicionales. marque el inicio y el final de la secuencia respectivamente y rellene los marcadores hasta la longitud máxima de la secuencia
debido a la paralelización. La información posicional perdida para una posición de secuencia determinada n también se recupera mediante incrustación posicional. Para utilizar la codificación posicional, que es una representación de forma cerrada sin aprendizaje, en el artículo clásico "Attention Is All You Need" de Transformer, los autores desarrollaron una codificación posicional que consta de funciones seno y coseno que determinaron experimentalmente. Esa incrustación posicional funciona tan bien como la codificación posicional, pero la codificación tiene la ventaja de ser más larga que las secuencias encontradas en el entrenamiento. Para obtener una excelente explicación visual, consulte esta publicación de blog
Después de generar todas estas secuencias de tokens. , lo último que debe hacer es crear algunas capas de incrustación y combinarlas. Cada capa de incrustación necesita conocer el tamaño del diccionario de entrada requerido y las dimensiones de incrustación de la salida. La dimensión de incrustación de cada capa es 256, lo que significa que podemos combinarlas de forma aditiva. El tamaño del diccionario depende de la cantidad de valores únicos ingresados. Para la incrustación de valores, es el número de valores cuantificados más el número de etiquetas de control. Para la incrustación de coordenadas, hay una para cada una de las coordenadas x, y y z, pero ninguna para ninguna de las coordenadas anteriores (marcadores de control). Finalmente, la incrustación posicional toma uno para cada posición posible o longitud máxima de secuencia.
PolyGen también hace un uso extensivo de máscaras de predicción no válidas para garantizar que las secuencias de vértices y caras que genera codifiquen modelos 3D válidos. Por ejemplo, se deben aplicar reglas como "la coordenada z no cae" y "los marcadores de parada solo pueden aparecer después de los vértices completos (tres veces los marcadores z, y y x)" para evitar que el modelo genere una malla no válida. Los autores proporcionan una lista extensa de máscaras que utilizaron en el Apéndice F del artículo. Estas restricciones sólo se aplican en el momento de la predicción, ya que en realidad pueden perjudicar el rendimiento del entrenamiento.
Como muchos modelos de pronóstico de secuencia, este modelo es un modelo autorregresivo, lo que significa que la salida en un paso de tiempo determinado es una distribución de valores posibles en el siguiente paso de tiempo. La secuencia completa se predice un token a la vez, y en cada paso el modelo mira todos los tokens de los pasos anteriores para seleccionar el siguiente token. La estrategia de decodificación determina cómo seleccionar el siguiente token de esta distribución.
Si se utilizan estrategias de decodificación subóptimas, los modelos generativos a veces pueden quedarse atascados en bucles repetitivos o generar secuencias de mala calidad. Todos hemos visto texto generado que parece una mierda. PolyGen utiliza una estrategia de decodificación llamada muestreo de kernel para generar secuencias de alta calidad. El artículo original aplicó este enfoque a la generación de texto, pero también se puede aplicar a los vértices. La premisa es simple: en la distribución máxima suave****, solo se seleccionará aleatoriamente el siguiente token con una masa de probabilidad que alcance el máximo p. Esto se aplica en el momento de la inferencia para generar mallas evitando la degradación de la secuencia. Consulte esta esencia para conocer la implementación de PyTorch del muestreo del kernel.
Además de la generación de modelos incondicionales, PolyGen admite el condicionamiento de entradas mediante etiquetas de clases, imágenes y vóxeles. Estos pueden guiar la generación de mallas con un tipo, apariencia o forma específica. Las etiquetas de clase se proyectan mediante incrustaciones y luego se agregan después de la capa de autoatención de cada bloque de atención. Para imágenes y vóxeles, el codificador crea un conjunto de incrustaciones que luego se utilizan para la atención cruzada con el decodificador de transformación.
El modelo PolyGen describe un marco potente, eficiente y flexible para la generación de mallas 3D condicionales. La generación de secuencias se puede realizar bajo una variedad de condiciones y tipos de entrada, desde imágenes hasta vóxeles, etiquetas de clase simples o incluso simplemente una etiqueta inicial. El modelo de vértices que representa la distribución de los vértices de la malla es sólo una pieza del rompecabezas de la distribución conjunta. Planeo cubrir modelos faciales en un artículo futuro. Mientras tanto, te animo a que consultes la implementación de TensorFlow de DeepMind e intentes generar modelos condicionales.
Enlace original:/blog/polygen-3d-models/