시스템 개요
본 프로젝트는 현대 의료 진단의 핵심 요소인 혈액 세포 분석을 자동화하기 위해 개발된 종합적인 인공지능 솔루션입니다. 주요 대상은 적혈구(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']
환경 설정
- 가상 환경 생성:
conda create -n blood_cell_analysis python=3.9 - 환경 활성화:
conda activate blood_cell_analysis - 필수 패키지 설치:
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; - 버튼 상태 변화: 호버 시 배경색 변경 및 반투명 효과
- 테이블 스타일링: 격자 무늬, 행 구분선, 텍스트 정렬
- 상태바: 실시간 시간 표시 및 작업 상태 정보 제공
시스템 플로우
- 사용자 인증 (로그인 또는 회원가입)
- 입력 소스 선택 (이미지/동영상/카메라)
- 감도 및 정밀도 파라미터 조정 (선택 사항)
- 탐지 시작 → 실시간 결과 출력
- 결과 저장 또는 재시작