- Anomaly Detection 설명 – 정의, 특성, 활용 방안, 연구 흐름
- [One Class Classification 방식의 Anomaly Detection]
- [18′ ICML] Deep SVDD : Deep One-Class Classification
- [20′ ICLR] DEEP SEMI-SUPERVISED ANOMALY DETECTION (Deep SAD) 핵심 리뷰
- [20′ ACCV] Patch SVDD : Patch-level SVDD for Anomaly Detection and Segmentation
- [21′ ICLR] EXPLAINABLE DEEP ONE-CLASS CLASSIFICATION (FCDD) 핵심 리뷰
- [Reconstruction 방식의 Anomaly Detection]
- [17′ IPMI] AnoGAN : Unsupervised Anomaly Detection with Generative Adversarial Networks to Guide Marker Discovery
- [18′ ACCV] GANomaly : Semi-Supervised Anomaly Detection via Adversarial Training
- [20′ ECCV] Attention Guided Anomaly Localization in Images (CAVGA) 핵심 리뷰
- [21′ ICCV] Devide and Assemble : Learning Block-wise Memory for Unsupervised Anomaly Detection 핵심 리뷰
- [21′ ICCV] Learning Unsupervised Metaformer for Anomaly detection 핵심 리뷰
- [22′ CVPR] SSPCAB : Self-Supervised Predictive Convolutional Attentive Block for Anomaly Detection 핵심 리뷰
- [Pretrained Feature Matching 방식의 Anomaly Detection]
- [20′ Arxiv] SPADE : Sub-Image Anomaly Detection with Deep Pyramid Correspondences
- [20′ ICPR] Mahalanobis AD : Modeling the Distribution of Normal Data in Pre-Trained Deep Features for Anomaly Detection
- [21′ ICPR] PaDiM : a Patch Distribution Modeling Framework for Anomaly Detection and Localization
- [22′ CVPR] PatchCore : Towards Total Recall in Industrial Anomaly Detection
- [Normalizing Flow 방식의 Anomaly Detection]
- [20′ NIPS] Why Normalizing Flows Fail to Detect Out-of-Distribution Data 핵심 리뷰
- [21′ WACV] Same Same But DifferNet: Semi-Supervised Defect Detection with Normalizing Flows 핵심 리뷰
- [22′ WACV] CFLOW-AD: Real-Time Unsupervised Anomaly Detection with Localization via Conditional Normalizing Flows 핵심 리뷰
- [22′ WACV] Fully Convolutional Cross-Scale-Flows for Image-based Defect Detection (CS-Flow) 핵심 리뷰
- [21′ arxiv] FastFlow: Unsupervised Anomaly Detection and Localization via 2D Normalizing Flows 핵심 리뷰
- [Self Supervised Learning 방식의 Anomaly Detection]
- [18′ NIPS] Deep Anomaly Detection Using Geometric Transformations (GEOM) 핵심 리뷰
- [19′ NIPS] SSL-AD : Using Self-Supervised Learning Can Improve Model Robustness and Uncertainty 핵심 리뷰
- [20′ ICLR] CLASSIFICATION-BASED ANOMALY DETECTION FOR GENERAL DATA (GEOD) 핵심 리뷰
- [20′ NIPS] CSI: Novelty Detection via Contrastive Learning on Distributionally Shifted Instances
- [21′ ICLR] SSL-OCC : Learning and evaluating representations for deep one class classification 핵심 리뷰
- [21′ ICCV] Hierarchical Transformation AD : A Hierarchical Transformation-Discriminating Generative Model for Few Shot Anomaly Detection 핵심 리뷰
- [21′ ICLR] SSD: A UNIFIED FRAMEWORK FOR SELFSUPERVISED OUTLIER DETECTION 핵심 리뷰
- [Knowledge Distillation 방식의 Anomaly Detection]
- [20′ CVPR] Uninformed Students: Student–Teacher Anomaly Detection with Discriminative Latent Embeddings
- [21′ Arxiv] Student Teacher AD : Student-Teacher Feature Pyramid Matching for Unsupervised Anomaly Detection
- [21′ CVPR] Multiresolution Knowledge Distillation for Anomaly Detection
- [22′ CVPR] Reverse Distillation AD : Anomaly Detection via Reverse Distillation from One-Class Embedding
- [Synthetic Anomaly 방식의 Anomaly Detection]
- [21′ ICCV] DRAEM : A discriminatively trained reconstruction embedding for surface anomaly detection
- [21′ CVPR] CutPaste: Self-Supervised Learning for Anomaly Detection and Localization
내용 요약
기존의 Pretrained network를 사용하는 Anomaly Detection 방법에는 대표적으로 SPADE와 PaDiM이 있었습니다.
하지만 각각 단점이 존재했습니다. PatchCore는 locally aware feature를 만들고 coreset sampling을 적용하여 두 방법의 단점을 개선합니다. PatchCore는 실험을 통해 mvTec, mSTC, MTD 데이터셋에서 기존 방법들 대비 가장 우수한 성능을 입증합니다. 또한 low shot 세팅에서도 강한 면모를 보였습니다.
1. 들어가며
이번 글에서는 2022년 CVPR에 발표된 Towards Total Recall in Industrial Anomaly Detection 논문을 리뷰합니다. 이 논문은 PatchCore라는 별칭으로 불리며, 이번 글에서는 PatchCore로 지칭하겠습니다. 이번 글은 독자들이 Anomaly Detection의 기본적인 내용을 알고 있다고 가정하고 있습니다. Anomaly Detection에 관한 기본적인 내용은 Anomaly Detection에 관한 모든 것을 참고해주세요.
먼저 제목의 의미를 통해 저자들이 가장 강조하고자 했던 내용을 생각해 보겠습니다. 제목으로부터 저자들이 두 가지를 강조하고 있음을 알 수 있습니다.
첫 번째는 산업용 Anomaly Detection 방법이라는 것입니다.
두 번째는 Total Recall입니다.
이를 통해 최고의 recall 성능을 갖는, 즉 모든 anomaly를 다 찾는 산업용 Anomaly Detection 방법을 지향한다는 것을 알 수 있습니다. 이번 글에서는 이러한 내용에 초점을 맞춰 살펴보도록 하겠습니다.
PatchCore의 목표는 다음과 같이 요약할 수 있습니다.
첫 번째는 pretrained network를 사용하여 추출한 feature의 정보력을 향상하는 것입니다.
두 번째는 ImageNet으로 학습한 모델의 bias를 줄이는 것입니다.
세 번째는 inference 속도를 향상하는 것입니다.
본문에서 하나씩 자세한 내용을 살펴보겠습니다.
PatchCore 전에도 pretrained network를 사용하는 Anomaly Detection 방법은 존재했습니다. 대표적으로 SPADE와 PaDiM이 있습니다. 하지만 각각의 한계가 존재했죠.
위 그림은 SPADE와 PaDiM의 작동 방식을 구조화한 그림입니다.
먼저 SPADE를 보겠습니다.
Pretrained network를 사용하여 추출한 feature를 patch별로 나눈 뒤, 모두 메모리에 저장하여 test patch feature와 비교하는 모습을 볼 수 있습니다. 이는 PatchCore의 핵심 철학과도 일맥상통하는 방법이죠.
하지만 SPADE에는 치명적인 단점이 있습니다. 바로 pretrained network로 추출한 feature를 그대로 사용한다는 것입니다. 이는 각각의 patch가 주변 정보 없이 본인의 정보만 갖고 있다는 문제가 있습니다. 즉 각각의 patch가 ‘locally aware 하지 않다.’라고 표현할 수 있습니다.
다음은 PaDiM을 보겠습니다.
마찬가지로 pretrained network를 사용하여 feature를 추출하는 모습을 볼 수 있습니다. 하지만 SPADE와 달리 모든 patch feature들과 테스트 patch feature를 비교하는 것이 아닌, 동일 위치의 patch feature들끼리만 비교하는 모습을 볼 수 있습니다. 이는 패치별로 alignment가 잘 안 맞는 데이터셋에서는 치명적인 단점이 될 수 있는 부분입니다.
PatchCore는 SPADE와 PaDiM의 단점을 개선한 방법입니다.
SPADE의 자세한 내용은 해당글을 참고해 주세요.
PaDiM의 자세한 내용은 해당글을 참고해 주세요.
2. 제안 방법
그럼 이러한 한계를 극복하기 위한 PatchCore의 아이디어를 살펴보겠습니다.
2-1. 큰 그림
먼저 PatchCore의 큰 그림을 살펴보겠습니다.
위 그림은 PatchCore의 작동 방법을 구조화한 그림입니다. 왼쪽은 training 과정을, 오른쪽은 testing 과정을 나타내고 있습니다.
Training 과정부터 살펴보겠습니다.
먼저 pretrained network를 사용하여 feature를 추출합니다. 이렇게 추출한 feature들은 locally aware patch feature로 만들어줍니다. 그다음 coreset sampling을 통해 메모리에 올릴 patch feature들을 선별합니다. 이제 이렇게 선택한 patch feature들을 모두 메모리에 넣어줍니다. 메모리에 있는 patch feature들은 test 단계에서 anomaly를 판단하는 데에 사용할 겁니다.
이제 test 단계를 보겠습니다.
Training과 마찬가지로 pretrained network로 추출한 feature를 locally aware 하게 만들어줍니다. 이렇게 나온 patch feature는 메모리의 patch feature들과 비교해 anomal score를 측정하게 됩니다.
이 과정에서 중점적으로 살펴볼 포인트는 다음 세 가지입니다.
첫 번째는 locally aware patch feature를 만드는 방법입니다.
두 번째는 coreset subsampling 방법입니다.
세 번째는 anomal score 측정 방법입니다.
이제부터 위 세 가지 항목에 대해 자세히 살펴보겠습니다.
2-2. Locally aware patch feature 만들기
먼저 locally aware patch feature를 만드는 방법에 대해 살펴보겠습니다.
SPADE는 pretrained network를 사용하여 추출한 patch feature를 그대로 사용합니다. 이 방법의 문제는 무엇일까요?
바로 이렇게 추출한 patch feature 각각은 locally aware 하지 않다는 것입니다. 즉 patch 각각이 서로 겹치지 않고 서로 본인 정보만 가지고 있다는 것이죠. 이렇게 정보의 겹치는 정도는 ImageNet을 학습할 때 CNN의 stride와 filter size로 조절할 수 있습니다. 하지만 Anomaly Detection 모델을 위해 매번 stride와 filter size를 달리해서 ImageNet을 처음부터 학습한다는 건 너무 비효율적인 일입니다. 따라서 간단한 방법으로 locally aware 하게 업그레이드해 줄 방법이 필요합니다. PatchCore는 이를 average pooling을 사용하여 해결합니다.
위 그림은 average pooling을 사용하여 locally aware patch feature를 만드는 방법을 보여줍니다. 각각 다른 sliding window 방법을 사용하여 average pooling을 해서 나온 patch feature들은 서로 정보가 겹치게 됩니다. 이를 통해 locally aware 하게 만들어줄 수 있는 것이죠. 수식으로는 다음과 같이 표현하고 있습니다.
fagg는 aggregation function을 의미합니다. 여기서는 average pooling에 해당합니다.
𝜙는 pretrained network를 의미합니다.
Np(h,w)는 (h, w)의 근처에 있는 patch들을 의미합니다. 수식으로는 다음과 같습니다.
이를 해석하면 주변부에 있는 패치들의 정보를 종합한 feature는 주변부 패치 feature들을 average pooling값 임을 알 수 있습니다.
자 그럼 이때의 feature는 어떤 feature를 사용하면 좋을까요?
보통은 high level의 feature를 사용하는데요. PatchCore에서는 mid level feature를 사용해야 한다고 주장합니다.
High level feature는 크게 두 가지 문제가 있기 때문입니다.
첫 번째로 high level feature에는 위치 정보가 너무 많이 사라져 있습니다. High level로 올라갈수록 계속해서 pooling을 거치며 위치 정보는 사라지기 때문이죠.
두 번째로 high level feature는 지나치게 ImageNet classification을 위해 특화된 정보입니다. High level feature를 사용하여 최종적으로는 softmax를 거쳐 classification을 하도록 학습했기 때문에 어쩔 수 없는 현상이죠.
하지만 우리가 하고자 하는 Anomaly Detection을 위해서는 위치 정보도 필요합니다. 그리고 ImageNet classification에 특화된 정보가 아닌, 일반적인 특성을 구분하는 능력이 필요하죠. 따라서 PatchCore에서는 위치 정보도 비교적 유지하고 있고, ImageNet에 덜 특화된 mid level feature를 사용합니다.
2-3. Coreset memory bank 만들기
다음은 coreset memory bank를 만드는 방법을 살펴보겠습니다.
왜 굳이 coreset sampling을 해서 memory bank를 만들어야 될까요? 그냥 모든 patch feature를 memory bank에 넣어주면 무슨 문제가 있을까요?
PatchCore는 Nearest Neighbor 방법을 사용하여 anomal score를 측정합니다. 즉 매번 메모리에 있는 모든 patch feature들과 비교를 해봐야 한다는 것이죠. 그 말은 메모리의 patch feature 개수에 따라 계산 시간도 늘어난다는 겁니다. 따라서 PatchCore는 계산 시간을 줄이기 위해서라도 patch feature의 일부를 sampling 하는 방법을 찾아야만 했습니다.
PatchCore의 sampling 알고리즘은 다음과 같습니다.
위 그림의 형광펜 부분이 알고리즘의 핵심인데요. 해석해보면 이렇습니다.
Sampling 하기로 선택된 메모리 집단이 Mc 일 때, 새로 추가할 patch feature는 Mc에 있는 어떤 patch feature 보다도 가장 멀리 있는 patch feature를 선택할 것.
이렇게만 봐서는 느낌이 오지 않는데요. 무슨 상황인지 그림을 그려보겠습니다.
위 그림은 전체 patch feature 중에서 coreset sampling 알고리즘에 따라 sampling을 수행하는 과정을 나타낸 그림입니다.
왼쪽의 각 점은 patch feature를 의미합니다. 형광펜은 coreset으로 선택된 patch feature를 의미합니다. 하나의 샘플에서 시작한 뒤 전체 patch feature들 중 선택된 patch feature들과 가장 멀리 떨어져 있는 patch feature를 선택하는 과정을 반복했습니다. 그렇게 선택된 coreset들은 오른쪽 그림과 같이 분포합니다. 선택된 coreset의 분포가 기존 분포를 잘 반영하고 있는 모습을 볼 수 있습니다.
위 그림은 PatchCore의 coreset 분포 실험 결과입니다.
그림 a는 multimodal distribution에 대한, 그림 b는 uniform distribution에 대한 coreset sampling 실험 결과입니다. 위쪽은 coreset sampling 방식을, 아래쪽은 random sampling 방식을 수행한 결과입니다. 가장 오른쪽의 uniform distribution에 대한 실험 결과를 보면 차이를 더 극명하게 알 수 있습니다. 선택된 점(빨간색)을 보면 random sampling 방식은 군데군데 뭉쳐 있는 부분을 볼 수 있습니다. 반면 coreset sampling 방식은 뭉치지 않고 온전히 넓게 퍼져 선택된 모습을 볼 수 있습니다.
2-4. Anomal score 측정하기
이번에는 anomal score를 측정하는 방법을 살펴보겠습니다.
Test 단계에서 추출된 patch feature는 coreset memory bank에 있는 patch feature들 중 가장 가까운 거리로 해당 patch의 anomal score를 정해줍니다. 메모리에 있는 patch feature는 정상 데이터이므로, 이 중 가장 가까운 거리로 나의 정상 점수를 정하겠다는 생각이 크게 문제가 있어 보이지는 않습니다. 하지만 이렇게만 해주면 이런 문제가 있을 수 있습니다.
위 그림은 6개의 coreset sample에 대해 6개의 test patch feature의 anomal score를 측정하는 모습을 나타낸 것입니다.
각 test patch feature 별로 가장 가까운 coreset sample을 찾아 거리를 측정한 모습을 볼 수 있습니다. 그런데 d6의 경우를 생각해 보겠습니다. d6에 해당하는 coreset sample은 다른 sample들과는 멀리 떨어져 있습니다. 따라서 이 sample은 비정상적으로 분포하는 정상 sample이라고 할 수 있습니다. 이런 경우에는 그냥 측정한 거리보다 더 높게 가중치를 계산해 줘야합니다. 그래서 PatchCore에서는 측정한 거리에 가중치를 주어 최종 patch 별 anomal score를 정합니다.
위 식은 patch별로 측정한 거리 s*에 새로 가중치를 주어 최종 anomal score를 계산하는 식입니다.
b는 메모리에서 근처에 있는 patch feature들을 의미합니다. 가중치 부분을 생각해 보겠습니다. 먼저 분모는 메모리의 근처에 있는 모든 patch feature들과의 거리 합입니다. 분자는 나와 가장 가까운 메모리 patch feature와의 거리고요. 따라서 내가 만약 다른 메모리 patch feature들과 멀리 떨어져 있다면 분모가 큰 값을 가질 겁니다. 따라서 전체 가중치 값은 커지게 됩니다. 즉 메모리상의 다른 patch feature들과 멀리 떨어져 있다면, 더 큰 가중치를 주겠다는 의도를 잘 반영한 식이라고 할 수 있습니다.
이렇게 측정된 patch별 anomal score s는 그대로 pixel level의 anomal score map이 됩니다. 그리고 pixel level anomal score map 중 가장 큰 값이 해당 이미지의 anomal score가 됩니다.
3. 실험 결과
이제 PatchCore는 기존의 다른 방법들보다 얼마나 성능이 좋은지 실험을 통해 확인해 보겠습니다.
3-1. mvTec
먼저 산업용 데이터셋인 mvTec에 대한 실험 결과를 살펴보겠습니다.
위 그림은 mvTec 데이터셋에 대한 다양한 방법들의 성능을 비교한 표입니다.
Error는 최적의 f1 threshold로 측정했을 때 잘못 분류된 데이터의 개수입니다. Misclassification은 그때 잘못 분류된 데이터의 비율입니다.
우선 PatchCore는 기존 다른 방법들보다 가장 높은 성능을 내는 모습을 볼 수 있습니다. 심지어 전체 클래스의 1/3은 100% 맞추는 결과를 보였습니다. Segmentation에서도 기존 방법들보다 좋은 성능을 보입니다.
3-2. mSTC, MTD
다음은 상하이 테크 캠퍼스 데이터셋 (STC)와 Magnetic Tile Defect 데이터셋 (MTD)에 대한 실험 결과를 살펴보겠습니다.
위 그림은 STC와 MTD 데이터셋에 대한 다양한 방법들의 성능을 비교한 표입니다.
두 데이터셋 모두 PatchCore가 기존 방법들보다 좋은 성능을 내는 모습을 볼 수 있습니다.
3-3. Low shot Anomaly Detection
다음은 학습 데이터의 일부만 사용하는 low shot 실험 결과를 살펴보겠습니다.
위 그림은 mvTec 학습 데이터의 비율, 개수에 따른 성능을 비교한 표입니다.
가장 왼쪽은 PaDiM, PatchCore, SPADE의 detection AUROC 성능에 대한 그래프입니다. 가운데는 segmentation AUROC 성능을, 오른쪽은 segmentation PRO 성능을 나타낸 그래프입니다.
생각해보면 PatchCore의 coreset sampling은 그 자체가 low shot 세팅이라고 할 수 있습니다. 학습 데이터 전체 중에서 대표성 있는 일부만 선택해 사용하는 방법이니까요. 그 덕분인지 low shot 실험에서도 강한 모습을 보여줍니다. 거의 모든 항목에서 PaDiM, SPADE보다 좋은 성능을 내는 모습을 볼 수 있습니다.
4. Ablations
다음은 ablation 실험을 통해 왜 PatchCore의 성능이 좋은지 살펴보겠습니다.
4-1. Locally aware patch features and hierarchies
먼저 locally aware feature의 효과와 hierarchy에 대해 살펴보겠습니다.
위 그림의 위쪽 그래프는 locally aware feature를 만들기 위해 average pooling을 할 때 사이즈에 따른 성능을 나타낸 것입니다.
Pooling 사이즈를 3으로 할 때 가장 성능이 좋은 모습을 볼 수 있습니다. 사이즈가 1일 때의 성능은 pooling을 하지 않은 상태를 의미하는데, 위 그래프를 보면 pooling을 했을 때 대부분 성능이 더 좋은 모습을 볼 수 있습니다. 따라서 저자들이 주장하는 locally aware feature는 효과가 있다고 말할 수 있습니다.
또한 아래쪽 그래프는 사용한 feature layer level에 따른 성능을 나타낸 것입니다.
결과를 보면 layer2를 사용할 때 성능이 가장 좋은 모습을 볼 수 있습니다. 이는 mid level feature를 사용해야 가장 성능이 좋다는 저자들의 주장을 뒷받침해 줍니다.
4-2. Importance of coreset sampling
다음은 coreset sampling의 효과를 살펴보겠습니다.
위 그림은 sampling의 비율에 따른 성능을 나타낸 그래프입니다.
Sampling 방식으로는 coreset, random, learned 세 가지를 비교하고 있습니다. 결과를 보면 다른 방식들은 sampling을 할수록 성능이 크게 하락하는 모습을 보입니다. 반면 PatchCore는 sampling을 해도 비교적 성능이 덜 하락하며, 심지어 초반에는 성능이 더 오르는 모습도 보여줍니다.이는 coreset sampling 방법의 우수성을 보여줍니다.
5. 결론
Pretrained network를 사용하여 추출한 patch feature들을 기준으로 anomal score를 측정하는 PatchCore를 살펴봤습니다. PatchCore는 coreset sampling 방식을 적용하여 patch feature들을 sampling 합니다. 이렇게 구성된 coreset patch feature에 대해 비교하며 anomal score를 측정합니다. Coreset sampling은 kNN 방식의 단점인 느린 속도를 개선해주는 효과를 보였습니다. PatchCore는 mvTec, STC, MTD 데이터셋에서 기존 방법들 대비 가장 우수한 성능을 보였을 뿐만 아니라 low shot 세팅에서도 강한 모습을 보였습니다.