はじめに
今回はこちらの拡張です。touch-sp.hatenablog.com
環境
Ubuntu 24.04 on WSL2 Python 3.12.3 CUDA 12.6
環境構築
pip install autogluon pip install git+https://github.com/jacobgil/pytorch-grad-cam
実行
キノコ分類の学習はすでに済ませている前提です。こちらのような学習を行っています。touch-sp.hatenablog.com
こちらのスクリプトを参考にさせてもらいました。
from pytorch_grad_cam import ( GradCAM, ScoreCAM, GradCAMPlusPlus, AblationCAM, XGradCAM, EigenCAM, EigenGradCAM, LayerCAM, #FullGrad ) from pytorch_grad_cam.utils.image import show_cam_on_image, preprocess_image from pytorch_grad_cam.ablation_layer import AblationLayerVit from pytorch_grad_cam.utils.reshape_transforms import swinT_reshape_transform import timm import torch import cv2 import numpy as np # モデルを作成 model = timm.create_model( "swin_large_patch4_window7_224", pretrained=False, num_classes=12 ) # チェックポイントを読み込み checkpoint_path = "second_trained_best/second_trained_model.pth" checkpoint = torch.load(checkpoint_path, map_location="cpu") model.load_state_dict(checkpoint["model_state_dict"], strict=True) model.to("cuda") model.eval() target_layers = [model.layers[-1].blocks[-1].norm2] methods = { "gradcam": GradCAM, "scorecam": ScoreCAM, "gradcam++": GradCAMPlusPlus, "ablationcam": AblationCAM, "xgradcam": XGradCAM, "eigencam": EigenCAM, "eigengradcam": EigenGradCAM, "layercam": LayerCAM, #"fullgrad": FullGrad } for key in methods.keys(): if key == "ablationcam": cam = methods[key]( model=model, target_layers=target_layers, reshape_transform=swinT_reshape_transform, ablation_layer=AblationLayerVit() ) else: cam = methods[key]( model=model, target_layers=target_layers, reshape_transform=swinT_reshape_transform ) image_path = "dataset_20250717/val/Amanita muscaria/2740medium.jpg" rgb_img = cv2.imread(image_path, 1)[:, :, ::-1] rgb_img = cv2.resize(rgb_img, (224, 224)) rgb_img = np.float32(rgb_img) / 255 input_tensor = preprocess_image( rgb_img, mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225] ).to("cuda") grayscale_cam = cam( input_tensor=input_tensor, targets=None, eigen_smooth=True, aug_smooth=True ) grayscale_cam = grayscale_cam[0, :] cam_image = show_cam_on_image(rgb_img, grayscale_cam) cv2.imwrite(f"{key}_cam.jpg", cam_image)
結果
元画像はこちらです。
FullGradだけは実行できませんでした。
GradCAM

ScoreCAM

GradCAM++
これは全くうまくいっていません。
AblationCAM

XGradCAM
これは全くうまくいっていません。
EigenCAM

EigenGradCAM

LayerCAM
これは全くうまくいっていません。