이전 포스팅
- Task : 해당 프로젝트에서 문제정의에 대한 내용을 다룹니다.
- DataCentric : 주어진 데이터를 살펴보며, 데이터가 가지는 문제점을 찾아내고 해결방안을 도출하는 과정입니다.
모델의 흐름
불량 검출을 위해 사용한 모델 아키텍처는 위와 같습니다. DataCetric 편에서 말했듯, 널링 내의 요소(찍힘, 밀림, 이중선)와 널링 외의 요소(미압입)로 불량의 기준을 나누었고, 그에 따라 모델의 로직도 2가지로 나뉘게 되었습니다. 이번 포스팅에서는 널링 내의 요소로 찍힘과 밀림, 이중선, 정상을 분류해 내는 내용이 될 것이며, 이 과정에서 GradCAM기법을 사용하여 모델의 신뢰성을 확보하는 내용이 될 것입니다.
[널링 내의 요소] Classification
부품 이미지에서 널링 내의 영역을 Classification 모델을 통해 찍힘, 밀림, 이중선, 정상으로 분류하려 합니다. 우선 가장 보편적인 모델로 학습을 시켜보고, 어느 정도 결과가 나오는지 간단하게 파악해 볼 계획입니다. 모델은 CNN계열에서 많이 사용되는 resnet을 선택하였으며, 사이즈는 resnet50을 사용하였습니다. Pretrained 된 모델을 가져왔으며, 모델 출력단만 4개의 class를 가질 수 있도록 수정해 주었습니다. 학습을 위해 데이터는 8:2로 Train과 Validation으로 분할하여 진행하였습니다. Train : 1964장, Validation : 493장
학습 결과, 아직 전처리나 Augmentation 등 성능 향상을 위한 튜닝을 전혀 하지 않았음에도 불구하고 성능이 꽤 높게 나왔었습니다. 아래는 WandB 툴을 활용해 모델 성능을 매 epoch마다 로깅한 결과입니다.
이럴 경우는 보통 ‘이게 왜 잘 되지?’라는 불안감으로 코드를 다시 한번 뜯어보게 됩니다. 하지만 코드는 다시 봐도 잘못된 부분을 찾아낼 수 없었습니다. 전혀 다른 모델로 학습을 시켜 보아도 비슷하게 높은 성능을 보였습니다. 높은 성능에도 뭔가 찝찝합니다..
모델이 정말 똑똑해서 잘 맞춘 걸까? (feat. XAI, CAM)
저같이 의심이 많고, 자신이 짠 코드에 신뢰를 갖지 못하는(?) 사람들에게는 단순히 저런 Recall과 Precision 같은 수치적인 Metrics는 그리 믿음직스럽지 못할 것입니다. 이처럼 인공지능 모델에 의심을 가지는 사람들을 위해 XAI라는 기법이 존재합니다. DACON이라는 커뮤니티에서 XAI와 CAM에 대한 내용을 직접 설명해 본 적이 있습니다. 간단한 예시를 통해 최대한 쉽게 설명하고자 했고, 실습을 해볼 수 있는 코드도 함께 있으니 관심 있으신 분들은 아래 링크를 접속하시면 되겠습니다.(CAM에 대한 수식적인 이해를 원하시는 분들은 아래 reference에 유용한 자료를 첨부하였습니다.)
https://dacon.io/competitions/official/235957/codeshare/6025
간단하게 요약을 해보자면,
- XAI : 복잡한 AI모델은 결괏값에 대한 근거를 제공해 주기 어려워 신뢰성을 얻기 힘든데, 이를 위해 모델 내에서 설명가능한 요소를 찾아내는 분야가 XAI다.
- CAM : 이미지 분류 모델이 결괏값을 내놓을 때, 이미지의 어떤 부분이 분류 결과에 영향을 끼쳤는지를 시각화를 해주는 XAI기법 중 하나이다.
- GradCAM : 기존의 CAM은 모델 끝단에 GAP이라는 layer가 꼭 필요한데, GradCAM은 이러한 제한점을 해결하였다.
이제 GradCAM을 활용하여 요놈의 모델이 진짜 학습이 잘 된 건지, 아니면 Metrics만 이상적으로 높게 나온 건지 낱낱이 까발려 볼 계획입니다. 편의를 위해 GradCAM을 CAM이라 부르도록 하겠습니다. CAM을 적용하기 위해 학습된 모델의 가중치 파일과 CAM을 찍어볼 모델의 layer를 선택해 주어야 했습니다. 우선 가장 basic 하게 학습시킨 resnet50에서 끝단의 레이어인 layer4에 대한 CAM을 찍어 봤습니다. 보통 모델의 마지막 단계의 레이어에서 CAM의 결과물이 잘 나오곤 합니다. CNN 모델의 끝단에서 나온 feature map이 분류 결과에 가장 큰 영향을 미치기 때문이죠.
1) 찍힘에 대한 CAM 시각화
어떠한 Augmentation이나 전처리를 진행하지 않고 학습시킨 상태에서도 CAM의 결과가 생각보다 잘 나왔습니다. 실제로 crack의 위치가 저기가 맞는지, 기존에 주어진 bbox를 입혀봤습니다.
bbox에서 찍힘이라고 표현한 영역 그대로 잘 캐치하며 모델이 판단했음을 확인할 수 있었습니다. 위의 예시뿐 아니라, 다른 찍힘의 데이터에서도 CAM의 결과물은 꽤나 만족스러웠습니다.
2) 밀림에 대한 CAM 시각화
밀림에 대해서도 전체적인 영역을 잘 잡아내고 있습니다. 하지만, 밀림이 아닌 지역에 대해서도 어느 정도 히트맵이 옅게 그려져 있는 걸로 봐서는 판단 시에 밀림 아닌 정상적인 영역도 아주 조금은 참고하고 있음을 볼 수 있습니다. 이는 부정적인 요소지만, 히트맵의 강도가 약하므로 충분히 무시할만한 정도라 판단하였습니다.
3. 이중선에 대한 CAM 시각화
이중선에 대해서는 불량의 영역이 따로 존재하진 않습니다. 아래의 이중선에 대한 bbox를 살펴보면 널링 그 자체를 라벨링 해놓았음을 봐서는 널링 그 자체가 불량에 해당한다고 볼 수 있죠. 그래서 해당 CAM의 결과물이 옳게 나온 건지 bbox와 비교하며 판단하기가 어려웠습니다.
이중선이라는 불량이 발생하는 원인을 다시 한번 찾아보면 아래와 같습니다.
이중선 : 전조 과정에서 베어링 이상으로 인해 널링에 이중선이 발생하는 형태
즉, 이중선은 널링 전반에 걸쳐 “선”의 형태로 나타는 불량이라는 겁니다. 굉장히 얇은 선으로 불량이 발생하기에, 찍힘과 밀림과는 달리 특정한 영역으로 나타내기는 힘들었죠. 더구나, CNN모델의 특성상 모델 끝단의 feature map은 하나의 픽셀값이 원본이미지의 많은 픽셀 영역을 함축하게 됩니다. 그렇기 때문에 모델 끝단의 feature map을 적용한 위의 CAM시각화는 세세하고 미세한 영역까지는 커버하지 못한다고 판단하였습니다. 그렇다면 모델의 끝단 layer 말고 중단쯤에 있는 layer에서 CAM을 찍어보면 되지 않느냐?라는 생각에 모델의 중간에 위치한 layer를 기준으로 CAM을 찍어 봤습니다.
그 결과, 조금 더 이미지의 에지 관점에서 시각화가 진행되었습니다. 의도대로 조금 더 좁고 미세한 영역의 히트맵을 얻을 순 있었지만, 해당 시각화가 이중선이라고 판단한 근거가 되기는 어려웠습니다.
정리해 보자면
모델의 높은 성능에 대한 의심 때문에, Grad CAM을 활용하여 모델의 판단 근거를 직접 확인해 보았습니다. 히트맵으로 시각화해 본 결과, 찍힘과 밀림에 대해서는 적절한 영역을 잘 탐지하여 판단했음을 확인하였습니다. 덕분에 해당 class에 대한 모델의 성능은 확실하게 신뢰할 수 있게 되었습니다. 하지만, 이중선에 대한 판단근거는 여전히 못 미더운 상황입니다. 히트맵의 시각화가 이중선의 불량 영역을 세세하게 못 담아냈기 때문이죠. 그렇지만 3가지의 불량 요소 중에서 2가지의 불량에 대해서는 확실히 탐지하고 있다는 것을 확인하였기에, 의미 있는 실험이 되었습니다.
NEXT!
신뢰성 확보를 위해 시작된 XAI기법은 단순히 신뢰성뿐 아니라, 불량의 위치를 제공해 줄 수 있게 되었습니다. 이는 마치 Classification 모델을 사용하였음에도 불구하고, Object Detection의 결과물을 보여주는 셈이 되었죠. 그리고 부품을 생산하는 공장 측에서도 단순 분류보다는 불량의 위치도 파악하고 싶은 니즈(needs)가 있을 거라 생각했습니다. 다음 글에서는 이러한 히트맵 시각화를 가장 잘 나타내는 모델을 찾아내고, 그 과정에서 효율적인 탐색을 위해 CAM 대시보드를 개발하는 내용으로 구성하고자 합니다.
Reference
- https://wikidocs.net/135874
- https://prgmti1.tistory.com/m/entry/1-Convolutional-Neural-Network-%EA%B7%B8-%EB%82%B4%EB%B6%80%EB%A5%BC-%EB%B3%B4%EB%8B%A4
'Tech > AI 해커톤' 카테고리의 다른 글
5. [Model Centric] Anomaly Detection(feat. VAE) (0) | 2023.03.12 |
---|---|
4.[Model Centric] CAM 대시보드 개발 (feat. Streamlit) (0) | 2023.03.10 |
2.[DataCentric] 데이터의 문제점 (1) | 2023.03.03 |
1.[Task] 해결해야할 문제 (0) | 2023.02.26 |