지도학습(YOLOv8) vs 비지도학습(PatchCore) 산업 결함 검사 비교, pixel 단위 실패 원인 분석까지
| 기간 | 2026.08 |
| 인원 | 개인 |
| 역할 | 전처리, 두 모델 학습·평가, 오탐/미탐 원인 분석 전체 |
| 주요 기술 | Python, PyTorch, anomalib(PatchCore), YOLOv8, OpenCV |
| GitHub | sung-ju-park/industrial-defect-inspection |
객체탐지 모델은 학습된 결함 유형은 잘 잡지만 본 적 없는 이상은 놓치기 쉽고, 이상탐지 모델은 정상과 다르면 다 잡아내지만 정확히 어디가 왜 문제인지 짚어내기 어렵다는 상반된 한계가 있습니다. 같은 데이터(MVTec AD hazelnut)로 지도학습(YOLOv8)과 비지도학습(PatchCore)을 각각 구현해 직접 비교하고, 두 접근의 실제 강약점을 데이터로 확인하고자 했습니다.
PatchCore는 image_AUROC 1.000으로 사실상 완벽하게 정상/불량을 구분했습니다. 이 숫자만 보면 "다 잘 된 것"처럼 보이지만, 결함의 정확한 위치까지 맞히는지는 이미지 단위 지표로는 전혀 알 수 없었습니다.
이미지 단위 판정에서 멈추지 않고, pixel 단위 IoU로 다시 뜯어봤습니다. 그 결과 PatchCore는 불량 이미지 70장 평균 IoU 0.193(최저 0.032)로, 결함이 있다는 것은 맞히지만 정확한 위치는 체계적으로 못 짚어낸다는 걸 확인했습니다. 같은 방식으로 YOLOv8도 결함 유형별로 나눠 재평가했습니다.
두 모델은 정확히 반대 지점에서 약했습니다 — PatchCore는 cut 결함의 위치를 못 짚었고(IoU 0.032), YOLOv8은 가늘고 긴 crack 결함을 거의 놓쳤습니다(recall 0.143). 축 정렬 바운딩박스 구조 자체가 가늘고 긴 형태를 표현하기 어렵다는 것이 원인으로 보입니다.
종합 F1 기준으로는 PatchCore(0.993)가 YOLOv8(0.714)보다 높게 나왔지만, 이 숫자 하나로 "PatchCore가 더 낫다"고 결론 내리지 않았습니다. cut/hole/print처럼 형태가 뚜렷한 결함은 YOLOv8이 거의 완벽하게(mAP50 ~0.995) 잡아내는 반면, PatchCore는 정상 여부 판단은 정확해도 위치 특정은 약하다는 것 — 즉 두 모델이 서로 다른 상황에서 강점을 갖는 상호보완적 관계라는 것이 이 프로젝트의 핵심 발견입니다. 추가로 coreset ratio를 1%와 10%로 바꿔 실험한 결과 성능 차이가 거의 없어, 이후 실험은 1%로 반복 속도를 높였습니다.