La Convolución en las Redes Convolucionales

En este segundo post de la serie “Redes Convolucionales” hablaremos precisamente de la convolución, que le da el nombre a estas redes. Veremos qué es un filtro o kernel, para qué sirve y como a través de la convolución este filtro permite extraer características de una imagen en escala de gris o a color.

¡Así que listo, comencemos!

Video

Como siempre, en el canal de YouTube se encuentra el video de este post:

Intuición acerca de la convolución

Supongamos que tenemos una imagen como la mostrada en la figura de abajo, y que para una cierta aplicación queremos determinar la presencia únicamente de las líneas verticales:

Imagen con líneas que poseen diferentes orientaciones. El objetivo es detectar automáticamente sólo las líneas verticales
Imagen con líneas que poseen diferentes orientaciones. El objetivo es detectar automáticamente sólo las líneas verticales

La anterior imagen está en escala de grises, lo cual quiere decir que cada pixel se representa con un valor entero que está entre 0 y 255. Así, una tonalidad oscura (el fondo de la imagen) se representa con valores cercanos a 0, una tonalidad gris con valores intermedios (cercanos a 128), y una tonalidad clara o brillante (en este caso las líneas) con valores cercanos a 255.

Para poder detectar de forma automática las líneas verticales podemos usar un filtro (o kernel) similar al mostrado en la figura de abajo. Observamos que los valores de cada pixel en este kernel están orientados verticalmente, lo que permitirá posteriormente encontrar el patrón que estamos buscando en la imagen original (las líneas verticales):

Un sencillo filtro (o kernel) de tamaño 3x3 y con orientación vertical
Un sencillo filtro (o kernel) de tamaño 3x3 y con orientación vertical

Si realizamos la convolución entre la imagen original y el kernel, entonces obtendremos un resultado similar al mostrado en la siguiente figura:

Resultado de convolucionar la imagen original con el kernel mostrado en la figura anterior
Resultado de convolucionar la imagen original con el kernel mostrado en la figura anterior

Podemos observar que la imagen resultante contiene únicamente las líneas que queríamos detectar. Así, podemos concluir que la convolución es una operación entre una imagen y un kernel, a través de la cual resulta posible detectar patrones en la imagen. A la entrada requiere una imagen y un kernel, y a la salida genera otra imagen que, idealmente, contendrá las características de interés.

Veamos ahora sí en detalle en qué consiste la Convolución, aplicada por el momento a imágenes en escala de gris.

La convolución en dos dimensiones: explicación detallada

En la figura de abajo se muestra en detalle una imagen en escala de grises y el kernel. La primera tiene un tamaño de 6x6 (es decir dos dimensiones), mientras que el kernel tiene un tamaño de 3x3:

Imagen original de tamaño 6x6 (a la izquierda) y kernel de 3x3 (a la derecha). La convolución se denota con el símbolo '*'
Imagen original de tamaño 6x6 (a la izquierda) y kernel de 3x3 (a la derecha). La convolución se denota con el símbolo '*'

La convolución es un procedimiento iterativo, y a continuación veremos cómo se desarrolla paso a paso.

Primera iteración

En la primera iteración se lleva a cabo el siguiente procedimiento:

  1. Se ubica el kernel en la esquina superior izquierda de la imagen
  2. Posteriormente se realiza la multiplicación término a término entre los coeficientes del kernel y los valores de la imagen que se encuentran superpuestos
  3. El valor correspondiente en la imagen de salida es el resultado de sumar los valores resultado de la multiplicación realizada en el paso anterior.

Esta primera iteración se ilustra en la siguiente figura:

Primera iteración de la convolución. A la izquierda la imagen original con la ubicación del kernel en rojo (los valores en azul corresponden a los valores del kernel). A la derecha, y en rojo, el valor resultante de esta primera iteración
Primera iteración de la convolución. A la izquierda la imagen original con la ubicación del kernel en rojo (los valores en azul corresponden a los valores del kernel). A la derecha, y en rojo, el valor resultante de esta primera iteración

Por tanto, como se describe en el procedimiento anterior, para esta primera iteración el valor resultante de la convolución será igual a multiplicar uno a uno los valores de la imagen y el kernel, y luego sumar el resultado:

$$3\cdot1 + 0\cdot0 + (-1)\cdot1 + 1\cdot1 + 0\cdot5 +$$ $$(-1)\cdot8 + 1\cdot2 + 0\cdot7 + (-1)\cdot2$$ $$ = 3 + 0 -1 + 1 + 0 -8 + 2 + 0 – 2 = -5$$

Segunda iteración

