구강 이미지 한 장으로 충치(Caries)와 마모(Abrasion) 의심 부위를 자동으로 탐지·분류하는 2단계 딥러닝 파이프라인 기반 진단 보조 시스템입니다.
RF-DETR(Detection) → Swin Transformer(Classification) 순으로 이어지는 2-Stage 구조를 채택했습니다.
- 충치·마모는 초기 발견 시 간단한 치료로 해결 가능하지만, 방치 시 신경치료·발치로 이어집니다. 그러나 일반인은 증상이 나타난 뒤에야 치과를 방문하는 경우가 대부분입니다.
- 구강 이미지는 복잡한 배경(잇몸·혀·입술·조명 반사), 작고 모호한 병변 경계, 치아 간 유사한 질감 때문에 AI 모델이 병변에 집중하기 어렵다는 기술적 난점이 있습니다.
- 본 프로젝트는 Detection으로 병변 위치를 먼저 좁히고, Classification으로 정밀 판별하는 2단계 구조를 통해 이 문제를 완화하고자 했습니다.
AlphaDent (Zenodo, Sechenov University, CC BY 4.0) — zenodo.org/records/16582489
| 항목 | 내용 |
|---|---|
| 이미지 수 | 약 1,200장 |
| 환자 수 | 295명 |
| 이미지 유형 | 고해상도 구강 사진 (DSLR) |
| 어노테이션 | 픽셀 단위 Instance Segmentation Mask |
| 클래스 | Abrasion, Filling, Crown, Caries 1~6 (총 9개) → 본 프로젝트는 Abrasion / Caries 중심으로 재구성 |
| 데이터 분할 | Train 273명 / Val 22명 / Test 135장 |
Detection 라벨 분포 (객체 수 기준)
| 클래스 | Train | Valid | Test |
|---|---|---|---|
| Abrasion | 5,125 | 609 | 616 |
| Caries | 2,912 | 337 | 315 |
Abrasion 대비 Caries 데이터가 약 1.76:1로 불균형하여, Copy-Paste 증강으로 Caries 객체 수를 +25% 확장(2,923 → 3,660)해 비율을 1.40:1로 완화했습니다.
Classification 라벨 분포 (Train 기준, 총 14,497장)
| 클래스 | 학습 수 |
|---|---|
| Neither (정상) | 5,634 |
| Caries | 1,771 |
| Abrasion | 6,050 |
| Caries & Abrasion (Both) | 1,042 |
입력 이미지
│
▼
[1단계] RF-DETR (Detection)
│ threshold=0.001 → score ≥ 0.35 필터
│ bbox + confidence 후보군 추출
▼
[2단계] Swin Transformer (Classification)
│ 각 bbox 크롭 → 재분류
│ Normal 확률 ≥ 0.45 이면 제거 (False Positive 억제)
│ Abrasion / Caries 중 확률 높은 클래스로 최종 판정
▼
결과 집계 (bbox별 신뢰도, 평균 신뢰도, 병변 개수)
Detection이 찾은 bbox를 Classification 모델로 한 번 더 검증함으로써, Detection 단독 대비 False Positive를 줄이고 True Positive를 늘리는 방향으로 설계했습니다.
| Experiment | Precision | Recall | F1-score | Remark |
|---|---|---|---|---|
| RF-DETR Baseline | 0.8128 | 0.5736 | 0.6725 | Detection 최종 모델 선정 |
| RF-DETR + Copy-Paste | 0.6885 | 0.6216 | 0.6532 | 전체 Recall 상승 |
| Caries Recall (Copy-Paste) | 0.3206 → 0.5370 | +67% | - | 가장 큰 개선폭 |
| Caries Recall (Gamma) | - | +34% | - | mAP@0.5 유지하며 개선 |
| Final Pipeline | Detection + Swin Transformer | FP 억제 | - | 2-Stage 통합 시스템 |
원본(전처리 X) 데이터셋 기준, RF-DETR이 D-FINE 대비 전반적으로 우세하여 최종 Detection 모델로 채택했습니다.
| 모델 | Precision | Recall | F1-score | mAP@0.5 | mAP@0.5:0.95 |
|---|---|---|---|---|---|
| RF-DETR | 0.8128 | 0.5736 | 0.6725 | 0.6376 | 0.4504 |
| D-FINE | 0.6378 | 0.5768 | 0.6058 | 0.5437 | 0.4014 |
| RF-DETR (Caries only) | 0.7594 | 0.3206 | 0.4509 | 0.4560 | 0.1706 |
| D-FINE (Caries only) | 0.5946 | 0.1397 | 0.2262 | 0.3043 | 0.1164 |
Caries는 두 모델 모두에서 전체 평균 대비 Recall이 크게 낮아, 별도의 증강·튜닝이 필요함을 확인했습니다.
Copy-Paste Augmentation
| 구분 | Precision | Recall | F1-score | mAP@0.5:0.95 |
|---|---|---|---|---|
| RF-DETR (증강 전) | 0.8128 | 0.5736 | 0.6725 | 0.4504 |
| RF-DETR (증강 전, Caries) | 0.7594 | 0.3206 | 0.4509 | 0.1706 |
| RF-DETR (증강 후) | 0.6885 | 0.6216 | 0.6532 | 0.5104 |
| RF-DETR (증강 후, Caries) | 0.6105 | 0.5370 | 0.5714 | 0.3219 |
- Caries Recall 0.32 → 0.54 (+67%), Caries mAP@0.5:0.95 약 2배 상승
- 전체 Recall도 0.57 → 0.62로 함께 상승, Abrasion 성능 저하 없이 Caries 탐지력만 개선
- Precision 하락은 Recall 극대화에 따른 트레이드오프로 해석, 이후 Classification 단계에서 정밀도 보완을 시도
Rotation & Gamma Augmentation
- Gamma 보정: mAP@0.5 유지(0.60→0.61)하면서 Caries Recall 34% 향상
- Rotation: mAP@0.5가 0.60→0.33으로 절반 가까이 하락 — 구강 X-ray/구내 사진 특성상 회전이 오히려 모델에 혼란을 유발
- 목표였던 Caries Recall 0.7에는 미달(최고 0.43), 추가 전략(데이터셋 교체 등) 필요성 확인
데이터셋 교체 실험 (Syed vs AlphaDent vs Combined)
내부 평가와 외부 데이터셋 교차 평가를 통해 일반화 성능을 비교한 결과, 단일 데이터셋으로 학습한 모델은 자기 자신의 내부 평가에서는 높은 성능을 보이지만 외부 데이터셋에 대한 일반화 성능은 크게 떨어지는 것을 확인했습니다(Exp1, Exp3 모두 external 평가에서 mAP가 0에 가깝게 급락).
Detection 결과 bbox를 GT label과 IoU 비교로 재라벨링한 데이터셋으로 RegNet과 Swin Transformer를 비교했습니다. Detection 단독 대비 (Detection + Classification) 파이프라인이 False Positive를 줄이는지, True Positive를 늘리는지를 기준으로 최종 모델을 선정했습니다.
| 파이프라인 | Abrasion 예측 | Caries 예측 | Missed |
|---|---|---|---|
| Detection Only | 514 / 0 | 0 / 239 | Abrasion 101, Caries 174 |
| Detection + RegNet | 417 / 0 | 0 / 201 | Abrasion 198, Caries 212 |
| Detection + Swin | 437 / 0 | 0 / 195 | Abrasion 178, Caries 218 |
실험 조건: epoch 25, batch size 8, optimizer AdamW, learning rate 1e-4
cd web
pip install -r requirements.txt
streamlit run app.py화면 흐름: 홈 → 촬영/업로드 → 분석 중 → 결과
- 결과 화면에서 bbox, 부위별 신뢰도, 평균 신뢰도, 병변 개수 확인 가능
- AI 분석 결과는 참고용이며 실제 진단을 대체하지 않음을 화면에 명시
| 구분 | 내용 |
|---|---|
| 프레임워크 | Streamlit |
| 언어 | Python 3.11 |
| AI 모델 | RF-DETR (탐지) + Swin Transformer (분류) |
| 이미지 처리 | Pillow, torchvision |
| 배포 환경 | Ubuntu EC2, port 8501 |
- Caries 탐지 Recall이 목표치(0.7)에 아직 도달하지 못함 — 추가 데이터 확보, 손실 함수 개선(class-balanced loss 등) 필요
- 단일 데이터셋(AlphaDent) 학습 모델의 외부 데이터셋 일반화 성능이 크게 저하됨 — 다양한 촬영 환경/장비의 데이터 추가 확보 필요
- Detection→Classification 2단계 구조에서 Classification이 Recall을 개선하지 못하고 오히려 Missed가 증가하는 경향 확인 — 임계값(threshold) 및 padding 비율 추가 튜닝 여지
code/
├─ classification/ # 분류 모델(Swin, RegNet 등) 실험 코드
│ ├─ gayoung/
│ ├─ gayoung_sequencial/
│ ├─ Jaewon_Classification_Final/
│ └─ seoyeon/
│
├─ detection/ # 탐지 모델(RF-DETR 등) 실험 코드
│ ├─ Jaewon/
│ ├─ Seoyeon/
│ └─ soyoung/
│
├─ web/ # 웹 데모 (Streamlit)
│ ├─ app.py
│ ├─ requirements.txt
│ └─ README.md
│
└─ .gitignore
각 실험 폴더(classification/, detection/)는 팀원별로 진행한 모델 튜닝·증강 실험 스크립트를 담고 있습니다.
| 분야 | 내용 |
|---|---|
| 🔬 실험 설계 | Ablation Study 설계 및 하이퍼파라미터(Threshold, Epoch, Batch Size, Learning Rate) 통일 |
| 🎯 Detection 모델 선정 | RF-DETR과 D-FINE 성능 비교 후 RF-DETR 채택 |
| 🖼️ 전처리 및 증강 | Baseline, Copy-Paste, Gamma, CP+Gamma 실험 수행 |
| 🏷️ Classification 데이터셋 구축 | OoF 기반 데이터셋 생성 및 IoU 라벨링 기준 수립 |
| 🧠 Classification 모델 평가 | RegNet과 Swin Transformer 비교 및 성능 분석 |
| ⚙️ 파이프라인 통합 | Detection → Classification 전체 파이프라인 구축 |
| 📊 결과 분석 및 발표 | 주차별 발표자료 작성 및 실험 결과 토론 |
![]() |
![]() |
![]() |
![]() |
| 가영 | 소영 | 재원 | 서연 |
| Backend & Deployment | Detection Experiments | Classification Experiments | Frontend & Web Demo |
- 최종 발표 PPT: Google Slides 링크
본 서비스의 AI 분석 결과는 참고용이며, 실제 진단을 대체하지 않습니다. 증상이나 불편함이 있다면 치과 전문의 상담을 받으시기 바랍니다.




