La radiología es un campo que depende significativamente de la experiencia de profesionales altamente calificados. Los radiólogos analizan imágenes médicas para diagnosticar y monitorear una variedad de afecciones, desde simples fracturas hasta enfermedades complejas como el cáncer. Sin embargo, con el auge de las imágenes médicas y la urgente necesidad de diagnósticos rápidos y precisos, los radiólogos se encuentran bajo una enorme presión. Aquí es donde interviene la inteligencia artificial (IA), transformando el campo al mejorar las capacidades humanas. Al final de este artículo, habrá creado su propio modelo de clasificador de imágenes para ayudar a detectar neumonía en imágenes médicas.
Antes de sumergirnos en la codificación, debemos asegurarnos de que nuestro entorno esté preparado. Comenzaremos instalando las bibliotecas necesarias:
%pip install --upgrade tensorflow keras numpy pandas sklearn pillow
Estas bibliotecas son esenciales para construir y entrenar nuestro modelo:
tensorflow
y keras
para crear y entrenar redes neuronales.numpy
para operaciones numéricas.pandas
para manipulación de datos.sklearn
para preprocesar datos.pillow
para procesamiento de imágenes.Con las bibliotecas instaladas, importémoslas:
import os from tensorflow import keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Flatten from tensorflow.keras.preprocessing.image import ImageDataGenerator import numpy as np
Comenzamos importando varias bibliotecas y módulos esenciales necesarios para construir y entrenar un modelo de red neuronal para tareas de procesamiento de imágenes. Usaremos TensorFlow y sus submódulos para crear y administrar nuestros modelos de aprendizaje profundo. Específicamente, importaremos Keras para usarlo como nuestra API de alto nivel, Sequential para construir una pila lineal de capas y módulos como Dense, Conv2D, MaxPool2D y Flatten para construir y configurar varias capas de redes neuronales. Además, ImageDataGenerator nos ayudará a aumentar nuestros datos de imagen, mejorando la capacidad del modelo para generalizar. Por último, importaremos numpy por su soporte para operaciones numéricas, particularmente útil para manejar matrices y realizar funciones matemáticas.
Nuestro radiólogo de IA necesita datos de los que aprender. Usaremos ImageDataGenerator para cargar y aumentar nuestros datos de entrenamiento y validación: para descargar los datos, usaremos nuestro amigo de datos de código abierto Kaggle, vaya y descargue el conjunto de datos etiquetados desde el enlace aquí.
En el contexto del aprendizaje supervisado aquí, el conjunto de datos etiquetado será la verdad fundamental que se supone que debe predecir el modelo de aprendizaje automático.
trdata = ImageDataGenerator() traindata = trdata.flow_from_directory(directory="data-task1/train", target_size=(224, 224)) tsdata = ImageDataGenerator() testdata = tsdata.flow_from_directory(directory="data-task1/val", target_size=(224, 224))
Este fragmento de código configura generadores de datos para nuestros conjuntos de datos de capacitación y validación. Las imágenes cambian de tamaño a 224x224 píxeles, el tamaño de entrada estándar para el modelo VGG16.
Ahora viene la parte divertida: construir el modelo VGG16. VGG16 es una arquitectura popular de red neuronal convolucional (CNN) conocida por su simplicidad y efectividad gracias a su arquitectura única construida principalmente sobre 13 capas convolucionales y 3 capas completamente conectadas. Lo que distingue a VGG16 es el uso de pequeños filtros convolucionales de 3x3 dentro de una red profunda. Este diseño captura patrones complejos en imágenes al tiempo que garantiza la eficiencia computacional. Así es como lo creamos:
model = Sequential() model.add(Conv2D(input_shape=(224,224,3), filters=64, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=64, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Flatten()) model.add(Dense(units=4096, activation="relu")) model.add(Dense(units=4096, activation="relu")) model.add(Dense(units=2, activation="softmax")) model.summary()
Vamos a desglosarlo:
Con nuestra arquitectura modelo definida, necesitamos compilarla:
opt = keras.optimizers.Adam(learning_rate=0.001) model.compile(optimizer=opt, loss=keras.losses.binary_crossentropy, metrics=['accuracy'])
Aquí, utilizamos el optimizador Adam con una tasa de aprendizaje de 0,001 y entropía cruzada binaria como nuestra función de pérdida, adecuada para tareas de clasificación binaria. Analicemos los pros y los contras de estas opciones:
Componente | Ventajas | Desventajas |
---|---|---|
Optimizador Adam | 1. Tasas de aprendizaje adaptativas 2. Funciona bien con la configuración predeterminada. | Potencial de sobreajuste con modelos complejos. |
Pérdida de entropía cruzada binaria | Ideal para clasificación binaria | No es muy compatible con la función de activación de mi capa de salida, ¿por qué? (¡déjalo en los comentarios!) |
Siéntase libre de experimentar con diferentes optimizadores, tasas de aprendizaje y funciones de pérdida, ya que es una excelente manera de adquirir experiencia.
¡Es hora de formar a nuestro radiólogo de IA! Configuramos devoluciones de llamada para guardar el mejor modelo y detenernos temprano si la precisión de la validación deja de mejorar:
from keras.callbacks import ModelCheckpoint, EarlyStopping checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_accuracy', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1) early = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=20, verbose=1, mode='auto') hist = model.fit_generator(steps_per_epoch=20, generator=traindata, validation_data=testdata, validation_steps=10, epochs=10, callbacks=[checkpoint, early])
Para ver cómo le está yendo a nuestro modelo, podemos trazar la pérdida y precisión del entrenamiento y la validación:
import matplotlib.pyplot as plt # Training loss plt.plot(hist.history['loss']) plt.legend(['Training']) plt.title('Training loss') plt.ylabel('loss') plt.xlabel('epoch') plt.show() # Validation loss plt.plot(hist.history['val_loss']) plt.legend(['Validation']) plt.title('Validation loss') plt.ylabel('validation loss') plt.xlabel('epoch') plt.show() # Training and validation accuracy plt.plot(hist.history['accuracy']) plt.plot(hist.history['val_accuracy']) plt.legend(['Training', 'Validation']) plt.title('Training & Validation accuracy') plt.xlabel('epoch') plt.show()
Estos gráficos nos ayudarán a comprender qué tan bien está aprendiendo nuestro modelo y si está sobreajustado o insuficientemente ajustado.
Después de la formación, nuestro radiólogo de IA está listo para hacer predicciones. Así es como puedes cargar una imagen y obtener la predicción del modelo:
from tensorflow.keras.preprocessing import image # Load and preprocess image img_path = 'path_to_your_image.jpg' img = image.load_img(img_path, target_size=(224, 224)) img_array = image.img_to_array(img) img_array = np.expand_dims(img_array, axis=0) # Create batch axis # Make prediction prediction = model.predict(img_array) print('Prediction:', prediction)
Construir un radiólogo con IA es solo el comienzo. A continuación se ofrecen algunos consejos para ajustar y mejorar su modelo:
¡Vaya, increíble trabajo! 🎉 Has creado un modelo que puede analizar imágenes médicas y hacer predicciones. ¡Qué gran logro médico! :) Al profundizar en las complejidades de las arquitecturas de redes neuronales, has visto cuán impactante puede ser un modelo de IA finamente ajustado. Sigue superando los límites, sigue experimentando y, lo más importante, ¡disfruta cada momento de trabajar con tus proyectos de IA!