# 내부 참고: 분기와 포즈 설명

상태: 2026-11-02 사이드 초안. **실제 영상 재검증이나 새 규칙 구현 결과가 아니다.** 아래 행동 예시는 현재 식의 의도를 설명하는 예이지, 해당 행동을 반드시 구분한다는 성능 보장이 아니다.

## 전체 구조 먼저

한 사람의 같은 현재 Frame Pose에서 `R1 OR D1 OR D2` 중 하나가 최종 조건을 만족하면 그 사람의 기여가 생긴다. ROI는 여러 사람의 결과를 통합한다. 한 사람의 다리와 다른 사람의 몸통을 합치지 않으며, 무릎 한 조건만 통과했다고 FALL을 확정하지 않는다.

| 경로 | 주로 보는 근거 | 이번 공개 제안 |
| --- | --- | --- |
| R1 | 화면상 몸통 기울기 + 같은 사람의 다리/허벅지 방향 + 서기 지지 억제 | B 몸통 최소각, C 골반→발목 최소각 |
| D1 | 짧게 투영된 몸통·다리, 작은 수직 간격, 펼친 무릎 등의 조합 | E 무릎 최소각만 |
| D2 | 어깨/골반/같은 다리의 상하 배치 역전 등의 조합 | 공개 추가값 없음 |

R1을 통과해야 D1을 검사하는 순차 필터가 아니다. R1이 실패해도 D1/D2가 통과할 수 있다. 각도는 2D 영상 좌표에서 계산한 값으로 실제 중력·3D 관절각·사람 행동 이름이 아니다. 탑뷰 문제를 해결했다고 해석하지 않는다.

## B/C의 정확한 범위

- B `r1_torso_min_deg`: R1 몸통의 수직 대비 기울기 최소값. 현재50도이며 제안50~60도. R1 전체에서 쓰지만 D1의 별도 몸통20도 조건을50~60도로 대체하지 않는다.
- C `r1_leg_min_deg`: 같은 사람의 골반→발목 방향 최소값. 현재50도이며 제안50~60도. R1 `F1_FULL_LEG`에만 적용한다.
- 발목 근거가 없어 R1이 사용하는 `F2_THIGH_ONLY`의 골반→무릎65도, 별도 bbox 비율1.10은 고정한다. C를 바꿔 이 대체 경로까지 같이 바꾸지 않는다.
- 값을 높이면 해당 경로가 통과할 수 있는 현재 자세는 좁아진다. 최종 ROI는 OR 구조여서 다른 경로가 계속 충족할 수 있다. 관측별 포함 관계와 새 Event 개수/시각은 같은 의미가 아니다.

## D: bbox 가로세로비는 내부에만 보존

D는 사람 bbox의 **너비/높이**다. 이번 공개 대상에서 제외했고 wire field명도 새로 확정하지 않는다. UI/Start 예시/외부 시연용 조절 항목에 넣지 않는다.

현재 D1/D2는 각각 내부 `box_aspect_min=1.10`을 쓴다. 예를 들어 bbox가 너비120·높이100이면1.20으로1.10 조건을 통과한다. 가상의 최소값1.30이면 이 조건은 실패한다. 이는 이해를 위한 계산 예일 뿐1.30을 추천하거나 시험한 것이 아니다.

처리 흐름은 현재 관측의 bbox·관절 유효성 확인 → 같은 사람의 geometry 계산 → 각 분기의 AND 조건 평가 → `R1 OR D1 OR D2` 통합이다. 비율은 D1/D2의 다른 조건과 **함께** 충족해야 하는 한 항목이며, 전체 FALL의 공통 입구나 R1을 차단하는 전역 억제가 아니다. R1 허벅지 보조 경로에도 별개 비율 상수가 있으므로 이름이 같아 보인다고 함께 조절하지 않는다.

화각·가림·중복 bbox·검출 박스의 흔들림에도 영향을 받으므로, 사용자가 단순한 '쓰러짐 민감도'로 이해하기 어렵다는 이유로 공개를 보류했다. 미래 고도화 아이디어일 뿐 이번 구현 대상이 아니다.

## E: 무릎은 펴져 있을 때 D1의 한 조건을 통과

골반-무릎-발목이 거의 일직선이면 무릎각은180도에 가깝고, 많이 접히면 작아진다. 현재 D1은 **사용 가능한 유효 full-leg 모두**에서 무릎각이140도 이상이어야 한다. 양쪽이 모두 유효하면 양쪽 모두, 한쪽만 유효하면 그 한쪽이 대상이다. 최소 하나의 유효 full-leg와 나머지 D1 조건도 필요하다. 누락된 다리는 펴졌다고 만들지 않는다.

