Logotipo de Zephyrnet

Clasificación de rayos X utilizando un modelo apilado preentrenado

Fecha:

Este artículo fue publicado como parte del Blogatón de ciencia de datos.

Modelo apilado preentrenado

Fuente: Enlace

¡¡Hey gente!!

En el último artículo, hemos hablado sobre la creación de motores de búsqueda utilizando conceptos de PNL. Si no lo ha leído, consulte este liga.

En este artículo, vamos a hablar sobre una aplicación de clasificación/clasificación de imágenes y es la predicción de neumonía por radiografía de tórax utilizando el modelo apilado previamente entrenado.

La neumonía es causada por bacterias, hongos y virus. Es una infección pulmonar común. Un médico examina la radiografía y puede decir si el paciente sufre de neumonía o no.

La bacteria Streptococcus es la causa principal de la neumonía, causa inflamación en los alvéolos (los sacos de aire en los pulmones) y, debido a la inflamación, los alvéolos se llenan de pus o líquido, lo que dificulta la respiración.

Índice del contenido

  • Introducción
  • Entendiendo el problema
  • Modelo preentrenado de apilamiento
  • Implementación

Introducción

Nuestro objetivo es crear un modelo de aprendizaje automático que pueda categorizar los rayos X con neumonía. La implementación de la clasificación o categorización de imágenes puede ser un desafío cuando necesitamos clasificar detalles muy detallados utilizando el modelo apilado previamente entrenado. Como en nuestro escenario, cada radiografía se ve muy similar, pero para capturar detalles muy finos, debemos aplicar algunas técnicas de aprendizaje diferentes que cubriremos en este artículo.

Necesitamos tomar todos y cada uno de los pequeños detalles en nuestro entrenamiento para lograr nuestro objetivo.

Modelo apilado preentrenado
                                                                                                                                Fuente: Enlace
  • Cuando usamos un modelo de CNN definido, obtuvimos una precisión del 65 %. Simplemente indica que el modelo de CNN en capas personalizado no clasifica las imágenes de rayos X.
  • Para lograr una mayor precisión, utilizaremos modelos apilados previamente entrenados.

Comprender el conjunto de datos

Vamos a utilizar el Conjunto de datos de imágenes de rayos X de tórax disponible en Kaggle. puedes descargar o crear un cuaderno Kaggle para trabajar en él.

Comprender el conjunto de datos | Modelo apilado preentrenado
                                                                                                                                Fuente: Author
  • El conjunto de datos incluye datos de entrenamiento, prueba y validación.
  • Los datos de entrenamiento contienen 5216 radiografías, de las cuales 3875 imágenes son neumónicas y 1341 imágenes son imágenes normales.
  • Los datos de validación contienen solo 16 imágenes, incluidas 8 radiografías normales y 8 radiografías con neumonía.
  • Los datos de prueba contienen 624 imágenes en las que 390 radiografías neumónicas y 234 radiografías normales.

Implementación del categorizador de rayos X

Usaremos un modelo apilado previamente entrenado que es DensoNet169 y móvilnetv2 para mejores resultados

Esto se hace congelando las capas iniciales e intermedias de modelos previamente entrenados y luego apilándolos para la salida.

Implementación del clasificador de rayos X | Modelo apilado preentrenado
                                                                                                                                        Fuente: Enlace

Paso 1 Importación de bibliotecas

Estamos importando todas las bibliotecas necesarias a la vez.

de keras.layers.merge importar concatenar de keras.layers importar Entrada de tensorflow.keras.optimizers importar Adam de tensorflow.keras.preprocessing.image importar ImageDataGenerator de tensorflow.keras.layers importar MaxPooling2D, Flatten, Conv2D, Dense, BatchNormalization, GlobalAveragePooling2D ,Dropoutfrom tensorflow.keras.applications.densenet import DenseNet169 from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2

Paso 2 Cargando los datos

El conjunto de datos contiene carpetas jerárquicas para las imágenes de entrenamiento y la validación. hemos guardado la ruta como variables.

  • train_n(datos de entrenamiento para rayos X normales)
  • train_p(datos de entrenamiento para rayos X de neumonía)
  • validation_data_dir (datos de validación)
  • test_data_dir( para las pruebas )
main_dir = "../input/chest-xray-pneumonia/chest_xray/" train_data_dir = main_dir + "train/" validation_data_dir = main_dir + "val/" test_data_dir = main_dir + "test/" train_n = train_data_dir+'NORMAL/' train_p = train_data_dir+'NEUMONÍA/'

Paso 3 Crear generador de datos

Dado que el conjunto de datos es grande y para evitar la insuficiencia de memoria, necesitamos entrenar el modelo en lotes, para lograr este propósito usaremos un generador de datos.

Aparte de esto, necesitamos aplicar el aumento de datos para evitar problemas de sobreajuste.

En el aumento de datos, aplicando algunas pequeñas transformaciones logramos resultados más generalizados. esto también lleva a generar más datos de entrenamiento al aplicarles transformaciones.

