← Projects
완료IC-PBL 캡스톤디자인 2, 팀 도체부도체

WM-811K 웨이퍼 결함 분류

분류 난이도와 희소성에 따라 클래스별 증강량을 다르게 배분해, 결함을 놓치지 않는 성능(Recall)을 높인 프로젝트

WM-811K 웨이퍼 맵은 정상(None)이 약 85.2%를 차지하고, 결함 클래스끼리도 Edge-Ring 9,680장과 Near-full 149장처럼 차이가 큽니다. 모든 결함 클래스에 같은 양을 증강하면 클래스마다 다른 부족함과 분류 난이도를 반영하지 못해서, 정해진 증강 예산을 어떻게 나눌지에 집중했습니다.

WM-811K 웨이퍼 결함 분류 대표 화면
기간
2026년 1학기
인원
2명
내 역할
데이터 전처리, 증강, 모델 학습과 튜닝 (공동 수행)

기술 스택

  • Python
  • PyTorch
  • MobileNetV2

아키텍처

데이터를 준비하고 정상과 결함의 기준 비율을 찾아 증강 예산을 정한 뒤, 클래스별로 배분합니다. 이렇게 만든 3개 데이터셋을 같은 조건에서 학습시켜 비교했습니다.
데이터를 준비하고 정상과 결함의 기준 비율을 찾아 증강 예산을 정한 뒤, 클래스별로 배분합니다. 이렇게 만든 3개 데이터셋을 같은 조건에서 학습시켜 비교했습니다.

내가 한 일

  • WM-811K에서 라벨이 있는 데이터를 추출해 64×64, 3채널로 전처리하고, 5개 fold로 나눠 fold 0을 고정 테스트셋으로 썼습니다.
  • 회전과 반전 기반의 전통적 증강으로 균등 증강 데이터셋과 차등 증강 데이터셋을 만들었습니다.
  • ImageNet 사전학습 MobileNetV2를 전이학습하고, 검증 Macro-F2를 기준으로 모델을 선정했습니다.
  • 하이퍼파라미터(AdamW, learning rate, weight decay 1e-4)를 튜닝하고 클래스별 증강 가중치를 조정하며 실험했습니다.
  • 최종 보고서를 작성했습니다.
팀 맥락

2명이서 대부분의 실험을 함께 했습니다. 정상과 결함의 기준 비율 탐색과 증강 가중치 수식은 팀원이 주도했고, 전처리부터 증강, 학습, 튜닝, 가중치 조정까지는 함께 했습니다.

설계 결정

연구 질문 전환

선택지
어떤 증강 기법이 가장 좋은가 vs 같은 증강 예산을 클래스별로 어떻게 나눌 것인가
결정
증강량 배분 전략을 비교하는 쪽으로 바꿨습니다.
근거와 한계
기법 간 성능 차이가 크지 않아 단순 비교로는 불균형 문제를 어떻게 풀었는지 보여 주기 어렵다는 지도교수님 피드백을 반영했습니다.

모델 선정 기준

선택지
검증 F1-score vs 검증 Macro-F2
결정
Macro-F2로 바꾸고 Defect Macro-F2를 핵심 지표로 정했습니다.
근거와 한계
결함을 놓치지 않는 것(Recall)이 중요한 문제라서, Recall에 더 큰 비중을 두는 F2가 목적에 맞았습니다.

클래스별 증강량 배분

펼쳐 보기
클래스검증 F2난이도 D희소성최종 가중치증강량
Scratch0.58020.41980.50220.48301,130
Loc0.63510.36490.23780.3910915
Edge-Loc0.74500.25500.14960.2665624
Donut0.81750.18250.68600.2201515
Random0.87900.12100.57950.1421333
Center0.89500.10500.19510.1111260
Near-full0.94250.05751.00000.0747175
Edge-Ring0.96720.03280.00000.032877

분류가 어려운 Scratch와 Loc에 증강량이 가장 많이 배분되고, 이미 잘 분류되는 Edge-Ring에는 적게 배분됩니다.

최종 성능 비교 (fold 0 고정 테스트셋)

조건Macro-F1Macro-F2Defect Macro-F1Defect Macro-F2
원본0.87820.86470.86440.8488
균등 증강0.89470.88640.88290.8732
차등 증강 (제안)0.89170.89070.87950.8783

차등 증강은 F2 계열 지표에서 가장 높았고, F1 계열은 균등 증강이 조금 더 높았습니다.

증강량 배분 수식

펼쳐 보기
python
difficulty = 1 - f2_score                    # 분류 난이도 (검증셋 F2 기준)
scarcity = math.log(n_max / n_class)         # 희소성 보너스 (데이터가 적을수록 큼)
weight = difficulty * (1 + 0.3 * scarcity)   # 최종 가중치
aug_count = budget * weight / total_weight   # 증강 예산 4,024장을 가중치 비율로 배분
배분 수식을 코드로 옮긴 것입니다. 0.3은 휴리스틱 계수입니다.

결과

Macro-F2
0.8647 → 0.8907
Defect Macro-F2
0.8488 → 0.8783
Scratch F2
0.6356 → 0.7553
증강 예산
4,024장

배운 점

  • 불균형 데이터에서는 Accuracy 하나로 판단할 수 없어서, 문제 목적에 맞는 평가 지표를 먼저 정해야 한다는 것을 배웠습니다.
  • 모델 구조만큼이나 학습 데이터의 구성과 배분이 성능에 큰 영향을 준다는 것을 실험으로 확인했습니다.

한계

  • 희소성 계수 0.3 등 난이도 계산 수식이 휴리스틱이라 통계적 근거가 부족합니다.
  • Macro-F1은 균등 증강이 더 높았고, Donut, Random, Near-full은 차등 증강에서 오히려 점수가 낮아 모든 클래스가 고르게 개선되지는 않았습니다.
  • 공개 데이터셋(WM-811K)만 사용해서 실제 생산라인 데이터로는 검증하지 못했습니다.

다음 개선 과제

  • 결함 패턴의 형태에 맞춰 클래스별 증강 기법과 증강량을 따로 정하기
  • 난이도 산정 기준이 객관적인지, 다른 도메인에도 일반화되는지 검증하기
WM-811K 웨이퍼 결함 분류 | Changmin.dev