La segunda iteración es casi idéntica a la primera, con la única diferencia de que el kernel se desplaza una posición a la derecha. Así, el procedimiento paso a paso es el siguiente:

  1. Desplazar el kernel una posición a la derecha
  2. Repetir los pasos (1) a (3) usados en la primera iteración.

Este procedimiento se muestra a continuación:

Segunda iteración del algoritmo de convolución
Segunda iteración del algoritmo de convolución

Tercera iteración y siguientes

El procedimiento anterior se repite hasta que el kernel llega al extremo derecho de la imagen. Una vez se cumple con esta condición, el kernel se desplaza nuevamente al extremo izquierdo de la imagen y una posición hacia abajo.

El procedimiento se repite hasta que el kernel se haya desplazado por la totalidad de la imagen. En la figura de abajo se muestra el resultado de la última iteración:

Última iteración del algoritmo de convolución
Última iteración del algoritmo de convolución

La imagen resultante

En la figura anterior vimos que la imagen de entrada tenía un tamaño de 6x6, el kernel un tamaño de 3x3 y la imagen resultante un tamaño de 4x4.

Teniendo en cuenta lo anterior, podemos concluir que, para una imagen de entrada de m (filas) x n (columnas) y un kernel de tamaño u (filas) x v (columnas), la imagen resultante tendrá m-u+1 (filas) x n-v+1 (columnas).

La convolución 3D o en más dimensiones

La convolución en tres dimensiones es simplemente la convolución aplicada a imágenes en color (RGB, con tres planos de color) o imágenes con múltiples planos de información (más de 3).

Una imagen RGB es similar a una imagen en escala de grises (cada pixel es representado con un valor entre 0 y 255), con una diferencia importante: en lugar de un plano, la imagen RGB contiene tres planos (uno por cada color: R –rojo-, G – verde-, B –azul-), como se muestra en la siguiente figura:

Una imagen RGB contiene 3 planos de color: Rojo, Verde y Azul. Esto quiere decir que cada pixel está definido por tres valores
Una imagen RGB contiene 3 planos de color: Rojo, Verde y Azul. Esto quiere decir que cada pixel está definido por tres valores

Para este tipo de imágenes (con tres o más planos de información) el algoritmo de la convolución es similar al descrito anteriormente, con dos diferencias importantes:

  1. El kernel contendrá ahora el mismo número de planos de la imagen de entrada (uno por cada canal de la imagen de entrada). Es decir que si queremos procesar una imagen RGB (a color), con un tamaño de 6 (filas) x 6 (columnas) x 3 (planos de color), entonces por ejemplo podemos usar un kernel de 3 (filas) x 3 (columnas) x 3 (planos):
Una imagen RGB (izquierda) contiene 3 planos de color y por tanto el kernel (derecha) contendrá igualmente 3 planos
Una imagen RGB (izquierda) contiene 3 planos de color y por tanto el kernel (derecha) contendrá igualmente 3 planos
  1. En cada iteración se convoluciona cada plano del kernel con el correspondiente plano en la imagen de color
  2. Los resultados de estas convoluciones se suman generando un único valor
Procedimiento paso a paso para obtener la convolución entre la imagen RGB y el kernel
Procedimiento paso a paso para obtener la convolución entre la imagen RGB y el kernel

El último paso implica que la imagen resultante siempre contendrá un único plano de información.

Al igual que en el caso de la convolución 2D, en este caso la imagen resultante tendrá un tamaño inferior a la imagen original: m-u+1 x n-v+1, en donde $m$ y $n$ son el número de filas y columnas de la imagen de entrada, y $u$ y $v$ el tamaño del kernel. De nuevo, es importante recordar que la imagen resultante tendrá sólo un plano de información:

A pesar de que la imagen y el kernel tienen tres dimensiones, la imagen resultante de la convolución (a la derecha) tendrá un sólo plano de información (es decir sólo dos dimensiones: ancho y alto)
A pesar de que la imagen y el kernel tienen tres dimensiones, la imagen resultante de la convolución (a la derecha) tendrá un sólo plano de información (es decir sólo dos dimensiones: ancho y alto)

Conclusión

En resumen hemos visto que la convolución es una operación que nos permite extraer características de una imagen, para lo cual hace uso de un filtro o kernel, el cual está diseñado específicamente para extraer las características que resulten de mayor interés en la imagen.

Como vimos en el primer post de esta serie, en donde vimos qué son las Redes Convolucionales, los coeficientes de los filtros se obtienen a partir del entrenamiento mismo de la Red Convolucional.

Te invito además a revisar los demás posts de esta serie:

comments powered by Disqus