Anomaly Detection
이상 탐지는 정상 패턴에서 벗어나는 데이터 포인트, 이벤트 또는 이미지 영역을 표시합니다. 이상 유형, 주요 방법, 시각 검사, 코드를 다룹니다.
이상 탐지는 정상 동작의 확립된 패턴에서 벗어나는 데이터 포인트, 이벤트 또는 이미지 영역을 식별하는 작업입니다. 이상치 탐지라고도 하며, 제조업 비전에서는 흔히 결함 감지 또는 자동 시각 검사라고 합니다. 이상은 드물고 종류가 다양하며 이전에 본 적 없는 경우가 많으므로, 대부분의 방법은 대체로 정상인 데이터에서 정상 상태를 학습하고, 새 입력이 해당 패턴에서 얼마나 벗어나는지 나타내는 이상 점수를 부여한 다음 임계값을 초과하는 점수를 표시합니다. 적용 사례로는 생산 라인의 긁힘과 찌그러짐, 사기성 카드 거래, 네트워크 침입, 고장 징후가 있는 기계, 의료 영상 분석에서 의심스러운 소견을 찾아내는 작업이 있습니다.
이상 유형#
- 점 이상: 고객의 평소 지출보다 50배 큰 거래처럼 다른 값과 크게 차이가 나는 단일 값 또는 이미지입니다.
- 맥락적 이상: 한 맥락에서는 정상이고 다른 맥락에서는 비정상인 값입니다. 뉴욕의 7월에 기온이 30 °C인 것은 보통이지만 1월이라면 우려할 만한 수준입니다.
- 집단적 이상: 구성원 각각은 정상적으로 보여도 시퀀스나 그룹으로 보면 비정상인 경우입니다. 예를 들어 1분 이내에 여러 국가에서 로그인 시도가 한꺼번에 발생하면, 각각은 특이하지 않더라도 전체적으로는 이상입니다.
이상 탐지 작동 방식#
방법마다 정상 데이터를 모델링하는 방식이 다릅니다.
- 통계 규칙: 평균에서 설정된 표준편차 수보다 멀리 떨어진 값이나 사분위 범위로 정한 범위를 벗어난 값을 표시합니다.
- 거리 및 밀도: 최근접 이웃과 멀리 떨어져 있거나 밀도가 낮은 영역에 있는 점을 표시합니다. 국소 이상치 계수가 이러한 방식의 예입니다.
- 격리: Isolation Forest는 무작위 절단으로 데이터를 분할하며, 이상치는 정상 데이터보다 적은 횟수의 분할만으로 격리됩니다.
- 단일 클래스 모델: 단일 클래스 서포트 벡터 머신(SVM)은 학습 데이터 주변의 경계를 학습하고 그 바깥에 있는 점을 표시합니다.
- 재구성: 정상 데이터만으로 학습한 오토인코더는 정상 입력은 잘 재구성하고 이상은 잘 재구성하지 못합니다. 따라서 재구성 오차를 이상 점수로 사용합니다.
- 특징 기반 시각 방법: PatchCore는 ImageNet으로 사전 학습된 네트워크에서 추출한 무결점 이미지의 패치 특징을 메모리 뱅크에 저장합니다. 각 테스트 패치와 가장 가까운 저장 패치 사이의 거리를 점수로 사용하며, MVTec AD 벤치마크에서 이미지 수준 AUROC를 최대 99.6%까지 달성합니다.
scikit-learn은 학습 데이터에 이미 일부 이상이 포함된 경우를 이상치 탐지로, 학습 데이터가 깨끗하고 새 입력에만 점수를 매기는 경우를 신규성 탐지로 구분합니다. 아래 스크립트는 정상적인 기계의 측정값으로 Isolation Forest를 학습하고 새 측정값 네 개의 점수를 계산합니다.
import numpy as np
from sklearn.ensemble import IsolationForest
# 1,000 readings from a healthy machine: temperature (C) and vibration (mm/s)
rng = np.random.default_rng(0)
normal = rng.normal([60, 2.0], [3, 0.3], size=(1000, 2))
# Learn what normal looks like, then score new readings
detector = IsolationForest(random_state=0).fit(normal)
new = np.array([[61, 2.1], [59, 1.8], [75, 2.0], [60, 4.5]])
labels = detector.predict(new) # 1 = normal, -1 = anomaly
scores = detector.decision_function(new) # below 0 = anomaly
for (temp, vibration), label, score in zip(new, labels, scores):
status = "anomaly" if label == -1 else "normal"
print(f"{temp:.0f} C, {vibration:.1f} mm/s -> {status} (score {score:+.3f})")학습 평균에 가까운 두 측정값의 점수는 +0.080과 +0.076으로 정상 범위에 있습니다. 과열 상태의 측정값인 75 °C는 −0.139, 평소보다 진동이 두 배 이상 큰 측정값은 −0.152이므로 둘 다 이상으로 표시됩니다. 모델은 두 고장 중 어느 것에 대한 사례도 본 적이 없습니다.
시각적 이상 탐지#
육안 검사는 결함을 수집하고 라벨링할 수 있는지에 따라 두 가지 접근 방식을 사용합니다. 결함 유형이 알려져 있고 예시가 있으면, 긁힘, 찌그러짐, 균열과 같은 클래스로 학습한 객체 탐지 또는 인스턴스 세그멘테이션 모델이 각 결함의 위치와 종류를 찾습니다. 이러한 클래스로 미세 조정한 YOLO26 탐지 또는 세그멘테이션 모델은 이미지에서 찾은 각 결함에 대해 박스 또는 마스크, 클래스, 신뢰도 점수를 반환합니다. 결함이 드물거나 예측하기 어려운 경우에는 정상 부품 이미지만 학습하는 단일 클래스 방법을 사용해 다른 항목을 표시하며, 예상하지 못한 결함 유형도 찾아낼 수 있습니다. 객체 및 텍스처 카테고리 15개에 이미지 5,000개 이상이 포함되고 학습 세트에는 결함이 없는 이미지만 들어 있는 MVTec AD 데이터셋은 이 설정의 표준 벤치마크입니다. Ultralytics Platform은 지도 학습 방식에 사용할 수 있도록 이 데이터셋을 탐지 데이터셋으로도 호스팅합니다. Anomalib와 같은 오픈 소스 라이브러리는 PatchCore 및 유사한 방법을 구현합니다.
이상 탐지기는 ROC 곡선 아래 면적(AUC)과 같이 임계값에 구애받지 않는 지표, 그리고 실제 운영자가 마주하게 될 오경보와 누락을 반영하는 선택된 임계값에서의 정밀도 및 재현율로 평가합니다. 이상은 드물기 때문에 임계값은 정상 검증 이미지의 점수로 설정하는 경우가 많습니다. 예를 들어 양품 중 1%만 초과하는 점수를 임계값으로 설정할 수 있습니다.
이상 탐지와 관련 용어 비교#
- 객체 감지: 미리 정해진 레이블 클래스 집합의 인스턴스를 찾습니다. 결함 데이터로 학습한 객체 감지기는 학습한 결함 유형만 찾아냅니다.
- 데이터 드리프트: 일주일 동안 이미지가 더 어두워지는 경우처럼, 시간에 따라 입력 전체 스트림의 분포가 변하는 현상입니다. 이상 탐지는 개별 입력에 점수를 매깁니다.
- 분포 외(OOD) 탐지: 모델이 학습 데이터와 다른 입력을 표시해 모델이 예측을 보류하거나 사람에게 처리를 넘길 수 있도록 합니다. 배포된 모델의 입력에 신규성 탐지를 적용하는 방식입니다.
- 변화 탐지: 홍수 전후의 위성 이미지처럼 서로 다른 시점에 촬영한 동일 장면의 이미지를 비교해 변경 사항을 찾습니다.










