[AI 검사, 현장의 문제들 (2)] 정상만 학습해서 이상을 찾을 때 막히는 지점들
불량 이미지 없이 양품만 학습시키는 비지도 이상탐지는, 벤치마크에서는 완벽해 보이지만 양산 데이터가 들어오는 순간 두 곳에서 동시에 무너집니다. 문제는 하나를 고치려 하면 다른 하나가 나빠지는 구조라는 것 — 이 상충을 어디서부터 풀어야 하는지를 다룹니다.
2026.08.05
- 기술·제품
1편에서 검사 AI가 반복해서 막히는 지점 다섯 가지를 정리했습니다. 이번 글에서는 그중 첫 번째, 학습시킬 불량 이미지가 없는 상황을 다룹니다.
비지도 이상탐지의 발상은 단순합니다. 모델에게 불량을 학습시킬 수 없다면, 불량을 아예 학습시키지 않습니다. 대신 양품 이미지만으로 "정상은 대체로 이렇게 생겼다"는 기준을 만들고, 새로 들어온 이미지가 그 기준에서 얼마나 벗어났는지를 점수로 환산합니다.

[그림 1] 양품만으로 기준을 만들고 이탈 정도를 점수로 환산하는 구조
이 방식에는 실무적으로 세 가지 이점이 있습니다. 첫째, 엔지니어가 결함 종류를 미리 정의하지 않아도 모델을 학습시킬 수 있습니다. 둘째, 검사 항목표에 없던 결함도 모델이 이상으로 걸러냅니다. 셋째, 양품 이미지는 라인을 돌리기만 하면 쌓이므로 신규 라인에도 바로 투입할 수 있습니다.
여기까지는 벤치마크에서 확인되는 이야기입니다. 문제는 양산 데이터를 넣기 시작할 때 생깁니다.
이상 점수를 어떻게 내는지부터
비지도 방식이 양산 현장 어디에서 무너지는지 설명하려면, 모델이 이상 점수를 어떻게 계산하는지부터 봐야 합니다.
널리 쓰이는 구성은 이렇습니다. 사전 학습된 백본에 양품 이미지를 통과시켜 중간 계층의 특징 맵을 얻습니다. 이 특징 맵을 이미지 한 장당 벡터 하나로 압축하지 않고, 패치 단위로 쪼개서 메모리에 저장합니다. 추론 단계에서는 입력 이미지에서도 같은 방식으로 패치를 뽑은 뒤, 각 패치가 메모리에 저장된 정상 패치들과 얼마나 떨어져 있는지를 잰 다음, 그중 가장 먼 값을 그 이미지의 이상 점수로 씁니다.
모델이 이미지를 패치 단위로 쪼개는 이유는 결함이 국소적이기 때문입니다. 이미지 전체를 벡터 하나로 압축하면 화면의 1%를 차지하는 스크래치가 나머지 99%의 정상 패턴에 희석됩니다. 패치로 나누면 결함이 포함된 패치에서만 점수가 튀므로 신호가 살아남습니다. 그리고 어느 패치에서 점수가 높았는지가 그대로 위치 정보가 되므로, 별도의 검출기를 붙이지 않아도 결함 영역까지 함께 나옵니다.
패치 크기는 엔지니어가 임의로 정할 수 있는 값이 아닙니다. 패치가 결함보다 지나치게 크면 결함이 패치 안에서 희석되고, 지나치게 작으면 그 패치만 봐서는 정상인지 결함인지 판단할 근거가 사라집니다. 미세 크랙의 한 조각만 떼어 놓으면 정상 표면의 결 무늬와 구분되지 않습니다. 그래서 저희는 검사 대상의 결함 크기 분포를 먼저 확인한 뒤, 백본의 어느 계층에서 특징을 뽑을지, 패치 크기를 어떻게 설정할지를 결정합니다.
메모리를 줄이는 과정에서 희귀 패턴 및 불량이 사라집니다
문제는 정상 패치를 저장하는 단계에서 생깁니다.
양품 이미지 수만 장에서 나온 패치를 전부 들고 있으면 두 가지가 감당되지 않습니다. 하나는 메모리 용량이고, 다른 하나는 추론 시간입니다. 입력 패치마다 저장된 모든 패치와의 거리를 재야 하는데, 저장량이 커질수록 이 탐색이 느려집니다. 검사 라인의 택트 타임(takt time) 안에 판정이 끝나야 하므로 저장량에는 상한이 생깁니다.
그래서 대표성 있는 일부만 남기는 축약을 거칩니다. 여기서 표준적으로 쓰는 기준은 전체 분포를 고르게 덮는 부분집합을 고르는 것입니다. 서로 멀리 떨어진 샘플을 우선 남겨서 커버리지를 확보하는 방식입니다. 이 기준에서는 다수를 차지하는 패턴이 반드시 살아남습니다. 밀집한 영역은 대표 몇 개만 남겨도 커버리지가 유지되기 때문입니다. 반대로 몇 장뿐인 희귀 품종이나 드물게 나타나는 표면 상태는 통째로 빠질 수 있습니다. 커버리지 관점에서 그 패턴을 남겨야 할 이유가 약하기 때문입니다.
결과적으로 1편에서 다룬 롱테일 문제가 메모리 안에서 재현됩니다. 애초에 희귀 품종은 원본 이미지 수가 적고, 축약 단계에서 그마저 빠집니다. 그리고 메모리에 없는 패턴이 추론 시점에 들어오면 모델은 정상 집합에서 멀다고 계산합니다. 정상인데 이상으로 뜨는 과검이 여기서 나옵니다.
반대 방향의 실패도 같은 원인에서 나옵니다. 희귀 품종의 배경 변동을 제대로 학습하지 못한 상태에서 그 품종의 정상 점수를 임계값 조정으로 억지로 낮춰 놓으면, 그 품종에서 발생한 미세 결함이 정상 변동 범위 안으로 들어가 버립니다.
양품 폴더에 불량이 섞여 있습니다
두 번째 문제는 학습 데이터 자체의 오염입니다. 1편에서 다룬 라벨 노이즈가 여기서는 더 직접적으로 작용합니다. 지도학습에서는 잘못된 라벨 하나가 여러 샘플 중 하나로 희석되지만, 비지도 이상탐지에서는 정상만 들어 있다는 전제 자체가 무너집니다.
오염된 샘플이 정상 메모리에 포함되면, 모델은 그 불량 패턴을 정상 집합의 일부로 기억합니다. 같은 유형의 불량이 다시 들어와도 저장된 패턴과 가까우므로 거리가 작게 나오고, 이상 점수가 올라가지 않습니다. 미검이 됩니다. 성가신 점이 하나 더 있습니다. 오염된 유형은 검증 세트에서도 같은 이유로 걸러지지 않기 때문에, 지표만 보면 문제가 드러나지 않습니다.
두 문제는 서로를 밀어냅니다
여기까지 보면 해법이 명확해 보입니다. 학습 데이터에서 이상해 보이는 샘플을 미리 걸러내면 됩니다. 실제로 여러 방법이 이 방향을 택합니다. 그런데 걸러내는 기준이 문제입니다. 노이즈를 제거하려면 알고리즘이 다수와 많이 다른 샘플을 의심해서 제외해야 합니다. 그런데 몇 장뿐인 희귀 품종과 희귀 결함도 정확히 그 특징을 가지고 있습니다.

