데이터 분석/머신러닝

Vision Transformer(ViT) 모델의 예측 결과 영향도 시각화 방법

Family in August 2023. 9. 20. 09:21
반응형


Vision Transformer(ViT) 모델의 예측 결과 영향도 시각화 방법

예측 결과에 영향을 미치는 이미지 영역을 확인하려면 "Attention Maps" 또는 "Saliency Maps"를 생성하는 방법을 사용할 수 있습니다. Vision Transformer 모델에서는 Self-Attention 메커니즘을 사용하기 때문에 이를 활용하여 중요한 이미지 영역을 식별할 수 있습니다. 아래는 일반적인 단계입니다:

Grad-CAM (Gradient-weighted Class Activation Mapping)을 사용하거나 Attention Maps를 시각화하는 방법: 이 방법은 모델의 각 레이어에서의 self-attention 가중치를 시각화하여 모델이 주목하는 이미지 영역을 보여줍니다.

Saliency Maps를 생성하는 방법: 이 방법은 모델의 예측을 위해 어떤 이미지 영역이 중요한지를 확인하는 데 도움이 됩니다. 예를 들어, 입력 이미지의 그래디언트를 계산하고 중요한 영역을 강조하는 Saliency Map을 얻을 수 있습니다.

Attention 헤드를 분석하는 방법: Vision Transformer 모델은 여러 개의 attention 헤드를 가지고 있으며, 각 헤드는 이미지의 다른 부분에 주의를 기울일 수 있습니다. Attention 헤드를 분석하여 어떤 헤드가 어떤 영역에 주의를 기울이는지 확인할 수 있습니다.

이러한 시각화 도구와 기술을 사용하여 모델의 예측 결과에 영향을 크게 미치는 이미지 영역을 확인하고 모델의 작동 방식을 더 잘 이해할 수 있습니다.

모델의 영향을 미치는 부분을 시각화하기 위해 Grad-CAM (Gradient-weighted Class Activation Mapping) 기술을 사용하는 예제 코드입니다. 이 코드는 PyTorch를 기반으로 작성되었습니다.

먼저, 필요한 라이브러리를 설치해야 합니다:


pip install transformers torch torchvision



그런 다음, 다음과 같은 예제 코드를 사용하여 모델의 영향을 미치는 이미지 영역을 시각화할 수 있습니다:


import torch
from transformers import AutoFeatureExtractor, AutoModelForSequenceClassification, AutoTokenizer
from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt

# 모델, 토크나이저 및 이미지 전처리기를 로드합니다.
model_name = "모델 이름"  # 사용하려는 모델의 이름으로 바꾸세요.
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
feature_extractor = AutoFeatureExtractor.from_pretrained(model_name)

# 이미지를 불러오고 전처리합니다.
image_path = "이미지 파일 경로"  # 시각화할 이미지의 경로로 바꾸세요.
image = Image.open(image_path)
image = feature_extractor(images=image, return_tensors="pt")

# 모델의 예측을 수행합니다.
outputs = model(**image)
logits = outputs.logits
predicted_class = torch.argmax(logits, dim=1).item()

# Grad-CAM을 계산합니다.
target_layer = model.base_model.encoder.layer[-1]  # 모델의 원하는 레이어를 선택합니다.
grad_cam = GradCAM(model=model.base_model, target_layer=target_layer)

# Grad-CAM을 생성합니다.
cam = grad_cam(input_tensor=image.pixel_values, target_class=predicted_class)

# 원본 이미지를 가져옵니다.
original_image = Image.open(image_path)

# Grad-CAM을 원본 이미지와 합성하여 시각화합니다.
heatmap, result = overlay_gradcam(original_image, cam)
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(heatmap)
plt.title("Grad-CAM Heatmap")
plt.subplot(1, 2, 2)
plt.imshow(result)
plt.title(f"Predicted Class: {predicted_class}")
plt.show()


ViT 모델은 layer 접근 방법이 다르므로 아래의 방법을 사용해야 합니다.


import torch
from transformers import AutoFeatureExtractor, AutoModelForImageClassification, AutoTokenizer
from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

# 모델, 토크나이저 및 이미지 전처리기를 로드합니다.
model_name = "모델 이름"  # 사용하려는 모델의 이름으로 바꾸세요.
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForImageClassification.from_pretrained(model_name)
feature_extractor = AutoFeatureExtractor.from_pretrained(model_name)

# 이미지를 불러오고 전처리합니다.
image_path = "이미지 파일 경로"  # 시각화할 이미지의 경로로 바꾸세요.
image = Image.open(image_path)
inputs = feature_extractor(images=image, return_tensors="pt")

# 모델의 예측을 수행합니다.
outputs = model(**inputs)
logits = outputs.logits
predicted_class = torch.argmax(logits, dim=1).item()

# Grad-CAM을 계산합니다.
grads = model.base_model.backbone.grads  # 모델의 백본에서 grads를 얻습니다.

# Grad-CAM을 생성합니다.
weights = torch.mean(grads, dim=(2, 3), keepdim=True)
cam = torch.matmul(weights, grads)

# Grad-CAM을 원본 이미지와 합성하여 시각화합니다.
cam = cam.squeeze(0).numpy()
cam = np.maximum(cam, 0)  # ReLU 활성화
cam = cam / cam.max()  # 정규화

# 원본 이미지를 가져옵니다.
original_image = Image.open(image_path)

# 원본 이미지와 Grad-CAM을 합성하여 시각화합니다.
cam = np.uint8(255 * cam)
heatmap = cv2.applyColorMap(cam, cv2.COLORMAP_JET)
heatmap = Image.fromarray(heatmap)
result = Image.blend(original_image, heatmap, alpha=0.5)

plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(heatmap)
plt.title("Grad-CAM Heatmap")
plt.subplot(1, 2, 2)
plt.imshow(result)
plt.title(f"Predicted Class: {predicted_class}")
plt.show()




위 코드에서는 모델의 예측 클래스에 대한 Grad-CAM Heatmap을 생성하고 원본 이미지와 합성하여 시각화합니다. "모델 이름"과 "이미지 파일 경로"를 실제 모델과 이미지에 맞게 수정하세요. Grad-CAM을 사용하여 모델이 예측을 수행할 때 어떤 이미지 영역에 주의를 기울이는지 시각적으로 확인할 수 있습니다.

반응형