PyTorch 공식 홈페이지의 예제 중에는 Captum 라이브러리를 활용하여 예측 결과를 시각화하는 예제가 있다. 입력으로 사용된 원본 이미지에서 활성화되는 부분을 시각화 하는 것은 모델의 이해를 위해 매우 중요한 작업이다. CAM(Class Activation Map), Grad-CAM 등 부터 근래에 발표된 Integrated Gradient 까지 pixel attribution method 들을 이용하는 것은 이러한 이유라고 볼 수 있다.
페이스북이 개발한 Captum은 PyTorch로 구현된 NLP모델이나 컴퓨터 비전 모델의 예측 결과를 이해하도록 돕는 오픈소스 라이브러리다. 위에서 언급한 pixel attribution method 들을 적용하는 통일된 방법을 제공하기 때문에 pytorch로 구현된 모델이라면 쉽게 활용해 볼 수 있다.
공식홈페이지의 예제는 ImageNet에서 사전훈련된 Resnet 18 분류 모델이 개와 고양이가 있는 사진으로부터 예측을 내놓을 때, 입력 이미지의 어떤 부분을 바라보고 있는 지를 시각화해준다. 사용한 pixel attribution method는 Occlusion 알고리즘이다. 예제 페이지, Captum 공식 페이지를 참조하여 Colab에서 직접 실행해 본 결과에 대한 링크는 아래와 같다.
설치
Captum은 pip 패키지 또는 conda 패키지로 사용할 수 있다.
$ pip install captum
(pytorchEnv)$ conda install captum -c pytorch
예제 설명
예제는 torchvision에서 ImageNet에서 pretrained된 resnet18 모델을 사용해서 예측 결과를 내놓을 때, 해당 예측이 입력 이미지의 어떤 부분으로부터 추론되었는 지를 보여준다.
사용한 이미지는 이미지에는 래브라도 리트리버와 고양이가 담겨있다. torchvision.models.resnet18()을 사용하기 위해 256 x 256 크기로 리사이즈하고, 224 x 224 크기로 center crop하였다. Resnet18 모델은 위 이미지에 대해서 이미지넷 인덱스 208 (래브라도 리트리버)와 283(페르시안 고양이)라는 top-3 예측결과를 내놓는다.
이미지넷의 1000개 클래스에 대한 각각의 레이블을 확인하려면 참고를 이용한다.
예제에서는 283(페르시안 고양이)라고 적혀있는데, 282(얼룩 고양이)가 더 맞지 않나 생각해본다.
Captum은 지원하는 모든 pixel attribution method들을 동일한 메소드로 호출할 수 있도록 해준다. 생성된 객체의 attribute 메소드를 통해 결과를 얻어낼 수 있다. attribute 메소드에서 예제에 필요한 argument에 관한 설명은 다음과 같다.
- inputs : occlusion attribution이 계산될 입력 이미지
- sliding_window_shapes : 알고리즘이 수행되는 단위인 patch( =hyperrectangel)의 크기
- strides : patch가 이동하는 간격
- baselines : 찾으려는 feature가 occluded 되었을 때, 대체하려는 참조 값
- target : 타겟 클랙스의 인덱스
from captum.attr import Occlusion
occlusion = Occlusion(model)
attribution_dog = occlusion.attribute(
inputs = input_img,
sliding_window_shapes = (3, 45, 45),
strides = (3, 9, 9),
target = 208,
baselines = 0)
attribution_cat = occlusion.attribute(
inputs = input_img,
sliding_window_shapes = (3, 45, 45),
strides = (3, 9, 9),
target = 283,
baselines = 0)
Captum에서는 시각화를 위한 함수도 함께 제공하는데, 이 때 적절한 옵션을 선택함으로써 원하는 해석을 얻을 수 있다. visualization 함수는 matplotlib의 figure로서 결과 이미지를 표현해준다. 예제에서는 visualize_image_attr_multiple을 이용해서 히트맵과 원본 이미지를 함께 보여주려고 한다. 다양한 옵션에 대한 설명은 공식 홈페이지나 구현한 Colab 노트북에 설명을 달아 두었다. 이 때, 주목할 점은 heat map에서 positive 옵션을 주면, 찾으려는 target 클래스에 대한 활성화된 속성을 보여주고, negative 옵션을 주면 target 이외의 클래스에 대한 활성을 보여준다는 점이다. all 옵션은 두 결과를 평균해서 보여준다. 실행 결과는 아래와 같다.
attribution_dog = numpy.transpose(
attribution_dog.squeeze().cpu().detach().numpy(), (1,2,0))
_ = catpum.attr.visualization.visualize_image_attr_multiple(
attribution_dog, np.array(input_img),
["heat_map", "heat_map", "heat_map", "original_image"],
["all", "positive", "negative", "all"],
["all heatmap", "positive heatmap", "negative heatmap", "image"],
show_colorbar = True)
'A.I. > 구현' 카테고리의 다른 글
llama.cpp를 설치하여 Ubuntu 서버에서 llama-2 경량모델을 실행해보자 (0) | 2023.09.26 |
---|---|
간단한 얼굴 인식 웹 애플리케이션을 만들어보자. (6) | 2021.10.28 |
PyTorch 컴퓨터 비전 전이학습 예제를 따라해보자. (0) | 2021.03.12 |
PyTorch Dataloader에서 원본 파일명을 알고 싶다. (0) | 2020.11.25 |
개vs고양이 데이터셋으로부터 살펴보는 케라스 훈련 데이터 준비 (0) | 2020.07.04 |
댓글