# camera24 행동 인식 비교 준비

작성: 2026-10-26 KST / ltb1021. 상태: 준비 및 합성 입력 smoke 완료, 사용자 구간 지정 대기.

## 영상 검토

- `inputs/camera24_review.mp4`: Frame 번호와 경과시간을 넣은 검토본, 약 77 MB.
- `inputs/camera24_original.mp4`: 표시 없는 녹화 원본, 약 415 MB. 후속 모델 입력은 이 파일이다.
- `inputs/camera24_frame_map.csv`: 1부터 시작하는 파일 Frame 번호, 원본 PTS, 상대 시각, 검토본 PTS.
- 1920x1080, 4,322 Frame, 원본 duration 180.034667초, 평균 약 24.006 FPS의 VFR 자료다.
- 원본/검토본 Frame 수와 상대 PTS가 같고 최대 대응 오차 0초, 양쪽 디코딩 오류 없음.
- 양수 시간 간격만 관측했으며 중앙값 약 42ms, 최대 87ms, 중앙값 1.5배 초과 간격 21개를 보존했다.
- 송출 측 원본과 대조하지 않아 실제 송출/수신 Frame 손실이 전혀 없었다고 보장하지 않는다.
- 검토본의 ffprobe `r_frame_rate`는 VFR/encoder time base 때문에 90000/1로 보고된다.
  실제 Frame 수와 PTS 기준 평균은 약 24.012 FPS이며 90,000 FPS 영상으로 해석하지 않는다.
- 검토본 H.264 High/level4.0/yuv420p, faststart. 마지막 Frame duration 차이는 약 39ms이며 Frame PTS는 동일하다.
- 번호는 Runtime frameSeq가 아니다. 이번 원본을 다른 영상과 섞거나 파일 번호를 타 run에 재사용하지 않는다.

원래 요청은 camera23이었으나 실제 등록은 camera23=배회, camera24=싸움이었다.
사용자의 질문창 답변으로 camera24로 변경했고, camera23은 녹화하지 않았다.
원본 녹화는 1회이며 첫 컨테이너 시도는 파일 권한으로 Python 시작 전 실패했다.
정상 녹화 시작 2026-10-26 17:17:10 KST, wall 174.203초/미디어 약180초였다.
원본에 반복 주기 전체나 원하는 싸움 장면이 포함됐는지는 사용자 검토 대상이다.

피드백 양식:

```text
반복 시작/끝: Frame __ ~ __ / 반복 경계가 불명확하면 미확인
싸움 구간: Frame __ ~ __ / 상황 설명:
정상 행동 구간: Frame __ ~ __ / 상황 설명:
가림·판단 애매 구간: Frame __ ~ __ / 참고:
```

## 준비 환경

- 모든 image build와 GPU smoke는 아이서티 AI 서버에서 실행했다. test Runtime/컨테이너/GPU와 101은 미변경이다.
- 원격 root: `/storage/contextra/experiments/action-model-eval/2026/2026-10-26_contextra-camera24-prep_r01`
- 최종 시험 image: `contextra-action-eval:20261026-camera24-r03`
- image ID: `sha256:7c0fdf5e607a2a5eae998738327f8e4902b37caf6fe83acb832462fab21b9f4e`
- 기존 cached base: `pytorch/pytorch:2.7.1-cuda12.8-cudnn9-runtime`
- base ID: `sha256:c16f4c749e2d9e96878875cdf6cc45cddda1d1a36fddd371dd6f2360f1b6e2a2`
- Torch 2.7.1+cu128, torchvision 0.22.1+cu128, mmengine 0.10.7, mmcv-lite 2.1.0, MMAction2 1.2.0.
- OpenCV headless를 사용하며 MMEngine 패키지 metadata의 GUI OpenCV 요구와 실제 cv2 제공 패키지는 다르다.
- MMAction2 wheel에 빠진 namespace 경로는 `/opt/mmaction2` source PYTHONPATH로 해결했다.
- 운영 image, Compose, 채널 설정, 모델, 인증 파일에는 변경이 없다. host 패키지/driver 설치 없음.

