PyTorch genera modelos 3D.
Existe un nuevo campo de investigación sobre aprendizaje profundo centrado en la aplicación de la tecnología DL a aplicaciones de geometría 3D y gráficos por ordenador. Esta colección de investigaciones a largo plazo lo demuestra. Para los usuarios de PyTorch que quieran probar el aprendizaje profundo 3D, vale la pena investigar la biblioteca kaolin. Para los usuarios de TensorFlow, existen TensorFlow Graphs. Un subcampo particularmente popular es la generación de modelos 3D. Las combinaciones creativas 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 el campo de la investigación del 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 de manera ordenada y uniforme en una cuadrícula precisa. No existe tal coherencia en el mundo de los datos 3D. Los modelos 3D se pueden representar como vóxeles, nubes de puntos, mallas, conjuntos de imágenes de múltiples vistas y más. Estas representaciones de entrada también tienen sus propios inconvenientes. Por ejemplo, aunque el coste computacional de los vóxeles es alto, la resolución de salida es muy baja. Las nubes de puntos no codifican el concepto de superficie o sus normales, por lo que no es posible inferir de forma única la topología a partir de las nubes de puntos únicamente. La 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 para mallas que estima conjuntamente las caras y vértices del modelo para generar mallas directamente. La implementación oficial está disponible en DeepMind GitHub.
El ahora clásico documento de red de puntos proporciona un modelo para el modelado de datos de nubes de puntos, como los vértices de un modelo tridimensional. Es un algoritmo general y no modela la superficie ni la ocupación del modelo 3D, por lo que PointNet por sí solo no puede generar una malla impermeable única. El método vóxel utilizado por 3D-R2N2 extiende la familiar convolución 2D a 3D, generando de forma natural mallas impermeables a partir de imágenes RGB. Sin embargo, a resoluciones espaciales más altas, la representación de vóxeles es muy costosa desde el punto de vista computacional, lo que efectivamente limita el tamaño de la malla 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 homeomorfo a la malla de plantilla, por lo que el uso de una malla de plantilla convexa (como un elipsoide) introducirá muchas caras falsas en objetos muy no convexos, como sillas y lámparas. Topology Modification Network (TMN) itera Pixel2Mesh al introducir dos nuevas etapas: una etapa de modificación de la topología para podar superficies erróneas que aumentan el error de reconstrucción del modelo y una etapa de refinamiento de límites para suavizar los límites irregulares introducidos por la poda de superficies. Si está interesado, le recomiendo que vea AtlasNet y Hierarchical Surface Prediction.
Si bien los métodos comunes para deformar y refinar mallas de plantilla funcionan bien, todos parten de suposiciones primarias sobre la topología del modelo. En esencia, un modelo 3D es simplemente un conjunto de vértices en el espacio 3D que están agrupados y conectados por varias caras. ¿Podemos evitar la representación intermedia y predecir directamente estos vértices y caras?
PolyGen adopta un enfoque bastante único para la tarea de generación de modelos, representando 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 parecida a como lo hacen los modelos BERT o GPT para el texto.
PolyGen tiene dos objetivos generales: primero, generar un conjunto razonable de vértices para un modelo 3D (quizás basado en imágenes, vóxeles o etiquetas de clase) y luego generar una secuencia de caras que conecten los vértices. tras otro juntos para proporcionar una superficie razonable para el modelo. El modelo combinado representa la distribución p(M) en la malla como una distribución conjunta de dos modelos: el modelo de vértice p(V) representa el vértice y el modelo de superficie p(F|V) representa la superficie condicionada en el vértice.
Un modelo de vértice es un decodificador que intenta predecir el siguiente token en una secuencia condicionada al token anterior (y opcionalmente condicionada a la imagen, campo de vóxel o etiqueta de clase). El modelo de cara consta de una red de punteros codificador y decodificador, que representa la distribución en una secuencia de vértices. Las redes de punteros "seleccionan" efectivamente un vértice a la vez para agregarlo a la secuencia anterior y construir el modelo.
El modelo se basa en la secuencia anterior de caras y en toda la secuencia de vértices. Debido a que la arquitectura PolyGen es bastante compleja y se basa en varios conceptos, este artículo se limitará a los modelos de vértices.
Cada modelo del popular conjunto de datos ShapeNetCore se puede representar como un conjunto de vértices y caras. Cada vértice consta de una coordenada (x, y, z) que describe un punto en la malla 3D. Cada cara es una lista de índices que apuntan a los vértices de las esquinas que forman la cara. Para caras triangulares, esta lista tiene 3 índices. Para N caras, la longitud de esta lista es variable. El conjunto de datos original es bastante grande, por lo que, para ahorrar tiempo, proporciono aquí un subconjunto más ligero del conjunto de datos preprocesado para que pueda experimentar. Este subconjunto contiene solo modelos de las cinco categorías de formas y tiene menos de 800 vértices después de la conversión a N-polígonos (que se describe a continuación).
Para que los métodos de modelado de secuencias funcionen, los datos deben expresarse de forma restringida y determinista para eliminar la mayor variabilidad posible. Para ello, los autores simplificaron el conjunto de datos. Primero, convirtieron todos los modelos de entrada de triángulos (caras que conectan tres vértices) a N-polígonos (caras que conectan N vértices) y fusionaron las caras con el modificador Plane Extract de Blender. Esto proporciona 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. Por razones de espacio, este artículo no discutirá las secuencias de comandos de Blender, 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 proporcioné se extrajo de antemano.
Para continuar, descargue este archivo cube.obj de muestra. Este modelo es un cubo básico con 8 vértices y 6 caras. El fragmento de código simple que aparece a continuación proviene de un único. archivo obj.
En segundo lugar, los vértices se ordenan en orden ascendente comenzando desde el eje z (el eje vertical en este caso), luego el eje y y finalmente el eje x. De esta forma, los vértices del modelo se representan de abajo hacia arriba. En los modelos poligonales ordinarios, los vértices están conectados en una secuencia unidimensional de vectores. Para modelos más grandes, este vector terminará como un vector de secuencia muy larga. Los autores describen algunas modificaciones 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. Esto es lo mismo que ordenar palabras en un diccionario. Para ordenar dos palabras, mirarías la primera letra, luego la segunda letra para ver si hay un empate, y así sucesivamente. Para las palabras "aardvark" y "apple", las primeras letras son "a" y "a", así que pasamos a las segundas letras "a" y "p" para decirme "aardvark" antes de "Apple". En este caso, nuestras "letras" son las coordenadas z, y, x en ese orden.
Finalmente, las coordenadas de los vértices se normalizan y luego se cuantifican para convertirlas en valores discretos de 8 bits. Este enfoque se ha utilizado para modelar señales de audio en redes neuronales recurrentes de píxeles y WaveNet, lo que les permite aplicar distribuciones categóricas a valores de vértice. En el artículo original de WaveNet, los autores comentaron que "las distribuciones categóricas son más flexibles y más fáciles de modelar distribuciones arbitrarias porque no hacen suposiciones sobre su forma". Esta cualidad es importante para modelar dependencias complejas, por ejemplo, simetría entre vértices en 3D. modelo.
El modelo de vértice consta de una red de decodificador que tiene todas las características estándar de un modelo de transformador: incrustación de entrada, una pila de 18 capas de decodificador de transformador, normalización de capas y, finalmente, representación de todos los tokens de secuencia posibles, distribución softmax. . Dada una secuencia de vértices planos Vseq de longitud n, el objetivo es maximizar la probabilidad logarítmica de la secuencia de datos con los parámetros del modelo dados:
A diferencia de LSTM, el modelo transformador puede procesar entradas secuenciales en paralelo, mientras que la información de una parte de una secuencia todavía se admite para proporcionar contexto para 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 apogeos. Por ejemplo, considere una mesa típica donde las patas en las esquinas opuestas del modelo son imágenes especulares entre sí. El módulo de atención permite modelar este tipo de patrones.
La incrustación de capas es una técnica común utilizada en el modelado de secuencias para convertir un número limitado de etiquetas en conjuntos de características.
En un modelo de lenguaje, las palabras "país" y "nación" pueden tener significados muy similares, pero son muy diferentes de las palabras "manzana". Cuando las palabras están representadas por tokens únicos, no existe una noción inherente de similitud o diferencia. La capa de incrustación convierte estos marcadores en representaciones vectoriales que pueden simular una sensación significativa de distancia.
Los polígonos aplican los mismos principios a los vértices. El modelo utiliza tres tipos de capas de incrustación: las coordenadas indican si el marcador de entrada es una coordenada X, Y o Z, los valores indican el valor del marcador y la posición codifica el orden de los vértices. Cada uno pasa una información sobre el token al modelo. Debido a que nuestros vértices se ingresan un eje a la vez, las incrustaciones de coordenadas proporcionan al modelo información básica de coordenadas para que pueda saber a qué tipo de coordenadas corresponde un valor determinado.
Las incrustaciones de valores codifican los valores de vértices cuantificados que creamos anteriormente. También necesitamos algunos puntos de control de secuencia: etiquetas de inicio y parada adicionales para marcar el principio y el final de la secuencia respectivamente, y rellenar las etiquetas hasta la longitud máxima de la secuencia.
Recupera información posicional para una posición de secuencia determinada n que se pierde debido a la paralelización mediante incrustación posicional. También es posible utilizar codificación posicional, una representación cerrada que no es necesario aprender. En el artículo clásico de Transformer "La atención es todo lo que necesitas", los autores definen una codificación posicional que consta de funciones seno y coseno de diferentes frecuencias. Confirmaron experimentalmente que las incrustaciones posicionales funcionan tan bien como las codificaciones posicionales, pero las codificaciones tienen la ventaja de ser más largas que las secuencias encontradas durante el entrenamiento. Para obtener una excelente explicación visual de la codificación posicional, consulte esta publicación de blog.
Después de generar todas estas secuencias de etiquetas, lo último que queda es crear algunas capas de incrustación y combinarlas. Cada capa de incrustación necesita conocer el tamaño del diccionario de entrada esperado y la dimensión de incrustación de la salida. La dimensión de incrustación de cada capa es 256, lo que significa que podemos combinarlas mediante la suma. El tamaño del diccionario depende de la cantidad de valores únicos que puede tener la entrada. Para la incrustación de valores, es el número de valores cuantificados más el número de indicadores de control. Para las incrustaciones de coordenadas, hay una para cada coordenada x, y, z, no ninguna de las anteriores (marcadores de control). Finalmente, la incrustación posicional requiere 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 "Las coordenadas Z no se reducen" y "Los marcadores de parada solo pueden aparecer después de un vértice completo (un triple de marcadores Z, Y y X)" para evitar que el modelo genere una malla no válida. Los autores proporcionan una lista detallada de las máscaras que utilizaron en el Apéndice F del artículo. Estas restricciones sólo se implementan en el momento de la predicción, ya que en realidad pueden perjudicar el rendimiento del entrenamiento.
Como muchos modelos de predicción de secuencias, este modelo es 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 analiza todos los tokens del paso de tiempo anterior para seleccionar el siguiente token. La estrategia de decodificación determina cómo selecciona el siguiente token de esta distribución.
Si se utilizan estrategias de decodificación subóptimas, el modelo resultante a veces puede quedarse atascado en bucles repetitivos o producir 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 aplica este enfoque en el contexto de la generación de texto, pero también se puede aplicar a los vértices. La premisa es simple: simplemente seleccione aleatoriamente la siguiente etiqueta de la distribución softmax * * * con una masa de probabilidad superior a p. Esto se aplica en inferencia para generar mallas evitando la degradación de la secuencia. Consulte esto para ver una implementación de PyTorch del muestreo del kernel.
Además de generar modelos incondicionalmente, PolyGen también admite ajustes de entrada mediante etiquetas de clase, imágenes y vóxeles. Estos pueden guiar la generación de mallas con un tipo, apariencia o forma específica. Las etiquetas de categoría se proyectan mediante incrustaciones y luego se agregan a la capa de autoatención en 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 transformador-decodificador.
El modelo PolyGen describe un marco potente, eficiente y flexible para generar mallas tridimensionales de forma condicional. 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 parte del problema de distribución conjunta.
Planeo cubrir modelos de rostros en un artículo futuro. Mientras tanto, te animo a que eches un vistazo a la implementación de TensorFlow de DeepMind e intentes generar un modelo condicional.
Enlace original:/blog/polygen-3d-models/