# -*- coding: utf-8 -*- """ResNet50.ipynb Automatically generated by Colaboratory. Original file is located at https://colab.research.google.com/drive/1Ztagc2mpxc2YEeFMut7EwFhL8SFY2gAm """ import numpy as np import pandas as pd from PIL import Image import pickle from sklearn.utils import shuffle from sklearn.model_selection import train_test_split from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense import os from tensorflow.keras.applications import ResNet50 from tensorflow.keras.applications.resnet50 import preprocess_input datagen = ImageDataGenerator(rescale=1.0/255.0, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') batch_size = 20 train_data_dir = '/content/drive/MyDrive/BoneFractureDataset/training' validation_data_dir = '/content/drive/MyDrive/BoneFractureDataset/testing' train_generator = datagen.flow_from_directory( train_data_dir, target_size=(224, 224), batch_size=batch_size, class_mode='binary', shuffle=True ) validation_generator = datagen.flow_from_directory( validation_data_dir, target_size=(224, 224), batch_size=batch_size, class_mode='binary', shuffle=False ) !ls /kaggle/input/resnet50-weights/ !stat /kaggle/input/resnet50-weights/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 !wget https://storage.googleapis.com/tensorflow/keras-applications/resnet/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 -P /kaggle/input/resnet50-weights/ !cat /kaggle/input/resnet50-weights/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 !ls -l /kaggle/input/resnet50-weights/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 !wget https://storage.googleapis.com/tensorflow/keras-applications/resnet/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 -P /kaggle/input/resnet50-weights resModel = Sequential() resModel.add(ResNet50( include_top=False, pooling='avg', weights=None, )) resModel.add(Dense(1, activation='sigmoid')) for layer in resModel.layers[0].layers[-50:]: layer.trainable = True from tensorflow.keras.optimizers import Adam from tensorflow.keras.callbacks import ReduceLROnPlateau optimizer = Adam(learning_rate=0.001) reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=3, min_lr=0.0001) resModel.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy']) epochs = 10 history = resModel.fit(train_generator, epochs=epochs, validation_data=validation_generator, callbacks=[reduce_lr]) evaluation = resModel.evaluate(train_generator) print(f"Test Accuracy: {evaluation[1] * 100:.2f}%") initial_epoch = 0 saved_history = { 'loss': history.history['loss'], 'accuracy': history.history['accuracy'], 'val_loss': history.history['val_loss'], 'val_accuracy': history.history['val_accuracy'], } import matplotlib.pyplot as plt from matplotlib.lines import Line2D from matplotlib.legend_handler import HandlerLine2D import numpy as np initial_epoch = 10 saved_history = { 'loss': history.history['loss'], 'accuracy': history.history['accuracy'], 'val_loss': history.history['val_loss'], 'val_accuracy': history.history['val_accuracy'], } !ls /kaggle/working !ls -l /kaggle/working/saved_D201history.npy !find / -name saved_D201history.npy from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, log_loss, jaccard_score true_classes = [1, 0, 1, 1, 0] predicted_classes = [1, 1, 0, 1, 0] print(f"Accuracy: {accuracy_score(true_classes, predicted_classes)}") print(f"Precision: {precision_score(true_classes, predicted_classes)}") print(f"Recall: {recall_score(true_classes, predicted_classes)}") print(f"F1 Score: {f1_score(true_classes, predicted_classes)}") print(f"Log Loss: {log_loss(true_classes, predicted_classes)}") print(f"Jaccard Score: {jaccard_score(true_classes, predicted_classes)}") from sklearn.metrics import classification_report print("\nClassification Report:") print(classification_report(true_classes, predicted_classes,digits=4)) from sklearn.metrics import roc_curve, roc_auc_score import matplotlib.pyplot as plt from matplotlib.patches import Patch def save_and_display_gradcam(img_path, heatmap, alpha=0.7): img = cv2.imread(img_path) img = cv2.resize(img, (299, 299)) heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0])) heatmap = np.uint8(255 * heatmap) heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_PLASMA) superimposed_img = cv2.addWeighted(heatmap, alpha, img, 1 - alpha, 0) plt.figure(figsize=(4, 4)) plt.imshow(cv2.cvtColor(superimposed_img, cv2.COLOR_BGR2RGB)) plt.title('GradCAM', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12}) plt.axis('off') plt.tight_layout() plt.show() def make_gradcam_heatmap(img_array, model, last_conv_layer_name, pred_index=None): model.layers[-1].activation = None grad_model = tf.keras.models.Model( [model.inputs], [model.get_layer(last_conv_layer_name).output, model.output] ) with tf.GradientTape() as tape: last_conv_layer_output, preds = grad_model(img_array) if pred_index is None: pred_index = tf.argmax(preds[0]) class_channel = preds[:, pred_index] grads = tape.gradient(class_channel, last_conv_layer_output) pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2)) last_conv_layer_output = last_conv_layer_output[0] heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis] heatmap = tf.squeeze(heatmap) heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap) return heatmap.numpy() import cv2 abcd = cv2.imread('/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg') plt.imshow(abcd)