Pas encore de compte ?
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
Copyright (c) 2021 Panostam
L'ensemble de données doit être téléchargé à partir de Kaggle : Chest X-Ray Images (Pneumonia)
Visualiser l'ensemble de données.
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é.
Afficher un échantillon des prédictions du modèle.
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