Logo elodees  elodees

Une IA bien-veillante pour un monde meilleur













Seuls les caractères alphabétiques accentués ou non ainsi que l'espace sont acceptés

Logo IA




Détection des maladies thoraciques à l'aide de CNN





Pas encore de compte ?

Inscrivez-vous pour accéder à tous les contenus




Testé sous Anaconda et Python 3.7

import os
import cv2
import numpy as np
from tensorflow.keras import layers, optimizers
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.layers import Input, Dense, Flatten, AveragePooling2D, Dropout
from tensorflow.keras.models import Model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
import matplotlib.pyplot as plt
import seaborn as sns
 
XRay_Directory = r"Dataset"
 
os.listdir(XRay_Directory)
 
image_generator = ImageDataGenerator(rescale = 1./255, validation_split= 0.2)
 
train_generator = image_generator.flow_from_directory(batch_size = 40, directory= XRay_Directory, shuffle= True, target_size=(256,256), class_mode= 'categorical', subset="training")
 
validation_generator = image_generator.flow_from_directory(batch_size = 40, directory= XRay_Directory, shuffle= True, target_size=(256,256), class_mode = 'categorical', subset="validation")
 
train_images, train_labels = next(train_generator)
 
print(train_images.shape)
 
print(train_labels.shape)
 
label_names = {0 : 'Covid-19', 1 : 'Normal' , 2: 'Viral Pneumonia', 3 : 'Bacterial Pneumonia'}
 
L = 6
W = 6
 
fig, axes = plt.subplots(L, W, figsize = (12, 12))
axes = axes.ravel()
 
for i in np.arange(0, L * W):
    axes[i].imshow(train_images[i])
    axes[i].set_title(label_names[np.argmax(train_labels[i])])
    axes[i].axis('off')
 
plt.subplots_adjust(wspace = 0.5)
plt.show()
 
basemodel = ResNet50(weights = 'imagenet', include_top = False, input_tensor = Input(shape=(256,256,3)))
 
basemodel.summary()
 
for layer in basemodel.layers[:-10]:
  layers.trainable = False
 
#Use pretrained model
headmodel = basemodel.output
#Add average pooling layer
headmodel = AveragePooling2D(pool_size = (4,4))(headmodel)
#Add flattening layer
headmodel = Flatten(name= 'flatten')(headmodel)
# Add dense layer with 256 neurons and apply relu activation function
headmodel = Dense(256, activation = "relu")(headmodel)
#Drop 30% of the neurons to avoid Codependency
headmodel = Dropout(0.3)(headmodel)
# Add dense layer with 256 neurons and apply relu activation function
headmodel = Dense(256, activation = "relu")(headmodel)
#Drop 30% of the neurons to avoid Codependency
headmodel = Dropout(0.3)(headmodel)
# Add dense layer with 256 neurons and apply relu activation function
headmodel = Dense(256, activation = "relu")(headmodel)
#Drop 30% of the neurons to avoid Codependency
headmodel = Dropout(0.3)(headmodel)
#Add final dense layer with 4 outputs and apply softmax activation function
headmodel = Dense(4, activation = 'softmax')(headmodel)
 
model = Model(inputs = basemodel.input, outputs = headmodel)
 
model.compile(loss = 'categorical_crossentropy', optimizer=optimizers.RMSprop(lr = 1e-4, decay = 1e-6), metrics= ["accuracy"])
 
earlystopping = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=20)
 
checkpointer = ModelCheckpoint(filepath="weights.hdf5", verbose=1, save_best_only=True)
 
train_generator = image_generator.flow_from_directory(batch_size = 4, directory= XRay_Directory, shuffle= True, target_size=(256,256), class_mode= 'categorical', subset="training")
 
val_generator = image_generator.flow_from_directory(batch_size = 4, directory= XRay_Directory, shuffle= True, target_size=(256,256), class_mode= 'categorical', subset="validation")
 
