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