YOLO 이상행동 탐지 프로젝트 흐름

1. 데이터 준비
문제정의
- 입력: CCTV 연속 프레임(1920×1080)
- 출력: 프레임마다 이상행동 사람 박스 + 레이블(normal, fall, crawl 등)
레이블링 단위 결정
- 프레임 단위로 박스 + 클래스
YOLO 포맷으로 정리
- images/train, images/val
- labels/train, labels/val
- 레이블 파일 형식(한 줄이 한 박스): 1 0.52 0.63 0.18 0.30 → class_id=1, 중심과 크기는 정규화 좌표
데이터 불균형 확인
- normal이 90% 이상, fall · crawl 매우 적음 -> Focal Loss 적용 이유
2. Training
구조 선택
- 모델: YOLOv5s -> 실시간 처리 위해 경량 모델 선택, 큰 모델보다 작은 모델 + 적절한 해상도가 낫기 때문
학습 설정
- 이미지 크기: 640×640
- Batch size: 32
- Epochs: 200
- Optimizer: Adam
- Loss: 기본 YOLO Loss + Focal Loss 로 교체/옵션 사용
Augmentation
- Random flip, scale, rotate, 밝기/대비 조절 등
- 특히 이상행동 데이터 부족 -> fall · crawl 이미지에 강한 Aug 적용
학습 실행 후 모니터링
- 학습 후 Epoch마다 train/val loss, mAP@0.5, mAP@0.5:0.95, 클래스별 Precision/Recall 확인
- 이상행동 클래스 Recall 올라가는지 확인
YOLO는 1 stage detector
-> 입력 이미지 한 번 통과시키면서 각 anchor마다 박스 + 클래스 직접 예측,
이 구조에 Focal Loss와 Augmentation 얹어 이상행동 데이터 불균형 보완
3. Evaluation
지표
- mAP
- 이상행동 탐지가 중요하기 때문에 fall/crawl 클래스의 Recall · F1 함께 확인
- IoU ≥ 0.5 예측을 TP로 두고 PR curve → 각 클래스 AP → mAP
- F1 = 2 * (Precision·Recall) / (Precision+Recall)
전체 mAP뿐 아니라 fall·crawl 클래스의 Recall과 F1 따로 보면서 실제로 이상행동 잘 잡는지 확인
4. Inference · 실시간 처리
모델 로드
- best.pt 가중치 불러오기
- Python 흐름: 프레임 읽기 → 640×640으로 resize → 모델 forward → 박스 + 클래스 + score 출력
후처리
- Confidence Threshold (0.25) 아래는 제거
- NMS로 겹치는 박스 정리
- class_id를 normal/fall/crawl 레이블로 다시 매핑
실시간 파이프라인
- CCTV 스트림에서 프레임 단위로 읽기(예: OpenCV).
- 매 프레임마다 YOLO 추론 → fall/crawl 박스 있으면 알람 신호 전송(서버/DB/웹소켓)
- FPS 측정 후 필요하면 이미지 해상도 낮추거나 batch=16 변경, 모델 더 작은 버전으로 교체
실서비스 연결
- 실제 관제 시스템에서는 fall/crawl Detection 발생 시 이벤트 로그 기록, 알림창 표시, normal은 알림 X
이상행동 있는 구간만 관제사에 보여주고 나머지는 자동 처리