이전 포스팅
- 1.Task : 해당 프로젝트에서 문제정의에 대한 내용을 다룹니다.
- 2. DataCentric : 주어진 데이터를 살펴보며, 데이터가 가지는 문제점을 찾아내고 인사이트를 얻는 과정입니다.
- 3. Classification & CAM : 부품 불량을 위해 분류 모델을 학습하고, 신뢰성을 확보하기 위해 CAM기법을 적용해 보는 과정입니다.
최고의 CAM 시각화를 얻어내자
앞선 포스팅에서 분류 모델의 신뢰성을 위해 GradCAM을 적용해 봤습니다. 그 결과, 높은 성능에 대한 신뢰성을 어느 정도 확보할 수 있었죠. 단순히 신뢰성 확보를 위해 CAM을 적용해 본 거지만, 이 시각화 정보를 공장 측에도 제공해 주면 좋겠다는 생각이 문득 들었습니다. 단순히 어떤 불량인지 분류하는 걸 넘어, 불량의 위치정보도 함께 제공해 주면 공장 설비를 관리하는데 도움이 될 수 있기 때문입니다. 그래서, 해당 CAM시각화를 가장 잘 나타내는 분류 모델을 탐색해보고자 합니다. 기존에는 단순히 수치적인 성능을 보고 최종 모델을 선정했다면, 이번 프로젝트에서는 CAM 시각화의 정성적인 평가를 통해 모델을 선정해 보는 거죠. 이번 글은 이러한 탐색 과정을 효율적으로 진행하기위해 CAM 대시보드를 개발하고, 최적의 CAM시각화를 얻어내는 과정에 대한 내용이 될 것입니다.
CAM 대시보드 개발기
기존에는 JupyterNotebook으로 코드를 실행해 가며 CAM 결과를 확인하였습니다. 하지만, 서로 다른 모델의 CAM 결과물을 비교하자니 매번 코드를 수정해 가며 실행하는 게 꽤나 불편했습니다. 또한, 원본 사진과 CAM결과물을 왔다 갔다 비교하기도 어지러웠고요. 이러한 과정을 생략하고자 대시보드를 개발하기로 했습니다. 대시보드에 포함되어야 할 실험 변수와 UI설계도는 아래와 같습니다.
이제 코드로 구현할 일만 남았습니다. 대시보드도 어떻게 보면 웹 애플리케이션이라 볼 수 있습니다. 하지만, 실험용 대시보드를 위해 근사한 웹 개발에 시간을 많이 투자할 순 없었습니다. 간단한 웹 애플리케이션을 개발하는 데 사용할 수 있는 Streamlit을 소개하고자 합니다.
Streamlit은 파이썬으로 간단한 웹, 대시보드를 쉽게 만들 수 있도록 해주는 툴입니다. 간단한 만큼이나 세세한 커스터마이징은 제한적일 수 있지만, 실험용 대시보드, 프로토타입용으로는 전혀 손색없는 툴입니다. 특히 CSS를 좀 건드릴 수 있다면, 글꼴이나 색상, 위치 등등 조금 더 디자인하기 용이할 수 있겠습니다. Streamlit으로 표현할 수 있는 기능은 해당 Document에서 모두 확인할 수 있습니다. 결론적으론, Streamlit으로 아래와 같이 CAM 대시보드를 구현할 수 있었습니다.(아래 시연 영상은 용량을 줄이고자, gif로 보여드립니다.)
실험을 통해 얻은 문제점 및 해결
위의 대시보드 덕분에 기존 Jupyter Notebook으로 노가다 했을 때를 대비해, 효율이 5배 이상은 올라간 것 같습니다. 또한, 다양한 변수와 이미지 간 비교가 훨씬 수월했죠. 아래는 실험을 통해 얻은 여러 인사이트들과 개선점들입니다.
1) Augmentation을 통한 CAM 노이즈 제거
기존에는 아래 사진의 좌측처럼 CAM이미지에 노이즈가 많았습니다. 여기서 말하는 노이즈는 불량의 위치가 아님에도 불구하고 옅은 색의 히트맵이 시각화 된것을 말합니다. CAM의 작동 원리 보면 알겠지만, 이 옅은색의 히트맵이 시사하는 점은 ‘강하게는 아니더라도 약하게는 이 부분도 불량을 검출하는데 영향을 끼친다.’라고 해석해 볼 수 있겠습니다. 하지만, 실제로 저 옅은색의 노이즈 부분은 불량을 나타내는 feature는 아니었죠. 해당 문제를 Augmentation으로 해결해 볼 수 있었습니다. 학습 시 데이터를 다양한 방식으로 증강해 주었고, 특히 Blur와 같이 노이즈를 첨가하여 학습시켰을 때, CAM시각화에서 긍정적인 효과를 얻을 수 있었습니다.
2) 전처리를 통한 이슈 해결
CAM을 찍어 봤을 때, 아래 사진의 좌측처럼 이미지의 왼쪽 부분에 노이즈가 자주 껴 있었습니다. 대부분이 그랬죠. 모델의 입력 이미지를 자세히 살펴보니, 왼쪽 부분에 부품의 이음새(?)같이 부품이 시작되는 영역이 존재했었습니다. 이 부분이 CAM을 시각화하는데에 있어서 노이즈를 크게 발생시키는 것 같았습니다. 이 부분을 제거하기 위해 Center Crop으로 널링의 양 끝을 조금 잘라 입력시켜 주었습니다. 간단한 전처리 방법이지만, CAM 시각화에 있어서 기존에 있던 끝단의 노이즈를 확실하게 잡아줄 수 있었습니다.
3) CAM으로 부터 Bounding Box를 추출하자
CAM 시각화를 히트맵으로 보여주다 보니, 빨간 부분이 불량의 요소를 가리게 됩니다. 해당 불량 영역을 히트맵이 아닌, bbox로 표현하고자 합니다. 해당 히트맵을 적절한 threshold로 이진화하여, 경계선을 딴 뒤, 해당 경계선을 기준으로 가장 바깥쪽의 직사각형을 구하였습니다. OpenCV의 threshold와 findCountours함수를 통해 쉽게 구현할 수 있었습니다.
정리해 보자면
공장 측에 불량의 위치정보도 함께 제공해 주기 위해, CAM시각화를 최적화하기로 하였습니다. 여러 실험들을 해볼 필요가 있었고, 이 과정을 효율적으로 진행하기 위해 Streamlit툴을 활용해 대시보드를 만들어 봤습니다. 결론적으론 Augmentation, 전처리, 후처리 등을 통해 좀 더 적절한 CAM시각화를 얻을 수 있게 되었습니다.
NEXT!
이제껏 “널링 내의 요소”인 찍힘, 밀림, 이중선의 불량 유형을 Classification을 통해 검출해 봤습니다. 다음은 “널링 외의 요소”인 미압입의 불량유형을 검출해 낼 차례입니다. 이를 위해 Anomaly Detection방법론으로 접근하고자 하며, VAE모델을 다루게 됩니다.
긴 글 읽어주셔서 감사합니다!
'Tech > AI 해커톤' 카테고리의 다른 글
5. [Model Centric] Anomaly Detection(feat. VAE) (0) | 2023.03.12 |
---|---|
3.[Model Centric] Classification & CAM (0) | 2023.03.07 |
2.[DataCentric] 데이터의 문제점 (1) | 2023.03.03 |
1.[Task] 해결해야할 문제 (0) | 2023.02.26 |