CCTV 자세기반 이상행동 감지 (낙상·폭력)
단독 개발

지표
- 낙상 ST-GCN F1 99.6%윈도 분류 검증셋 2,283 (end-to-end 아님)internal-exp
- 폭력 ST-GCN F1 0.815fight/non-fight 윈도, AI Hub 174internal-exp
- 지연 13–16초→<2초AI Hub baseline 대비internal-exp
- 데모 45–50 FPSRTX 3090 720pdemo-env
- Orin Nano 50–64ms · 16–20 FPSJetson Orin Nano TensorRT FP16 실측internal-exp
페인
CCTV로 낙상이나 폭력을 잡으려면 두 가지가 동시에 필요하다. 자세 변화를 시간축으로 읽어야 하고, 그 판단이 현장에서 몇 초 안에 떨어져야 한다. 기존 방식은 행동이 끝나고 한참 뒤에야 경보가 떴고, 다인 환경에서는 누구의 행동인지 섞였다.
접근
2-stage로 나눴다. YOLOv11-Pose로 스켈레톤을 뽑고 BoTSORT로 사람별 추적을 건 뒤, 윈도 단위로 ST-GCN이 행동을 분류하고 temporal smoothing으로 깜빡임을 눌렀다. 다인 환경은 2-tier 로직으로 사람별 판정을 모아 장면 단위 경보를 확정했다. 폭력 모델은 사람당 V=17 관절 그래프 + 2-tier 구조로 정리했다(초기 V=34 설계는 폐기).
지표
- 낙상 ST-GCN F1 99.6% — 윈도 분류 검증셋 2,283 (
internal-exp) - 폭력 ST-GCN F1 0.815 — fight/non-fight 윈도, AI Hub 174 (
internal-exp) - 지연 13–16초→<2초 — AI Hub baseline 대비 (
internal-exp) - 데모 45–50 FPS — RTX 3090 720p (
demo-env) - Orin Nano 50–64ms · 16–20 FPS — Jetson Orin Nano TensorRT FP16 실측 (
internal-exp)
낙상 분류기는 윈도 단위 검증셋에서 F1 99.6%를 기록했다. 이건 ST-GCN 분류 단계의 정확도이고, 추적·스무딩까지 묶은 end-to-end 수치와는 다르다. 체감으로 더 큰 변화는 지연이었다. baseline에서 행동 종료 후 13–16초 걸리던 경보를 2초 안으로 당겼다. 엣지에서도 Jetson Orin Nano TensorRT FP16로 윈도당 50–64ms(16–20 FPS) 실측을 확인해, 디바이스 단독 추론이 가능한 수준을 잡았다.
스택 표
회고
까다로웠던 건 다인 처리였다. 사람별 윈도가 겹치고 추적 ID가 끊기면 판정이 흔들려서, 2-tier로 사람 단계와 장면 단계를 분리한 뒤에야 안정됐다. 엣지는 ONNX→TensorRT 변환 후 Orin Nano에서 FP16 실측까지 마쳤고(윈도당 50–64ms), 윈도 전략·입력 해상도 트레이드오프를 더 조여 처리량을 끌어올리는 작업을 이어가고 있다.
시각 자산
실제 AIHub 낙상 장면 + YOLOv11-Pose 스켈레톤 오버레이를 커버로, ST-GCN 혼동행렬과 Orin Nano 윈도 전략 latency 차트를 본문 자산으로 사용. 병원·요양원·가정 환경 프레임으로 적용 범위를 함께 제시.
스택
| OS | Ubuntu, Jetson L4T/JetPack 6 |
|---|---|
| Lang | Python 3.11 |
| Lib | Ultralytics YOLOv11-Pose, BoTSORT, OpenCV, supervision |
| FW | PyTorch 2.x, ST-GCN, TensorRT, DeepStream 7.1 |
| Tech | YoloPose+ST-GCN 2-stage, 다인 2-tier, Jetson Orin Nano, ONNX→TensorRT, HF Spaces, uv |