[PYTHON] Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren

Einführung

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?

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.

Zielgruppe

――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.

Ausführung

Ü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__)

Ausführungsergebnis

tensorflow version:  2.3.0
keras version:  2.4.3

Implementierung

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

Berechnen Sie Grad-CAM

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)

abschließend

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!

Referenz

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

Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe versucht, PCANet zu implementieren
Ich berührte Tensorflow und Keras
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, mit VOICEROID2 2 automatisch zu lesen und zu speichern
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit VOICEROID2 automatisch zu lesen und zu speichern
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, SSD jetzt mit PyTorch zu implementieren (Dataset)
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
Ich habe versucht, eine einfache Bilderkennungs-API mit Fast API und Tensorflow zu erstellen
Ich habe versucht, Deep VQE zu implementieren
Ich habe versucht, eine kontroverse Validierung zu implementieren
Ich habe versucht, Realness GAN zu implementieren
Ich habe versucht, mit Quantx eine Linie mit gleitendem Durchschnitt des Volumens zu implementieren
Ich habe versucht, Überlebende der Titanic mit Kaggle vorherzusagen und einzureichen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, mit Quantx einen Ausbruch (Typ der Täuschungsvermeidung) zu implementieren
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe versucht, Harry Potters Gruppierungshut mit CNN umzusetzen
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, SSD jetzt mit PyTorch zu implementieren (Modellversion)
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, die Lesezeichen zu visualisieren, die mit Doc2Vec und PCA nach Slack fliegen
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
Vergleichen Sie rohen TensorFlow mit tf.contrib.learn und Keras
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, die Satzklassifizierung durch Self Attention mit PyTorch zu implementieren
Ich habe versucht, PPO in Python zu implementieren
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Ich habe versucht, TSP mit QAOA zu lösen
[Deep Learning von Grund auf neu] Ich habe versucht, Sigmoid Layer und Relu Layer zu implementieren
Ich habe versucht, datetime <-> string mit tzinfo mit strftime () und strptime () zu konvertieren.
Ich habe versucht, den Winkel von Sin und Cos mit Chainer zu lernen
Ich habe das VGG16-Modell mit Keras implementiert und versucht, CIFAR10 zu identifizieren
Ich habe versucht, die Netzwerkbandbreite und -verzögerung mit dem Befehl tc zu steuern
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe DCGAN implementiert und versucht, Äpfel zu generieren
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe mit TensorFlow eine nicht negative Matrixzerlegung (NMF) versucht
Ich habe versucht, mit PartiQL und MongoDB verbunden zu spielen
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren