Bigenlight/orange-bowl-in-purple-bowl-rl-npz
orange-bowl-in-purple-bowl RL npz — dataset card 작성: 2026-09-16 (Claude, Opus). Bigenlight/carrot-in-pot-rl-npz의 자매 문서 — 같은 파이프라인(build_dataset.py / build_px_dataset.py)으로 orange-bowl 실물 코퍼스를 chunk-MDP transition으로 변환한 것. raw 영상은 Bigenlight/orange_bowl_in_purple_bowl_lerobot_v3에 있고, 여기엔 파생 npz(W/data/rl/)만 있음. 모델은 Bigenlight/orange-bowl-in-purple-bowl-ifql. 수치는 npz meta + .shape(mmap)와 결과 노트에서 읽음. 출처 file:line은 cards/CARD_SOURCES.md §2026-09-16 "orange". 0. 소스… See the full description on the dataset page: https://huggingface.co/datasets/Bigenlight/orange-bowl-in-purple-bowl-rl-npz.
orange-bowl-in-purple-bowl RL npz — dataset card
작성: 2026-09-16 (Claude, Opus).Bigenlight/carrot-in-pot-rl-npz의 자매 문서 — 같은 파이프라인(build_dataset.py/build_px_dataset.py)으로 orange-bowl 실물 코퍼스를 chunk-MDP transition으로 변환한 것. raw 영상은Bigenlight/orange_bowl_in_purple_bowl_lerobot_v3에 있고, 여기엔 파생 npz(W/data/rl/)만 있음. 모델은Bigenlight/orange-bowl-in-purple-bowl-ifql. 수치는 npzmeta+.shape(mmap)와 결과 노트에서 읽음. 출처 file:line은cards/CARD_SOURCES.md§2026-09-16 "orange".
0. 소스 (raw)
1. 파일 목록 (rl/, 17 files, 2.93 GB)
frozen-feature r18_ss(Da=2055, `Dc=null), sparse reward, absorb-tail, val episodes [10, 25, 40, 51] → **train N=14,769 (48 ep) / val N=1,240 (4 ep)**. 전부 np.savez(비압축), pickle 없이 읽힘(meta`는 JSON 문자열).
lead0/2/6 npz는 actions만 다르고 observations/rewards/masks/terminals/next_observations는 byte-identical. sanity(빌드 로그): masks==0 = 1,200 (25/ep), terminals = 48, actions ∈ [-0.9998, 0.9996], 특징 parity worst cos 0.9999996, decode 정렬 max|pts−query| 8.9e-7 s.
2. 키 스키마
carrot 카드 §3과 동일 (observations (N,2055) f32, actions (N,56) f32 ∈[-1,1], rewards (N,), masks (N,)(성공 흡수 transition과 그 24프레임 전 row에서 0), terminals (N,)(episode 마지막 row 1), next_observations (N,2055), meta). `critic_observations` 없음(--no-critic). aug8 train 파일은 추가로 obs_aug, next_obs_aug (K=8, N, 2048) float16 — canonical observations[:, :2048](cam1‖cam2 표준화 feature) 자리에 끼우는 view, proprio(뒤 7)는 항상 canonical. meta.aug_params에 view 정의 전부(scale [0.8,1.0], shift 0.08, brightness [0.6,1.4], contrast [0.7,1.3], saturation [0.7,1.3], hue ±0.05, gamma [0.7,1.4], gain [0.9,1.1], grad_amp [0.1,0.4], p_op 0.8, p_grad 0.3, RNG default_rng([seed, cam_id, row, k]), view 0은 photometric만).
pxv1(`demoorangelead2px96.npz): obscam1, obscam2 (N,96,96,3) uint8(JPEG q92 round-trip → INTER_AREA 96², crop 없음), obsproprio (N,7) f32`(raw, 표준화는 로더), `actions (N,56)`, `rewards, masks, terminals`, `nextindex (N,) int64(min(i+24, last)), meta(schema pxv1, img 96, crop 84, stride 3, H 8, chunkframes 24, preprocess jpeg92->area96, reward sparse, source realdemo, nepisodes 48, N 14769, absorbtail true, actionlead 2, discountchunk 0.9227446944279201, gammaframe 0.99, nsuccess 48, nfailure 0`).
3. 청킹 · lead · reward
carrot 카드 §4와 동일 상수(STRIDE 3, H 8, CHUNK_FRAMES 24): knot_k(joints) = action[min(i + 3k + LEAD, last), :6], 그리퍼는 LEAD 0, next_obs = obs[min(i+24, last)], sparse r=-1(마지막 row 0), absorb-tail(i+24 ≥ last인 row의 mask 0), discount_chunk = 0.99^8 = 0.923.
왜 lead2인가: carrot real(구 recorder)은 action[i] ≈ state[i](lag 0)라 sim(+6)에 맞추려고 lead6을 썼음. orange는 고친 recorder라 raw command가 이미 state보다 +4 프레임 앞섬(lead0 npz에서 argmin lag = +4) → ACTION_LEAD=2가 sim convention(+6)을 재현, 6은 +10으로 과잉. 그래서 lead2가 기본 세트이고 lead0/lead6은 sweep용.
4. 정규화 (norm_stats_r18_ss_orange_lead2.json)
공식은 carrot 카드 §5와 동일. 숫자:
action lo = [2.3428163528442383, -1.9074292182922363, 1.308194875717163, -2.702819347381592, -1.8299357891082764, -3.939363956451416, 0.0]
action hi = [3.6872901916503906, -0.9155053496360779, 2.3606531620025635, -1.524034023284912, -1.2490525245666504, -2.3564114570617676, 1.0]
proprio mean = [3.048793315887451, -1.3951243162155151, 1.9118824005126953, -2.1602773666381836, -1.546466588973999, -3.2785484790802, 0.3810938596725464]
proprio std = [0.2240169495344162, 0.16405987739562988, 0.17950011789798737, 0.16540184617042542, 0.09374841302633286, 0.2097344994544983, 0.39555299282073975]j0(shoulder_pan)가 +2.34..+3.69 rad — carrot 코퍼스는 같은 물리 자세를 −π 쪽(−3.70..−2.68)으로 기록했음. orange 모델을 배포할 때 /joint_states의 j0가 +2.4..+3.6이어야 함(모델 카드 §8 경고).
5. 로더 / 재현
import numpy as np, json
z = np.load("rl/real_orange_r18_ss_lead2_aug8.npz", mmap_mode="r") # 1.2 GB — mmap
meta = json.loads(str(z["meta"])) # aug_k 8, aug_params, action_lead 2, norm_stats ...
obs, act = z["observations"], z["actions"] # (14769, 2055), (14769, 56)
views = z["obs_aug"] # (8, 14769, 2048) float16 — obs[:, :2048] 대체용# frozen r18_ss (lead2; ACTION_LEAD=0/6 으로 나머지)
cd $W && TASK=orange REPO_ID=Bigenlight/orange_bowl_in_purple_bowl_lerobot_v3 \
SNAP=$W/data/lerobot/orange_bowl_in_purple_bowl_lerobot_v3 HF_SHA=8c65562b6d237461d2974ebf8d06fd97b14b52f5 \
VAL_EPISODES=10,25,40,51 PREVIEW_EPISODES=0,26,51 ACTION_LEAD=2 env -u PYTHONPATH bash $FV/real_pipeline/build_real.sh
# aug8: 위 + AUG_K=8 STEPS=features → 그다음 AUG_K=8 STEPS=build,load
# px96: decode_px.py --raw <snapshot> --out $W/data/decoded_px/orange_demo --set real_demo
# build_px_dataset.py --set real_demo --episodes $W/data/decoded_px/orange_demo --out $W/data/rl --name demo_orange_lead2_px96 \
# --reward sparse --fit-norm-stats --norm-stats-out $W/data/rl/norm_stats_orange_lead2_px96.json --val-episodes 10,25,40,51 --action-lead 2인코더: torchvision.models.resnet18(weights=IMAGENET1K_V1) frozen, 224² INTERAREA squash, ImageNet 정규화, layer4 → spatial softmax(7×7) → `[x1..x512, y1..y512]`. 코드는 모델 repo `code/carrotifqlcode20260916.tar.gz`.
6. 주의
meta.norm_stats는 학습 박스 절대경로 — 다른 PC에선rl/norm_stats_*.json을 직접 지정.real_orange_r18_ss_lead2_aug8.npz(1.2 GB)와demo_orange_lead2_px96.npz(821 MB)는mmap_mode="r"로 열 것.datasets.json에 모든 파일의 bytes·sha256·N·meta 요약이 있음.
