El propio entendimiento de ConvNets deformables

PS no ha actualizado el blog durante mucho tiempo. Principalmente quería agregar el código del equipo grt a fpn y luego predecirlo en múltiples escalas. No quería reproducirlo. El resultado fue muy anormal. No funciona si ajusté muchos parámetros (principalmente cambié el modelo, la etiqueta de múltiples escalas, la función de pérdida de múltiples escalas, etc.) Más tarde, tengo que estar ocupado con otras cosas.

Acabo de terminar el modelo 3dcnn que reduce los falsos positivos antes de la semana pasada (también uso 3dunet para reducir los falsos positivos (conjuntos), no escritos), y aprovecho el tiempo de entrenamiento para ver las redes que se pueden usar más adelante. De hecho, Vi Deformable ConvNets primero V2, la comprensión general, pero algunos detalles siempre parecen ser comprensibles. Traté de mirar el código, pero también es uno de los dos primeros grandes. Luego miraré la primera versión es V1.

La información que encontré al principio también fue traducida, y era un poco de código. Pero todavía estaba muy confundido. Por ejemplo, uno de los pasos importantes es cómo se deforma la interpolación bilineal (no entiendo). Más tarde Descubrí que leí este blog de DFann Great God https://blog.csdn.net/u011974639/article/details/79675408 desde cero para enseñarte qué es la transformación afín. Comprendo de inmediato la escala y la rotación de la matriz original (rotación no es intuitivo, todavía Para probarlo, si está interesado, puede intentar saber por qué.) La traslación se puede lograr multiplicando por un vector columna, que es una transformación radial.

Y DFann Great God también proporcionó el código. Pasé mucho tiempo depurando y verificando el valor intermedio para comprender la forma en que el código implementa la transformación radial.

Transformación de radiación en pocas palabras: (idea principal)

1. Construya dos matrices X e Y que representen posiciones de coordenadas dimensionales xy2, cuyo tamaño es el tamaño de la matriz de características

# Cree una cuadrícula de tablero de ajedrez y divida la imagen completa por igual x = np.linspace (-1, 1, width) y = np.linspace (-1, 1, height) x_t, y_t = np.meshgrid (x, y)

2.Presione X e Y en dos columnas y agregue una columna de 1 para realizar la traslación durante la transformación de radiación, y luego multiplique por la matriz de radiación.

    # Hacer vectores de columna de los puntos de coordenadas originales (xt, yt, 1) 
    ones = np.ones (np.prod (x_t.shape))
    muestreo_grid = np.vstack ([x_t.flatten (), y_t.flatten (), ones ])
    # Ponga todos los píxeles juntos. La forma de la
    cuadrícula de muestreo es (lote, 3, H * W)   cuadrícula de muestreo = np.resize (cuadrícula de muestreo, (num_batch, 3, altura * ancho)) # Lote de expansión de vector de columna

    # Realizar operaciones de matriz afines M * K
    batch_grids = np.matmul (M, sampling_grid)
    # forma de cuadrícula de lote (num_batch, 2, H * W)

3. De acuerdo con la matriz transformada afín obtenida, realizar una serie de operaciones como transformar dimensiones, redondear, reconstruir dimensiones, etc., para obtener los valores en la cuadrícula correspondientes a X e Y a completar (incluida la interpolación bilineal, las coordenadas están más allá del rango de la imagen Toma 0)

 

Redes de transformadores espaciales

El gran dios de la homeopatía también habló sobre STN en https://blog.csdn.net/u011974639/article/details/79681455

1. Primero use una red con convolución o producto para obtener los parámetros de la transformación de radiación de matriz bidimensional (x, y se juntan) matriz 2 * 3 en la figura siguiente.

2. Luego, genere la cuadrícula de muestreo, es decir, la salida de conversión deseada se genera en el punto muestreado en la entrada. Este es el objetivo en la figura anterior (de hecho, está bien cambiar la fuente y el objetivo en la figura anterior En teoria)

 