history = model.fit(train_generator, steps_per_epoch= train_generator.n // 4, epochs = 25, validation_data= val_generator, validation_steps= val_generator.n // 4, callbacks=[checkpointer, earlystopping])
 
print(history.history.keys())
 
plt.plot(history.history['acc'])
plt.plot(history.history['loss'])
plt.xlabel('Epochs')
plt.ylabel('Training accuracy and loss')
 
plt.show()
 
plt.plot(history.history['val_loss'])
plt.xlabel('Epochs')
plt.ylabel('Validation loss')
 
plt.show()
 
plt.plot(history.history['val_acc'])
plt.xlabel('Epochs')
plt.ylabel('Validation accuracy')
 
plt.show()
 
test_directory =r"Test"
 
test_gen=ImageDataGenerator(rescale=1./255)
test_generator=test_gen.flow_from_directory(batch_size=40,directory=test_directory,shuffle=True,target_size=(256,256),class_mode='categorical')
 
evaluate=model.evaluate(test_generator,steps=test_generator.n //4, verbose=1)
 
print('Accuracy Test: {}'.format(evaluate[1]))
 
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score
 
prediction = []
original = []
image = []
 
for i in range(len(os.listdir(test_directory))):
  for item in os.listdir(os.path.join(test_directory,str(i))):
    img= cv2.imread(os.path.join(test_directory,str(i),item))
    img = cv2.resize(img,(256,256))
    image.append(img)
    img = img / 255
    img = img.reshape(-1,256,256,3)
    predict = model.predict(img)
    predict = np.argmax(predict)
    prediction.append(predict)
    original.append(i)
 
score=accuracy_score(original,prediction)
print('Test Accuracy: {}'.format(score))
 
print(classification_report(np.asarray(original),np.asarray(prediction)))
 
cm = confusion_matrix(np.asarray(original), np.asarray(prediction))
ax = plt.subplot()
sns.heatmap(cm, annot = True, ax = ax)
 
ax.set_xlabel('Predicted')
ax.set_ylabel('Original')
ax.set_title('Confusion_matrix')
 
#Development of a 25 picture grid (5x5)
L = 5
W = 5
 
fig, axes = plt.subplots(L, W, figsize = (12, 12))
axes = axes.ravel()
 
for i in np.arange(0, L * W):
    axes[i].imshow(image[i])
    axes[i].set_title('Guess={}\nTrue={}'.format(str(label_names[prediction[i]]), str(label_names[original[i]])))
    axes[i].axis('off')
 
plt.subplots_adjust(wspace = 1.2)
 


Chest_Disease_Detection_Using_CNN

License: MITLicenseMIT  Copyright (c) 2021 Panostam


GitHub



L'ensemble de données doit être téléchargé à partir de Kaggle : Chest X-Ray Images (Pneumonia)



Visualiser l'ensemble de données.



Image gratuite et libre de droits fournie par pexel.com


Importer un modèle ResNet50 pré-formé qui a été formé avec l'ensemble de données Imagenet.
Construire et former le modèle d'apprentissage en profondeur.
Évaluer le modèle d'apprentissage en profondeur entraîné.



Image gratuite et libre de droits fournie par pexel.com

Image gratuite et libre de droits fournie par pexel.com

Image gratuite et libre de droits fournie par pexel.com

Image gratuite et libre de droits fournie par pexel.com


Afficher un échantillon des prédictions du modèle.



Image gratuite et libre de droits fournie par pexel.com












Bienvenu, je m’appelle Eric Soupet et je suis l'administrateur du site elodees.com. elodees.com est un état de l'art de l'Intelligence Artificielle et se veut collaboratif, vous pouvez dès à présent proposer du contenu tels que des articles, des événements, des tutoriels, ... alors n'hésitez pas !

Crédit des images de la plate-forme : Pixabay - Pixabay License | Pexels - Pexels License