Búsqueda de sitios web

Filtros en redes neuronales convolucionales


En los perceptrones multicapa (MLP), los parámetros que se pueden aprender son los pesos de la red que se asignan a vectores de características. Sin embargo, en el contexto de las redes neuronales convolucionales, los parámetros que se pueden aprender se denominan filtros, filtros que son matrices/matrices bidimensionales comúnmente de tamaño cuadrado. En este artículo, vamos a explorar qué le hacen realmente estos filtros a una imagen a medida que pasa a través de las capas de una red neuronal convolucional (CNN).

Requisitos previos

Se necesita una comprensión básica del código Python y las redes neuronales para seguir este tutorial. Recomendamos este artículo a programadores de nivel intermedio a avanzado con experiencia en el desarrollo de arquitecturas novedosas.

El código de este artículo se puede ejecutar en una PC doméstica normal o en DigitalOcean Droplet.

Redes neuronales y extracción de características

Una capacidad esencial de las redes neuronales es su capacidad para extraer características de los datos para luego usarlas para archivar un objetivo determinado, ya sea clasificación, regresión, etc. En los MLP, este proceso es fácil de conceptualizar, los puntos de datos que a menudo son atributos de una instancia particular de datos se asignan a pesos entrenados para combinarlos o transformarlos de alguna forma en características esenciales. Por otro lado, la extracción de características no es tan clara cuando se trata de CNN, ya que no tratan con un vector de atributos, sino que tratan con imágenes que son una matriz bidimensional de atributos (píxeles).

Además, ¿qué representaría una característica cuando se trata de imágenes? Cuando se habla de un conjunto de datos tabulares de casas, por ejemplo, se dice que las columnas que contienen atributos como el número de dormitorios o el tamaño de la sala de estar son características de una instancia de casa en particular. Entonces, ¿qué pasa con una imagen de definición mejorada (480p) de un gato que tiene un tamaño de (640, 480) píxeles? Esta imagen tiene 640 columnas y 480 filas, un total de 307.200 atributos (píxeles), ¿qué representa características en este caso?

Imágenes en el borde

Muchos de los detalles de lo que constituye una imagen en realidad están contenidos en sus bordes o contornos. Es una de las razones por las que podemos distinguir fácilmente objetos en los bocetos de dibujos animados. De hecho, existen numerosos estudios que sugieren que la percepción de bordes es una de las primeras técnicas utilizadas por el cerebro humano al procesar señales visuales provenientes de los ojos (Willian Mcllhagga, 2018). La percepción de los bordes no se limita solo a la visión humana; algunos estudios han argumentado que es una de las razones por las que los aviares son tan hábiles para esquivar obstáculos en pleno vuelo a velocidades tan altas, así como para aterrizar en objetivos pequeños desde tan lejos. con precisión milimétrica (Partha Bhagavatula et al, 2009).

La única información que tenemos son los bordes y todos sabemos qué es esto.

Las CNN y la visión humana

Se ha hablado mucho de cómo las redes neuronales imitan el cerebro humano. Un escenario que da cierta credibilidad a esto es el hecho de que así como el cerebro humano comienza a procesar señales visuales provenientes de los ojos al percibir bordes, las redes neuronales convolucionales también comienzan a extraer características de las imágenes al detectar bordes; de hecho, se puede decir que los bordes representan características de la imagen. Las herramientas que utiliza para este propósito son sus parámetros aprendibles, sus filtros.

Ese es específicamente el propósito de los filtros en una red neuronal convolucional: están ahí para ayudar a extraer características de las imágenes. Si bien las primeras capas de una CNN se componen de filtros de detección de bordes (extracción de características de bajo nivel), las capas más profundas a menudo aprenden a centrarse en formas y objetos específicos de la imagen. A los efectos de este artículo, me centraré en la detección de bordes en las primeras capas, ya que es un proceso bastante intrigante y los filtros son fácilmente comprensibles.

Filtrar bordes

Lo bueno de las redes neuronales convolucionales es que pueden aprender filtros de detección de bordes personalizados según la distribución de probabilidad de los píxeles en un determinado conjunto de datos y el objetivo específico de la red. No obstante, existen algunos filtros de detección de bordes clásicos formulados manualmente que se pueden utilizar para desarrollar una intuición de cómo se ve la detección de bordes en un contexto de visión por computadora. Son los filtros Prewitt, Sobel, Laplacian, Robinson Compass y Krisch Compass.

Para examinar realmente lo que hacen estos filtros, hagamos un poco de trabajo aplicándolos a imágenes usando la función de convolución escrita manualmente que se proporciona a continuación.

