JackLiu0406/b1k-224x224-gop8-fixed
BEHAVIOR-1K 2026 — 224x224, GOP=8, upstream-matched encoding A 224x224 re-encode of the 2026 challenge demos (100 tasks, 3 RGB cameras) whose image statistics match the dataset the widely-used 50-task checkpoint was pretrained on (IliaLarchenko/behavior_224_rgb), while keeping GOP=8 for fast random-frame access during training. Why "fixed" Earlier 224 re-encodes of this data used bicubic + libx264 CRF 23, which lands 13% softer (high-frequency content) than the… See the full description on the dataset page: https://huggingface.co/datasets/JackLiu0406/b1k-224x224-gop8-fixed.
BEHAVIOR-1K 2026 — 224x224, GOP=8, upstream-matched encoding
A 224x224 re-encode of the 2026 challenge demos (100 tasks, 3 RGB cameras) whose image statistics match the dataset the widely-used 50-task checkpoint was pretrained on (IliaLarchenko/behavior_224_rgb), while keeping GOP=8 for fast random-frame access during training.
Why "fixed"
Earlier 224 re-encodes of this data used bicubic + libx264 CRF 23, which lands 13% softer (high-frequency content) than the pretraining distribution. Since a short fine-tune barely moves the vision encoder, that mismatch is inherited rather than trained away.
The correct filter and codec were recovered by exact reconstruction, not inference: the x265 option string is embedded in the upstream bitstream (strings file.mp4 | grep options:). Transcribing it into -x265-params and re-encoding upstream's exact source episode reproduces their published file byte-for-byte:
A high-frequency-content analysis using a generic -preset gets this wrong — the encoder mismatch is ~10 dB and swamps the ~1-2 dB filter signal. Only exact encoder replication resolves it.
Encoding
scale=224:224:flags=lanczos
libx265 -preset faster
crf=28.0 ref=3 bframes=4 b-adapt=0 b-pyramid=1 rc-lookahead=15 me=1 subme=2 merange=57
rd=2 rdoq-level=0 psy-rd=2.00 psy-rdoq=0.00 aq-mode=2 aq-strength=1.00 cutree=1
qcomp=0.60 ipratio=1.40 pbratio=1.30 max-merge=2 qg-size=32 ctu=64 min-cu-size=8
max-tu-size=32 b-intra=0 scenecut=0
keyint=8 min-keyint=8 open-gop=1 <- the ONLY deviation from upstream
pix_fmt yuv420p, audio strippedUpstream uses keyint=250. We use 8 for random-access decode: 9.3 ms/frame vs 68.0 ms/frame, which is the difference between compute-bound and dataloader-bound training. CRF is a quality target, so per-frame quality is unchanged by GOP — only file size grows.
Source is the 720x720 originals (themselves x265 crf30), so one generation of lossy re-encoding.
Fidelity to the pretraining distribution
Measured on the episode upstream published, content held constant:
Two deviations nearly cancel: keyint=8 sharpens (+5.5%), our crf30 source softens (-3.5%).
Contents
videos/observation.rgb.{zed_link,left_realsense_link,right_realsense_link}_camera_0/chunk-XXX/file-YYY.mp4data/chunk-XXX/*.parquet— states, actions, episode indices (unmodified)meta/— LeRobot v3 metadata (unmodified)
100 chunks (chunk-000 .. chunk-099), one per task. Frame counts and timestamps are identical to the source — nothing is dropped or resampled in time.
Eval-time note
Do not apply lanczos when downsampling live renders at eval. Training frames are lanczos then compressed; eval renders have no compression step, so matching the filter overshoots. Measured against these training frames, from 1080x1080 renders: bilinear ~0.92x, bicubic ~1.32x, lanczos3 ~1.61x. Bilinear is closest.
Derived from behavior-1k/2026-challenge-demos (MIT).
