본문 바로가기

Visual Intelligence

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

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

이상행동 있는 구간만 관제사에 보여주고 나머지는 자동 처리

 


Tiny Star