어제 NDT 결함 분류 실습을 끝내고, 같은 흐름을 도메인 무관한 체크리스트로 다시 추렸다. 다음에 다른 이미지 분류 과제를 시작할 때 이대로 따라가면 빠뜨리지 않는다.
Table of contents
Open Table of contents
11단계 체크리스트
1. 환경 설정 (GPU, 시드 고정, 라이브러리)
2. 데이터셋 로딩 + 검수 (클래스별 개수 확인)
3. EDA — 샘플 이미지 시각화
4. 전처리 정의 (리사이즈, 정규화, 증강)
5. 데이터 분할 (학습 / 검증 / 테스트)
6. 모델 준비 (구조 정의, 전이학습이면 가중치 로드)
7. 학습 설정 (손실 함수, 옵티마이저, 학습률)
8. 학습 + 매 에폭 검증 → 학습 곡선 확인
9. 테스트 평가 (정확도, Confusion Matrix, precision/recall)
10. Grad-CAM 으로 판단 근거 시각적 검증
11. 저장 + 추론 속도·모델 크기 측정 → 필요 시 양자화
각 단계의 요점
1. 환경 설정
- GPU 사용 가능 여부 확인 (
torch.cuda.is_available()) - 시드 고정 —
random,numpy,torch모두. 결과 재현성을 위해 반드시. - 라이브러리 임포트 정리
2. 데이터셋 로딩 + 검수
데이터가 잘 들어왔는지 반드시 클래스별 개수를 출력해 확인한다. 클래스 불균형은 학습 결과 해석에 결정적 영향을 미친다. 라벨링 실수도 이 단계에서 자주 잡힌다.
3. EDA — 사람 눈으로 먼저 보기
- 각 클래스의 샘플 이미지를 그리드로 시각화
- 사람 눈에도 클래스가 구분되는가?
- 잘못 라벨링된 이미지는 없는가?
- 데이터 파이프라인이 정상 동작하는가?
사람이 못 가르는 문제는 모델도 못 푼다. 학습 시작 전 EDA로 그 가능성을 먼저 가늠하는 게 시간 절약.
4. 전처리 정의 — 리사이즈 / 정규화 / 증강
- 리사이즈: 모델 입력 크기에 맞춤 (ResNet 계열은 보통 224×224).
- 정규화: 픽셀 값을 모델이 학습하기 좋은 분포로 재조정. (아래 별도 설명)
- 증강: 회전, 반전, 약한 밝기 변동 등. 학습 셋에만 적용, 검증/테스트에는 적용하지 않는다.
정규화는 왜 필요한가
한 줄 요약: 픽셀 값의 범위를 모델이 학습하기 좋은 형태로 다시 맞춰주는 작업.
원본 픽셀은 0–255 범위의 정수다. 이걸 그대로 넣으면:
- 값이 0 근처가 아니라 한쪽으로 치우쳐 있다 → 경사하강법의 수렴이 느리고 불안정해진다.
- 같은 모델이라도 채널마다 통계가 다르면 학습이 흔들린다.
정규화로 값을 0 근처로 모아주면 경사하강법이 더 빠르고 안정적으로 수렴한다. ImageNet 사전학습 모델을 쓸 때는 그 모델이 학습된 때의 평균·표준편차(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])에 맞춰 정규화하는 게 표준이다.
5. 데이터 분할
학습 / 검증 / 테스트 비율은 보통 7:1:2 또는 8:1:1. 클래스 비율을 유지하는 stratified split을 쓰면 분할 자체가 불균형해지는 사고를 막을 수 있다.
6. 모델 준비
- 모델 구조 정의 (직접 짜거나 표준 아키텍처 호출)
- 전이학습이면 사전학습된 가중치 로드 + 마지막 분류기 층만 우리 클래스 수에 맞춰 교체
7. 학습 설정
- 손실 함수: 다중 클래스 분류는 보통 CrossEntropyLoss.
- 옵티마이저: SGD / Adam / AdamW 중 선택.
- 학습률: 너무 크면 발산, 너무 작으면 수렴 늦음. 스케줄러(StepLR, CosineAnnealing 등) 활용하면 더 안정.
8. 학습 + 매 에폭 검증
학습 진행 중 매 에폭마다 검증 셋으로도 평가해 학습 곡선을 그린다.
- Train과 Val이 함께 내려가면: 학습 잘 되는 중
- Train만 내려가고 Val은 올라가면: 과적합 시작 — early stopping 검토
- 둘 다 정체되면: 학습률 조정 또는 모델 변경 필요
9. 테스트 평가
- 정확도(Accuracy) 는 시작점일 뿐.
- Confusion Matrix 로 어떤 클래스를 어떤 클래스로 헷갈리는지 본다.
- Precision / Recall / F1 — 클래스 불균형이 있거나 FN/FP 비대칭이 중요한 도메인에서 필수.
도메인에 따라 어떤 지표가 더 중요한지 다르다. NDT처럼 결함 놓침(FN)이 치명적이면 Recall, 광고 분류처럼 오탐(FP)이 사용자 경험을 해치면 Precision 중심.
10. Grad-CAM 으로 시각적 검증
모델이 결함/대상이 실제로 있는 위치를 보고 판단했는지를 히트맵으로 확인한다. 정확도가 높아도 모델이 배경이나 가장자리에 활성화되어 있다면 “우연히 맞춘 것” 일 가능성. 실무 도입을 위해서는 단순 정확도 너머 판단 근거의 신뢰성도 검증 대상.
11. 저장 + 성능 측정 → 필요시 양자화
- 모델 파일 저장 (
.pt또는.pth) - 추론 속도 (단일 이미지 평균 ms, FPS)
- 모델 크기 (MB)
- 임베디드/모바일 배포 대상이면 양자화(quantization) 로 INT8/FP16 변환 — 크기와 속도가 크게 개선되지만 정확도 손실 가능. 추가 단계로 진행.
정리
이 11단계는 도메인이 NDT든 의료 영상이든 일반 분류 문제든 거의 같다. 달라지는 건 1~3단계의 데이터 특성, 그리고 9단계의 도메인별 핵심 지표. 나머지는 사실상 템플릿화 가능.
더 공부해볼 것
1. 정규화 / 표준화의 종류
- 단순 [0,1] 스케일링 vs Z-score 표준화 vs ImageNet 통계 사용 — 각각 언제 쓰는가
- Batch Normalization, Layer Normalization, Instance Normalization 의 차이
- 참고: PyTorch Normalization 문서
2. 옵티마이저별 특성
- SGD + momentum: 단순하고 안정적, 큰 데이터에서 좋다고 알려진 선택
- Adam / AdamW: 빠른 수렴, 하이퍼파라미터에 덜 민감 — 그러나 일반화 성능에서는 SGD가 이긴다는 경험적 결과도 있음
- 언제 어떤 걸 고를지, 학습률을 어떻게 함께 튜닝할지
3. 학습률 스케줄링
- StepLR (정해진 간격마다 감쇠)
- CosineAnnealing (코사인 곡선 따라 감쇠)
- ReduceLROnPlateau (검증 지표가 정체되면 자동 감쇠)
- Warmup 단계와의 조합
4. 교차 검증 (Cross-Validation)
- 데이터가 적을 때 단순 분할 대신 k-fold CV 로 평가의 견고성 높이기
- Stratified k-fold 의 필요성
5. 양자화 (Quantization) — 어제 NDT 글에서 미뤘던 것
- PTQ (Post-Training Quantization) vs QAT (Quantization-Aware Training)
- INT8 양자화 후 정확도가 얼마나 떨어지는가, 어떤 모델에서 손실이 크고 어떤 모델에서 작은가
- ONNX 로 export 해서 모바일/엣지 디바이스에 올리는 흐름
회고
같은 작업을 두 번 하면서 알게 된 것: 첫 번째는 “도메인에 빠져 작업한 기록”이지만, 두 번째 정리는 그 위에 한 단계 올라선 추상화라는 것. 도메인 디테일을 한번 거치고 나서야 보편적 흐름이 보였다.
다음에 새 이미지 분류 과제를 시작하면 이 체크리스트를 옆에 두고 진행할 예정. 그러면서 도메인 차이로 단계마다 어떻게 갈라지는지 따로 모아보면, 더 일반화된 머신러닝 워크플로우 감각을 키울 수 있을 것 같다.