소아흉부 폐질환 진단 및 분류

kikiru328 | Jul 8, 2025 min read

Python TensorFlow Keras OpenCV PyQt5

한 장 요약본

프로젝트 개요

목록내용
프로젝트명소아흉부 폐질환 진단 및 분류 모델 개발
개발기간2021년 11월 - 2021.12월
역할팀리더
기여도40% (설계 및 전처리 중심)
개발환경네이버클라우드, Ubuntu 16.04, T4(1), RAM 20GB, HDD 100GB

경진대회 개요

목록내용
대회명“소아흉부 폐질환 진단 및 분류” 모델 개발 경진대회
대회기간2021년 11월 - 2021.12월
주최/주관한국지능정보사회진흥원(NIA), 과학기술정보통신부 / (주)FA솔루션, 고려대학교
참가 규모300팀 → 5팀 본선 → 3팀 수상
최종 성과2위 수상 (상금 100만원)
경진대회 핵심과제

소아 흉부 X-ray 이미지를 활용하여 정상을 포함한 7가지의 질환을 예측하는 모델 개발

기술적 제약사항

  • 정해진 서버 내에서만 사용이 가능한 외부 인터넷 연결이 제한된 폐쇄망 환경
  • 제공받은 데이터의 클래스 불균형 (약 8:1)
  • 팀 공용 서버 내 제한된 GPU 리소스로 동시 접속 시 성능이 저하
  • Github등 협업 도구 활용이 제한되어 있음

핵심 성과 지표

지표달성값측정 방법
F1-Score평균 0.63비공개 Test 데이터 활용, 평가
데이터 규모4,000장주관측에서 제공받은 소아 흉부 X-ray 이미지
상금100만원경진대회 2위 수상

기술 스택 및 아키텍처

핵심 기술 스택

Model     : CheXNet         # (DenseNet121 기반)
Framework : TensorFlow      # (Keras)
Preprocessing: CLAHE + U-Net # (폐 영역 분할)
Data      : DICOM 처리      # (pydicom)
Optimization: Class Weight  # (불균형 해결)
GUI       : PyQt5           # (의료진 사용)

시스템 아키텍처

  graph TD
    subgraph 경진대회
        A[DICOM 원본이미지<br/>4,000장] --> B[전처리 파이프라인]
        B --> C[U-NET<br/>폐 영역 분할]
        B --> D[CLAHE+전체 폐 처리]
        D --> E[Data Augmentation<br/>4배 증강]
        C --> E
        E --> F[CheXNet 모델<br/경진대회학습>]
        F --> G[성능평가<br/>F1-Score]
    end
    subgraph 추가개발
        H[RSNA 데이터셋] --> I[전처리 파이프라인]
        I --> K[CheXNet 모델<br/RSNA학습>]
        K --> J[PyQt GUI 개발]
    end
    F <--> K

주요 기술적 도전과 해결책

1. 데이터 불균형 문제 해결

도전과제

  • 목표: 제공받은 데이터의 불균형을 해결하여 모델을 개발해야 함
  • 제약: 심각한 클래스 불균형 (정상 25% vs 과대팽창 3.1%)
  • 제한: 소수 클래스의 학습 데이터 부족으로 인한 성능 저하

문제 해결 과정

  • Classweight: 소수 클래스에 높은 가중치 부여
# Class Weight 적용 예시
class_weights = {
    0: 1.0,      # 정상 (25%)
    1: 1.0,      # 폐렴 (25%)
    2: 1.56,     # 신생아호흡곤란증후군 (16%)
    3: 2.06,     # 흉막삼출 (12.1%)
    4: 2.45,     # 공기누출 (10.23%)
    5: 2.92,     # 무기폐 (8.58%)
    6: 8.06      # 과다팽창 (3.1%)
}
  • Data Augmentation: 4배 데이터 증강 (회전, 반전, 노이즈 추가)
결과 (Negative)

소수 클래스 학습 성능 향상, 하지만 여전한 과적합 문제


2. 의료 영상 전처리 파이프라인 최적화

  • 목표: DICOM 형식 의료 영상의 효과적 전처리 방법 부재
  • 제약: 동시 접속시 GPU 리소스 분할 사용 어려움
  • 갈등: 각자 주장하는 전처리 방법의 다양함

문제 해결 과정

  • 협업: 각자 샘플 데이터로 전처리 구현 → 시각적 비교 → 최적 방법 선정
# 전처리 파이프라인 예제
# CLAHE (Contrast Limited Adaptive Histogram Equalization)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
enhanced_image = clahe.apply(image)