| 사람이 이해할 포즈 예 | 조건을 둔 목적 | 중요한 한계 |
| --- | --- | --- |
| 쪼그려 앉기, 무릎을 깊게 굽힌 낮은 착석 | 몸통이 짧게 보이더라도 접힌 무릎이 관측되면 D1 통과를 막는 데 도움 | 모든 앉기/쪼그림을 정확히 분류하는 규칙이 아님 |
| 무릎을 꿇거나 몸을 낮추어 물건을 줍는 자세 | 접힌 다리 근거가 있다면 단순한 몸통 압축만으로 D1을 발동하지 않게 함 | 실제 관절 검출·화각에 따라 각도가 달라짐 |
| 다리를 편 채 엎드림/바로 누움이 카메라 쪽 깊이 방향으로 보이는 장면 | 화면상 몸통 각도만으로 놓칠 수 있는 자세를 다른 D1 geometry와 함께 받기 위함 | 이 포즈 이름을 출력하거나 무조건 감지하지 않음 |
| 똑바로 선 사람 | 무릎 조건 하나는 통과할 수 있음 | 나머지 몸통/다리 투영·비율 조건이 필요하므로 무릎만으로 FALL 아님 |
| 실제로 쓰러졌지만 다리를 구부리거나 웅크린 사람 | D1에서는 놓칠 수 있는 반례 | R1/D2가 보완할 수도 있지만 보장하지 않음 |
| 한 다리는 펴고 다른 유효 다리는 많이 구부린 쓰러짐 | `all` 조건 때문에 D1에서 탈락할 수 있음 | `any`로 바꾸는 것이 이번 제안은 아님 |

E를140→150→160으로 높이면 더 곧게 편 무릎만 D1 근거로 인정한다. 굽힌 일상 자세 억제에 도움을 줄 가능성과 실제 쓰러짐 누락을 함께 봐야 한다. **무릎이 펴졌으니 쓰러짐을 제외한다는 뜻이 아니라, D1의 한 통과 조건**이다. E 실패가 R1/D2나 다른 사람의 근거까지 막지 않는다.

## FIGHT 관측 수의 혼동 방지

`min_samples`는 최근 관측창에서 규칙이 승인한 관측 수다. 단순 검출 Frame 수나 모델 추론 횟수가 아니다. 같은 상대 관계·actor의 한 관측에서 여러 특징이 통과해도1로 센다. 근접 규칙의 승인 관측은 일반 수와 근접 수에 각각1씩 기여한다. 근접3개를 일반1개로 환산하지 않는다.

현재 일반 규칙이 통과한 경로는 일반 최소 수를, 현재 근접 규칙만 통과한 경로는 일반 최소 수와 내부 `contact_min_samples`를 모두 만족해야 한다. 현재 기본2/3에서 일반2→3으로 바꿔도 이미 근접3개가 필요한 경로는 똑같을 수 있다. '3이면 무조건 모든 싸움이 더 엄격해진다'고 설명하지 않는다. 근접 규칙은 사람이 부르는 밀치기만을 판별하는 분류기가 아니다.

## 시연 설명에 사용할 표현

권장 문장: '현재 기본 규칙값은 검토한 샘플에서 수용한 출발점입니다. 환경이나 설정 변경에 따라 오탐·미탐·알림 지연이 달라질 수 있어 먼저 기본값으로 확인하세요. 사람 score는0.35부터, 필요하면0.35~0.45 안에서 비교하고 관절은0.10을 권장합니다.'

사람 score는 낮은 score의 중복 후보가 판단에 섞이는 영향과, 실제 격한 동작/쓰러짐 중 낮은 score로 검출되는 대상을 놓치는 영향 사이의 절충이라는 **사용자 관찰**로 설명한다. 현재 검토에서 가장 좋은 출발점이라는 의미이지 모든 현장의 best, 중복 검출 구조의 원인 확정, 효과 보장이 아니다. score는 행동 확률이 아니다.

## 근거

- [R1 geometry와 판정](/workspace/contextra-analytics-runtime-lifecycle-refactor/app/fall_r2/reference.py)
- [R1 고정값](/workspace/contextra-analytics-runtime-lifecycle-refactor/app/fall_r2/base.json)
- [D1/D2 고정값](/workspace/contextra-analytics-runtime-lifecycle-refactor/app/fall_r2/rules.json)
- [R1/D1/D2 결합](/workspace/contextra-analytics-runtime-lifecycle-refactor/app/fall_r2/decision.py)
- [geometry 정의](/workspace/contextra-analytics-runtime-lifecycle-refactor/app/fall_r2/geometry.py)
- [FIGHT 관측 누적](/workspace/contextra-analytics-runtime-lifecycle-refactor/app/fight_r5/decision.py)

소스 지문은 [context](validation/context.json)에 보존한다. 포즈별 성능 비교·탑뷰 규칙·공간 이력 연결·일반화 검증은 이번에 실행하지 않았다.
