対象読者:CNN の判断根拠を確認したい初学者~中級エンジニア
ゴール:わずか数行のコードで Grad‑CAM を動かし、誤判定解析や説明可能性(XAI)に役立てる。


1. Grad‑CAM とは?

Grad‑CAM(Gradient‑weighted Class Activation Mapping)は、画像分類モデルが どのピクセル領域に注目して予測したかをヒートマップで示す手法。医療画像診断や不良検出など、AI の“説明責任”が求められる場面で多用されます。

ヒートマップでは、赤い部分ほどモデルが強く注目した領域であり、青い部分はあまり関心がなかったことを示します。 以下は Grad-CAM の出力例です。

この例では、犬の顔や身体の中心が赤く強調されており、そこに注目して「犬」と判断していることがわかります。 背景は青く、判断にはほとんど使われていないこともわかります。


2. Google Colab で簡単実装

以下は Grad-CAM を Google Colaboratory 上で試すための完全なサンプルコードです。

!pip install git+https://github.com/jacobgil/pytorch-grad-cam.git

from google.colab import files
uploaded = files.upload()

import torch
from torchvision import models, transforms
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

from pytorch_grad_cam import GradCAM
from pytorch_grad_cam.utils.image import show_cam_on_image
from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget
from torchvision.models import resnet50, ResNet50_Weights

# 画像の読み込みと前処理
url = "do2.jpeg" # アップロードするファイル名に修正してください。
img = Image.open(url).convert('RGB')

# 【前処理】モデルに入力できるサイズにリサイズし、テンソル化
preprocess = transforms.Compose([
    transforms.Resize((224, 224)),   # 入力サイズを固定
    transforms.ToTensor()            # PIL → Tensor に変換
])

input_tensor = preprocess(img).unsqueeze(0)  # shape: (1, 3, 224, 224)
input_image = input_tensor.squeeze().permute(1, 2, 0).numpy()
input_image = input_image / input_image.max()  # 正規化して0〜1にスケーリング

# モデル読み込み
model = resnet50(weights=ResNet50_Weights.IMAGENET1K_V1)
model.eval()

# GradCAM 実行
target_layers = [model.layer4[-1]]
cam = GradCAM(model=model, target_layers=target_layers)
targets = [ClassifierOutputTarget(281)]  # 任意クラス(例: tabby cat)
grayscale_cam = cam(input_tensor=input_tensor, targets=targets)[0]

# ヒートマップ合成と表示
visualization = show_cam_on_image(input_image, grayscale_cam, use_rgb=True)
plt.imshow(visualization)
plt.axis('off')
plt.title("Grad-CAM Visualization")
plt.show()

3. 活用シーン

シナリオGrad‑CAM が役立つ理由
誤分類の原因分析ヒートマップが“見当違い”ならデータやモデル構造を再検討
クライアント説明どこを見て判断したかを図示→信頼性アップ
データセット検証ラベルミスや強いバイアスを早期発見

4. よくある落とし穴と対策

  1. 入力前処理をスキップ → ヒートマップ位置ズレ → モデルと同じ正規化・サイズ に合わせる。
  2. マルチラベルタスクtargets 引数でクラス ID を明示する。
  3. 高解像度画像でボケる → 元画像をリサイズしてからヒートマップをアップサンプリング。

5. 類似・関連可視化手法

手法ひと言特徴どんなとき向く?
CAM (Class Activation Mapping)勾配を使わず、GAP付き CNN の重みでヒートマップ古典的ResNet・GoogLeNet等で実装が簡単
Score‑CAM勾配を使わず、各チャネルの貢献度をスコアで測定勾配がノイズ気味なモデルでも安定
Guided Backprop勾配の正方向のみ通過させ、特徴をピクセル単位で可視化エッジ・細部を確認したいとき
Integrated Gradients入力画像の各ピクセルが予測に与えた影響を“積分”で可視化白黒的な重要度マップが欲しいとき/勾配が不安定なとき
SmoothGrad入力にノイズを加えながら勾配を平均→ノイズの少ないヒートマップにヒートマップがザラついてしまうときに滑らかに可視化したい
LIME / SHAP画像をセグメントでマスク→出力変化を解析モデル非依存で“局所的”説明が可能

選び方のヒント:まずは Grad‑CAM でざっくり可視化 → 細部が気になれば Guided Backprop/Integrated Gradients、モデル非依存なら LIME/SHAP を試すと効率的です。


まとめ

Grad‑CAM はブラックボックスな CNN の“視線”を可視化する最も手軽な XAI ツールです。まずは ImageNet 学習済み ResNet で動かし、ヒートマップを観察するところから始めてみましょう。

投稿者 kojiro777

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です