Dieses Mal habe ich GradCAM auf meinem eigenen CNN-Modell implementiert. Ich verwende Google Colaboratory, aber ich denke, es kann lokal oder in einem Jupyter-Notizbuch verwendet werden.
Das CNN-Modell wird AlexNet sein, das mit Keras implementiert und trainiert wurde.
Da es sich bei dem Bild um das Bild handelt, das in der eigentlichen Forschung verwendet wird, kann es nicht veröffentlicht werden. Lesen Sie es daher entsprechend der Umgebung, wenn Sie darauf verweisen möchten.
Was ist Grad-CAM überhaupt? Wer ist Wo auf dem Bild sieht Deep Learning aus! ?? Überprüfen Sie den Unterschied zwischen "Oshiyaki" und "Pizza" mit CNN Bitte schauen Sie sich den Artikel genauer an.
――Ich weiß, dass es Grad-CAM gibt, aber wie implementieren Sie es tatsächlich? Menschen, die sind
> RuntimeError: tf.gradients is not supported when eager execution is enabled. Use tf.GradientTape instead.
Überprüfen Sie die Version, bevor Sie mit der Implementierung fortfahren Geben Sie den folgenden Code in die Zelle ein und überprüfen Sie die Version
import tensorflow as tf
import keras
print('tensorflow version: ', tf.__version__)
print('keras version: ', keras.__version__)
tensorflow version: 2.3.0
keras version: 2.4.3
Lassen Sie uns zuerst tun, was wir brauchen Hängen Sie das Google-Laufwerk mit dem Befehl ↓ ein.
from google.colab import drive
drive.mount('/content/drive')
Definieren Sie den Pfad des aktuellen Verzeichnisses, um das Bild oder Modell zu laden. Bitte ändern Sie das folgende My Drive entsprechend Ihrer Umgebung.
current_directory_path = '/content/drive/My Drive/Research/AlexNet/'
Importieren Sie die erforderlichen Module
import numpy as np
import cv2
#Für Bilder
from keras.preprocessing.image import array_to_img, img_to_array, load_img
#Zum Laden von Modellen
from keras.models import load_model
#Für die Grad-CAM-Berechnung
from tensorflow.keras import models
import tensorflow as tf
Definition der Konstante Bitte ändern Sie auch hier entsprechend Ihrer Umgebung.
IMAGE_SIZE = (32, 32)
Methode zur Berechnung von Grad-CAM
def grad_cam(input_model, x, layer_name):
"""
Args:
input_model(object):Modellobjekt
x(ndarray):Bild
layer_name(string):Der Name der Faltungsschicht
Returns:
output_image(ndarray):Farbiges Bild des Originalbildes
"""
#Bildvorverarbeitung
#Da nur ein Bild gelesen werden muss, muss der Modus erhöht werden..Ich kann es nicht vorhersagen
X = np.expand_dims(x, axis=0)
preprocessed_input = X.astype('float32') / 255.0
grad_model = models.Model([input_model.inputs], [input_model.get_layer(layer_name).output, input_model.output])
with tf.GradientTape() as tape:
conv_outputs, predictions = grad_model(preprocessed_input)
class_idx = np.argmax(predictions[0])
loss = predictions[:, class_idx]
#Berechnen Sie den Gradienten
output = conv_outputs[0]
grads = tape.gradient(loss, conv_outputs)[0]
gate_f = tf.cast(output > 0, 'float32')
gate_r = tf.cast(grads > 0, 'float32')
guided_grads = gate_f * gate_r * grads
#Mitteln Sie die Gewichte und multiplizieren Sie sie mit der Ausgabe der Ebene
weights = np.mean(guided_grads, axis=(0, 1))
cam = np.dot(output, weights)
#Skalieren Sie das Bild auf die gleiche Größe wie das Originalbild
cam = cv2.resize(cam, IMAGE_SIZE, cv2.INTER_LINEAR)
#Anstelle von ReLU
cam = np.maximum(cam, 0)
#Wärmekarte berechnen
heatmap = cam / cam.max()
#Pseudofarbige monochrome Bilder
jet_cam = cv2.applyColorMap(np.uint8(255.0*heatmap), cv2.COLORMAP_JET)
#In RGB konvertieren
rgb_cam = cv2.cvtColor(jet_cam, cv2.COLOR_BGR2RGB)
#Kombiniert mit dem Originalbild
output_image = (np.float32(rgb_cam) + x / 2)
return output_image
Laden Sie zunächst das Modell und das Bild. Bitte passen Sie jeden Durchgang an Ihre Umgebung an.
model_path = current_directory_path + '/model.hdf5'
image_path = current_directory_path + '/vis_images/1/2014_04_1_3.png'
model = load_model(model_path)
x = img_to_array(load_img(image_path, target_size=IMAGE_SIZE))
Überprüfen Sie, ob das geladene Bild übereinstimmt.
array_to_img(x)
Berechnen Sie Grad-CAM
target_layer = 'conv_filter5'
cam = grad_cam(model, x, target_layer)
Überprüfen Sie das berechnete Bild.
array_to_img(cam)
Dieses Mal habe ich versucht, Grad-CAM mit Google Colaboratory zu implementieren. Ich hoffe, es hilft Menschen, die unter der Tensorflow-Version gelitten haben.
Ich liege hier falsch! Wenn es so etwas gibt, lass es mich wissen!
Wo auf dem Bild sieht Deep Learning aus! ?? Überprüfen Sie den Unterschied zwischen "Oshiyaki" und "Pizza" mit CNN Grad CAM implementation with Tensorflow 2
Recommended Posts