convolución 2D en imagen de escala de grises 32x32 en FPGA usando verilog para inferencia de CNN

1

Hola, soy nuevo en el mundo de las redes neuronales convolucionales y me gustaría implementar una operación de convolución 2D utilizando el enfoque de ventana deslizante en un FPGA xilinx. La entrada a la imagen es una imagen de 32x32 con 2 canales en la que 6 núcleos de 5x5 se combinan para producir 6 mapas de características de salida. Ahora, asegurando que tengo suficientes DSP en el FPGA, ¿cómo paralelizaría el problema? Después de investigar un poco, comprendí que podemos paralelizar sobre los mapas de características de entrada o salida, el kernel o ambos. Para un kernel 5x5, necesitaría 25 multiplicaciones y 25 adiciones, incluido el sesgo. Si tengo 25 DSP operando en paralelo, puedo lograr esto en un ciclo de reloj. ¿Mi comprensión del problema de la paralelización es correcta hasta ahora?

Ahora, considerando que la entrada se almacena en buffers y se transmite a mi módulo de convolución y los pesos se cargan previamente en el módulo, ¿cómo se realiza el cálculo de la ventana deslizante? Me doy cuenta de que tendría que usar contadores para hacer un seguimiento de la posición de la entrada hasta el final de N_W y N_H respectivamente. Existe mucha literatura sobre la implementación de este uso de matrices de multiplicadores sistólicos, pero no estoy seguro de obtenerlos.

¿Podría alguien ayudarme a entender un flujo de datos para la operación de convolución?

Cualquier ayuda sería muy apreciada. Un estudiante ansioso.

    
pregunta frisco_1989

1 respuesta

3

El problema de procesar un núcleo de datos 2-d sobre un gran conjunto de datos (no solo de convolución) aparece tan regularmente en el procesamiento de video HD que se me ocurrió una forma genérica de manejo que uso todo el tiempo.

Desarrollé un "generador de kernel" genérico que usa búferes de línea y registros para presentar todos los datos de entrada para un píxel de salida dado en paralelo. Un núcleo N × N requiere búferes de línea N-1 y registros N-1. Se supone que los datos llegan en el orden de "escaneo ráster", como una señal de TV.

simular este circuito : esquema creado usando CircuitLab

La siguiente etapa podría ser sus multiplicadores, pero la mayoría de las veces, necesito manejar los bordes de alguna manera especial, como poner a cero los valores que quedan fuera de los datos de entrada, o reflejar los datos a través del borde, o lo que sea. Por lo tanto, tengo algunos módulos estándar (N 2 píxeles de entrada, N 2 píxeles de salida) que constan de contadores y multiplexores que realizan este procesamiento de borde antes de pasar los datos al real módulo de procesamiento de datos.

Para una convolución, puedes hacer todas las multiplicaciones en paralelo en el mismo período de reloj, pero luego las adiciones deberán ser canalizadas. Por ejemplo, si solo puedes agregar dos números en un período de reloj, necesitarás un "árbol" de sumadores con 5 niveles de profundidad para un núcleo de 5 × 5. Si puede agregar tres o cuatro números a la vez, solo necesitará 3 niveles de canalización.

Obviamente, el mismo generador de kernel puede alimentar varias circunvoluciones en paralelo si eso es lo que estás haciendo, pero secundo la idea de Harry Svensson de usar técnicas FFT si estás haciendo más de unas pocas.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas