|
|
|
"""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) |