들어가며...
이번에 소개하고자 하는 논문은 CVPR 2022년에 소개된 논문인 "Towards Total Recall in Industrial Anomaly Detection"이다. 저자인 Karsten Roth가 Amazon AWS에서 internship을 하면서 나온, Amazon AWS의 논문이라고 소개되고 있다. 개인적으로 제목이 인상적인데, 러프하게 직역하면 'Industrial Anomaly Detection에서 Total Recall을 하겠다.' 정도로 해석할 수 있지 않을까 싶다. Total Recall은 뭐냐? 이것도 직역하면 '모든 것을 회수한다'인데, 다음과 같은 뜻으로 사용된다고 한다.

"완벽한 기억 능력" 정도가 되겠다. 조금 더 Total Recall에 대해서 이야기 하자면 학부 3학년 때 들은 인지과학 과목에서 '기억'에 대한 주제를 다루면서 과제로 이터널 선샤인, 메멘토와 함께 언급된 영화 중 하나가 Total Recall이라는 이름을 가지고 있었다. 당시에는 세 영화 모두 감상한 적이 없었고, 주변에서 이터널 선샤인에 대한 압도적 추천이 있어서 이터널 선샤인으로 보고서를 작성했었다. 그래서 당시에 토탈리콜을 보지는 않았는데 이 논문 덕에 생각이 나서 돌려보게 되었다. 영화 자체도 꽤나 재미있다...~

쓸데없는 이야기가 길었는데, 결국 Anomaly detection이라는 task에서 뭔가 기억(memory)과 비슷한 개념을 적용하겠다는 것이 직관적으로 느껴지는 제목이었다.
Introduction
각설하고 논문에 대해서 이야기 해보자면 Anomaly detection 분야의 동향에 대해서 조금 이해할 필요가 있다. anomaly detection은 말 그대로 '이상치'를 탐지하는 분야이다. '이상치'란 무엇인가?

일반적으로 예쁘게 나온 데이터들은 어떠한 분포나 동향을 가진다고 이야기 할 수 있다. 위의 그림에서는 대충 선형적인 경향성을 보이는데 붉은 원에 들어가있는 점들은 그 분포를 확연하게 벗어나 있다는 것을 볼 수 있다. 이러한 값들을 outlier 혹은 이상치 라고 이야기하고 종종 이러한 이상치들을 찾아내는 것이 중요한 상황이 종종 있기 마련이다.
대표적인 상황이 산업현장으로, 대부분의 생산되는 제품들은 정상적인 제품들이고 정말 간혹가다가 비정상적인 제품들이 나오는 경우가 있다. 제품을 생산하는 입장에서는 이렇게 비정상적으로 제작된 제품들을 찾아내서 시중에 나가지 못하도록 처리해야 할 필요가 있다. 대표적인 이야기가 미국의 비누 회사 이야기.
대충 요약하자면 기기 오작동으로 박스에 비누가 들어가지 않아 빈 박스인 채로 배송되는 경우가 종종 생겼던 것. 기업에서는 이러한 문제를 해결하기 위해 X-ray를 도입해 비누가 없으면 이를 감지하는 방식을 사용했는데, 어떤 사원이 선풍기를 설치해서 빈 박스를 날려버리면서 간단하게 문제가 해결됐다는 이야기이다. Anomaly detection의 대표적인 사례라고 볼 수 있겠다. 하지만, 위의 시스템에서 아예 비누가 없는 상자는 확인할 수 있었지만 비누가 찌그러져 있었다면? 비누의 품질이 좋지 못했다면? 단순히 선풍기로는 해결할 수 없는 문제이다.
논문에서 주로 다루는 MVTec 데이터셋은 그러한 상황을 다룬다. 공장에서 생산되는 여러 종류의 제품들이 정상적인 제품과 비정상적인 제품으로 나뉘어져있다. 정상-비정상으로 binary classification을 할 수 있겠지만, 이것은 현실적으로 어렵다. 일단 binary classification model을 학습시키기에는 비정상 데이터가 너무나도 부족하다. 이러한 문제를 해결하기 위해서 GAN 같은 생성 모델을 기반으로 비정상 데이터를 더 만들어 class unbalance를 해결하는 방법도 있지만, GAN을 학습시키기도 어렵고 생성되는 데이터들을 검증하는 것도 어렵기 때문에 주로 선택되는 방식은 아닌 것 같다.
다른 방식중 하나가 Auto-Encoder와 같은 구조를 가지는 model을 통해 정상 데이터들을 reconstruction하는 model을 학습시키는 것이다. 이렇게 정상 데이터를 학습한 reconstruction model에 비정상데이터가 들어오게 되면 비정상적인 부분은 model이 학습한 분포에 의해 제대로 재건되지 않게 되고, 따라서 재건된 이미지와 입력 이미지의 차이를 비교하여 이상치인지 아닌지를 탐지할 수 있다는 것이다.
그러나 앞서 말한 대부분의 방식들은 정상 데이터를 기반으로 학습 혹은 fine-tuning을 해야한다. 이러한 과정에서 데이터가 부족하다는 문제도 존재하고 학습에 들어가는 cost를 줄이고 싶기 때문에 이미 ImageNet과 같은 큰 dataset에 대해서 학습된 model을 가지고 와서 fine-tuning 없이 해당 backbone에서 나온 feature를 활용하는 연구들이 많고 이 논문도 그러한 논문중 하나이다.
좋다! 학습된 모델을 가져다 쓰면 되니까! 하지만, 그렇게 단순히 해결될 문제는 아니다. 우선 일반적으로 이야기하는 feature들의 특성에 대해서 조금 더 이야기 해보자. 일반적으로 입력에 가까운 layer를 통과한 feature들을 low-level feature 혹은 local (spatial) feature라고 이야기하고, classifier에 가까운 깊은 layer에서 나온 feature들을 high-level feature 혹은 global (semantic) feature라고 부른다.