# U-Net Segmentation을 통한 폐 영역 분할
segmented_lung = unet_model.predict(enhanced_image)

# 품질 필터링: 폐 개수 2개 이하 이미지 제거
if count_lung_regions(segmented_lung) <= 2:
    process_image(segmented_lung)
발견
  • Segmentation 역효과
    • 일부 질환(흉막삼출)에서 폐 분할이 없는 원본이 더 좋은 성능
  • 흉강 변화의 중요성
    • 특정 폐질환은 흉강 전체 관찰이 진단 핵심을 발견
  • 도메인 인사이트
    • 폐 내부만이 아닌 흉강 전체 관찰의 필요성 발견

3. CheXNet 모델 Customization

  • 목표: CheXNet 모델을 활용해서 향상된 구분 모델 개발
  • 한계
    • VGG16, InceptionV3, DenseNet169, ResNet50, MobileNet 등
    • 일반 CNN 모델등의 낮은 성능
  • 이유
    • DenseNet121을 백본으로 하는 흉부 X-ray 특화 모델
    • 의료 영상에서 입증된 안정적 성능

모델 아키텍처 커스터마이징

아키텍처 예제
# CheXNet 기반 구조
base_model = DenseNet121(
    include_top=False,  # feature extractor로 사용
    weights=None,       # 사전 학습 없이 NIA 데이터로 처음부터 학습
    input_shape=(224, 224, 1)
)

model = Sequential([
    base_model,
    GlobalAveragePooling2D(),  # 공간 정보 평균화
    Dense(units=7, activation='softmax')  # 7-class 분류
])
학습설정
{
    Epoch: 150,
    steps_per_epoch: 6,
    class_weight: class_weight,
}
backbone = DenseNet121(input_shape=(224, 224, 3),
                      weights= None,
                      include_top=False)
x = backbone.output # fc layer 

x = GlobalAveragePooling2D()(x)
x = Flatten()(x)
output = Dense(units=7, activation='softmax', name='output_layer')(x)
chexnet_model = Model(inputs=backbone.input, outputs=output)
성과

Train F1-score 결과 0.94 (과적합 예상) 비공개 Test F1-score 결과 0.63 (2위 수상)


4. 프로젝트 협업

1. 협업 방식

  • 제약
    • 제한된 서버 환경에서 손수 협업 필요

문제 해결 과정

  • Git을 사용할 수 없기에 직접 docs에 연구 과정 및 결과 기록
  • 각자 샘플 데이터로 전처리 방법 구현
  • 시간적 결과 비교 검토
  • 최적 방법 선정 및 적용
  • 명확한 역할 분배로 14일 내 개발 완료

성능 평가 및 검증

데이터 셋

주최측에서 공개하지 않은 비공개 데이터셋 사용

평가 지표

  • 주요지표: F1-Score
  • 보조지표: Precision, Recall, Accuracy, AUC

최종 성능

  • Test F1-Score: 0.63
  • 1등팀 비교: 0.8 (앙상블 모델 사용)
  • 성능차이원인: 단일모델 vs 아상블 모델 차이

비즈니스 임팩트 및 확장성

의료 현장 적용 가능성

  • 의료진 업무 지원: 소아 폐질환 진단 보조 도구
  • 진단 정확도 향상: 7가지 주요 폐질환 자동 분류로 오진위험감소
  • 접근성 개선: 전문의 부족 지역에서 1차 스크리닝 도구
  • 의료 비용 절감: 자동화된 진단 보조로 의료진 업무 효율성 향상

후속 연구 및 솔루션 개발

  • 데이터 제약 해결: NIA 데이터 공개 불가 → RSNA 데이터셋 활용
  • 공개 데이터로 모델 일반화 검증
  • PyQt기반 진단 시스템 개발: GUI 기반 사용자 친화적 인터페이스 제공

프로젝트 한계 및 개선 방향

아쉬운 점

  • 데이터 제약: NIA 데이터 공개 불가로 솔루션 배포 한계
  • DICOM 메타데이터 미활용: 의료 영상 고유 정보 활용 부족
  • 클래스 불균형 한계: 소수 클래스 성능 저하
  • 평가 지표 제한: 의료 AI 특화 지표 미검토

개선 방향

  • DICOM 전처리 고도화: 의료 메타데이터 활용으로 성능 향상
  • 도메인 전문성 강화: 의료진 협업을 통한 흉강 영역 포함 분석
  • 불균형 데이터 처리: 고급 샘플링 기법 및 합성 데이터 생성
  • 설명 가능한 AI: GradCAM 등을 통한 진단 근거 시각화
  • 실시간 진단 시스템: 웹/모바일 애플리케이션 개발