골연령

kikiru328 | Jul 8, 2025 min read

Python PyTorch YOLOv5 TensorFlow PyQt5

한 장 요약본

프로젝트 개요

목록내용
프로젝트명소아 왼손 X-ray 기반 골연령 예측 및 성장 예측 시스템
개발기간2021년 10월 - 2021년 11월 (1개월)
역할팀리더
기여도40% (설계 및 전처리 중심)
핵심 과제

성장기 아동 왼손 X-ray를 활용하여 골 연령을 예측하는 모델을 개발한다.


핵심 성과 지표

지표달성값측정 방법
MAP@0.50.991YOLOv5 객체 탐지. 관절 7개 부위 탐지
MAE4.7개월전문의 판단 대비 평균 4.7개월 차이
실용성GUI개발PyQt5기반 완전 독립 실행 GUI 개발

기술 스택 및 아키텍처

핵심 기술 스택

Detection    : YOLOv5s              # (13개 골 관절 탐지)
Regression   : TJNet                # (VGG16 + Gender Embedding)
Processing   : OpenCV 4.5+          # (전처리 파이프라인)
Framework    : PyTorch 1.11.0       # (딥러닝 백엔드)
Medical      : LMS 방법             # (성장 예측 알고리즘)
Validation   : Bland-Altman         # (의학적 검증)
UI           : PyQt5                # (데스크톱 GUI)
Visualization: Matplotlib           # (성장 그래프)
Report       : openpyxl             # (Excel 보고서)
Deployment   : Pyinstaller          # (.exe 독립 실행)

시스템 아키텍처

  graph TD
    A[Image]
    subgraph Preprocessing
        B[Remove Background]
        B --> C[Bone Segmentation]
        C --> D[Make Mask]
    end
    subgraph Model
        E[YOLO Inference<br/>TW3 7 ROI]
        E --> F[TJ-Net]
        F --> G[Bland-Altman]
        end

    subgraph Service
        Preprocessing --> Model
        H[LMS 18th Hight] --> I[Graph]
        F --> H
        I --> J[Make Report]
    end

    A --> Service

주요 기술적 도전과 해결책

1. 복잡한 X-ray 영상 전처리 파이프라인 최적화

  • 목표: 다양한 촬영 조건에 대해서 배경 노이즈, 손 위치 변화가 있더라도 동일한 ROI 추출힐 수 있도록 전처리
  • 제약: 의료 영상 특성항 높은 정확도가 요구. 뼈 구조의 명확한 구분이 필요

문제 해결 과정

  • 체계적 파이프라인 설계

    • Bitwise를 통해 마스크 생성 및 배경 제거
    • 손목 중간과 손목이 시작되는 지점을 x,y로 설정. 선형회귀선을 통해 각도 조정
    angle = math.atan2(h - 0, int(model.predict([[h]])) - int(model.predict([[0]])))*180/math.pi
    M = cv2.getRotationMatrix2D((w/2,h/2), angle-90, 1)
    rotate = cv2.warpAffine(before_rot_img, M, (w, h))
    
    • 밝기 조정 및 모폴로지 적용
    • CLAHE 기반 대비 개선
    clahe = cv2.createCLAHE(clipLimit=1.0, tileGridSize=(3,3)) 
    
성과

각 단계별 기능 자동화를 통해 처리시간 40% 단축


2. TW3 기법 기반 정확한 골관절 탐지 및 TJNet 모델 활용

  • 목표: 의학적 표준화된 TW3기법의 7개 골관절을 정확히 탐지하고 각각의 성숙도 평가
  • 제약: 손목과 손가락 20개 핵심 관절 중 7개를 정확히 탐지, 추출

문제 해결 과정

  • TW3표준 적용

    • 의학 문헌 기반 정확한 관절 분류 체계 구축
    • 직접 소아 나이, 성별별 데이터를 선택, 직접 Annotation
  • YOLOV5 학습 및 활용

    • 7개 ROI Annotation 데이터를 활용, 학습하고 검증
    {
        image: 621,
        batch_size: 2,
        epochs: 230
    }
    

alt text

  • TJ-Net 학습 및 활용
    • 기존 TJ-Net과는 달리 Input layer에 7개 ROI를 삽입하고 학습.
    • 이후 TJ-Net 특징으로 Gender layer에 성별 데이터를 추가하여 모델 학습 진행
    {
        train_data: 865
        validation_data: 371,
        batch_size: 4,
        epoch: 18 (early stopping)
    }
    

alt text

성과

YOLO mAP@0.5 0.991달성 TJ-Net MAE 4.7개월 달성


3. LMS 방법 기반 18세 예상 신장 예측

  • 목표 질병 관리청 소아 청소년 성장도표를 활용하여 18세 예측 신장을 제공하는 서비스 개발

문제 해결 과정

  • LMS방법론 구현
    • L,M,S 매개변수 활용 현재 신장의 분위수를 계산, 18세 신장 예측
def Height_prediction ( gender, BA, current_H ) :
    import pandas as pd
    lms_df = pd.read_csv('/content/drive/MyDrive/2차 프로젝트 원본 데이터/growth/height_df.csv')
    month_age = round(BA * 12)
    if gender == 1:
        lms_index = month_age - 36                                                             
        L_18, M_18, S_18 = lms_df.iloc[191,2], lms_df.iloc[191,3], lms_df.iloc[191,4]
    elif gender == 0:
        lms_index = month_age - 36
        L_18, M_18, S_18 = lms_df.iloc[383,2], lms_df.iloc[383,3], lms_df.iloc[383,4]

L,M,S = lms_df.iloc[lms_index,2], lms_df.iloc[lms_index,3],lms_df.iloc[lms_index,4]
x = current_H

Z = (((x/M)**L)-1)/(L*S)
Z = round(Z,4)

pred_height = M_18 * (1 + (L_18 * S_18 * Z)) ** (1 / L_18)
pred_height = round(pred_height, 1)
return pred_heigh

alt text

  • 종합 분석 시스템
    • 골연령 차이에 따른 성장 잠재력 분석
    • 시각적 표현을 통해 서비스 제공

비즈니스 임팩트 및 확장성

  • 저작권 등록
    • 등록번호: C-2021-048147
    • 저작물명: 손목과 손가락 관절을 이용한 소아/청소년의 뼈 나이 예측 프로그램
    • 등록기관: 한국 저작권 위원회
    • 창작일: 2021년 10월 18일
    • 등록일: 2021년 11월 17일
    • 공동저작자: 총 6명 (본인포함 5명 + 지도교수)

저작권