Тепловая карта Grad CAM
Не знаю, как исправить ошибку. Указываю последний сверточный слой (точно последний, вывод в консоль), но все равно получаю ошибку
def generate_heatmap(image_path, prediction):
global result_image_path
img = cv2.imread(image_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_resized = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
img_array = preprocess_image(image_path)
last_conv_layer = model.get_layer("conv2d_2")
grad_model = tf.keras.models.Model([model.inputs], [last_conv_layer.output, model.output])
with tf.GradientTape() as tape:
conv_output, predictions = grad_model(img_array)
class_channel = predictions[:, 0]
grads = tape.gradient(class_channel, conv_output)
pooled_grads = K.mean(grads, axis=(0, 1, 2))
conv_output = conv_output.numpy()[0]
pooled_grads = pooled_grads.numpy()
for i in range(conv_output.shape[-1]):
conv_output[:, :, i] *= pooled_grads[i]
heatmap = np.mean(conv_output, axis=-1)
heatmap = np.maximum(heatmap, 0)
heatmap = heatmap / np.max(heatmap)
heatmap = cv2.resize(heatmap, (img_resized.shape[1], img_resized.shape[0]))
heatmap = np.uint8(255 * heatmap)
heatmap_colored = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
superimposed_img = cv2.addWeighted(img_resized, 0.7, heatmap_colored, 0.3, 0)
if prediction > 0.9:
plt.title(f"Предполагаемая пневмония \nВероятность - {prediction * 100:.2f}%")
result_image_path = "result_pneumonia_heatmap.jpg"
else:
plt.title("Патология не обнаружена")
result_image_path = "result_no_pneumonia_heatmap.jpg"
plt.imshow(superimposed_img)
plt.axis("off")
plt.savefig(result_image_path)
plt.show()
и вот сама ошибка
Traceback (most recent call last):
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2544.0_x64__qbz5n2kfra8p0\Lib\tkinter\__init__.py", line 1967, in __call__
return self.func(*args)
^^^^^^^^^^^^^^^^
File "c:\Users\usr\Desktop\diplom\main.py", line 115, in analyze_xray
generate_heatmap(image_path, prediction)
File "c:\Users\usr\Desktop\diplom\main.py", line 55, in generate_heatmap
grad_model = tf.keras.models.Model([model.inputs], [last_conv_layer.output, model.output])
^^^^^^^^^^^^
File "C:\Users\usr\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\keras\src\ops\operation.py", line 266, in output
return self._get_node_attribute_at_index(0, "output_tensors", "output")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\usr\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\keras\src\ops\operation.py", line 285, in _get_node_attribute_at_index
raise AttributeError(
AttributeError: The layer sequential has never been called and thus has no defined output.