Los datos Generador de datos de imagen maneja todas las tareas de procesamiento de imágenes.

Note– Aplicamos el aumento de imágenes solo en las imágenes de entrenamiento, no en las imágenes de prueba y validación.

train_datagen = ImageDataGenerator (reescalar = 1. / 255, horizontal_flip = Verdadero)

test_datagen = ImageDataGenerator(reescalar=1. / 255)
val_datagen = ImageDataGenerator(reescalar=1. / 255)


La siguiente transformación de imagen se puede aplicar, es decir,

  • zoom_rangeValor flotante: Rangos [inferior, superior]
  • shear_rangeValor flotante. Intensidad de corte
  • rescale Se utiliza para normalizar la imagen.

Paso 4 Cargando los datos en DataGenerator 

El métodoflow_from_directory carga los datos de forma recursiva yendo directorio por directorio si nuestro directorio principal está de forma jerárquica.

img_width , img_height = [224,224] lote_tamaño = 16
train_generator = train_datagen.flow_from_directory( train_data_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary', shuffle = True)

validacion_generador = val_datagen.flow_from_directory(
validación_datos_dir,
target_size=(img_height, img_width),
tamaño_lote=tamaño_lote,
class_mode='binario')

test_generator = test_datagen.flow_from_directory(
test_data_dir,
target_size=(img_height, img_width),
tamaño_lote=tamaño_lote,
class_mode='binario')


  • class_mode = ‘binary’ ya que es una categorización binaria.
  • target_size = (img_height, img_width) del tamaño del objetivo, la imagen debe ser otorgada por el generador de datos de imagen.
  • batch_size = 16 Se agruparán 16 imágenes en un lote y el modelo se entrenará tomando el lote de imágenes. Usando lotes solucionamos el problema de la insuficiencia de memoria.
Cargando los datos | Modelo apilado preentrenado
                                                                                                                      Fuente: Author

Trazado de las imágenes generadas por Image Data Generator

image_batch, label_batch = siguiente(iter(train_generator))

def show_batch(lote_imagen, lote_etiqueta):
plt.figure (figsize = (10, 10))
para n in rango (15):
hacha = plt.subplot(5, 5, n + 1)
plt.imshow(image_batch[n])
si lote_etiqueta[n]:
plt.title ("NEUMONÍA")
más:
plt.título(“NORMAL”)
plt.eje(“apagado”)

show_batch(lote_imagen, lote_etiqueta)


Trazado de las imágenes generadas por Image Data Generator
                                                                                               Imágenes aumentadas

Paso 5 Construcción de modelos

Usaremos pre-entrenados DensoNet169 y móvilnetv2 y apilará las últimas capas pre-entrenadas usando la clase de combinación.

Congelar las capas superiores e intermedias significa que mantenemos los pesos previamente entrenados y no lo estamos entrenando desde cero.

forma_entrada = (224,224,3) capa_entrada = Entrada(forma = (224, 224, 3))

#primer modelo
mobilenet_base = MobileNetV2(pesos = 'imagennet',input_shape = input_shape,include_top = False)


densenet_base = DenseNet169 (pesos = 'imagenet', input_shape = input_shape, include_top = False)
para capa in mobilenet_base.layers: layer.trainable = Falso para capa in densenet_base.layers: layer.trainable = False model_mobilenet = mobilenet_base(input_layer) model_mobilenet = GlobalAveragePooling2D()(model_mobilenet) output_mobilenet = Flatten()(model_mobilenet)

model_densenet = densanet_base(capa_entrada)
model_densenet = GlobalAveragePooling2D()(model_densenet)
salida_densenet = Aplanar()(modelo_densenet)

combinado = tf.keras.layers.Concatenate()([output_mobilenet, output_densenet])

x = Normalización por lotes () (fusionado)
x = denso (256, activación = 'relu') (x)
x = Abandono(0.5)(x)
x = Normalización por lotes()(x)
x = denso (128, activación = 'relu') (x)
x = Abandono(0.5)(x)
x = Densa(1, activación = 'sigmoide')(x)
modelo_apilado = tf.keras.models.Model(entradas = capa_entrada, salidas = x)


  • Congelar todas las capas superiores e intermedias para mantener los pesos previamente entrenados y solo entrenar el modelo para la salida después del apilamiento.

La mayoría de los modelos CNN pre-entrenados están entrenados en el imagenet conjunto de datos

  • tf.keras.layers.Concatenate() Concatena las salidas para apilar.
  • stacked_model es el modelo final listo para las predicciones.
Construcción del modelo
                                                                                                               La salida del modelo apilado

Compilación de modelos

Hasta ahora hemos diseñado nuestro modelo, es hora de asignar algunos parámetros de aprendizaje y compilar el modelo.

  • LR = 0.0001
  • optimizador = adam

Estamos probando el optimizador Adam y LR = 0.0001, la pequeña tasa de aprendizaje es el mejor comienzo para el modelo pre-entrenado.

optm = Adam(lr=0.0001) stacked_model.compile(loss='binary_crossentropy', Optimizer=optm, metrics=['accuracy'])

Paso 6 Definición de devoluciones de llamada

Las devoluciones de llamada son una herramienta para un entrenamiento eficiente, pero su uso no es obligatorio y nos da control sobre el entrenamiento.

de keras.callbacks import EarlyStopping,ReduceLROnPlateau EarlyStopping = EarlyStopping(monitor='val_accuracy', min_delta=.01,patient=6, verbose=1, mode='auto',baseline=Ninguno, restore_best_weights=True)

EarlyStopping: Detiene el entrenamiento si el modelo no obtiene mejores resultados después de algunas épocas.

rlr = ReduceLROnPlateau( monitor="val_accuracy", factor=0.01, paciencia=6, detallado=0, modo="max", min_delta=0.01)

ReduceLROnPlateau Reduce la tasa de aprendizaje (LR) si el modelo no mejora.

model_save = ModelCheckpoint('./stacked_model.h5', save_best_only = True, save_weights_only = False, monitor = 'val_loss', mode = 'min', detallado = 1)

ModelCheckpoint : guarda el modelo en varias épocas.

Paso 7 Entrenamiento

Ahora que estamos listos con el modelo y los datos, es hora de comenzar el entrenamiento.

nb_tren_muestras = 5216 # número de muestras de entrenamiento
nb_validación_muestras = 16 # número de muestras de validación
nb_test_muestras = 624 # número de muestras de entrenamiento
épocas = 20 tamaño_lote = 16

Formación

stacked_history = stacked_model.fit(train_generator, pasos_por_epoch = nb_train_samples // tamaño_lote, épocas = 20, validation_data = test_generator, callbacks=[EarlyStopping, model_save,rlr])
Formación | Compilación de modelos
                                                                                                                       Fuente: Author
  • maximum val_accuracy La precisión máxima que tenemos es 93% y la pérdida es .18 la pérdida mínima. El modelo y el entrenamiento se pueden mejorar aún más mediante el ajuste fino y el apilamiento de algunos modelos más densos.

Paso 8 Prueba del modelo

Al probar el rendimiento del modelo mediante la creación de una función de predicción, se ingresa una imagen y el nombre del modelo y se indica si se trata de una radiografía normal o una radiografía neumónica.

def procesar_imagen(imagen): imagen = imagen/255 imagen = cv2.resize(imagen, (224,224)) devolver imagen

La función preprocess_image() toma la matriz de imágenes y la normaliza dividiéndola por 255 y redimensionándola a (224,224).

def predecir(ruta_de_imagen, modelo): im = cv2.imread(ruta_de_imagen) imagen_de_prueba = np.asarray(im) imagen_de_prueba_procesada = imagen_de_proceso(imagen_de_prueba) imagen_de_prueba_procesada = np.expand_dims(imagen_de_prueba_procesada, eje = 0) ps = model.predict(imagen_de_prueba_procesada) volver pd

La funciónpredict() ingresa la ruta de la imagen image_path y modelo y predicción de retornos.

de sklearn.metrics import Classification_report,confusion_matrix

de la imagen de importación PIL

prueba de definición (modelo, test_df):
base_pred=[]
para la imagen in prueba_df.img_ruta:
base_pred.append(predecir(imagen, modelo)[0][0])

final_base_pred = np.where(np.array(base_pred)>0.5,1,0)
etiqueta_actual = test_df['etiqueta']
# imprimir(final_base_pred)

imprimir (informe_clasificación (etiqueta_real, base_pred_final))
matriz=confusion_matrix(actual_label, final_base_pred)
sb.heatmap(matriz,cuadrado=Verdadero, annot=Verdadero, fmt='d', cbar=Falso,
xticklabels=['0', '1'],
yticklabels=['0', '1'])
plt.xlabel('Etiqueta prevista')
plt.ylabel('Etiqueta verdadera')


La funcióntesting() se hace para devolver la matriz de confusión y el informe de entrenamiento para una mejor comprensión del rendimiento de nuestro modelo.

pruebas (modelo_apilado, prueba_df)
Pruebas
                                                                                                                             Fuente: Author

Matriz de confusión

Matriz de confusión
                                                                                                                    Fuente: Author

Conclusión

En este artículo, discutimos la implementación del modelo apilado preentrenado para nuestra segregación de imágenes de rayos X. Discutimos el funcionamiento del generador de datos de imagen, y usando API funcional construimos nuestro modelo y usando devoluciones de llamada lo hemos entrenado.

Lista de verificación

  • El modelo apilado que entrenamos tiene la pérdida más baja en 20 épocas y la precisión de validación más alta
  • Puedes probar (CLAHE y normalización) para una mayor precisión.
  • Apilar varios modelos con una arquitectura más densa puede prometer un mejor resultado.

Espero que les haya gustado mi artículo sobre el modelo apilado preentrenado. Siéntase libre de golpearme LinkedIn si tienes algo que preguntar.

Los medios que se muestran en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor. 

punto_img

Información más reciente

punto_img