import numpy as np
import torch
import torch.nn.functional as F
import cv2
from tqdm import tqdm
import matplotlib.pyplot as plt


def convolve(image_filepath, filter, title=''):
    """
    This function performs convolution and
    returns both the original and convolved
    images.
    """

    #  reading image in grayscale format
    image = cv2.imread(image_filepath, cv2.IMREAD_GRAYSCALE)

    #  defining filter size
    filter_size = filter.shape[0]

    #  creating an array to store convolutions (x-m+1, y-n+1)
    convolved = np.zeros(((image.shape[0] - filter_size) + 1, 
                      (image.shape[1] - filter_size) + 1))
    
    #  performing convolution
    for i in tqdm(range(image.shape[0])):
      for j in range(image.shape[1]):
        try:
          convolved[i,j] = (image[i:(i+filter_size),
                                  j:(j+filter_size)] * filter).sum()
        except Exception:
          pass

    #  converting to tensor
    convolved = torch.tensor(convolved)
    #  applying relu activation
    convolved = F.relu(convolved)

    #  producing plots
    figure, axes = plt.subplots(1,2, dpi=120)
    plt.suptitle(title)
    axes[0].imshow(image, cmap='gray')
    axes[0].axis('off')
    axes[0].set_title('original')
    axes[1].imshow(convolved, cmap='gray')
    axes[1].axis('off')
    axes[1].set_title('convolved')
    pass

Función de convolución.

Esta función replica el proceso de convolución con un paso adicional de activación de ReLU como se espera en una convnet típica. Al utilizar esta función, detectaremos bordes en la imagen a continuación usando los filtros enumerados anteriormente.

Muestra

Filtros Prewitt

Los filtros Prewitt verticales y horizontales.

El operador Prewitt se compone de dos filtros que ayudan a detectar bordes verticales y horizontales. El filtro horizontal (dirección x) ayuda a detectar bordes en la imagen que cortan perpendicularmente a través del eje horizontal y viceversa para el filtro vertical (dirección y).

# utilizing the horizontal filter
convolve('image.jpg', horizontal)

# utilizing the vertical filter
convolve('image.jpg', vertical)

Filtros Sobel

Los filtros de Sobel verticales y horizontales.

Al igual que el operador Prewitt, el operador Sobel también se compone de un filtro de detección de bordes vertical y horizontal. Los bordes detectados son bastante similares a los resultados obtenidos utilizando filtros Prewitt, pero con la diferencia de una mayor intensidad de píxeles de los bordes. En otras palabras, los bordes detectados con los filtros de Sobel son más nítidos en comparación con los filtros de Prewitt.

# utilizing the horizontal filter
convolve('image.jpg', horizontal)

# utilizing the vertical filter
convolve('image.jpg', vertical)

Filtro laplaciano

El filtro laplaciano

A diferencia de los filtros de Prewitt y Sobel, el filtro laplaciano es un filtro único que detecta bordes de diferente orientación. Desde un punto de vista matemático, calcula derivadas de segundo orden de valores de píxeles a diferencia de los filtros de Prewitt y Sobel que calculan derivadas de primer orden.

# utilizing the filter
convolve('image.jpg', filter)

Robinson Brújula Mascarillas

Las 8 máscaras de Robinson Compass

Las máscaras de Robinson Compass son filtros de detección de bordes que se componen de 8 filtros diferentes que representan las 8 direcciones geográficas de la brújula, como se muestra en la imagen de arriba. Estos filtros ayudan a detectar bordes orientados en esas direcciones de la brújula. Para abreviar, sólo dos de los filtros se utilizan con fines ilustrativos.

# utilizing the north_west filter
convolve('image.jpg', north_west)

# utilizing the north_east filter
convolve('image.jpg', north_east)

Máscaras de brújula Krisch

Las 8 máscaras de Krisch Compass

Al igual que las máscaras de Robinson Compass, la máscara de Krisch Compass también se compone de 8 filtros que ayudan a detectar bordes en las direcciones geográficas de la brújula. Dos de los filtros se utilizan a continuación.

# utilizing the south_west filter
convolve('image.jpg', south_west)

# utilizing the south_east filter
convolve('image.jpg', south_east)

Notaciones de filtro

Hay una afirmación bastante importante que probablemente te hayas perdido:

El filtro horizontal (dirección x) ayuda a detectar bordes en la imagen que cortan perpendicularmente a través del eje horizontal y viceversa para el filtro vertical (dirección y).

