resnet50で転移学習したモデルを用い、gradcamで注視領域可視化を行っています。
ほとんどの画像の注視領域の可視化が可能ですが、3割程度以下のエラーメッセージ表示されたときのみほぼ元画像のまま出力されました。
他のサイト等も参考にさせていただきましたが、どうにも解決の糸口が見つかりません。
原因などわかる方教えていただけますでしょうか。
発生している問題・エラーメッセージ
2021-05-22 20:13:33.296281: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_10.dll 2021-05-22 20:13:33.498016: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll 2021-05-22 20:13:34.344031: W tensorflow/stream_executor/gpu/redzone_allocator.cc:312] Internal: Invoking GPU asm compilation is supported on Cuda non-Windows platforms only Relying on driver to perform ptx compilation. This message will be only logged once. gradcam.py:63: RuntimeWarning: invalid value encountered in true_divide cam = cam / cam.max()
該当のソースコード
python
1# coding:utf-8 2 3import pandas as pd 4import numpy as np 5import cv2 6from keras import backend as K 7from tensorflow.keras import backend as k 8from keras.preprocessing.image import array_to_img, img_to_array, load_img 9from keras.models import load_model 10import config 11from prepare_data import generate_datasets 12from train import get_model 13 14K.set_learning_phase(1) #set learning phase 15 16 17 18def Grad_Cam(input_model, x, layer_name): 19 ''' 20 Args: 21 input_model: モデルオブジェクト 22 x: 画像(array) 23 layer_name: 畳み込み層の名前 24 25 Returns: 26 jetcam: 影響の大きい箇所を色付けした画像(array) 27 28 ''' 29 30 # 前処理 31 X = np.expand_dims(x, axis=0) 32 33 X = X.astype('float32') 34 preprocessed_input = X / 255.0 35 36 37 # 予測クラスの算出 38 39 predictions = model.predict(preprocessed_input) 40 class_idx = np.argmax(predictions[0]) 41 class_output = model.output[:, class_idx] 42 43 44 # 勾配を取得 45 46 conv_output = model.get_layer(layer_name).output # layer_nameのレイヤーのアウトプット 47 grads = K.gradients(class_output, conv_output)[0] # gradients(loss, variables) で、variablesのlossに関しての勾配を返す 48 gradient_function = K.function([model.input], [conv_output, grads]) # model.inputを入力すると、conv_outputとgradsを出力する関数 49 50 output, grads_val = gradient_function([preprocessed_input]) 51 output, grads_val = output[0], grads_val[0] 52 53 # 重みを平均化して、レイヤーのアウトプットに乗じる 54 weights = np.mean(grads_val, axis=(0, 1)) 55 cam = np.dot(output, weights) 56 57 58 # 画像化してヒートマップにして合成 59 60 cam = cv2.resize(cam, (224, 224), cv2.INTER_LINEAR) # 画像サイズは200で処理したので 61 cam = np.maximum(cam, 0) 62 cam = cam / cam.max() 63 64 jetcam = cv2.applyColorMap(np.uint8(255 * cam), cv2.COLORMAP_JET) # モノクロ画像に疑似的に色をつける 65 jetcam = cv2.cvtColor(jetcam, cv2.COLOR_BGR2RGB) # 色をRGBに変換 66 jetcam = (np.float32(jetcam) + x / 2) # もとの画像に合成 67 68 return jetcam 69 70model = load_model("./saved_model/model_15.hdf5") 71model.summary() 72x = img_to_array(load_img('./dataset/test/6.jpg', target_size=(224,224))) 73array_to_img(x) 74 75image = Grad_Cam(model, x, 'res5c_branch2c') 76array_to_img(image) 77 78cv2.imwrite("./product/model15/gradcam6.jpg", image)
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー