以下の内容はhttps://touch-sp.hatenablog.com/entry/2025/07/15/235149より取得しました。


色々なCAMを使ってみる

はじめに

今回はこちらの拡張です。
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

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







以上の内容はhttps://touch-sp.hatenablog.com/entry/2025/07/15/235149より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14