모델/성과 소개

이 서비스가 어떤 데이터로, 어떤 과정을 거쳐 지금의 모델에 도달했는지 정리했습니다.

데이터셋

출처AML-Cytomorphology_LMU (Matek et al. 2019), 뮌헨대학병원(LMU)
종류말초혈액도말(peripheral blood smear), 100배율 오일 침지
형식.tiff, 400×400
분할train 12,862 / val 2,748 / test 2,755 (70/15/15, stratified)

augmented 폴더는 왜 뺐나

원본 폴더에는 15개 클래스(18,365장)만 있는데, 실은 16번째 클래스(PRO)와 8개 클래스의 증강본이 augmented/라는 별도 폴더에 더 있습니다. 이번 프로젝트는 이 폴더를 처음부터 의도적으로 제외했습니다.

그 결과 실제 학습 스코프는 15클래스이고, 그중 4개(PMO 70장·PMB 18장·KSC 15장·LYA 11장)는 원본만으로도 극단적으로 표본이 적은 희귀 클래스입니다 — 아래 개발 과정 내내 이 문제가 계속 등장합니다.

모델 개발 과정

숫자를 올리는 것보다, 왜 그 선택을 했는지를 검증하는 데 더 많은 시간을 썼습니다.

Day 2

ML 베이스라인부터 시작

색상 특징(54차원)만으로 RF·SVM·LogisticRegression을 비교했습니다. SVM이 정확도(0.91)는 가장 높았지만 macro F1은 세 모델 다 0.35~0.36에 그쳤어요 — 표본이 적은 클래스를 거의 못 맞힌다는 뜻이었고, 이후 모든 결정은 이 문제를 어떻게 풀지에 맞춰졌습니다.

Day 3

어떤 백본을 쓸지 결정

MobileNetV2와 EfficientNetB0의 전이학습 특징을 같은 분류기로 비교한 결과, EfficientNetB0이 정확도·macro F1·weighted F1 세 지표 모두에서 앞섰습니다. 이후 전 과정에서 이 백본을 그대로 사용했습니다.

Day 4

불균형과 정면으로 붙다

기본 모델(v1) 위에 class_weight·L2 정규화·Dropout을 더한 v2, 거기에 희귀 클래스 자체 증강까지 더한 v3를 비교했습니다. v2가 macro F1 0.46으로 가장 좋았고, 오히려 증강(v3)은 소폭 하락했습니다 — 증강만으로는 근본적인 표본 부족 문제를 못 푼다는 걸 확인한 결과였습니다. v2를 대표 모델로 확정했습니다.

Day 6

파인튜닝, 그리고 숫자만 보면 안 되는 이유

여유 시간에 backbone 상위 레이어를 풀어서 재학습(파인튜닝)해봤습니다. 범위를 넓힌 wide 버전이 macro F1 0.48로 지금까지 중 가장 높은 수치를 기록했어요. 하지만 극소 클래스 표본 수 때문에, 이 개선폭을 그대로 믿어도 되는지는 확신할 수 없었습니다.

Day 7

지표가 좋아졌다고 실제로 나아진 건 아니었다

v2와 wide 모델에 같은 이미지 9장을 넣고 Grad-CAM으로 실제 판단 근거를 비교했습니다. 결과는 예상 밖이었어요 — 예측이 뒤집힌 사례는 0건이었고, 가장 위험했던 고확신 오답(MOB→MON)은 오히려 확률이 0.96→0.97로 더 나빠졌습니다. 집계 지표가 올랐다고 실제로 더 나은 판단을 하게 된 건 아니라는 뜻이었죠. 그래서 지표상으로는 더 낮은 v2를 최종 모델로 유지하기로 결정했습니다.

최종 모델 성능 (v2, EfficientNetB0)

이렇게 확정된 v2의 test셋 성능입니다.

Accuracy 90.0%
Macro F1 0.46
Weighted F1 0.90

Accuracy(90%)와 macro F1(0.46) 사이의 큰 격차는, 표본이 많은 클래스는 잘 맞히지만 표본이 적은 희귀 클래스는 여전히 어려워한다는 뜻입니다 — 아래 "알려진 한계"에서 더 설명합니다.

Grad-CAM으로 확인한 것

숫자만으로는 "왜 맞혔는지/왜 틀렸는지"를 알 수 없어서, Grad-CAM으로 모델이 이미지의 어느 부분을 보고 그 클래스로 판단했는지 히트맵으로 확인했습니다. 예측 결과 화면에서 원본과 나란히 보여주는 그 이미지가 바로 이 결과입니다.

알려진 한계

그래서 이 서비스는 "확정 진단"이 아니라, 3단계 수동 판독 과정 중 분류·설명 구간을 보조하는 도구로 설계했습니다.