Comprensión de PointNet ++

1. ¿Qué problemas resuelve PointNet ++ en PointNet?

  1. El MLP puntual de PointNet es solo una representación de cada punto, y la capacidad de integrar información estructural local es demasiado débil -> Mejora de PointNet ++: el muestreo y la agrupación integran vecindarios locales
  2. La característica global de PointNet se obtiene directamente mediante la agrupación máxima, ya sea para tareas de clasificación o segmentación, causará una gran pérdida de información -> Mejora de PointNet ++: marco de aprendizaje de características jerárquicas, reducción de resolución a través de múltiples abstracciones de conjuntos paso a paso para obtener diferentes escalas Diferentes niveles de características locales y globales (la salida de abstracción del último conjunto se puede considerar como una característica global), las características globales obtenidas de esta manera son más avanzadas y tienen capacidades de representación más fuertes .
  3. Las características globales de la tarea de segmentación se copian y empalman directamente con las características locales. Si el empalme se realiza directamente, hay muy pocas características globales disponibles y la capacidad de generar características discriminativas es limitada -> Mejora de PointNet ++: La estructura codificador-decodificador está diseñada para tareas de segmentación, primero reduce la muestra y luego aumenta la muestra, y usa la conexión de salto para empalmar las características locales-globales de la capa correspondiente. Dichas características son más avanzadas y discriminativas .
  4. Por supuesto, PointNet ++ también resuelve el problema de que cuando la nube de puntos es desigual, las características aprendidas en el área densa pueden no ser adecuadas para el área dispersa. La solución es realizar la extracción de características en subáreas de diferentes radios y luego realizar la característica. apilamiento La transformación de dimensión de la extracción de características también variará con el radio.

2. Hay una operación de muestreo de FPS no diferenciable en el módulo SA de PointNet ++ ¿Cómo se puede propagar hacia atrás el gradiente?

Existe un tipo de operación de este tipo en la detección 3D que, en lengua vernácula, se puede clasificar como "enrutamiento": es decir, dónde extraer las características o dónde recopilar las características. El proceso de establecimiento de la "ruta" en sí no se puede guiar (como FPS y consulta de bola). Pero una vez que se establece el "enrutamiento", el proceso de transferencia y mapeo de características generalmente es derivable. Entonces, para la implementación específica de la operación FPS en retropropagación, creo que es similar a la retropropagación de gradiente de torch.scatter, inicializa un tensor 0 y luego asígnalo de acuerdo con la dispersión.

Para ver un ejemplo en pointnet++ (debido a que no puede depurar en un operador cuda personalizado escrito en C++, no puede depurar en el código de C++, solo puede ir al paso de llamada, por lo que se recomienda utilizar la búsqueda global directamente), para las operaciones hacia adelante que no se pueden guiar en la propagación, es necesario reescribir la función hacia atrás y se puede llamar al código cuda implementado por sí mismo al reescribir. Se puede ver que la función hacia atrás reescrita devuelve solo la primera con gradiente y la segunda sin gradiente. La entrada del parámetro hacia atrás proviene del gradiente de salida hacia adelante, y el valor de retorno de hacia atrás corresponde al gradiente de entrada hacia adelante, por lo que significa que idx no tiene gradiente y está truncado, lo que indica que la ruta de idx está muerta, pero el la ruta de características todavía tiene gradiente :

Caso :
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Lógica de llamada externa:
Insertar descripción de la imagen aquí

Consulte :

  1. [Lectura de código] Revisión del código PointNet ++
  2. [Lectura de código] Explicación detallada de cómo definir sus propias funciones de programación CUDA en Pytorch
  3. [Lectura de código] Explicación detallada de la implementación específica de PointNet ++
  4. Python usa la configuración para crear paquetes personalizados-empaquetado-instalación
  5. pytorch construye la extensión CUDA/C++ a través de torch.utils.cpp_extension
  6. Utilice torch.autograd.Function para personalizar el avance y el retroceso de la capa
  7. Interpretación del código fuente de PyTorch de torch.autograd: explicación detallada del cálculo del gradiente

Supongo que te gusta

Origin blog.csdn.net/Rolandxxx/article/details/128408625
Recomendado
Clasificación