[그림 2] tail과 noise의 trade-off 관계
필터를 조이면 희귀 패턴이 함께 지워지고, 느슨하게 하면 노이즈가 그대로 남습니다. 학계에서 tail-versus-noise 딜레마라고 부르는 상황입니다. 이 상충은 공개 벤치마크에서도 관찰됩니다. 롱테일 구간에 강한 모델은 데이터가 많은 구간에서 성능이 떨어지고, 데이터가 많은 구간에 최적화된 모델은 희귀 클래스를 놓칩니다. 오랫동안 둘 중 하나를 고르는 문제로 다뤄져 왔습니다.
걸러내기 전에 판별합니다
저희가 바꾼 것은 필터의 세기가 아니라 판단의 순서입니다. 알고리즘이 제외 여부를 정하기 전에 먼저 묻게 했습니다. 이 샘플은 원래 드문 것인가, 아니면 잘못 들어온 것인가?
구분의 단서는 샘플들 사이의 관계에 있습니다. 실제 희귀 클래스는 수가 적어도 자기들끼리 서로 닮아 있습니다. 같은 품종의 같은 표면 상태에서 나온 패치이기 때문입니다. 반면 잘못 들어온 노이즈는 서로 닮은 구석이 없습니다. 발생 원인이 제각각이라 특징 공간에서도 흩어져 있습니다. 이 차이를 이용해 알고리즘이 희귀 샘플을 먼저 식별한 뒤, 노이즈만 배제하고 희귀 패턴은 메모리에 남깁니다. 이 방법론을 TailedCore라는 이름으로 CVPR 2025에 게재했습니다.
노이즈 제거는 별도 알고리즘으로 다룹니다. 기존 방법들은 노이즈 비율을 하이퍼파라미터로 받았습니다. 데이터셋이 바뀌면 엔지니어가 그 값을 다시 잡아야 하는데, 현장에서는 실제 오염률을 모르는 상태로 들어갑니다. 오염률을 알고 있다면 애초에 오염된 샘플을 지목할 수 있으니 이 가정은 순환적입니다. 그래서 사람이 값을 넣는 대신 데이터 자체의 통계량에서 기준을 뽑아내는 방식으로 바꿨고, 오염률 40% 이상에서도 판정 기준이 유지되는 것을 확인했습니다. 위 내용은 MeDS(Memory-Distilled Selection)라는 이름으로 ICML 2026에 게재했습니다.
평균 지표는 꼬리 쪽 실패를 감춥니다
성능을 확인하는 방식도 같이 바꿔야 합니다.
비지도 이상탐지에서 가장 널리 쓰이는 지표는 이미지 단위 AUROC입니다. 그런데 이 값은 테스트 세트 전체를 평균한 숫자입니다. 희귀 클래스가 테스트 세트의 2%를 차지한다면, 모델이 그 클래스에서 완전히 실패해도 전체 AUROC는 거의 움직이지 않습니다. 1편에서 검출률 98%를 신뢰하기 어렵다고 쓴 것과 같은 구조입니다.
그래서 저희는 평균값 대신 클래스별로 나눠서 봅니다. 특히 표본이 적은 클래스는 몇 건만 틀려도 값이 크게 흔들리므로, 한 번 측정한 수치만 보지 않고 반복 측정했을 때의 편차를 함께 확인합니다.
검출률보다 점수 분포가 중요합니다
논문 지표와 별개로, 현장에서 훨씬 크게 체감되는 것은 이상 점수의 안정성입니다. 비지도 검사는 결국 점수가 특정 값을 넘으면 NG로 판정하는 임계값 운영으로 귀결됩니다. 그런데 품종마다, 로트마다 정상 이미지의 점수 분포가 서로 다른 위치에 있으면 임계값을 하나로 잡을 수 없습니다.