3. El tercer paso es obtener el valor del punto de la cuadrícula de muestreo por diferencia bilineal. Como se muestra a continuación

 

ConvNets deformables

Ahora podemos entender nuestro tema nuevamente. Tanto DCN como STN tienen parámetros de conversión internos y parámetros de aprendizaje, que son datos de aprendizaje puros. En comparación con los ConvNets deformables, es un entrenamiento más simple, más efectivo, en profundidad y de principio a fin. En comparación con el aprendizaje de STN de un conjunto de parámetros de transformación afines, Deformable aprende el desplazamiento de cada punto de muestreo en el núcleo de convolución. En contraste con esto, la convolución dilatada convencional tiene un desplazamiento fijo. Entonces es más simple.

Aquí hay una interceptación del blog del gran dios mykeylock https://blog.csdn.net/mykeylock/article/details/77746499 :

La convolución deformable es fácil de entender, pero ¿cómo implementarla? Es necesario prestar atención a dos limitaciones en la implementación:

1. Cómo convertirlo en una capa separada sin afectar a otras capas;

2. Cómo realizar eficazmente la propagación hacia atrás en la propagación hacia adelante para lograr la convolución de variabilidad.

Las respuestas a estas dos preguntas son:

1. En el funcionamiento real, el núcleo de convolución no se expande realmente, pero los píxeles de la imagen antes de la convolución se reintegran.

Darse cuenta de la expansión del núcleo de convolución en forma disfrazada;

2. Cuando los píxeles de la imagen están integrados, los píxeles deben desplazarse y la generación del desplazamiento generará un tipo de número de punto flotante.

El offset debe convertirse a shaping. Si el offset se redondea directamente, no se puede propagar hacia atrás. En este caso, se utiliza el método de diferencia bilineal para obtener el píxel correspondiente.

—————————————————————————————————————————

El proceso de convolución de variabilidad es:

1. El lote de imagen original (el tamaño es b * h * w * c), denotado como U, después de una convolución normal, la convolución se rellena con lo mismo, es decir, el tamaño de entrada y salida permanece sin cambios,

El resultado de salida correspondiente es (b * h * w * 2c), denotado como V, y el resultado de salida se refiere al desplazamiento de cada píxel en el lote de imagen original (desplazamiento xy desplazamiento y, por lo tanto, 2c).

2. Agregue el valor del índice de píxeles de la imagen en U y V para obtener la posición de desplazamiento (es decir, el valor de las coordenadas en la imagen original U), y el valor de posición debe limitarse al tamaño de la imagen.

El tamaño de la posición es (b * h * w * 2c), pero la posición es solo un valor de coordenada y es de tipo flotante. Necesitamos estas coordenadas de tipo flotante para obtener píxeles.

3. Por ejemplo, tome un valor de coordenadas (a, b) y conviértalo en cuatro números enteros, piso (a), techo (a), piso (b), techo (b) e integre estos cuatro números enteros.

Obtenga cuatro pares de coordenadas (piso (a), piso (b)), ((piso (a), techo (b)), ((techo (a), piso (b)), ((techo (a), ceil (b)). Cada uno de estos cuatro pares de coordenadas corresponde a U

Un valor de píxel en y necesitamos obtener el valor de píxel de (a, b), que se calcula por diferencia bilineal

(Por un lado, los píxeles obtenidos son precisos, por otro lado, se puede retropropagar).

4. Una vez obtenidos todos los píxeles de posición, se obtiene una nueva imagen M, y esta nueva imagen M se introduce como datos de entrada en otra capa, como la convolución ordinaria.
--------------------- 

 

 

Sin embargo, todavía hay conflictos en la comprensión 1. Después de la convolución (b * h * w * 2c), algunos de c solo se consideran como el número de canales del mapa de características de entrada, y algunos se consideran determinados por el tamaño del núcleo de convolución deformable. (3 * 3 = 9, c = 9) Pero mirar el código parece ser un tipo, y mirar el papel es más como el último.

 

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_36401512/article/details/89362385
Recomendado
Clasificación