본 프로젝트는 발 및 발목 X-ray 영상에 대해 AI 기반 triage 분류를 수행하는 연구 프로젝트이다.
응급의료 환경에서는 다수의 X-ray 영상이 동시에 의뢰될 수 있으며, 긴급한 영상의 판독이 지연될 경우 치료 골든타임을 놓칠 위험이 있다. 특히 발 및 발목 X-ray는 해부학적 구조가 복잡하고, 영상 내 마커·석고·부목·고정 장치 등 질병과 직접 관련 없는 시각적 요소가 포함될 수 있어 모델이 임상적 특징이 아닌 데이터셋별 편향이나 shortcut feature에 의존할 가능성이 있다.
본 연구는 여러 공개 X-ray 데이터셋을 통합하여 4단계 triage grade 체계로 재구성하고, 다중 도메인 환경에서 발생하는 spurious correlation 문제를 완화하기 위한 여러 학습 기법을 비교한다.
본 프로젝트의 목표는 발 및 발목 X-ray 영상에 대해 다음과 같은 4단계 triage 분류를 수행하는 것이다.
| Grade | 의미 |
|---|---|
| Grade 1 | 골절 |
| Grade 2 | 추가 검사가 필요한 위험 소견 |
| Grade 3 | 비응급 이상 |
| Grade 4 | 정상 |
비교한 주요 실험 방법은 다음과 같다.
-
Baseline
- 도메인 일반화 기법을 적용하지 않은 ResNet18 기반 기본 분류 모델
-
DANN
- Gradient Reversal Layer를 이용하여 도메인 불변 특징을 학습하는 Domain-Adversarial Neural Network
-
Marker Paste
- 특정 데이터셋에 존재하는 텍스트 마커 shortcut을 완화하기 위해 마커 영역을 다른 도메인 이미지에 삽입하는 방법
-
SupCon
- 같은 triage grade에 속하는 샘플을 feature space에서 가깝게 학습시키는 Supervised Contrastive Learning
-
DeYO-style Patch Shuffle
- X-ray 이미지를 4×4 patch로 나눈 뒤 랜덤 셔플하는 augmentation을 적용하여 형태 및 촬영 구도 기반 shortcut 의존을 줄이는 방법
본 repository는 Jupyter Notebook 기반의 실험 재현용 코드로 구성되어 있다.
각 방법별 폴더에는 실험 notebook, 설정 파일, 로그, 결과물이 포함되어 있다.
CAPSTONE-DESIGN/
├── .vscode/
├── md/
├── model/
│ ├── baseline/
│ │ ├── logs/
│ │ ├── result/
│ │ ├── baseline_binary_resnet18_v2_seed42_fold0.ipynb
│ │ ├── baseline_resnet18_v2_seed42_fold0.ipynb
│ │ ├── baseline_resnet18_v3_seed42_fold0.ipynb
│ │ ├── baseline_resnet18_v4_seed42_fold0.ipynb
│ │ ├── baseline_resnet18_v5_seed42_fold0.ipynb
│ │ ├── config_baseline_binary.yaml
│ │ ├── config_baseline_v3.yaml
│ │ ├── config_baseline_v4.yaml
│ │ ├── config_baseline_v5.yaml
│ │ └── config_baseline.yaml
│ ├── DANN/
│ │ ├── logs/
│ │ ├── result/
│ │ ├── cdann_resnet18_v1_multiseed_aug.ipynb
│ │ ├── cdann_resnet18_v1_seed42_fold0.ipynb
│ │ ├── config_cdann_v1.yaml
│ │ ├── config_dann_v1.yaml
│ │ ├── config_dann.yaml
│ │ ├── dann_resnet18_v2_seed42_fold0.ipynb
│ │ └── dann_resnet18_v3_seed42_fold0.ipynb
│ ├── deyo_patch/
│ │ ├── result/
│ │ ├── config_deyo_patch.yaml
│ │ └── deyo_patch_resnet18_seed42_fold0.ipynb
│ ├── marker_paste/
│ │ ├── result/
│ │ ├── config_marker_paste.yaml
│ │ └── marker_paste_resnet18_seed42_fold0.ipynb
│ ├── simclr/
│ │ └── config_simclr.yaml
│ └── supcon/
│ ├── result/
│ ├── config_supcon.yaml
│ └── supcon_resnet18_seed42_fold0.ipynb
├── preprocess/
│ └── code/
│ ├── config.yaml
│ └── preprocess_lera_merge_resnet18_v2_seed42_2v1_1.ipynb
├── requirements.txt
└── .gitignore
| 경로 | 설명 |
|---|---|
preprocess/code/ |
원본 데이터셋을 triage grade 체계에 맞게 병합하고 전처리하는 notebook 및 설정 파일 |
model/baseline/ |
ResNet18 기반 baseline 실험 코드 |
model/DANN/ |
DANN 및 CDANN 관련 실험 코드 |
model/deyo_patch/ |
DeYO-style Patch Shuffle 실험 코드 |
model/marker_paste/ |
Marker Paste 실험 코드 |
model/supcon/ |
Supervised Contrastive Learning 실험 코드 |
model/simclr/ |
contrastive learning 관련 보조 실험 설정 |
logs/ |
각 실험의 학습 로그 저장 폴더 |
result/ |
각 실험의 metric, 예측 결과, figure, checkpoint 등 결과물 저장 폴더 |
config_*.yaml |
데이터 경로, 하이퍼파라미터, 실험 설정을 저장하는 YAML 파일 |
*.ipynb |
각 실험을 실행하는 Jupyter Notebook 코드 |
본 프로젝트는 별도의 빌드 과정이 필요한 소프트웨어가 아니라 Jupyter Notebook 기반 연구 실험 코드이다.
따라서 필요한 Python 패키지를 설치한 뒤 Jupyter Notebook 환경에서 각 실험 notebook을 실행하면 된다.
jupyter notebookJupyter Notebook 실행 후, 아래의 최종 실험 notebook들을 열어 순서대로 실행한다.
repository를 clone한 뒤, 프로젝트 폴더로 이동한다.
git clone <repository-url>
cd CAPSTONE-DESIGN필요한 Python 패키지를 설치한다.
pip install -r requirements.txtJupyter Notebook 관련 패키지가 설치되어 있지 않은 경우 다음 명령어를 추가로 실행한다.
pip install jupyter notebook ipykernel환경 구성 후 Jupyter Notebook을 실행한다.
jupyter notebook본 repository는 별도의 unit test 파일을 제공하지 않는다.
프로젝트 테스트는 최종 실험 notebook을 실행하고, 각 method의 result/ 폴더에 생성된 metric 및 결과 파일을 확인하는 방식으로 수행한다.
| Method | Final Notebook | Config |
|---|---|---|
| Baseline | model/baseline/baseline_resnet18_v5_seed42_fold0.ipynb |
model/baseline/config_baseline_v5.yaml |
| DANN | model/DANN/dann_resnet18_v3_seed42_fold0.ipynb |
model/DANN/config_dann.yaml |
| Marker Paste | model/marker_paste/marker_paste_resnet18_seed42_fold0.ipynb |
model/marker_paste/config_marker_paste.yaml |
| SupCon | model/supcon/supcon_resnet18_seed42_fold0.ipynb |
model/supcon/config_supcon.yaml |
| DeYO-style Patch Shuffle | model/deyo_patch/deyo_patch_resnet18_seed42_fold0.ipynb |
model/deyo_patch/config_deyo_patch.yaml |
- 데이터셋을 준비하고 각 config 파일의 데이터 경로를 로컬 환경에 맞게 수정한다.
- 전처리 notebook을 실행한다.
preprocess/code/preprocess_lera_merge_resnet18_v2_seed42_2v1_1.ipynb
- 각 방법별 최종 실험 notebook을 실행한다.
- 실행 후 각 method 폴더의
result/디렉토리에서 결과 파일을 확인한다.
예상 결과 저장 위치는 다음과 같다.
model/baseline/result/
model/DANN/result/
model/marker_paste/result/
model/supcon/result/
model/deyo_patch/result/
본 repository에는 원본 X-ray 데이터셋이 포함되어 있지 않다.
사용한 데이터셋은 공개 데이터셋이지만, 각 데이터셋의 라이선스 및 이용 조건을 따라야 하므로 원본 이미지는 repository에 직접 포함하지 않았다.
따라서 실험을 재현하려면 사용자가 각 데이터셋을 공식 출처에서 직접 다운로드한 뒤, config 파일에 지정된 경로 또는 아래와 같은 구조에 맞게 배치해야 한다.
data/
├── FracAtlas/
├── LERA/
└── AIHub/
sample data가 별도로 제공되는 경우에는 원본 데이터와 동일한 형식을 유지해야 한다.
본 연구에서는 다음 세 가지 공개 X-ray 데이터셋을 사용하였다.
| Dataset | 설명 | 사용된 grade | Link |
|---|---|---|---|
| FracAtlas | Musculoskeletal radiograph 기반 골절 데이터셋 | Grade 1 | https://www.kaggle.com/datasets/mahmudulhasantasin/fracatlas-original-dataset |
| LERA | Stanford Lower Extremity RAdiographs Dataset | Grade 1–4 | https://aimi.stanford.edu/datasets/lera-lower-extremity-radiographs |
| AIHub Synthetic X-ray | 국내 주요질환 이미지 합성 X-ray 데이터셋 | Grade 3–4 | https://aihub.or.kr/aihubdata/data/view.do?dataSetSn=71521 |
세 데이터셋은 서로 다른 레이블 체계를 가지고 있으므로, 전문의 소견을 참고하여 공통된 4단계 triage grade 체계로 재구성하였다.
최종 실험에서는 데이터셋-클래스 조합으로 총 7개의 그룹을 정의하였다.
FracAtlas-grade_1
LERA-grade_1
LERA-grade_2
LERA-grade_3
LERA-grade_4
AIHub-grade_3
AIHub-grade_4
데이터 불균형으로 인한 평가 편향을 줄이기 위해 test set은 7개 그룹별 20개씩 균등하게 구성하였다.
최종 데이터 구성은 다음과 같다.
| Split | 개수 |
|---|---|
| Train | 18,449 |
| Test | 160 |
모든 이미지는 224×224 크기로 resize한 뒤 ImageNet 통계값을 사용하여 정규화하였다.
본 프로젝트는 다음과 같은 오픈소스 라이브러리 및 공개 연구 방법을 사용하였다.
- Python
- PyTorch
- NumPy
- Pillow
- tqdm
- Jupyter Notebook
- YAML 기반 configuration 관리
- FracAtlas
- LERA: Lower Extremity RAdiographs Dataset
- AIHub Synthetic X-ray Dataset
각 데이터셋의 사용자는 해당 데이터셋의 공식 라이선스, 이용 약관, 접근 정책을 준수해야 한다.
- ResNet18 pretrained on ImageNet
- DANN: Domain-Adversarial Training of Neural Networks
- CutMix-inspired augmentation
- Supervised Contrastive Learning
- SimCLR-inspired contrastive learning
- DeYO-style Patch Shuffle augmentation
연구트랙 제출 요건에 따라, 본 repository에는 실험을 재현하기 위한 코드와 실험 결과물이 포함되어 있다.
원본 X-ray 이미지는 repository에 포함되어 있지 않다.
단, 실험에 사용한 데이터 구성, triage grade 매핑 방식, 전처리 notebook, config 파일은 repository에 포함되어 있다.
실험 데이터 구성은 다음과 같다.
| Dataset | Grade 1 | Grade 2 | Grade 3 | Grade 4 | Total |
|---|---|---|---|---|---|
| FracAtlas | 120 | 0 | 0 | 0 | 120 |
| LERA | 92 | 92 | 169 | 136 | 489 |
| AIHub | 0 | 0 | 13,500 | 4,500 | 18,000 |
| Total | 212 | 92 | 13,669 | 4,636 | 18,609 |
공통 학습 설정은 다음과 같다.
| 항목 | 값 |
|---|---|
| Backbone | ImageNet pretrained ResNet18 |
| Input size | 224×224 |
| Optimizer | AdamW |
| Learning rate | 1e-4 |
| Weight decay | 1e-4 |
| Batch size | 32 |
| Epoch | 15 |
| Scheduler | CosineAnnealingLR |
| Early stopping patience | 5 |
| Seed | 42 |
| Loss | Cross Entropy Loss with class weight [2.0, 2.0, 0.5, 0.5] |
| Main metric | Macro F1-score |
최종 실험 결과는 다음과 같다.
| Method | Overall Accuracy | Macro F1 |
|---|---|---|
| Baseline | 0.6625 | 0.5660 |
| DANN | 0.6687 | 0.5604 |
| Marker Paste | 0.6062 | 0.5337 |
| SupCon | 0.6875 | 0.5634 |
| DeYO-style Patch Shuffle | 0.6375 | 0.5675 |
SupCon은 가장 높은 Overall Accuracy를 기록하였고, DeYO-style Patch Shuffle은 가장 높은 Macro F1-score를 기록하였다.
다만 AIHub 도메인의 강한 데이터 편향과 LERA grade_2의 데이터 부족 문제는 모든 기법에서 완전히 해결되지 않았다.
각 실험 결과물은 다음 위치에 저장되어 있다.
model/baseline/result/
model/DANN/result/
model/marker_paste/result/
model/supcon/result/
model/deyo_patch/result/
각 result/ 폴더에는 실험별 metric, 예측 결과, figure, checkpoint 등 실험 결과물이 포함된다.
일부 method의 경우 여러 버전의 실험 결과 또는 ablation 결과가 하위 폴더로 구분되어 저장되어 있다.
본 연구는 다중 도메인 발 및 발목 X-ray 환경에서 spurious correlation 완화를 위한 여러 학습 기법을 비교하였으나, 다음과 같은 한계가 존재한다.
- AIHub 데이터가 전체 데이터셋에서 차지하는 비중이 매우 커 특정 도메인의 편향이 완전히 제거되지 않았다.
- LERA grade_2는 샘플 수가 부족하여 모든 기법에서 안정적인 분류 성능을 얻기 어려웠다.
- 실제 임상 환경 적용을 위해서는 병원 데이터 기반의 추가 검증이 필요하다.
향후 연구에서는 다음과 같은 방향으로 확장할 예정이다.
- IRB 심의 후 실제 병원 데이터를 활용한 임상 환경 검증
- 소수 클래스 데이터 증강
- 하이퍼파라미터 탐색
- 다양한 domain generalization 기법의 조합 실험
- X-ray 영상 triage 및 판독 우선순위 결정 시스템 구축
- 김가영
- 한승연
- 박지호
본 repository는 학술 및 연구 목적으로 작성되었다.
사용한 공개 데이터셋은 각 데이터셋의 공식 라이선스와 이용 조건을 따라야 하며, 원본 데이터의 재배포는 허용된 범위 내에서만 가능하다.