Lind
@Lind (Lind Taylor)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GradCamの実装をkerasでやる際に起きたエラー

解決したいこと

kerasでGradCamをやろうとしたのですが、エラーが起きました。
クラス関数でGradCamを定義して、これを呼び出そうとしたのですが書き方の問題なのでしょうか?
これはどのように解決すれば良いでしょうか?

発生している問題・エラー

NameError                                 Traceback (most recent call last)
/var/folders/f3/m1mtk7qs2j11fp2992z42g880000gn/T/ipykernel_1996/846851547.py in <module>
     60 image = cv2.imread('/Users/tarou/Desktop/grad/trainingdataset_Ei_912_2/train/desease/Ei_koichi_912_desease_1_27.jpg')
     61 image = cv2.resize (image, (64, 64))
---> 62 gradcam = GradCam(model)
     63 cam = gradcam.gradcam_func(image, "activation_3")
     64 cv2.imwrite ('heatmap.jpg', cam)

NameError: name 'GradCam' is not defined

例)

NameError (uninitialized constant World)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

import numpy as np
import cv2

import keras 
from keras import backend as K 
from keras.models import Model 
from keras.utils import tf_utils
from keras.models import load_model
import tensorflow as tf


def main():
    class GradCam:
      def __init__(self, model):
          self.model = load_model("model.h5")  
          print([layer.name for layer in self.model.layers])

      def gradcam_func(self, x, layer_name):  
          X = [np.newaxis, ...]  
   
          if X.type != np.float32:
              X = X.astype('float32')
              X=X/255.
              conv_feature = self.model.get_layer("activation_3").output
              model = Model([self.model.inputs], [conv_feature, self.model.output])
 #配を記録するためにtf.GradientTape()を使う
              with tf.GradientTape() as tape:
 #numpy配列を配を計算するためにtの型に変換する
                X = tf.cast(X, tf.float32)
                conv_feature, outputs = model(X)
 #どのクラスを予測したか
                predicted_class = np.argmax(outputs [0]) 
                class_outputs = outputs[:, predicted_class]
                grads = tape.gradient(class_outputs, conv_feature)

 #平均を取る(GAP)
                weights = K.mean(grads, axis=(0, 1, 2))
                cam = conv_feature @ weights [..., tf.newaxis]
                cam = tf.squeeze(cam)
 #reluに通す
                cam = K.relu(cam)
                cam = cam / K.max(cam)
 #正規化を戻す
                cam = 255. * cam
 #K.evalでnumpy配列にする
                cam = K.eval(cam)
                cam = cam.astype('uint8')
 #カラーマップを作る
                jetcam = cv2.applyColorMap(cam, cv2.COLORMAP_JET)
 #BGRからRGBに変換
                jetcam = cv2.cvtColor(jetcam, cv2.COLOR_BGR2RGB)
                jetcam = cv2.resize(jetcam, (224, 224))
                jetcam = (np.float32 (jetcam) + x / 2) 
                return jetcam

if __name__ == "__main__":
    main() 
    
model = load_model("model.h5")
image = cv2.imread('/Users/tarou/Desktop/grad/trainingdataset_Ei_912_2/train/desease/Ei_koichi_912_desease_1_27.jpg')
image = cv2.resize (image, (64, 64))
gradcam = GradCam(model)
cam = gradcam.gradcam_func(image, "activation_3")
cv2.imwrite ('heatmap.jpg', cam)
   
    


自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

0

No Answers yet.

Your answer might help someone💌