딥러닝 기반 YOLOv11을 활용한 혈액 세포 자동 분석 시스템

시스템 개요

본 프로젝트는 현대 의료 진단의 핵심 요소인 혈액 세포 분석을 자동화하기 위해 개발된 종합적인 인공지능 솔루션입니다. 주요 대상은 적혈구(RBC), 백혈구(WBC), 혈소판(Platelets)이며, 이들은 임상 검사에서 중요한 지표로 활용됩니다. 본 시스템은 최신 YOLOv11 기반의 객체 탐지 모델을 사용하여 고정밀도의 실시간 분류를 수행하며, 사용자 친화적인 그래픽 인터페이스와 함께 완전한 워크플로우를 제공합니다.

주요 기능

  • 다양한 입력 방식 지원: 단일 이미지, 동영상 파일, 실시간 카메라 스트림 모두에 대한 탐지 가능
  • 실시간 결과 시각화: 원본 이미지와 탐지 결과를 쌍으로 비교 표시 (이중 화면)
  • 정밀한 파라미터 조절: 신뢰도 및 교차율 임계값 조정을 통한 감도 맞춤 설정
  • 자동 저장 기능: 탐지 결과 이미지 및 동영상 파일을 지정된 폴더에 자동 저장
  • 사용자 인증 시스템: 로그인/회원가입 기능과 비밀번호 강도 검사 포함
  • 고성능 멀티스레딩 아키텍처: UI 블러킹 없이 병렬 처리를 통한 원활한 작동

기술적 특징

  • PyQt5 기반의 현대적 디자인의 사용자 인터페이스
  • 다크 테마 + 동적 광효과로 시각적 피로 감소
  • 반응형 레이아웃으로 다양한 해상도 지원
  • 모델 가중치는 로컬 또는 네트워크에서 자동 다운로드
  • 모든 작업은 독립된 스레드에서 실행되어 메인 스레드 안정성 확보

데이터셋 구성

학습용 데이터셋은 전문적으로 준비된 미세현미경 이미지로 구성되며, 다음과 같은 특징을 갖습니다:

  • 클래스 수: 3개 (혈소판, 적혈구, 백혈구)
  • 총 이미지 수: 874장 (훈련: 765, 검증: 73, 테스트: 36)
  • 레이블 형식: YOLO 형식 (클래스 인덱스, 중심좌표 (x,y), 너비, 높이)
  • 전처리: 색상 보정, 회전/확대/축소 등의 데이터 증강 적용

데이터셋 구성 파일 (data.yaml) 예시:

train: ./datasets/images/train
val: ./datasets/images/val
test: ./datasets/images/test

nc: 3
names: ['Platelets', 'RBC', 'WBC']

환경 설정

  1. 가상 환경 생성:
    conda create -n blood_cell_analysis python=3.9
  2. 환경 활성화:
    conda activate blood_cell_analysis
  3. 필수 패키지 설치:
    pip install torch torchvision torchaudio ultralytics PyQt5 opencv-python pandas

모델 학습 절차

학습 스크립트 예시:

from ultralytics import YOLO

model = YOLO('yolo11s.pt')  # 사전 학습된 소형 모델
results = model.train(
    data='data.yaml',
    epochs=100,
    batch=8,
    device='0',
    workers=0,
    project='runs',
    name='blood_cell_detection'
)

모델 선택 옵션:

  • yolov11n.pt – 초경량, 임베디드 환경 최적화
  • yolov11s.pt – 균형 잡힌 성능, 실시간 처리 추천
  • yolov11m.pt – 중간 크기, 정확도 우선
  • yolov11b.pt – 기본 모델, 일반적 응용에 적합
  • yolov11l.pt – 고정밀도, 정교한 분석 필요 시

핵심 코드 구조

다중 스레드 탐지 엔진

class DetectionWorker(QThread):
    frame_ready = pyqtSignal(np.ndarray, np.ndarray, list)

    def __init__(self, model, source, conf_thres, iou_thres):
        super().__init__()
        self.model = model
        self.source = source
        self.conf_thres = conf_thres
        self.iou_thres = iou_thres
        self.running = True

    def run(self):
        cap = cv2.VideoCapture(self.source) if isinstance(self.source, int) or self.source.endswith(('.mp4', '.avi')) else None
        while self.running:
            ret, frame = cap.read() if cap else (True, cv2.imread(self.source))
            if not ret:
                break

            results = self.model(frame, conf=self.conf_thres, iou=self.iou_thres)
            annotated_frame = results[0].plot()

            detections = []
            for box in results[0].boxes:
                cls_id = int(box.cls)
                label = self.model.names[cls_id]
                score = float(box.conf)
                x, y, w, h = box.xywh[0].tolist()
                detections.append((label, score, x, y))

            self.frame_ready.emit(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB),
                                  cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB),
                                  detections)
            time.sleep(0.03)  # ~30 FPS 제어

        if cap: cap.release()

UI 상호작용 핸들러

def on_detection_complete(self, original_img, detected_img, results):
    self.display_original(original_img)
    self.display_detected(detected_img)
    self.update_result_table(results)
    self.status_bar.showMessage(f"탐지 완료 | {len(results)}개 객체 발견")

사용자 인증 로직

def validate_login(self, username, password):
    if len(password) < 6:
        return False, "비밀번호는 최소 6자 이상이어야 합니다."
    if username in ACCOUNTS and ACCOUNTS[username] == password:
        return True, "로그인 성공"
    return False, "아이디 또는 비밀번호가 잘못되었습니다."

파라미터 동기화 시스템

def on_confidence_change(self, value):
    self.conf_value_label.setText(f"{value:.2f}")
    self.conf_slider.setValue(int(value * 100))

def on_iou_change(self, value):
    self.iou_value_label.setText(f"{value:.2f}")
    self.iou_slider.setValue(int(value * 100))

시각적 디자인 요소

  • 광선 효과 버튼: border-radius: 8px; box-shadow: 0 0 12px #00ffff;
  • 버튼 상태 변화: 호버 시 배경색 변경 및 반투명 효과
  • 테이블 스타일링: 격자 무늬, 행 구분선, 텍스트 정렬
  • 상태바: 실시간 시간 표시 및 작업 상태 정보 제공

시스템 플로우

  1. 사용자 인증 (로그인 또는 회원가입)
  2. 입력 소스 선택 (이미지/동영상/카메라)
  3. 감도 및 정밀도 파라미터 조정 (선택 사항)
  4. 탐지 시작 → 실시간 결과 출력
  5. 결과 저장 또는 재시작

태그: YOLOv11 Deep Learning blood cell detection PyQt5 object detection

10월 1일 10:41에 게시됨