Download DenseNet/DenseNet.py from umaradnaan/deeplearning: direct link, hf CLI and curl.
- Browser
- Download file 25.6 kB
-
https://huggingface.co/umaradnaan/deeplearning/resolve/main/DenseNet/DenseNet.py
- Command line
-
hf download hf://umaradnaan/deeplearning/DenseNet/DenseNet.py
-
curl -L -o DenseNet.py https://huggingface.co/umaradnaan/deeplearning/resolve/main/DenseNet/DenseNet.py
25.6 kB
| # -*- coding: utf-8 -*- | |
| """DenseNet.ipynb | |
| Automatically generated by Colaboratory. | |
| Original file is located at | |
| https://colab.research.google.com/drive/1puXj_yhdhVZAi2D2P1mpDlDvccwU_63N | |
| """ | |
| import tensorflow as tf | |
| from tensorflow.keras import Input | |
| from tensorflow.keras.applications.densenet import DenseNet121, DenseNet169, DenseNet201 | |
| from tensorflow.keras.applications import MobileNetV3Small | |
| from tensorflow.keras.optimizers import Adam | |
| from tensorflow.keras.models import Sequential, Model | |
| from tensorflow.keras.callbacks import ModelCheckpoint | |
| from tensorflow.keras.layers import Dense, GlobalAveragePooling2D | |
| from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Dense, Flatten, Dropout | |
| from tensorflow.keras.preprocessing.image import ImageDataGenerator | |
| from sklearn.model_selection import train_test_split | |
| from sklearn.metrics import classification_report, confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, log_loss, jaccard_score | |
| import numpy as np | |
| import os | |
| from PIL import Image | |
| from shutil import copyfile | |
| import pandas as pd | |
| import seaborn as sns | |
| import matplotlib.pyplot as plt | |
| from google.colab import drive | |
| drive.mount('/content/drive') | |
| train_data_dir = '/content/drive/MyDrive/BoneFractureDataset/training' | |
| test_data_dir = '/content/drive/MyDrive/BoneFractureDataset/training' | |
| validation_data_dir = '/content/drive/MyDrive/BoneFractureDataset/training' | |
| IMG_WIDTH, IMG_HEIGHT = 299, 299 | |
| input_shape = (IMG_WIDTH, IMG_HEIGHT, 3) | |
| train_datagen = ImageDataGenerator(rescale=1./255) | |
| test_datagen = ImageDataGenerator(rescale=1./255) | |
| validation_datagen = ImageDataGenerator(rescale=1./255) | |
| train_datagen_augmented = ImageDataGenerator( | |
| rescale=1./255, | |
| rotation_range=20, | |
| width_shift_range=0.2, | |
| height_shift_range=0.2, | |
| shear_range=0.2, | |
| zoom_range=0.2, | |
| horizontal_flip=True, | |
| vertical_flip=False, | |
| fill_mode='nearest' | |
| ) | |
| train_generator = train_datagen_augmented.flow_from_directory(train_data_dir, target_size=(IMG_WIDTH, IMG_HEIGHT), batch_size=10, class_mode='categorical') | |
| test_datagen_augmented = ImageDataGenerator( | |
| rescale=1./255, | |
| rotation_range=20, | |
| width_shift_range=0.2, | |
| height_shift_range=0.2, | |
| shear_range=0.2, | |
| zoom_range=0.2, | |
| horizontal_flip=True, | |
| vertical_flip=False, | |
| fill_mode='nearest' | |
| ) | |
| test_generator = test_datagen.flow_from_directory(test_data_dir, target_size=(IMG_WIDTH, IMG_HEIGHT), batch_size=8, class_mode='categorical', shuffle=False) | |
| validation_datagen_augmented = ImageDataGenerator( | |
| rescale=1./255, | |
| rotation_range=20, | |
| width_shift_range=0.2, | |
| height_shift_range=0.2, | |
| shear_range=0.2, | |
| zoom_range=0.2, | |
| horizontal_flip=True, | |
| vertical_flip=False, | |
| fill_mode='nearest' | |
| ) | |
| validation_generator = validation_datagen.flow_from_directory(validation_data_dir, target_size=(IMG_WIDTH, IMG_HEIGHT), batch_size=8, class_mode='categorical', shuffle=True) | |
| class_indices = train_generator.class_indices | |
| print(class_indices) | |
| classes = os.listdir(train_data_dir) | |
| for class_name in classes: | |
| class_path = os.path.join(train_data_dir, class_name) | |
| num_images = len(os.listdir(class_path)) | |
| print(f"Class: {class_name}, Number of images: {num_images}") | |
| batch = train_generator.next() | |
| for i in range(len(batch[0])): | |
| img = batch[0][i] | |
| label = batch[1][i] | |
| height, width, channels = img.shape | |
| print(f"Image {i+1} - Shape: {width}x{height}x{channels}, Label: {label}") | |
| classes = os.listdir(test_data_dir) | |
| for class_name in classes: | |
| class_path = os.path.join(test_data_dir, class_name) | |
| num_images = len(os.listdir(class_path)) | |
| print(f"Class: {class_name}, Number of images: {num_images}") | |
| batch = test_generator.next() | |
| for i in range(len(batch[0])): | |
| img = batch[0][i] | |
| label = batch[1][i] | |
| height, width, channels = img.shape | |
| print(f"Image {i+1} - Shape: {width}x{height}x{channels}, Label: {label}") | |
| classes = os.listdir(validation_data_dir) | |
| for class_name in classes: | |
| class_path = os.path.join(validation_data_dir, class_name) | |
| num_images = len(os.listdir(class_path)) | |
| print(f"Class: {class_name}, Number of images: {num_images}") | |
| batch = validation_generator.next() | |
| for i in range(len(batch[0])): | |
| img = batch[0][i] | |
| label = batch[1][i] | |
| height, width, channels = img.shape | |
| print(f"Image {i+1} - Shape: {width}x{height}x{channels}, Label: {label}") | |
| print("GPU is", "available" if tf.config.list_physical_devices('GPU') else "NOT available") | |
| if tf.config.list_physical_devices('GPU'): | |
| tf.config.experimental.set_memory_growth(tf.config.list_physical_devices('GPU')[0], True) | |
| print("GPU device configured") | |
| else: | |
| print("No GPU device found") | |
| from tensorflow.keras.callbacks import ModelCheckpoint | |
| model_dir = '/kaggle/working/Checkpoints_densenet201' | |
| if not os.path.exists(model_dir): | |
| os.makedirs(model_dir) | |
| checkpoint_path = model_dir + '/cp.ckpt' | |
| checkpoint_dir = os.path.dirname(checkpoint_path) | |
| cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path, save_weights_only=True, save_best_only=True, monitor="val_accuracy", mode="max", verbose=1) | |
| checkpoint_path | |
| from tensorflow.keras import models, layers, optimizers | |
| def create_model(summary=True): | |
| new_input = Input(shape=(IMG_WIDTH, IMG_HEIGHT, 3)) | |
| base_model = DenseNet201(weights='imagenet', include_top=False, input_tensor=new_input) | |
| flat1 = Flatten()(base_model.layers[-1].output) | |
| output = Dense(2, activation='softmax')(flat1) | |
| model = Model(inputs=base_model.inputs, outputs=output) | |
| model.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=['accuracy']) | |
| if summary: | |
| print(model.summary()) | |
| return model | |
| model = create_model() | |
| history = model.fit(train_generator, steps_per_epoch=20, epochs=20, validation_data=validation_generator, validation_steps=25, callbacks=[cp_callback]) | |
| evaluation = model.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'], | |
| } | |
| np.save("/kaggle/working/saved_D201history.npy", saved_history) | |
| latest_checkpoint = tf.train.latest_checkpoint(checkpoint_dir) | |
| print(latest_checkpoint) | |
| if latest_checkpoint is not None: | |
| loaded_model = create_model(summary=True) | |
| status = loaded_model.load_weights(latest_checkpoint) | |
| status.expect_partial() | |
| else: | |
| print("No checkpoint file found in the specified directory.") | |
| previous_history = np.load("/kaggle/working/saved_D201history.npy", allow_pickle=True).item() | |
| initial_epoch = len(previous_history['loss']) | |
| print(initial_epoch) | |
| loaded_model.compile(optimizer=Adam(learning_rate=1e-5), loss=tf.keras.losses.BinaryCrossentropy(), metrics=['accuracy']) | |
| new_history = loaded_model.fit( | |
| train_generator, | |
| steps_per_epoch=20, | |
| epochs=20, | |
| initial_epoch=initial_epoch, | |
| validation_data=validation_generator, | |
| validation_steps=30, | |
| callbacks=[cp_callback] | |
| ) | |
| import matplotlib.pyplot as plt | |
| from matplotlib.lines import Line2D | |
| from matplotlib.legend_handler import HandlerLine2D | |
| import numpy as np | |
| plt.figure(figsize=(10, 6)) | |
| train_loss, = plt.plot(previous_history['loss'], label='Train Loss', color='blue') | |
| val_loss, = plt.plot(previous_history['val_loss'], label='Validation Loss', color='orange') | |
| train_accuracy, = plt.plot(previous_history['accuracy'], label='Train Accuracy', color='green') | |
| val_accuracy, = plt.plot(previous_history['val_accuracy'], label='Validation Accuracy', color='red') | |
| plt.title('Model Performance during Training', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12},pad=10) | |
| plt.xlabel('No. of Epochs', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12}) | |
| plt.xticks(np.linspace(0, 150, num=16), fontname='Serif', weight='bold') | |
| plt.yticks(np.linspace(0, 5, num=11), fontname='Serif', weight='bold') | |
| plt.xlim(0, 150) | |
| plt.ylim(0, 5) | |
| legend_lines = [ | |
| Line2D([0], [0], color='blue', lw=3), | |
| Line2D([0], [0], color='orange', lw=3), | |
| Line2D([0], [0], color='green', lw=3), | |
| Line2D([0], [0], color='red', lw=3) | |
| ] | |
| plt.legend(legend_lines, ['Train Loss', 'Validation Loss', 'Train Accuracy', 'Validation Accuracy'], | |
| loc='lower center', bbox_to_anchor=(0.5, 1.1), ncol=5, | |
| prop={'family': 'Serif', 'weight': 'bold', 'size': 8}, frameon=False, | |
| handler_map={Line2D: HandlerLine2D(numpoints=5)}) | |
| plt.gca().xaxis.labelpad = 10 | |
| plt.gca().spines['top'].set_visible(False) | |
| plt.gca().spines['right'].set_visible(False) | |
| plt.tight_layout() | |
| plt.show() | |
| latest_checkpoint = tf.train.latest_checkpoint(checkpoint_dir) | |
| print(checkpoint_dir) | |
| if latest_checkpoint is not None: | |
| loaded_model = create_model(summary=True) | |
| status = loaded_model.load_weights(latest_checkpoint) | |
| status.expect_partial() | |
| else: | |
| print("No checkpoint file found in the specified directory.") | |
| loaded_model.compile(optimizer=Adam(learning_rate=1e-3), loss=tf.keras.losses.BinaryCrossentropy(), metrics=['accuracy']) | |
| test_loss, test_acc = loaded_model.evaluate(test_generator) | |
| print(f"Test Accuracy: {test_acc}") | |
| # Commented out IPython magic to ensure Python compatibility. | |
| # %whos | |
| 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)}") | |
| print("\nClassification Report:") | |
| print(classification_report(true_classes, predicted_classes,digits=4)) | |
| conf_matrix = confusion_matrix(true_classes, predicted_classes) | |
| plt.figure(figsize=(6, 4.5)) | |
| custom_palette = sns.color_palette(palette='blend:#7AB,#EDA') | |
| font = {'family': 'Serif', 'weight': 'bold', 'size': 12} | |
| heatmap = sns.heatmap(conf_matrix, annot=True, fmt='d', cmap=custom_palette,vmin=0,vmax=350, | |
| xticklabels=['Fractured', 'Non_fractured'], yticklabels=['Fractured', 'Non_fractured'],annot_kws={"family": "Serif",'weight': 'bold', 'size': 12}) | |
| heatmap.set_xlabel('Predicted Labels', fontdict=font) | |
| heatmap.set_ylabel('True Labels', fontdict=font) | |
| heatmap.set_title('Fracture Classification', fontdict=font, pad=12) | |
| heatmap.set_xticklabels(heatmap.get_xticklabels(), fontname='Serif', fontsize=12) | |
| heatmap.set_yticklabels(heatmap.get_yticklabels(), fontname='Serif', fontsize=12) | |
| cbar = heatmap.collections[0].colorbar | |
| cbar.set_label('Count', fontdict=font) | |
| cbar.ax.tick_params(labelsize=10) | |
| plt.gca().xaxis.labelpad = 10 | |
| plt.tight_layout() | |
| plt.show() | |
| import numpy as np | |
| print(type(true_classes)) | |
| print(type(predictions)) | |
| !pip install scikit-learn | |
| !pip install matplotlib | |
| from sklearn.metrics import roc_curve, roc_auc_score | |
| import matplotlib.pyplot as plt | |
| from matplotlib.patches import Patch | |
| print(type(predictions)) | |
| predictions = np.array(predictions) | |
| 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() | |
| def make_prediction_and_visualize_(): | |
| img_path = '/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg' | |
| img = cv2.imread(img_path) | |
| img = cv2.resize(img, (299, 299)) | |
| rescaled_img = img/255.0 | |
| batch_pred = np.expand_dims(rescaled_img, 0) | |
| last_conv_layer_name = 'conv5_block32_concat' | |
| heatmap = make_gradcam_heatmap(batch_pred, loaded_model, last_conv_layer_name) | |
| save_and_display_gradcam(img_path, heatmap) | |
| make_prediction_and_visualize_() | |
| def save_and_display_gradcam_plusplus(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_plusplus_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_output = preds[:, pred_index] | |
| conv_output = last_conv_layer_output[0] | |
| grads = tape.gradient(class_output, last_conv_layer_output) | |
| pooled_grads = tf.reduce_mean(grads[0], axis=(0, 1, 2)) | |
| last_conv_layer_output = last_conv_layer_output[0] | |
| guided_grads = tf.cast(last_conv_layer_output > 0, 'float32') * grads[0] | |
| weights = tf.reduce_mean(guided_grads, axis=(0, 1)) | |
| heatmap = tf.reduce_sum(tf.multiply(weights, last_conv_layer_output), axis=-1) | |
| heatmap = tf.maximum(heatmap, 0) / tf.reduce_max(heatmap) | |
| return heatmap.numpy() | |
| def make_prediction_and_visualize_gradcam_plusplus(): | |
| img_path = '/content/drive/MyDrive/testing/not_fractured/1-rotated1-rotated1-rotated1-rotated1.jpg' | |
| img = cv2.imread(img_path) | |
| img = cv2.resize(img, (299, 299)) | |
| rescaled_img = img / 255.0 | |
| batch_pred = np.expand_dims(rescaled_img, 0) | |
| last_conv_layer_name = 'conv5_block32_concat' | |
| heatmap = make_gradcam_plusplus_heatmap(batch_pred, loaded_model, last_conv_layer_name) | |
| save_and_display_gradcam_plusplus(img_path, heatmap) | |
| make_prediction_and_visualize_gradcam_plusplus() | |
| def save_and_display_scorecam(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('ScoreCAM', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12}) | |
| plt.axis('off') | |
| plt.tight_layout() | |
| plt.show() | |
| import tensorflow as tf | |
| def make_scorecam_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_output = preds[:, pred_index] | |
| conv_output = last_conv_layer_output[0] | |
| grads = tape.gradient(class_output, last_conv_layer_output) | |
| guided_grads = tf.cast(grads[0] > 0, 'float32') * grads[0] | |
| weights = tf.reduce_mean(guided_grads, axis=(0, 1)) | |
| cam = tf.reduce_sum(tf.multiply(weights, conv_output), axis=-1) | |
| cam = tf.maximum(cam, 0) | |
| cam /= tf.reduce_max(cam) | |
| return cam.numpy() | |
| def make_prediction_and_visualize_scorecam(): | |
| img_path = '/content/drive/MyDrive/BoneFractureDataset/training/fractured/10.jpg' | |
| img = cv2.imread(img_path) | |
| img = cv2.resize(img, (299, 299)) | |
| rescaled_img = img/255.0 | |
| batch_pred = np.expand_dims(rescaled_img, 0) | |
| last_conv_layer_name = 'conv5_block32_concat' | |
| heatmap = make_scorecam_heatmap(batch_pred, loaded_model, last_conv_layer_name) | |
| save_and_display_scorecam(img_path, heatmap) | |
| make_prediction_and_visualize_scorecam() | |
| def save_and_display_faster_scorecam(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('Faster ScoreCAM', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12}) | |
| plt.axis('off') | |
| plt.tight_layout() | |
| plt.show() | |
| def faster_scorecam_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_output = preds[:, pred_index] | |
| conv_output = last_conv_layer_output[0] | |
| grads = tape.gradient(class_output, last_conv_layer_output)[0] | |
| weights = tf.reduce_mean(grads, axis=(0, 1)) | |
| weights = tf.reshape(weights, (1, 1, -1)) | |
| conv_output = tf.expand_dims(conv_output, axis=0) | |
| conv_output = tf.expand_dims(conv_output, axis=-1) | |
| cam = tf.matmul(weights, conv_output) | |
| cam = tf.squeeze(cam) | |
| cam = tf.maximum(cam, 0) | |
| cam /= tf.reduce_max(cam) | |
| return cam.numpy() | |
| def make_prediction_and_visualize_faster_scorecam(): | |
| img_path = '/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg' | |
| img = cv2.imread(img_path) | |
| img = cv2.resize(img, (299, 299)) | |
| rescaled_img = img/255.0 | |
| batch_pred = np.expand_dims(rescaled_img, 0) | |
| last_conv_layer_name = 'conv5_block32_concat' | |
| heatmap = faster_scorecam_heatmap(batch_pred, loaded_model, last_conv_layer_name) | |
| save_and_display_faster_scorecam(img_path, heatmap) | |
| make_prediction_and_visualize_faster_scorecam() | |
| def save_and_display_layercam(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('LayerCAM', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12}) | |
| plt.axis('off') | |
| plt.tight_layout() | |
| plt.show() | |
| import tensorflow as tf | |
| def generate_layercam_heatmap(img_array, model, last_conv_layer_name, target_class_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 target_class_index is None: | |
| target_class_index = tf.argmax(preds[0]) | |
| class_output = preds[:, target_class_index] | |
| conv_output = last_conv_layer_output[0] | |
| grads = tape.gradient(class_output, last_conv_layer_output)[0] | |
| weights = tf.reduce_mean(grads, axis=(0, 1)) | |
| weights = tf.reshape(weights, (1, 1, -1)) | |
| conv_output = tf.expand_dims(conv_output, axis=0) | |
| conv_output = tf.expand_dims(conv_output, axis=-1) | |
| cam = tf.matmul(weights, conv_output) | |
| cam = tf.squeeze(cam) | |
| cam = tf.maximum(cam, 0) | |
| cam /= tf.reduce_max(cam) | |
| return cam.numpy() | |
| def make_prediction_and_visualize_layercam(): | |
| img_path = '/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg' | |
| img = cv2.imread(img_path) | |
| img = cv2.resize(img, (299, 299)) | |
| rescaled_img = img/255.0 | |
| batch_pred = np.expand_dims(rescaled_img, 0) | |
| last_conv_layer_name = 'conv5_block32_concat' | |
| heatmap = generate_layercam_heatmap(batch_pred, loaded_model, last_conv_layer_name) | |
| save_and_display_layercam(img_path, heatmap) | |
| make_prediction_and_visualize_layercam() | |
| def save_and_display_saliency_map(img_path, saliency_map): | |
| img = cv2.imread(img_path) | |
| img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | |
| saliency_map = cv2.resize(saliency_map, (img.shape[1], img.shape[0])) | |
| saliency_map = (saliency_map - saliency_map.min()) / (saliency_map.max() - saliency_map.min()) | |
| heatmap = cv2.applyColorMap(np.uint8(255 * saliency_map), cv2.COLORMAP_JET) | |
| heatmap = cv2.cvtColor(heatmap, cv2.COLOR_BGR2RGB) | |
| alpha = 0.4 | |
| blended = cv2.addWeighted(img, alpha, heatmap, 1 - alpha, 0) | |
| plt.figure(figsize=(4, 4)) | |
| plt.imshow(blended) | |
| plt.title('Vanilla Saliency', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12}) | |
| plt.axis('off') | |
| plt.tight_layout() | |
| plt.show() | |
| def generate_vanilla_saliency_map(img_array, model): | |
| img_tensor = tf.convert_to_tensor(img_array) | |
| img_tensor = tf.expand_dims(img_tensor, axis=0) | |
| with tf.GradientTape() as tape: | |
| tape.watch(img_tensor) | |
| preds = model(img_tensor) | |
| top_pred_index = tf.argmax(preds[0]) | |
| top_class_score = preds[:, top_pred_index] | |
| grads = tape.gradient(top_class_score, img_tensor) | |
| saliency_map = tf.abs(grads) | |
| saliency_map = tf.reduce_max(saliency_map, axis=-1) | |
| return saliency_map[0].numpy() | |
| def make_prediction_and_visualize_vanilla_saliency(): | |
| img_path = '/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg' | |
| img = cv2.imread(img_path) | |
| img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | |
| img = cv2.resize(img, (299, 299)) | |
| img = img / 255.0 | |
| saliency_map = generate_vanilla_saliency_map(img, loaded_model) | |
| save_and_display_saliency_map(img_path, saliency_map) | |
| make_prediction_and_visualize_vanilla_saliency() | |
| def save_and_display_SmoothGrad(img_path, saliency_map): | |
| img = cv2.imread(img_path) | |
| img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | |
| saliency_map = cv2.resize(saliency_map, (img.shape[1], img.shape[0])) | |
| saliency_map = (saliency_map - saliency_map.min()) / (saliency_map.max() - saliency_map.min()) | |
| heatmap = cv2.applyColorMap(np.uint8(255 * saliency_map), cv2.COLORMAP_JET) | |
| heatmap = cv2.cvtColor(heatmap, cv2.COLOR_BGR2RGB) | |
| alpha = 0.4 | |
| blended = cv2.addWeighted(img, alpha, heatmap, 1 - alpha, 0) | |
| plt.figure(figsize=(4, 4)) | |
| plt.imshow(blended) | |
| plt.title('Smooth Grad', fontdict={'family': 'Serif', 'weight': 'bold', 'size': 12}) | |
| plt.axis('off') | |
| plt.tight_layout() | |
| plt.show() | |
| def generate_smoothgrad_saliency_map(img_array, model, n=50, sigma=1.0): | |
| img_tensor = tf.convert_to_tensor(img_array) | |
| img_tensor = tf.expand_dims(img_tensor, axis=0) | |
| img_tensor = tf.cast(img_tensor, dtype=tf.float32) | |
| with tf.GradientTape() as tape: | |
| tape.watch(img_tensor) | |
| preds = model(img_tensor) | |
| top_pred_index = tf.argmax(preds[0]) | |
| top_class_score = preds[:, top_pred_index] | |
| total_gradients = tf.zeros_like(img_tensor) | |
| for _ in range(n): | |
| noise = tf.random.normal(shape=img_tensor.shape, mean=0.0, stddev=sigma) | |
| perturbed_img = img_tensor + noise | |
| with tf.GradientTape() as perturbed_tape: | |
| perturbed_tape.watch(perturbed_img) | |
| perturbed_preds = model(perturbed_img) | |
| perturbed_top_class_score = perturbed_preds[:, top_pred_index] | |
| perturbed_grads = perturbed_tape.gradient(perturbed_top_class_score, perturbed_img) | |
| total_gradients += perturbed_grads | |
| averaged_gradients = total_gradients / n | |
| saliency_map = tf.abs(averaged_gradients) | |
| saliency_map = tf.reduce_max(saliency_map, axis=-1) | |
| return saliency_map[0].numpy() | |
| def make_prediction_and_visualize_smoothgrad_saliency(): | |
| img_path = '/content/drive/MyDrive/BoneFractureDataset/testing/fractured/3.jpg' | |
| img = cv2.imread(img_path) | |
| img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | |
| img = cv2.resize(img, (299, 299)) | |
| img = img / 255.0 | |
| heatmap = generate_smoothgrad_saliency_map(img, loaded_model) | |
| save_and_display_SmoothGrad(img_path, heatmap) | |
| make_prediction_and_visualize_smoothgrad_saliency() | |