25

GradCAM: 모델이 어디를 보고 판단했는가

Day 2: CNN 기반 불량 분류

학습 목표
  • GradCAM 이 마지막 Conv 층의 활성화와 그래디언트에서 어떻게 계산되는지 설명할 수 있다
  • Day 2 에서 학습한 분류기에 GradCAM 을 적용해 히트맵을 생성할 수 있다
  • 히트맵이 결함 위치와 겹치는 것만으로는 학습이 잘 됐다고 말할 수 없는 이유를 설명하고, 가림 검사로 확인할 수 있다

GradCAM: 모델의 판단 근거를 보여준다

AI가 "불량"이라고 했다. 왜? 제조 현장에서는 근거 없는 판정을 신뢰하지 않는다. GradCAM은 모델이 이미지의 어디를 보고 판단했는지 보여준다.


GradCAM 원리

[GradCAM 동작 흐름]

입력 이미지
    ↓
CNN 순전파 (Forward Pass)
    ↓
특정 클래스에 대한 그래디언트 계산 (Backward)
    ↓
마지막 Conv 층의 활성화 맵 × 그래디언트 가중 평균
    ↓
ReLU 적용 (양수만)
    ↓
히트맵 (해당 클래스에 기여한 영역)
    ↓
원본 이미지에 오버레이

제조에서 GradCAM의 쓸모

상황GradCAM 없이GradCAM 있으면
과검출왜 불량인지 모름어디를 보고 그렇게 판정했는지 후보를 좁힘
미검출원인 파악 불가결함 영역이 아예 활성되지 않는지 확인
새 불량학습 필요성 판단 불가관련 영역이 반응하는지 확인
고객 보고"AI가 불량 판정""이 영역의 패턴에 반응했다"까지 제시

히트맵을 읽을 때 반드시 알아야 할 것

여기서 한 가지를 분명히 하고 넘어간다.

빨간 영역이 결함 위치와 겹친다는 것만으로는 모델이 잘 학습됐다고 말할 수 없다.

이유는 셋이다.

  1. 히트맵은 항상 0~1 로 정규화된다. 결함이 없는 정상 이미지에도 "가장 붉은 곳"은 반드시 생긴다. 붉은 영역이 있다는 사실 자체는 아무 정보가 아니다.
  2. 겹침은 우연히도 생긴다. 결함이 화면에서 넓은 자리를 차지하면 아무 데나 찍어도 들어간다. 겹치는 비율을 세려면 정상 이미지와 틀린 예측까지 같은 방식으로 세어 견줘야 한다.
  3. 히트맵은 상관이지 인과가 아니다. 그 영역이 판정을 만들었는지 확인하려면 그 영역을 없애 봐야 한다.

그래서 이 과제는 "겹치는지 눈으로 본다" 대신 세 가지를 실제로 잰다.

검증 1. 히트맵 최대점이 정답 결함 상자 안에 들어오는 비율   ← 필요조건
검증 2. 히트맵 상위 15% 영역을 배경색으로 가렸을 때
        예측이 바뀌는 비율(가림 검사)                       ← 인과에 가장 가까운 확인
검증 3. 정상 이미지와 오분류 사례의 히트맵을 함께 본다        ← 무엇을 잘못 배웠는지

검증 2 에서 예측이 그대로면, 히트맵이 가리킨 곳은 판단 근거가 아니었다는 뜻이다. 이때는 히트맵이 아니라 모델과 데이터를 의심한다.

함께 붙어 있는 vision-inspector 시뮬레이터의 히트맵은 모델 활성화가 아니라 샘플을 그릴 때 쓴 결함 좌표를 칠한 것이다. 그 화면에서는 언제나 겹치므로 학습이 잘 됐는지 판단하는 데 쓸 수 없다. 판단은 아래 코드로 한다.

에디터 로딩 중...
핵심 포인트
  • GradCAM 은 마지막 Conv 층의 활성화를 그래디언트로 가중 평균한 것이다. 반드시 우리 불량으로 학습한 모델에 적용해야 의미가 있다
  • 히트맵은 0~1 로 정규화되므로 정상 이미지에도 붉은 영역이 생긴다. 붉다는 사실 자체는 불량의 증거가 아니다
  • 히트맵이 결함 자리에 뜨는 것은 필요조건일 뿐이다. 그 영역을 가렸을 때 예측이 무너져야 판단 근거였다고 말할 수 있다
  • 맞힌 사례만 보면 무엇을 잘못 배웠는지 알 수 없다. 틀린 예측의 히트맵을 반드시 함께 본다
  • 제조에서는 판정 근거를 보여줘야 신뢰받는다. 다만 '근거처럼 보이는 그림'과 '근거'는 다르다
AI로 학습하기 — 꿀팁
히트맵을 근거라고 부를 수 있는지 따져 보기AI 학습 팁

GradCAM 코드를 받는 데서 멈추지 말고, 그 히트맵이 판단 근거라는 것을 무엇으로 확인할 수 있는지 함께 물어라.

PyTorch ResNet 기반 제조 불량 분류 모델에 GradCAM 을 적용하는 코드를 구현해줘. 다만 히트맵을 그리는 데서 끝내지 말고, 다음을 함께 넣어줘: 1) 히트맵 상위 영역을 가렸을 때 예측 확률이 얼마나 떨어지는지 재는 가림(occlusion) 검사, 2) 정상 이미지에서도 히트맵 최댓값이 1 이 되는 이유와 그것을 오해하지 않도록 표시하는 방법, 3) 오분류 사례만 모아 히트맵을 비교하는 코드. 그리고 '히트맵이 결함 위치와 겹치면 모델이 잘 학습된 것'이라는 주장이 왜 충분하지 않은지 설명해줘.
이 팁이 도움이 됐나요?
실습 — 직접 해보기
Vision Inspector (화면 구성 확인용)
검사 화면이 분류 결과·결함 영역·조치 안내를 어떤 순서로 보여주는지 확인하는 용도다. 이 시뮬레이터의 히트맵은 모델의 활성화에서 계산한 것이 아니라 샘플 이미지를 그릴 때 쓴 결함 좌표를 그대로 칠한 것이어서 언제나 결함과 겹친다. 학습이 잘 됐는지 판단하는 데는 쓰지 말고, 그 판단은 이 과제의 코드(가림 검사)로 하라.
용어