Hola, soy Alex de DEV STORIES DOT EU. scikit-image: El pipeline de imágenes con IA, episodio 1 de 5. Antes de que un modelo de deep learning pueda reconocer una cara, tiene que digerir una cuadrícula de números. Si le pasas esa cuadrícula en el orden equivocado, tu modelo no aprende nada y tu procesamiento se vuelve lentísimo. El pipeline de imágenes con IA:
NumPy en el core es la solución para estructurar esa cuadrícula correctamente.
Cuando cargas una imagen usando scikit-image, no obtienes un objeto de imagen propietario. Obtienes un array N-dimensional estándar, conocido como ndarray. Una imagen es simplemente una matriz de píxeles. Como es un array de NumPy normal, puedes usar cualquier operación estándar para hacer un slice, aplicar un mask o manipular los datos de la imagen directamente.
Aquí está la clave. La forma en que scikit-image indexa estos arrays confunde a muchos developers. En geometría estándar, usas coordenadas x e y, donde la x es horizontal y la y es vertical. scikit-image abandona esto por la notación matricial. El primer índice es la fila, que corresponde a la posición vertical. El segundo índice es la columna, que corresponde a la posición horizontal. Si tienes una imagen en color, el tercer índice es el canal de color. Una imagen en color bidimensional estándar es, en realidad, un array tridimensional ordenado como fila, columna y canal.
Supón que estás preparando un batch de imágenes en color para pasárselo a una Convolutional Neural Network. Tu red espera un shape específico. Si tu imagen tiene 256 píxeles de alto y 256 píxeles de ancho con canales rojo, verde y azul, el shape de una sola imagen es 256, 256, 3. Pero un batch de estas imágenes añade una cuarta dimensión al principio, que representa el número de imágenes.
Cuando aplicas funciones de scikit-image a estos datos, la función necesita saber qué dimensión contiene los valores de color para no procesarlos como datos espaciales. Esto se maneja con el argumento channel axis. Al poner el argumento channel axis en -1, le dices a la función que los canales de color siempre están en la última dimensión del array. Esto asegura que la función apunte a los datos de color correctos, independientemente de si le pasas una sola imagen o un batch grande con dimensiones espaciales extra.
Esto nos lleva a la memoria. Esta es la parte que importa para la velocidad de procesamiento. Los arrays de NumPy se guardan en bloques contiguos de memoria, usando un orden tipo C por defecto. Esto significa que la última dimensión en el shape del array cambia más rápido en la memoria física. En nuestro array de imagen estándar de fila, columna y canal, los canales de color individuales para un solo píxel están justo uno al lado del otro en la memoria RAM de tu hardware.
Si escribes código a medida para hacer un loop sobre estos píxeles, tienes que respetar este memory layout. La regla es absoluta: la dimensión más a la derecha de tu array debería procesarse en el loop más interno. Iteras sobre las filas en el loop exterior, luego las columnas, y luego los canales en el interior. Si inviertes esto y haces el loop sobre las filas en el interior, fuerzas a la CPU a saltar de un lado a otro por direcciones de memoria fragmentadas. Esto destruye el cache locality y hace que tu código se ejecute mucho más lento.
Lo más crítico que debes recordar es que scikit-image no usa coordenadas horizontales y verticales; usa una indexación matricial estricta de fila, columna y canal, y hacer que tus loops coincidan con ese orden exacto de memoria es lo que mantiene rápido tu data pipeline.
Si quieres ayudar a que este podcast siga adelante, puedes apoyar el programa buscando DevStoriesEU en Patreon. Eso es todo por este episodio. Gracias por escuchar, y ¡sigue construyendo!