| 후보 | 선택 | 합성 입력 -> 출력 | 준비 결과 |
|---|---|---|---|
| ST-GCN++ | NTU60 COCO17 2D joint u100 | 1x1x2x100x17x3 -> 1x60 logits | strict load / GPU PASS |
| PoseC3D | NTU60 COCO17 keypoint u48 | 1x1x17x48x64x64 -> 1x60 logits | strict load / GPU PASS |
| AVA SlowOnly | R50 K400 4x16 AVA2.1 | 1x3x4x256x256 + 2 boxes -> 2x81 logits | 호환 adapter / strict load / GPU PASS |
| YOWOv2 | Large AVA 16-frame | 1x3x16x224x224 -> batch list, 0x85 | strict load / GPU PASS; 합성 입력의 빈 검출 |

합성 입력 smoke의 최대 Torch reserved 메모리는 모델별 약 52/160/266/600 MiB였다.
실제 영상의 메모리·속도·정확도·시각화 수용 결과가 아니며 비교 성능표로 사용하지 않는다.
GPU 작업은 순차 실행했고 25% PyTorch allocator 상한, container CPU2/RAM8GiB, network none을 사용했다.

## AVA 호환 경계

공식 v1 다운로드 링크가 HTTP404여서 공식 v0.24.1 문서의 동일 R50/K400/4x16 계열 checkpoint를 선정했다.
이는 다른 학습 결과이며 v1 공개 성능 수치를 이번 weight에 적용하지 않는다.
공식 backbone과 BBoxHeadAVA forward를 사용하고 모든 checkpoint key를 strict하게 로딩했다.
MMCV native ops 대신 torchvision RoIAlign을 aligned=True/scale1/16/output8/sampling_ratio0으로 연결했다.
ROI 좌표 해석은 합성 선형 격자로 확인했다. MMCV native 구현과의 수치 동등성 및 full MMDetection wrapper는 미검증이다.
`helpers/ava_adapter.py`가 이 제한된 inference-only 호환 경로이며 운영 코드에 설치하지 않았다.

## 자료와 후속 조건

- `reports/assets.json`: source revision, 다운로드 URL, weight SHA256, 실패한 공식 링크와 대체 근거.
- `reports/classes_*.csv`: 후보별 전체 클래스/출력 index. NTU60은 0-based, AVA head는 background0 제외 후 1~80, YOWOv2는 0~79.
- `reports/smoke_*.json`, `reports/smoke_history_*.jsonl`: 성공 및 실패 경계. 최초 실패는 registry scope/검사 harness의 출력 단계와 batch 해석 문제로 수정했다.
- `reports/environment.json`, `pip_freeze.txt`, license 사본: source 사용 조건과 환경.
- Source license와 pretrained weight/dataset 조건은 별개다. 이번 준비가 납품/상용 사용 조건 확인 완료를 뜻하지 않는다.
- `reports/production_after.json`: camera24 설정, 기존 Pose engine/config 지문. 실제 person owner는 RFDETRKeypointPreview다.
- 현재 camera24 fight person_score=0.15, joint_score=0.3, 분석 목표10FPS, 전체화면 ROI다.
- raw `pose.enabled=false`만으로 provider Off라고 해석하면 안 된다. FIGHT 실행 계획에서 Pose가 선택된다.
- 후속에는 동일 원본을 10FPS로 선택한 대응표를 사용하고, 별도 시점의 실시간 Pose를 합성하지 않는다.
- 실제 원본의 Pose 추출/전처리/모델 비교/Top5 시각화는 아직 수행하지 않았다.
- Top5는 ST-GCN++ 쌍별, AVA/YOWOv2 bbox별, PoseC3D 구간 전체별이다. 임의 싸움 매핑이나 확률 합산 없음.
- 모델별 시간 구간과 미래 Frame 사용을 기록한다. 점수·클래스가 달라 같은 threshold로 우열을 단정하지 않는다.

## 종료와 재개

원본·검토본·대응표의 test 전송 후 SHA256을 원격 결과와 대조했다.
운영은 5서비스/6채널 running·22 stopped이며 사전 대비 run ID/generation/child PID와 설정 hash가 같다.
시험 컨테이너와 GPU process는 모두 종료했다. Sudo 파일·SSH 키·기존 image/config는 보존했다.
재개 시 actual 운영 상태와 이 manifest/hash를 확인하고, 사용자가 지정한 구간부터 평가한다.
시험 환경에는 상시 서비스·자동 시작이 없다. 정리 요청 시 이 고유 run과 전용 image만 대상으로 확인하며 운영 폴더는 제외한다.
r01/r02 image는 준비 중 호환 실패 이력이고 최종 사용 대상은 r03이다. 임의 image 삭제/prune은 수행하지 않았다.