Esta afirmación puede parecer un poco confusa, pero la desglosaré más en esta sección. Considere la imagen a continuación, la figura de la derecha es lo que ve el ojo humano mientras que la figura de la izquierda es lo que percibe una computadora. Como es evidente en la imagen, la línea blanca delinea un borde vertical claro en el 'lienzo' negro, para el ojo humano esto es evidente debido al contraste entre esa línea y su entorno (En la misma veleta, una computadora necesita para poder percibir este cambio de contraste a nivel de píxel y eso es esencialmente lo que implica la detección de bordes).

Sin embargo, para encontrar físicamente este borde, sería necesario pasar el dedo de izquierda a derecha (horizontalmente) o viceversa. Lo mismo se aplica a los filtros de detección de bordes; para detectar un borde vertical es necesario utilizar un filtro horizontal.

Lo que ves versus lo que “ve” una computadora

Intentemos detectar bordes en la imagen utilizando los filtros Prewitt horizontal y vertical; las matemáticas detrás del proceso de detección de bordes se ilustran en la imagen a continuación. Las matemáticas detrás del proceso de convolución son bastante fáciles de seguir como se describe;

  1. Coloque el filtro en la esquina superior izquierda.
  2. Realizar multiplicaciones por elementos.
  3. Calcule una suma acumulativa.
  4. Devuelve la suma obtenida como un píxel correspondiente en una matriz vacía.
  5. Desplace el filtro un píxel hacia la derecha y repita los pasos 1 a 4 mientras continúa completando la primera fila de la matriz vacía hacia la derecha.
  6. Deténgase cuando el filtro se salga de los límites.
  7. Mueva el filtro hacia abajo un píxel hasta la segunda fila.
  8. Repita los pasos 1 a 6 a medida que completa la segunda fila en la matriz vacía.
  9. Haga lo mismo para todas las filas hasta que el filtro salga de los límites en el eje vertical (tenue 1).

La activación se realiza usando la función ReLU que simplemente convierte cualquier píxel negativo a 0. Después de la convolución y activación, el filtro horizontal resalta el borde vertical mientras que el filtro vertical devuelve una imagen oscurecida (todos cero píxeles), lo que significa que no ha detectado ningún borde. .

Matemáticas de detección de bordes

El borde detectado resultante se visualiza a continuación. Siguiendo la misma lógica, si la línea fuera horizontal, representando un borde horizontal, el filtro vertical resaltaría el borde horizontal mientras que el filtro horizontal devolvería una imagen oscurecida.

Borde detectado por el filtro horizontal

Usando la función de convolución

Para aquellos que quieran utilizar la función de convolución anterior en una imagen diferente o probar diferentes filtros para la detección de bordes u otras tareas de procesamiento de imágenes, esta sección es una guía rápida sobre cómo hacerlo.

La función toma 3 parámetros, a saber, 'image_filepath', 'filtro' y 'título'.

'Ruta_archivo_imagen'

Esto se refiere a la ubicación de la imagen deseada en su disco local o en la nube. En el caso de que su imagen esté en el directorio de trabajo actual, todo lo que necesita hacer es ingresar el nombre de la imagen completo con su extensión de archivo. De lo contrario, deberá proporcionar una ruta absoluta, algo así como "C:/Users/Username/Downloads/image_name.jpg" (barra diagonal en este caso, ya que estamos trabajando en Python).

Filtrar

De hecho, este es el filtro que le gustaría utilizar en el proceso de convolución. Los filtros son bastante fáciles de crear usando NumPy como se muestra a continuación. Todo lo que necesita hacer después es proporcionar el objeto de filtro en la función.

#  creating a Prewitt horizontal filter
prewitt_x = np.array(([-1, 0, 1],
                      [-1, 0, 1],
                      [-1, 0, 1]))
                       creating a laplacian filter
laplacian = np.array(([-1, -1, -1],
                      [-1, 8, -1],
                      [-1, -1, -1]))

Título

Este será el título de la visualización de la imagen proporcionada cuando se utilice la función. Es una cadena vacía de forma predeterminada, pero puedes proporcionar un título adecuado si lo deseas.

Comentarios finales

Lo que hace especiales a las redes neuronales convolucionales es su capacidad para extraer características de una representación bidimensional de datos, como los píxeles de una imagen. Las características se extraen como bordes utilizando herramientas contenidas en la red neuronal llamadas filtros.

En este artículo, hemos examinado cómo se ve la detección de bordes/extracción de características desde el punto de vista de la visión por computadora utilizando algunos filtros predefinidos. Sin embargo, vale la pena señalar que una CNN no utilizará estos filtros predefinidos para la detección de bordes, sino que aprenderá los mejores filtros para detectar bordes y extraer características en el conjunto de datos de interés.

Artículos relacionados: