Comprensión de convolución deformable y análisis de código fuente

La forma de la operación de convolución tradicional es regular, de la siguiente manera

                           

En pocas palabras, es un promedio ponderado de un área pequeña en el mapa de características, y luego se genera el valor correspondiente, y su forma es un cuadrado regular. El autor siente que este campo receptivo es demasiado regular para capturar bien las características, por lo que, sobre esta base, la convolución está sesgada:

                              

1. Método de inicialización de convolución deformable en Pytorch

        

El comienzo es la configuración de algunos parámetros convencionales (kernel_size, stride, padding), seguido de la definición de self.conv (la capa final de convolución de salida, establecer el número de canales de entrada y canales de salida), self.p_conv (capa de compensación, antes de aprender El desplazamiento mencionado en la fórmula (2)), self.m_conv (capa de aprendizaje de peso). register_backward_hook es para facilitar la visualización de los resultados aprendidos de estas capas y no tiene efecto en la estructura de la red.

Los canales de entrada self.p_conv y self.m_conv están configurados por nosotros mismos. El canal de salida self.p_conv es 2 * kernel_size * kernel_size representa las coordenadas de desplazamiento de todos los elementos en el núcleo de convolución (porque hay compensaciones xey al mismo tiempo, por lo que Multiplicado por 2), y el canal de salida self.p_conv es (kernel_size * kernel_size) representa el peso de cada elemento del núcleo de convolución. Su kernel_size es 3, stride puede ser configurado por nosotros mismos (esto implica la fórmula anterior (1,2) para la búsqueda de p0) El valor predeterminado de stride es 1

 2. Función de preámbulo

                         

Primero, los datos primero aprenden el desplazamiento (desplazamiento de coordenadas) a través de self.p_conv. Si la modulación se establece en verdadero, también aprende el desplazamiento . Como se mencionó anteriormente, los pasos de estas dos capas se establecen por sí mismos, por lo que cada elemento del mapa de características que han aprendido corresponde exactamente al centro del núcleo de convolución. Como se muestra a continuación

                                            

                                            

De la imagen, podemos saber que cada elemento en el mapa de características después de pasar p_conv (el rectángulo rojo en la figura anterior) corresponde exactamente al centro del núcleo de convolución. Long puede calcular las coordenadas centrales del núcleo de convolución durante el proceso de convolución. Como se muestra arriba, podemos ver que el número de operaciones de convolución es 6.

En la primera convolución, las coordenadas centrales del núcleo de convolución son (1,1), y las coordenadas centrales de todos los núcleos de convolución posteriores.

Luego, use la función self._get_p () para obtener todas las operaciones específicas de la coordenada central p0 del núcleo de convolución . Primero , las coordenadas relativas de la convolución son generadas por la función get _ p_n ():

          

El punto central de la convolución se define como el origen. Las coordenadas de los otros puntos son relativas al origen. Por ejemplo, self.kernel_size es 3 y torch.meshgrid genera 9 coordenadas desde (-1, -1) hasta (1, 1). Almacene las x e y de las coordenadas por separado, y luego devuelva las x e y en forma de (1,2N, 1,1), de modo que hayamos obtenido todas las coordenadas relativas de un núcleo de convolución.

A continuación, obtenga las coordenadas centrales correspondientes del núcleo de convolución en el mapa de características, que es p0. La implementación del código es la siguiente

                     

El proceso es como antes, todas las coordenadas centrales son generadas por torch.meshgrid, y las coordenadas iniciales son inferidas por kernel_size, y todas las coordenadas centrales son inferidas por self.stride. Esta función _get_p_0 y el gráfico.

                                                       

Es una correspondencia completamente uno a uno. Los parámetros de entrada h y w son la información de tamaño del mapa de características después de p_conv. Luego, el tensor obtenido se expande a (1,2N, h, w) por repetición (), y luego La información relativa de coordenadas que obtuvimos y la coordenada central se suman para obtener todas las coordenadas de nuestro núcleo de convolución, es decir, la fórmula (1).

Las operaciones relacionadas en _get_p () son las siguientes:
                       

Después de agregar el desplazamiento aprendido previamente, la coordenada de convolución es la fórmula (2) propuesta en el documento, que es la operación de convolución después de agregar el desplazamiento. Por ejemplo, p (cuando N = 0) p_0 es la coordenada central y p_n = (-1, -1), entonces p en este momento es la coordenada central del núcleo de convolución más (-1, -1), más el desplazamiento . Del mismo modo, podemos obtener N = 1, N = 2 ... representan respectivamente cada elemento en un núcleo de convolución.

 

 

 

943 artículos originales publicados · Me gusta 136 · Visita 330,000+

Supongo que te gusta

Origin blog.csdn.net/weixin_36670529/article/details/105666828
Recomendado
Clasificación