Autor: Alexander Oviedo Fadul | Grupo 10
¡Hola a todos, profesor Félix y compañeros de curso! En representación de mi equipo de trabajo (Grupo 10), conformado por María Fernanda, Neheman Samir, William Andrés, Yesith y mi persona, procedo a realizar el aporte principal.
A decir verdad, cuando inicié con el desarrollo del Ecosistema MARDUK para la Rama Judicial, no dimensionaba lo verdaderamente complejo que resulta el procesamiento visual primario para una máquina. Solemos pensar que la Inteligencia Artificial hace "magia" al identificar un objeto, pero la realidad matemática detrás de esa magia recae directamente en el procesamiento de señales bidimensionales.
La relevancia del procesamiento de imágenes radica en que es el traductor fundamental entre el mundo analógico (continuo y caótico) y el modelo de decisión de la máquina (discreto y estructurado). Como bien anotaba el profesor Gutiérrez en clase, al final estamos lidiando con frecuencias y matrices numéricas. Sin un procesamiento previo (como reducción de ruido o realce de contrastes), cualquier modelo de visión por computador, por más sofisticado que sea, fracasaría al ser alimentado con datos basura o saturados. Es el equivalente a intentar leer un documento legal con las gafas empañadas; no importa cuánto derecho sepas, si no ves bien la letra, la interpretación será errónea.
Para ilustrar la pertinencia de los filtros, me apoyaré en un caso real de mi portafolio: el SIRFAJ (Sistema Inteligente de Reconocimiento Facial para Audiencias Judiciales). Durante su implementación preliminar, recuerdo que el modelo fallaba estrepitosamente identificando a los participantes de la audiencia cuando la iluminación de la sala era deficiente; confundía las sombras de los estrados con los contornos de los rostros. Esto podría estar equivocado si lo analizamos solo desde la arquitectura de la red neuronal, pero el verdadero problema era la entrada de los datos.
Para mitigar esto, utilizamos filtros convolucionales para la extracción de características primarias antes de pasar la imagen al modelo profundo:
El modelo funcionó. Pero no como esperábamos inicialmente. Tuvimos que calibrar meticulosamente el tamaño del Kernel (variable que mis compañeros del Grupo 10, como Neheman, William, María Fernanda y Yesith abordarán en sus respectivas secuencias) para equilibrar la pérdida de información en los bordes frente al nivel de detalle extraído.
Dejo también el extracto del código Python (usando la librería OpenCV) con el que automaticé la extracción matemática para esta prueba:
# Extracto de generación del Filtro Laplaciano (Detección de Bordes) para SIRFAJ
import cv2
import numpy as np
k = 3 # Tamaño del Kernel
gray_img = cv2.imread('imagen_audiencia.jpg', cv2.IMREAD_GRAYSCALE)
# Detección de Bordes (Laplaciano aproximado)
kernel_edges = -np.ones((k, k), np.float32)
kernel_edges[k//2, k//2] = (k * k) - 1
res_edges = cv2.filter2D(gray_img, -1, kernel_edges)
cv2.imwrite("borde_extraido.jpg", res_edges)