독자는 라벨을 확보하러 나가는 사람이다. “무엇을 몇 건, 어떤 조건으로 받아와야 하는가”에 답하는 문서다. 남은 기능 순서는 로드맵에 있고, 상세와 정본은 미결 항목이다.
작성 2026.09.04 · 담당 구역 ho(정상호)
0. 지금 있는 라벨
| 무엇 | 건수 | 성격 | 정답 자격 |
|---|---|---|---|
phaseA/labeling/labels.json | 117 프레임 / 39 클립 | 프레임별 대상자 박스 인덱스 | ❌ labeler가 “Claude (에이전트) 1차 — 사람 검수 필요” 다 |
pending6_side/.../side_form.csv | 12 클립 (39 중 27 제외) | top_hand·swing_arm·swing_leg·subject_ok | ⚠️ 사람 판독이나 1인·비교차 |
축구 contact_frame | 19건 중 16건 채점 | 공-발목 최근접에서 자동 도출한 참조 | ❌ 라벨 파일이 없고 ±2프레임 불확실성 |
| B-3·B-4·B-5 판독 | 60건 | Claude 격리 재판독 | ❌ 정답으로 승격하지 않기로 확정 |
🔴 labels.json에는 편향 고지가 붙어 있다 — 4개 클립 (3R1kvNrGJK0·O2GSaYqH8JY·gg5xRWjw3f8·xMIUw5mi3Eo)은 판독자가 최대=빨강·최중앙=초록으로 칠해진 이미지를 이미 본 상태였다. 고지를 남긴 것은 옳았고, 그래서 그 4건은 지금도 따로 다뤄야 한다.
즉 지금 정답 자격을 갖춘 라벨은 사실상 없다.
1. 왜 층 순서인가
기능 순서가 아니라 검증 의존 순서다. 파이프라인이 묻는 질문이 넷이고, 각 질문의 답은 아래 질문의 답을 전제한다.
층 1 누구를 재는가 (분석 대상)
층 2 어느 팔·다리를 재는가 (사지 판별)
층 3 어느 프레임을 재는가 (시점)
층 4 그 자세가 몇 점인가 (채점)
아래층이 미검증이면 위층 라벨은 낭비된다. 이건 추상론이 아니라 이미 일어난 일이다 — 미결 6번 판독에서 39건 중 27건이 빠졌고, 그 사유의 상당수가 “스켈레톤이 타자가 아니다”(층 1)였다. 층 2 서식을 39건분 만들어 사람에게 보냈는데 그중 27건은 층 1이 먼저 걸러야 했던 것이다.
층 1 — 분석 대상: 누구를 재는가
(a) 필요한 라벨
| 조작적 정의 | 프레임 하나에 대해, 분석 대상이어야 할 사람의 박스를 후보 배열 인덱스로 지목한다. 없으면 none |
| 건수 | 기존 117 프레임 / 39 클립을 사람이 재판독한다. 새로 만들 필요 없다 |
| 누가 | 일반인. “이 영상에서 야구를 하는 사람이 누구인가”는 종목 지식이 필요 없다 |
| 소요 | 클립당 15~20초 수준(스윙 측 서식 실측치). 39건 10~15분 |
| 소스 영상 | 기존 39클립으로 된다. 촬영 불필요 |
부수 산출: subject_ok 칸을 39건 전수로 채우면 그것이 곧 층 1 라벨이다. 지금은 12건뿐이고 27건은 미판독이다.
(b) 라벨 받기 전에 해야 할 일
- 🔴
labels.json의 편향 고지 4건을 판독 순서에서 분리한다. 같은 사람이 칠해진 이미지를 본 적 있으면 그 4건은 독립 관측이 아니다 - 자동 선택 결과(
_largest_person_box)를 판독 화면에 넣지 않는다.make_packet.py가 이미 그 원칙으로 만들어져 있다 — 후보를 전부 같은 색으로 그리고 selector 결과를 표시하지 않는다 - 표본 설계: 후보가 1개인 프레임은 selector를 재지 못한다(고를 것이 없다). B-1 라벨 97건 중 39건(40.2%)이 단일후보였다. 다중후보 프레임을 층화해서 뽑을지 먼저 정한다
(c) 라벨 확보 후 계산
프레임 정확도와 클립 정확도를 Wilson 구간과 함께 낸다. 단일후보 프레임은 분모에서 뺀 값도 함께 적는다 — 그것이 selector의 능력을 재는 분모다.
(d) 닫히는 항목
미결 8번(selector A/B)의 정답 공급원. 미결 18번의 사용자 지정 라벨 승격 기준도 여기에 걸린다.
(e) 미검증이면 위층에서 무엇이 무의미해지는가
층 2 라벨이 다른 사람의 팔을 가리킨다. O2GSaYqH8JY는 스켈레톤이 공 줍는 사람에게 붙어 있었고 3R1kvNrGJK0은 심판/포수였다. 그 클립에 swing_arm = L을 붙이면 코치의 왼팔을 라벨한 것이다. 층 3·4도 같은 이유로 통째로 무효다.
층 2 — 사지 판별: 어느 팔·다리를 재는가
(a) 필요한 라벨
| 조작적 정의 | top_hand(배트 위쪽 손) · swing_arm(스윙을 주도한 팔, both 허용) · swing_leg(크게 움직인 다리) |
| 건수 | 미판독 27건. 12건은 이미 있다 |
| 누가 | 일반인으로 충분하다. 배트를 잡은 손이 어느 쪽인지는 종목 지식이 아니다 |
| 소요 | 15~20초/클립 |
| 소스 영상 | 기존 39클립. 다만 아래 한계를 먼저 읽을 것 |
🔴 이 39클립은 전부 야구 타격 = 두 손 스윙이다. 미결 6번의 원래 질문 (“팔 종목에서 자동 판별이 약한가”)은 한 손 동작(투구·레이업)에서 나왔다. 동작군이 달라 이 39건으로는 그 질문에 답이 안 나온다. 답이 나오는 것은 “야구 타격에 스윙 팔이라는 개념이 정의되는가”다.
(b) 라벨 받기 전에 해야 할 일 — ✅ 서식은 고쳤다. 지금 막는 것은 사람뿐이다
2026.09.04 — 2차 서식을 만들었다.
review_packet2/가 아래 1~3을 고친 것이다(회차 분리 · 순서 섞기 · 줄 삭제 금지 ·seen_before고지). 어휘와 산출 모양은 1차와 같아labeled_stats.py를 고치지 않았다. 1차 12건은 지우지 않는다 — 두 서식의 일치율 자체가 도출 여부의 근거다.🔴 이 절의 제목이 2주 동안 「서식을 먼저 고쳐야 한다」였다 (2026.09.18에 고침). 바로 위 인용이 「고쳤다」인데 제목은 「고쳐야 한다」였으니, 훑는 사람은 아직 못 받는 상태로 읽는다. 아래 1~5는 무엇이 결함이었나의 기록이지 남은 할 일이 아니다.
✅ 패킷이 실제로 쓸 수 있는 상태인지 확인했다 (2026.09.18). 2주간 0건이라 서식이 깨진 것 아닌가 싶어 봤는데 멀쩡하다: 4회차 × 39행, 이미지 참조 156건이 전부 존재한다(2차 폴더에
images/가 없는 것은 정상 — 1차 것을../review_packet/images/로 가리킨다). 막는 것은 서식도 이미지도 아니고 사람의 시간이다.
판독량 39클립 × 4회차 = 156건 소요 15~20초/클립 → 한 시간 안쪽 누가 🔴 지도자가 아니다. 「배트 위쪽 손이 어느 쪽인가」는 종목 지식이 아니라 눈으로 보는 것이다 — 층 4(미결 2번, 지도자 섭외)와 다른 층이고 거기에 안 묶여 있다 확인 awk -F, 'FNR>1 && $4 ~ /[A-Za-z0-9]/ {n++} END {print n+0}' review_packet2/*.csv→ 0 (🔴NR로 쓰면 머리줄이 잡혀 늘3이 나온다)
1차 서식대로 27건을 더 받았으면 그 27건도 못 썼다. 확보한 12건에서 드러난 것이 있다.
| 관측(12건 직접 확인) | |
|---|---|
swing_arm이 both가 아닌 8건 | 8건 전부 top_hand의 반대쪽이다 (R→L 7건, L→R 1건) |
swing_leg | 같은 8건에서 swing_arm과 전부 같다 |
| 안내문이 지시하는 기입 순서 | 「top_hand부터 채우면 빠릅니다 — 가장 확실하고 빠른 칸입니다」 |
12건으로는 두 해석을 못 가른다. (i) 판독자가 top_hand를 정하고 나머지를 규칙으로 도출했거나, (ii) 우타자의 위쪽 손이 오른손이고 디딤발이 왼발인 실제 신체 상관이거나. 어느 쪽이든 지금 서식은 세 칸이 독립 관측이라는 것을 보장하지 못한다.
받기 전에 고칠 것:
- 칸을 독립 관측으로 만든다. 한 화면에서 한 칸만 묻거나, 칸 순서를 클립마다 무작위로 바꾸거나,
top_hand와 나머지를 다른 회차로 나눈다. “빠르니까top_hand부터”라는 안내는 뺀다 swing_arm의 조작적 정의를 다시 쓴다. 두 손 스윙에서 “주도한 팔”이 무엇인지 판독자마다 다르게 읽힌다. 정의를 못 쓰겠으면 그 칸을 없애고both가 답이라는 것을 결과로 받는다subject_ok = n과na를 분리해 기록한다. 지금은 행을 지우는 방식이라 둘이 합쳐졌고 되돌릴 수 없다(EXCLUDED.md). 사지별 분모를 다시 세려면 27건을 다시 봐야 한다- 앵커링 차단은 이미 되어 있다 — 안내문이
reference_AFTER_LABELING.csv를 보지 말라고 명시한다. 그 규칙은 유지한다 - 사전 등록은 이미 굳어 있다 —
AFTER_LABELS.md(명세)와labeled_stats.py(구현)가 라벨을 보기 전에 커밋됐다(159355f). 구간 경계·both처리·검정력 표를 결과를 보고 바꾸지 않는다
(c) 라벨 확보 후 계산
labeled_stats.py를 그대로 돌린다. 분모를 두 벌(39 전체 / 유효) 적고, both는 분자·분모 양쪽에서 뺀다. 유효 분모가 한 자릿수면 정확도를 내지 말고 분모만 보고한다(사전 등록 6절).
(d) 닫히는 항목
미결 6번.
(e) 미검증이면 위층에서 무엇이 무의미해지는가
층 3에서 반대쪽 팔의 릴리스를 라벨하게 된다. 자동 판별은 야구 투구에서 던지는 왼팔 23.53 대 글러브 오른팔 33.13으로 뒤집힌 채다. 어느 팔을 볼지 틀리면 그 팔의 임팩트 프레임 정답을 받아도 다른 팔의 각도를 채점한다.
층 3 — 시점: 어느 프레임을 재는가
이 층이 가장 비싸고, 유일하게 새 촬영이 필요하다. 별도 절에서 다룬다 (아래 「층 3의 특수성」).
(a) 필요한 라벨
| 조작적 정의 | 클립에서 릴리스(또는 임팩트)가 일어난 프레임 번호 하나 |
| 건수 | 팔 종목 25~60클립 (미결 5번 재개 조건) |
| 누가 | 촬영자 또는 일반인. 공이 손을 떠나는 프레임은 종목 지식 없이 보인다 |
| 소요 | 프레임 단위 판독이라 클립당 분 단위다. 층 1·2의 초 단위와 다르다 |
| 소스 영상 | 🔴 기존 39클립으로 안 된다. 새로 촬영해야 한다 |
(b) 라벨 받기 전에 해야 할 일
- 촬영 요건을 먼저 고정한다(아래 절). 찍고 나서 “릴리스가 화면 밖이었다”를 발견하면 그 클립은 통째로 버린다
- 프레임 단위 판독 도구가 필요하다.
make_packet.py는 클립당 이미지 한 장(6칸 + 전체) 방식이라 프레임을 지목할 수 없다.phaseA/labeling/의label_cli.py·render_targets.py계열이 프레임 인덱스를 다루므로 그쪽을 기반으로 삼는다 - 자동 판별 결과를 화면에 넣지 않는다.
contact_frame같은 자동 도출값도 마찬가지다 — 그것은 참조이지 정답이 아니다 - 판정 기준을 먼저 등록한다: 몇 프레임 오차까지를 “맞음”으로 볼 것인가. 결과를 보고 정하면 근거가 아니다
(c) 라벨 확보 후 계산
순서를 지킨다 (eval_b7_a1_ground_truth/reproduction.md 4절):
- 새 정답에 대해 현재 production 경로의 임팩트 오차를 잰다 — 이것이 기준선
- 그 다음에야 A-1 계열 변경이나 갭 경계 단측차분을 정답 대비로 평가한다
1번이 먼저다. 정답 없이 A-1을 다시 켜 보는 것은 2026-08-31에 이미 했고 판정 불가로 끝났다.
(d) 닫히는 항목
미결 5번(재개), 미결 7번의 E-6(탐색 범위 제한), 미결 13번의 처방 선택(끝단 단측차분을 어떻게 할 것인가).
(e) 미검증이면 위층에서 무엇이 무의미해지는가
층 4의 지도자 골든셋이 통째로 낭비된다. 채점은 임팩트 프레임에서 각도를 읽는데, 프레임이 틀리면 지도자 등급과 어긋났을 때 루브릭이 틀린 것인지 프레임이 틀린 것인지 가를 수 없다.
실증이 있다. 미결 5번의 원래 근거로 적혀 있던 팔꿈치각 61도·112.7도는 릴리스 각도가 아니었다 — 각각 와인드업과 드리블 주행 구간에서 잰 값이다. 프레임이 틀리면 각도는 아무 의미가 없다.
층 4 — 채점: 그 자세가 몇 점인가
(a) 필요한 라벨
| 조작적 정의 | 클립 하나에 대한 루브릭 기준별 등급. 총점이 아니라 항목별이어야 한다 |
| 건수 | 50~100건 (미결 2번) |
| 누가 | 🔴 지도자. 이 층만 종목 전문성이 필요하다 |
| 소요 | 미측정 |
| 소스 영상 | (종목, 동작) 쌍마다 따로 필요하다 — 루브릭이 그 단위이기 때문이다 |
(b) 라벨 받기 전에 해야 할 일
- 루브릭을 먼저 고정한다. 지금 active인 것은
baseball_pitching·basketball_jump_shot·football_instep_shot이고basketball_layup·football_inside_pass는 draft다. 야구 타격 루브릭은 없다 — 39클립이 전부 타격인데 채점할 기준이 없다 - 어느 (종목, 동작)에 골든셋을 쓸지 정한다. 50~100건을 종목별로 쪼개면 각 종목의 검정력이 사라진다
- 채점 라벨은 자동 채점 결과를 보여주지 않고 받는다
(c) 라벨 확보 후 계산
기준별 일치율과 등급 차이 분포. 총점 일치율만 보지 않는다 — 서로 다른 기준이 상쇄되어 총점만 맞을 수 있다.
(d) 닫히는 항목
미결 2번. 루브릭 개선의 판별 근거가 이때 처음 생긴다.
(e) 미검증이면
이 층이 마지막이라 위층이 없다. 다만 이 층 없이는 “실력을 판단한다”는 주장 자체가 근거가 없다. 지금 할 수 있는 주장은 “같은 영상이 같은 점수를 받는다” 까지다.
층 3의 특수성 — 자체 촬영 요건
외부에서 구하는 경로는 전부 닫혔다. PitcherMotion(이벤트 주석 없음) · normalised_frame == 0(릴리스 아님, 표본 260 검증) · Statcast(매핑 불가) · UCF101(클립 단위) · UPLIFT·MultiSports·Penn Action·BBDB(전부 Grade A 아님) · 축구 표본 확대(필요 97~714 대비 상한 38, leg 종목이라 팔 종목 효과크기 예측 불가). 다시 조사하지 않는다.
| 요건 | 값 | 왜 |
|---|---|---|
| 클립 수 | 25~60 | 미결 5번 재개 조건 (⚠️ 산정 근거는 문서에 없다 — 아래 「확인 못 한 것」) |
| fps | 30 이상 | 15fps에서는 릴리스 프레임이 격자에 아예 없는 경우가 많다 |
| 해상도 | 1920x1080 이하 | 서비스 규격 검사 상한이고 4K는 host RAM이 먼저 터진다(미결 9번). 🔴 세로 촬영은 height 1920이라 반려된다 |
| 길이 | 짧을수록 좋다 | 분석 창이 10초다(DEFAULT_MAX_SECONDS). 업로드 상한 60초와 안 맞는 것은 jin 11번 |
| 구도 | 릴리스가 화면 안에 남을 것 | 기존 야구 클립은 마지막 프레임에서 팔이 아직 나오는 중이라 릴리스가 영상에 없었다 |
| 동작 | 한 손 팔 종목 (투구 등) | 두 손 타격은 이 질문에 답하지 않는다 |
| 프레임 | 릴리스 앞뒤로 여유 프레임 | 끝단은 단측차분이라 오염에 구조적으로 취약하다(미결 13번) |
라벨링 방법: review_packet 방식은 그대로 못 쓴다. 그쪽은 클립당 이미지 한 장이라 “어느 프레임인가”를 지목할 수 없다. 프레임을 넘겨 가며 하나를 고르는 도구가 필요하고, phaseA/labeling/label_cli.py 계열이 그 출발점이다.
라벨 승격 기준 — 무엇이 정답 자격을 갖는가
| 등급 | 무엇 | 쓸 수 있는 곳 |
|---|---|---|
| A | 사람 판독, 앵커링 차단, 2인 이상 독립 교차 | 정답. 정확도 주장 가능 |
| B | 사람 판독 1인, 앵커링 차단 | 방향성 판단. 정확도 수치는 구간과 함께만 |
| C | 자동 도출 참조 (축구 contact_frame) | 비교용. 정답으로 표기 금지 |
| D | AI 단독 판독 (labels.json, B-3~B-5) | 부정적 결론의 근거로만 |
- AI 단독이 왜 안 되는가. B-5에서 60건을 격리 재판독했지만 판독자가 같은 모델이라 독립이 아니다. 그래서 B-5는 “B-pose 우위가 확증되지 않는다”는 부정적 결론의 근거로만 쓰고 GT로 승격하지 않았다
- 자동 도출 참조는 C다. 축구
contact_frame은 공-발목 최근접에서 자동으로 낸 값이고 저장된 라벨 파일이 없다. 독립 근거 둘의 ±1 일치가 18건 중 9건 이라 ±2프레임 불확실성을 갖는다. 한때 “정답”으로 적은 것은 과했다 - 1인으로 충분한가. 층 1·2는 B등급(1인)으로도 방향이 나온다. 층 3·4는 교차가 필요하다 — 프레임 하나와 등급은 판독자 간 편차가 크고, 그 편차가 곧 우리가 재려는 오차와 같은 크기다
- 판독자가 정답을 미리 본 경우:
labels.json의 선례를 따른다 — 지우지 말고 고지한다. 어느 클립을 어떤 상태로 봤는지 파일에 남기고, 분석에서 그 건을 분리할 수 있게 한다
라벨이 열어주는 미결 항목 지도
| 층 | 열리는 항목 | 지금 상태 |
|---|---|---|
| 층 1 | 8번 selector A/B · 18번 사용자 지정 라벨 승격 | 라벨은 있으나 전부 D등급 |
| 층 2 | 6번 스윙 측 | |
| 층 3 | 5번 재개 · 7번의 E-6 · 13번 처방 선택 | 라벨 0건. 자체 촬영 필요 |
| 층 4 | 2번 골든셋 | 라벨 0건. 지도자 미섭외 |
미결 7번의 근본 처방(E-6)은 층 3에 걸려 있다. 원인 규명과 1차 판정은 정답 없이 끝났고, 남은 것은 얇은 argmax 마진을 없애는 것인데 그 처방이 미결 5번의 재개 조건과 같은 정답을 요구한다.
미결 5번은 층 3이다. 여기서 두 문장이 다 필요하다 — 오염은 실재한다 (제거 대상 프레임의 잔차가 자연 변동의 약 85배). 그런데 되돌렸다 (결측이 정답 창에 몰려 — 축구 참조 10/10이 접촉 ±10프레임, p=0.0017 — 임팩트가 84.3% 이동하는 것의 정당성을 검증할 독립 정답이 없었다). 층 3 라벨은 그 “검증할 독립 정답”이다.
미결 8번은 층 1이지만 라벨만으로는 안 닫힌다 — 아래 한계를 볼 것.
각 단계의 완료 조건
건수가 아니라 무엇을 주장할 수 있게 되는가로 쓴다.
| 층 | 끝났다고 말할 수 있는 시점 |
|---|---|
| 1 | “분석 대상을 몇 % 맞게 고르는지를 신뢰구간과 함께 말할 수 있다.” 단일후보 프레임을 뺀 분모에서도 말할 수 있다 |
| 2 | “야구 타격에서 swing_arm이 정의되는지 아닌지를 라벨로 답했다.” 정확도가 아니라 정의 가능성이 이 층의 답이다 |
| 3 | “현재 파이프라인이 고르는 임팩트 프레임의 오차 분포를 안다.” 그 기준선이 있어야 A-1·단측차분·E-6을 정답 대비로 판정할 수 있다 |
| 4 | “지도자 등급과 우리 등급이 어느 기준에서 갈리는지를 말할 수 있다.” 총점 일치율이 아니라 기준별 |
🔴 라벨이 있어도 남는 한계
라벨만 있으면 다 되는 것이 아니다. 검정력은 라벨 수가 아니라 설계가 정한다.
- 미결 8번은 이 39클립으로는 안 갈린다. 필요 판정 340건(관측 B비율 0.605, α=0.05, power=0.80, design effect 1.92 보정) 대 이 데이터셋 상한 약 49건이다. 클립을 늘리지 않는 한 사람 검수를 아무리 더 해도 결론이 안 나온다 — 층 1 라벨을 39클립에 더 붓는 것은 이 질문에 대해서는 낭비다
- 클립 안의 프레임은 독립 표본이 아니다. design effect 1.92가 그 값이다. “프레임 수”로 세면 검정력을 두 배 가까이 과대평가한다
- 39건으로 말할 수 있는 것은 “동전보다 나은가”까지다. 정확도가 80%인지 90%인지는 못 가른다(95% CI 폭 ±13%p 안팎). 유효 분모가 한 자릿수로 내려가면 ±30%p가 되어 “쓸 만한가”조차 못 가른다
- 동작군이 다르면 라벨이 있어도 답이 안 나온다. 39클립은 두 손 타격이라 “팔 종목에서 약한가”에 답하지 않는다. 이건 표본 크기 문제가 아니다
both가 다수면 그것이 결론이다. 억지로 한쪽에 배정해 분모를 늘리지 않는다
확인하지 못한 것
| 25~60클립의 산정 근거 | 미결 5번·devlog·eval_b7_a1_ground_truth/에 조건으로만 적혀 있고 검정력 산정이 없다. 촬영에 들어가기 전에 이 수를 어떻게 얻었는지 확인할 것 (비교 가능한 축구 산정은 “필요 97~714클립”이다) |
| 50~100건(미결 2번)의 근거 | 항목에 수만 있고 산정이 없다 |
| 층 4 판독 소요 시간 | 측정된 바 없다 |
swing_arm이 도출인지 실제 상관인지 | 12건으로는 못 가른다. 위 층 2 (b) 참고 |
| 판독 12건의 표본 편향 정도 | 남은 27건 대비 다중후보 비율 같은 층화 지표를 이 회차에서 재지 않았다(새 분석 금지) |
labeled_stats.py 실행 결과 | ✅ 2026.09.04에 돌렸다 — labeling/RESULTS.md |