[그림 3] 임계값 설정의 trade-off
임계값을 낮게 잡으면 점수 분포가 높은 쪽에 있는 품종에서 정상이 이상으로 뜨고, 높게 잡으면 점수 분포가 낮은 쪽에 있는 품종의 미세 결함을 놓칩니다. 그래서 현장에서는 품종별로 임계값을 따로 잡게 되는데, 그 순간 1편에서 말한 관리 포인트 폭증이 그대로 재현됩니다. 품종이 수백 종이면 관리해야 할 임계값도 수백 개입니다.
그래서 저희는 학습 파이프라인에 한 단계를 더 넣습니다. 학습이 끝난 뒤 정상 데이터를 다시 통과시켜 점수가 유난히 높게 나온 양품 샘플을 골라내고, 그 샘플들의 비중을 높여 다시 학습시킵니다. 잘 학습되지 못한 구간을 찾아 메우는 과정입니다. 이 과정을 거치면 정상 점수 분포의 폭이 좁아지고 품종 간 위치 차이도 줄어들어서, 여러 품종을 하나의 임계값으로 운영할 수 있게 됩니다. AUROC 몇 퍼센트 차이보다 이쪽이 실제 도입 난이도를 크게 좌우합니다.
남는 한계
비지도 모델은 정상에서 벗어났다는 사실까지만 알려줍니다. 그것이 크랙인지 이물인지 찍힘인지는 구분하지 못합니다. 이 한계는 두 가지 실무 문제로 이어집니다. 하나는 불량 유형별 발생 추이를 낼 수 없다는 점이고, 다른 하나는 재작업 여부를 자동으로 결정할 수 없다는 점입니다. 유형에 따라 재작업과 폐기가 갈리는 라인에서는 결국 사람이 다시 봐야 합니다.
그렇다고 지도학습으로 돌아가면 1편의 네 번째 문제, 학습하지 않은 결함을 정상으로 분류하는 문제가 다시 생깁니다. 다음 글에서는 이 둘을 하나의 시스템에 넣은 구조를 다룹니다.
[AI검사, 현장의 문제들] 시리즈
1편. 불량 제품이 없는 상태에서 AI Inspection 시작하기
2편. 정상만 학습해서 이상을 찾을 때 막히는 지점들 (현재글)
3편. 지도학습과 비지도학습을 한 시스템에 같이 넣은 이유
4편. 품종 수천 종을 모델 하나로 처리하기까지
5편. 결함 데이터를 생성해서 학습에 쓸 때 지켜야 할 것
6편. 품종이 바뀔 때마다 사람이 광학계를 맞추는 문제