이 경우 low-level feature들은 기본적으로 입력을 본지 얼마 안되었기에 해당 입력의 공간적 정보를 상대적으로 잘 포함하고 있다. 반면 high-level feature의 경우 이미 이런저런 연산을 많이 거친 다음이기 때문에 공간적 정보보다는 분류 등, 특정 task에 활용되기 적합한 추상적인 정보를 상대적으로 더 많이 포함하고 있다고 본다.
일반적으로 vision based anomaly detection에서 학습된 모델을 활용한다고 하면 ImageNet으로 학습된 classification model의 backbone을 feature extractor로 사용하는 것 같다. 그런데 이 경우 ImageNet으로 학습된 classification model의 backbone이 진짜 anomaly detection에도 최선인가?에 대한 질문을 할 필요성이 생긴다.
뭐 현실적으로 vision task에 막대한 권위를 가지고 있는 ImageNet 데이터셋 자체에 대해서 태클을 걸기는 어렵다. 다만 classification task에 대해서는 조금 더 이야기해볼 여지가 있다. Classification model의 High-level feature는 classification task에 적합한 형태로 representation이 bias되어 있다. 따라서 Anomaly detection에 classification model을 적용하기 위해서는 추가적인 학습을 수행하거나 high-level feature보다는 이미지 고유의 정보를 더 가지고 있는 mid-level feature를 사용하는 것이 조금 더 적합할 수 있다는 것이 요지이다.
PatchCore에서도 이러한 부분을 지적하여 가장 마지막 feature를 사용하는 것이 아니라 중간에 걸쳐있는 layer의 feature를 가져와 detection의 기준으로 삼는다. 뿐만 아니라 어디를 보고 anomaly라고 판단했는지 그리고 spatial한 정보를 조금 더 활용하기 위해서 여러 수준의 feature를 동시에 활용하는 접근을 채택한다.
이러한 motivation?을 가지고 출발하는 논문이다. 다음 3가지의 contribution을 가진다고 주장한다.
1) test time에 활용할 수 있는 nominal information을 maximization한다.
2) ImageNet Classification에 걸린 bias를 줄인다.
3) inference 시간을 개선한다.
Background
PatchCore를 구성하는 두 개의 핵심 기술은 PaDiM과 SPADE 두 개의 모델 구조이다. 사실상 두 모델의 방식이 PatchCore의 핵심이다. 간단하게 두 model에 대해서 이야기하고 넘어가자. 각 논문들에 대한 디테일한 리뷰는 따로 게시물을 올릴 수 있도록 노력해보겠다...
SPADE: Sub-Image Anomaly Detection with DeepPyramid Correspondences
우선 SPADE는 2020년 출판된 논문으로 pretrained model을 가져다 활용하는 관점에서 ResNet, WideResNet과 같은 모델의 다른 level의 feature를 활용하며 동시에 pixel 단위의 anomaly score를 계산하는 방식을 제안하였다. 기본은 kNN (k-Nearest Neighbor)를 적용하는 것에 있다고 볼 수 있겠다. 정상 sample들을 모두 Memory Bank (원문에서는 gallery라는 표현을 사용했다.)에 집어넣어두고 이를 inference 단계에서 평균 euclidien distance를 계산하는 방식을 소개한다.
Memory Bank 개념의 도입, multi-level feature의 활용, pixel level의 anomaly score 계산을 통한 explainability 등이 핵심이 되는 논문이라고 생각한다.
PaDiM: a Patch Distribution Modeling Framework for Anomaly Detection and Localization
PaDiM도 2020년에 나온 paper긴 하지만 SPADE보다 조금 늦게 나온 paper로 보이고, SPADE에서 제공하는 insight들이 어느정도 녹아 있는 paper인 것 같다.

PaDiM은 patch단위의 feature들을 종합하여 anomaly detection을 수행하는 방식으로 normal data로만 구성된 training set의 여러 layer에 걸친 patch화된 feature들의 정보를 활용한다. SPADE의 경우 pixel단위의 접근을 했고 PaDiM은 Patch 단위로 접근 했다는 차이가 있다. 최종적으로 모은 feature에 대해서 covariance와 mean을 계산하여 normal 데이터의 분포를 estimation한다.
사족이지만 두 논문 모두 incremental 느낌의 paper들이긴 하지만 이러한 연구들이 있어서 PatchCore처럼 SOTA 성능을 찍는 연구들이 나올 수 있는 것 같다는 생각이든다. 다만 incremental work들을 좋게 평가한다고 하지만 너무 논문이 많이 나오는거 아닌가... 학회 하나만 잡고 하루에 한 편씩 읽어도 한 해에 나오는 페이퍼 다 못읽는다...
사족이 좀 많았다... 다음 게시물에서는 PatchCore의 핵심 구조들에 대해서 좀 살펴보자...