[미니 프로젝트] DL 5. Class Activation Map

DongHyeon·2024년 1월 6일
0
post-thumbnail
post-custom-banner

Class Activation Map

CAM(Class Activation Map)은 딥러닝 모델의 특정 클래스에 대한 활성화 정도를 시각화하는 방법 중 하나입니다. 모델에 특정 입력 요소에 대해 얼마나 집중하고 있는 지, 그리고 출력을 생성할 때 어떤 입력을 참고하는 지 이해가능한 각 요소 간의 상호작용을 시각화 하는 것으로 모델의 클래스 별로 활성화 패턴을 시각화 하고 특정 클래스를 판단하기 위해 어떤 부분에 주의를 기울이는 지 확인하고, 마지막 컨볼루션 레이어의 출력을 사용하여 클래스별 가중치를 계산하고 원본 이미지에 적용하는 방식을 사용하여 출력하여 모델의 특성에 대한 통찰력을 향상시킬 수 있습니다.

설계

from torchvision.io.image import read_image
from torchvision.transforms.functional import normalize, resize, to_pil_image
from torchcam.methods import SmoothGradCAMpp
from torchcam.utils import overlay_mask
for i in range (5):
    # 클래스와 이미지 번호 무작위 선택 (5번 시행)
    label = random.choice(['Arborio', 'Basmati', 'Ipsala', 'Jasmine', 'Karacadag'])
    number=random.randint(1,15000)
    # 이미지 읽어오기
    img = read_image("./Rice_Image_Dataset/"+label+"/"+label+" ("+str(number)+").jpg")
    # 이미지 변환(resize 및 정규화)
    input_tensor = normalize(resize(img, (224, 224)) / 255., [0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    # SmoothGrad CAM 적용
    with SmoothGradCAMpp(model) as cam_extractor:
        # 전처리한 데이터 모델에 입력
        out = model(input_tensor.unsqueeze(0))
        # Class Index와 모델 출력을 사용하여 CAM 추출
        activation_map = cam_extractor(out.squeeze(0).argmax().item(), out)
        # CAM 오버레이
        result = overlay_mask(to_pil_image(img), to_pil_image(activation_map[0].squeeze(0), mode='F'), alpha=0.5)
        # 결과 출력
        plt.imshow(result); plt.axis('off'); plt.tight_layout(); plt.title(label+" ("+str(number)+").jpg"); plt.show()

결과

ArborioArborioArborioIpsalaJasmine

위의 사진은 DenseNet의 CAM을 출력한 그림이다. 전반적으론 쌀알 내부를 중요시 보는 경향이 있습니다. 즉, 쌀알의 내부 특징들이 모델의 판단에 큰 영향을 끼치고 있음으로 보입니다. 하지만 자세히 보게되면 쌀알 외부에도 해당 영역이 일부 나타나고 있고, 네트워크에 따라선 가장 중요시 보는 영역이 쌀알 외곽으로 나타나는 경우도 발생하였습니다.
이는 쌀알의 형태를 학습할 때, 테두리나 가장자리에 대해 학습을 할 때, 인간의 시각과는 다르게, 외곽의 검은 영역을 통해 테두리를 학습하는 것으로 외곽의 부분도 일정한 중요성을 부여받았음을 시사합니다.
이렇게 모델이 특정 클래스를 학습할 때, 모델이 주의를 기울이는 부분의 특징에 대하여 표시함으로써, 모델의 동작을 해석하고, 모델의 결정 과정을 이해하는 데 도움을 줍니다.

profile
I'm Free!
post-custom-banner

0개의 댓글