LIBERO-Occ là một benchmark mới cho câu hỏi rất thực tế: VLA manipulation có còn bền khi vật thể hoặc vùng đích bị che khuất không? Phần lớn benchmark robot manipulation giả định camera nhìn rõ object, receptacle và vùng tiếp xúc. Trong lab điều đó có thể đúng. Trên bàn thao tác thật, object thường bị đồ vật khác che, drawer che bowl, robot arm tự che camera, hoặc vật cần đặt vào nằm sau một container. Khi đó policy không chỉ cần nhận diện ngôn ngữ; nó phải suy luận scene state bị thiếu.
Bài này hướng dẫn cách đọc và chạy hướng tiếp cận từ paper LIBERO-Occ: Evaluating and Improving Vision-Language-Action Models under Scene-Induced Occlusion via Viewpoint Imagination. Paper được đăng trên arXiv ngày 2026-06-09, repo chính thức là litsh/Libero-Occ. Tác giả đề xuất hai phần: benchmark LIBERO-Occ để đo occlusion robustness, và Viewpoint Imagination (VIM) để sinh một complementary view tưởng tượng từ primary view bị che khuất, rồi dùng cả observed view và imagined view để dự đoán action.
Nguồn chính nên mở song song khi làm theo:
- Paper arXiv: LIBERO-Occ arXiv 2606.10862
- HTML paper: arxiv.org/html/2606.10862v1
- GitHub: litsh/Libero-Occ
- Upstream benchmark: LIBERO
LIBERO-Occ giải quyết lỗi gì?
Trong VLA, input thường là:
RGB image(s) + language instruction + optional proprioception
|
v
vision-language backbone
|
v
action tokenizer / diffusion head / flow head
|
v
robot action chunk
Pipeline này mạnh khi task-relevant evidence nằm trong ảnh. Ví dụ instruction là "put the bowl into the drawer", camera thấy bowl, thấy drawer, thấy handle, và robot chỉ cần căn pose. Nhưng nếu bowl bị một hộp khác che mất 60%, hoặc drawer region bị vật thể đặt trước che, input hiện tại không còn đủ thông tin hình học. Đây là partial observability, không phải chỉ là nhiễu ảnh.
Paper phân biệt scene-induced occlusion với các perturbation phổ biến:
| Kiểu thay đổi | Ví dụ | Vì sao khác occlusion |
|---|---|---|
| Lighting | ảnh tối hơn, đổ bóng mạnh | object vẫn còn trong ảnh |
| Background shift | texture bàn khác | evidence task-relevant vẫn nhìn được |
| Image noise | blur, compression, crop nhẹ | thông tin bị giảm chất lượng nhưng không mất hoàn toàn |
| Scene-induced occlusion | object/receptacle bị vật khác che | thông tin cần để action bị thiếu khỏi primary view |
Điểm hay của LIBERO-Occ là occluder không phải mask 2D vẽ lên ảnh. Benchmark thêm object che khuất vào scene 3D của LIBERO, kiểm tra va chạm vật lý, rồi replay demonstration để đảm bảo task vẫn executable. Nếu policy fail, ta có lý do tốt hơn để quy lỗi cho partial observability thay vì scene bị tạo sai.
Benchmark được tạo như thế nào?
LIBERO-Occ mở rộng bốn suite quen thuộc của LIBERO:
| Suite | Ý nghĩa |
|---|---|
libero_spatial_occluded |
generalization theo spatial layout |
libero_goal_occluded |
generalization theo goal/receptacle |
libero_object_occluded |
generalization theo object |
libero_10_occluded |
long-horizon tasks của LIBERO-10 |
Paper mô tả pipeline sinh task gồm ba bước:
- Occlusion target identification: parse BDDL task spec để tìm object, receptacle hoặc goal region liên quan đến task.
- View-aware occluder placement: đặt occluder trong 3D scene dọc theo ray từ camera chính tới target để che đúng bằng hình học, không phải bằng mask ảnh.
- Occlusion validity verification: render scene, đo hiệu ứng che khuất, kiểm tra va chạm, rồi replay demonstration gốc để chắc task vẫn làm được.
Sơ đồ đơn giản:
Original LIBERO task
|
v
parse BDDL -> find task-relevant targets
|
v
sample occluder along camera-to-target ray
|
v
render + visibility check + collision check
|
v
replay original demonstration
|
v
keep only executable occluded task
Benchmark chia occlusion theo loại target:
| Occlusion type | Target bị che | Điều policy phải suy luận |
|---|---|---|
| Manipulated object | vật cần grasp/move | object identity, pose, grasp point |
| Receptacle | drawer, bowl, vùng đặt | vị trí đích, vùng contact, affordance |
| Dual | cả object và receptacle | cả nơi lấy và nơi đặt đều thiếu thông tin |
Tổng cộng paper báo cáo 2,000 occluded task instances trên bốn suite, mỗi suite 500 instances. Severity được chia light, medium, heavy. Repo public hiện phát hành benchmark assets cuối cùng gồm BDDL và init files; code sinh benchmark không được phát hành, nên hướng dẫn thực dụng là cài assets rồi chạy evaluation/training trên các suite đã release.
Ý tưởng VIM: tưởng tượng góc nhìn bổ sung
VIM không gắn thêm camera mới ở deployment. Thay vào đó, model học từ dữ liệu có paired view trong training: primary view là third-person camera; complementary view thường là wrist/gripper camera. Trong inference, robot chỉ cần primary view bị che. VIM sinh ra complementary view tưởng tượng, rồi dùng nó như evidence trung gian cho action prediction.
occluded primary image + instruction
|
v
world-model / UniVLA-derived generator
|
+------------------------+
| |
v v
imagined gripper view observed primary view
| |
+-----------+------------+
|
v
unified action prediction
|
v
action tokens / robot actions
Tư duy quan trọng: imagined view không cần là ảnh "đẹp" như video generation demo. Nó cần chứa cue đủ hữu ích cho action. Ví dụ nếu primary view không thấy rõ bowl, imagined wrist view có thể phục hồi vị trí bowl tương đối với gripper. Nếu receptacle bị che một phần, imagined view giúp policy giữ hình dung về vùng đặt.
VIM được train hai stage:
| Stage | Mục tiêu | Loss chính | Vì sao cần |
|---|---|---|---|
| Stage 1 | học generate complementary view | visual content/special loss | tạo interface "imagination" ổn định |
| Stage 2 | joint viewpoint imagination + action prediction | visual loss + action loss | buộc imagined tokens hữu ích cho policy |
Paper có ablation rất đáng chú ý: bỏ Stage-2 view loss làm performance sụp, còn bỏ Stage-1 view training cũng giảm mạnh. Điều này cho thấy VIM không chỉ dùng generated image như phụ kiện. View generation và action prediction cần được nối trong cùng sequence-generation process để model học cách dùng visual tokens tưởng tượng.
Chuẩn bị môi trường
Bạn nên xem đây là setup research, không phải một pip install nhẹ. Paper train trên 8 H100 với global batch size 192. Nếu chỉ muốn làm quen benchmark, hãy bắt đầu bằng evaluation suite nhỏ hoặc dry-run script trên ít GPU hơn. Với máy local không có GPU mạnh, phần có thể làm là cài assets, đọc BDDL/init files, và chuẩn bị data path.
Các thành phần cần có:
| Thành phần | Vai trò |
|---|---|
| LIBERO upstream | simulator, BDDL loader, task environments |
| LIBERO-Occ repo | occluded BDDL/init assets, train/eval scripts |
| MuJoCo / OSMesa | rendering headless cho LIBERO |
| PyTorch CUDA | train/eval VIM |
| Emu3 vision tokenizer và VQ checkpoint | image tokenization cho VIM |
| FAST action tokenizer | action-token pipeline |
| UniVLA-derived code | world-model/action generation backbone trong repo |
Cài upstream LIBERO trước. Ví dụ:
git clone https://github.com/Lifelong-Robot-Learning/LIBERO.git
cd LIBERO
conda create -n libero-occ python=3.10
conda activate libero-occ
pip install -e .
Sau đó cài LIBERO-Occ. README hiện có dòng clone placeholder TODO, nên dùng URL thật của repo:
cd /path/to/workspace
git clone https://github.com/litsh/Libero-Occ.git
cd Libero-Occ
conda activate libero-occ
# Cài PyTorch đúng CUDA trước, ví dụ tùy máy:
# pip install torch torchvision --index-url https://download.pytorch.org/whl/cu124
pip install -r requirements.txt
Cài benchmark assets vào LIBERO:
export LIBERO_ROOT=/path/to/LIBERO
bash scripts/setup/install_libero_occ_assets.sh
Script này copy:
benchmark_assets/bddl_files/libero_*_occluded
-> $LIBERO_ROOT/libero/libero/bddl_files/
benchmark_assets/init_files/libero_*_occluded
-> $LIBERO_ROOT/libero/libero/init_files/
Sau khi copy, LIBERO phải resolve được bốn suite:
libero_spatial_occluded
libero_goal_occluded
libero_object_occluded
libero_10_occluded
Nếu gặp lỗi render trên server headless, đặt:
export MUJOCO_GL=osmesa
export NUMBA_DISABLE_JIT=1
Kiểm tra assets trước khi train
Trước khi đốt GPU, kiểm tra file đã nằm đúng chỗ:
ls $LIBERO_ROOT/libero/libero/bddl_files/libero_goal_occluded | head
ls $LIBERO_ROOT/libero/libero/init_files/libero_goal_occluded | head
Sau đó kiểm tra Python có import được LIBERO:
python - <<'PY'
import libero
print("LIBERO import OK:", libero.__file__)
PY
Một lỗi hay gặp là LIBERO_ROOT chỉ tới folder cha sai cấp. Bạn cần path trỏ tới checkout upstream LIBERO, nơi có subfolder libero/libero/bddl_files. Nếu assets copy vào nhầm nơi, evaluation sẽ báo không tìm thấy task suite.
Chuẩn bị dữ liệu cho Stage 1 và Stage 2
Repo yêu cầu hai file metadata:
STAGE1_DATA_PATH=/path/to/stage1_multiview_meta.pkl
STAGE2_DATA_PATH=/path/to/stage2_multiview_meta.pkl
Về logic, Stage 1 cần sample có primary image và complementary image để học view generation. Stage 2 cần thêm action trajectory/action tokens để joint training. Nếu bạn đã có pipeline UniVLA hoặc RoboVLMs, hãy export theo format mà code univla/ trong repo kỳ vọng. Nếu mới bắt đầu, hãy đọc metadata loader trước khi tạo file lớn:
rg -n "STAGE1_DATA_PATH|stage1_multiview|PERSPECTIVE_IMAGE_KEY|data_path" univla scripts
Schema tối thiểu về mặt khái niệm:
sample:
instruction: "put the bowl into the drawer"
primary_image: third-person RGB frame
gripper_image: wrist/gripper RGB frame
proprio: robot state, nếu pipeline dùng
actions: expert action chunk, dùng ở Stage 2
Tên mặc định của complementary image trong script là gripper_image, tương ứng:
PERSPECTIVE_IMAGE_KEY=gripper_image
PERSPECTIVE_VIEW_NAME=gripper
Nếu dataset của bạn dùng key khác như robot0_eye_in_hand_image, hoặc wrist_rgb, đừng sửa script vội. Hãy truyền biến môi trường:
export PERSPECTIVE_IMAGE_KEY=robot0_eye_in_hand_image
export PERSPECTIVE_VIEW_NAME=gripper
Train VIM Stage 1
Stage 1 bắt đầu từ world-model checkpoint của UniVLA/VIM và chỉ học viewpoint imagination. Theo script public, mặc định:
| Tham số | Giá trị mặc định |
|---|---|
MAX_STEPS |
4000 |
LEARNING_RATE |
8e-5 |
GLOBAL_BATCH_SIZE |
192 |
PER_GPU_BATCH_SIZE |
3 |
NGPUS |
8 |
| visual loss | bật |
| action loss | tắt |
Lệnh:
cd /path/to/Libero-Occ
conda activate libero-occ
export WORLD_MODEL_CKPT=/path/to/WORLD_MODEL_POSTTRAIN
export STAGE1_DATA_PATH=/path/to/stage1_multiview_meta.pkl
export ACTION_TOKENIZER_PATH=/path/to/fast
bash scripts/train/train_vim_stage1.sh
Nếu chạy ít GPU để debug:
export NGPUS=1
export GLOBAL_BATCH_SIZE=3
export PER_GPU_BATCH_SIZE=1
export MAX_STEPS=20
export EXP_NAME=debug_vim_stage1
bash scripts/train/train_vim_stage1.sh
Mục tiêu debug không phải đạt kết quả paper, mà là xác nhận loader, tokenizer, checkpoint path và CUDA đều chạy. Khi chạy production, quay lại batch size và GPU phù hợp.
Train VIM Stage 2
Stage 2 load checkpoint Stage 1 rồi train joint view generation + action prediction. Mặc định:
| Tham số | Giá trị mặc định |
|---|---|
MAX_STEPS |
6000 |
LEARNING_RATE |
4e-5 |
VISUAL_CONTENT_LOSS_WEIGHT |
0.5 |
ACTION_CONTENT_LOSS_WEIGHT |
1.0 |
ACTION_SPECIAL_LOSS_WEIGHT |
0.2 |
Lệnh:
export STAGE1_CKPT=/path/to/UniVLA/logs/vim_stage1_gripper/checkpoint-4000
export STAGE2_DATA_PATH=/path/to/stage2_multiview_meta.pkl
export ACTION_TOKENIZER_PATH=/path/to/fast
bash scripts/train/train_vim_stage2.sh
Checklist khi loss không ổn:
| Triệu chứng | Nguyên nhân hay gặp | Cách kiểm tra |
|---|---|---|
| visual loss không giảm | complementary key sai | in một batch sample từ dataset loader |
| action loss NaN | tokenizer/action normalizer sai | kiểm tra action range và token ids |
| checkpoint load fail | dùng nhầm Stage 1 path | kiểm tra folder có model files thật |
| OOM | batch quá lớn | giảm PER_GPU_BATCH_SIZE, bật gradient checkpointing |
| eval rất thấp | train/eval camera key lệch | so sánh PERSPECTIVE_IMAGE_KEY và PERSPECTIVE_OBS_KEY |
Inference và evaluation trên LIBERO-Occ
Evaluation script chạy RoboVLMs LIBERO evaluation với perspective generation bật. Các biến bắt buộc:
export LIBERO_ROOT=/path/to/LIBERO
export VIM_CKPT=/path/to/vim/checkpoint
export VISION_HUB=/path/to/Emu3-VisionTokenizer
export VQ_HUB=/path/to/Emu3-Stage1
export ACTION_TOKENIZER_PATH=/path/to/fast
Chạy từng suite:
TASK_SUITE_NAME=libero_spatial_occluded bash scripts/eval/eval_vim_libero_occ.sh
TASK_SUITE_NAME=libero_goal_occluded bash scripts/eval/eval_vim_libero_occ.sh
TASK_SUITE_NAME=libero_object_occluded bash scripts/eval/eval_vim_libero_occ.sh
TASK_SUITE_NAME=libero_10_occluded bash scripts/eval/eval_vim_libero_occ.sh
Các biến hữu ích:
| Variable | Default | Ý nghĩa |
|---|---|---|
GPUS_PER_NODE |
8 |
số GPU cho torchrun eval |
NUM_TRIALS_PER_TASK |
1 |
số rollout mỗi task instance |
CAMERA_RESOLUTION |
200 |
resolution camera LIBERO |
PERSPECTIVE_OBS_KEY |
robot0_eye_in_hand_image |
complementary view dùng cho debug/reference |
CACHE_ROOT |
logs path | nơi lưu cache/eval output |
Một lệnh debug gọn:
export GPUS_PER_NODE=1
export NUM_TRIALS_PER_TASK=1
export CAMERA_RESOLUTION=200
export TASK_SUITE_NAME=libero_goal_occluded
bash scripts/eval/eval_vim_libero_occ.sh
Trong inference thật, VIM không cần wrist camera làm input chính. PERSPECTIVE_OBS_KEY trong evaluation chủ yếu phục vụ môi trường benchmark và reference/debug. Ý tưởng deployment là model nhìn primary view, generate complementary view nội bộ, rồi dự đoán action.
Kết quả chính trong paper
Paper so sánh UniVLA, OpenVLA, OpenVLA-OFT, π0, π0.5 và VIM trên LIBERO gốc và LIBERO-Occ. Kết quả nổi bật:
| Method | Original LIBERO avg | LIBERO-Occ avg | Drop |
|---|---|---|---|
| UniVLA | 88.25 | 57.10 | 31.15 |
| OpenVLA | 92.65 | 40.65 | 52.00 |
| OpenVLA-OFT | 95.75 | 47.95 | 47.80 |
| π0 | 89.25 | 49.30 | 39.95 |
| π0.5 | 90.00 | 40.55 | 49.45 |
| VIM | 92.00 | 65.05 | 26.95 |
Điểm quan trọng không chỉ là VIM cao hơn baseline mạnh nhất 7.95 điểm trên LIBERO-Occ. Quan trọng hơn là gap giữa LIBERO gốc và LIBERO-Occ nhỏ hơn. Điều này cho thấy occlusion không phải perturbation phụ; nó làm lộ điểm yếu partial observability của nhiều VLA hiện đại.
Theo target type:
| Method | Manipulated object | Receptacle | Dual | Overall |
|---|---|---|---|---|
| UniVLA | 47.78 | 81.87 | 28.00 | 57.10 |
| OpenVLA | 28.89 | 67.47 | 13.43 | 40.65 |
| OpenVLA-OFT | 35.22 | 77.87 | 16.57 | 47.95 |
| π0 | 40.78 | 70.80 | 25.14 | 49.30 |
| π0.5 | 29.78 | 67.87 | 9.71 | 40.55 |
| VIM | 54.67 | 91.33 | 35.43 | 65.05 |
Dual occlusion vẫn rất khó. VIM cải thiện nhưng chưa "giải xong" occlusion. Nếu cả object và receptacle đều thiếu evidence, imagined view bị phụ thuộc mạnh vào prior đã học. Paper cũng nêu limitation: benchmark vẫn là simulation; VIM cần paired complementary-view data lúc train; nếu primary view chứa quá ít evidence, imagined view có thể sai.
Khi nào nên dùng LIBERO-Occ?
Dùng LIBERO-Occ khi bạn đang làm một trong các việc sau:
| Mục tiêu | Vì sao benchmark hữu ích |
|---|---|
| fine-tune OpenVLA/UniVLA/π0-style policy | đo policy có bị tụt mạnh khi object bị che không |
| thiết kế multi-view policy | so sánh true complementary view với imagined view |
| làm robot manipulation trong clutter | benchmark gần với lỗi vật che vật trên bàn thật |
| nghiên cứu world model cho control | kiểm tra generated visual evidence có giúp action không |
Không nên dùng LIBERO-Occ như bằng chứng duy nhất cho production. Nó chưa thay thế real-robot evaluation với sensor noise, calibration drift, latency, object variability và contact dynamics. Nhưng nó là benchmark rất tốt để phát hiện policy chỉ giỏi khi "mọi thứ đã nhìn rõ".
Lộ trình beginner nên làm
Nếu bạn mới bắt đầu, đừng train full ngay. Làm theo thứ tự:
- Cài upstream LIBERO và chạy một task LIBERO gốc.
- Clone LIBERO-Occ và install assets.
- Kiểm tra bốn suite occluded có load được.
- Chạy evaluation debug với checkpoint nhỏ hoặc released/internal checkpoint nếu bạn có.
- Đọc metadata loader rồi tạo
stage1_multiview_meta.pkltừ vài episode. - Chạy Stage 1 debug 20 bước để xác nhận view generation path.
- Chạy Stage 2 debug 20 bước để xác nhận action tokenizer path.
- Chỉ sau đó mới scale lên nhiều GPU.
Mẫu ghi chú thí nghiệm:
experiment: vim_goal_occ_debug
suite: libero_goal_occluded
primary_view: agentview / third-person
imagined_view_target: gripper_image
checkpoint: vim_stage2_gripper_weighted
trials_per_task: 1
camera_resolution: 200
metrics:
success_rate:
failure_examples:
- object hidden by occluder
- receptacle boundary ambiguous
- gripper self-occlusion
notes:
compare with same policy on original LIBERO goal suite
Kết luận
LIBERO-Occ nhắc ta một điều dễ bị bỏ qua: VLA manipulation không chỉ là hiểu instruction và nhận diện object. Robot còn phải hành động khi một phần scene bị thiếu khỏi camera. Benchmark này biến occlusion thành yếu tố có kiểm soát: target type rõ, severity rõ, task vẫn executable. VIM là hướng xử lý hợp lý vì nó không đòi thêm camera ở deployment, mà học dùng generative prior để tạo complementary view nội bộ.
Với người làm robotics ở Việt Nam, giá trị thực dụng là rất rõ. Trước khi đưa VLA lên cell sản xuất, kho logistics hoặc lab có nhiều vật trên bàn, hãy kiểm tra policy dưới occlusion. Nếu success rate tụt quá mạnh, thêm dữ liệu clutter, thêm wrist-view supervision, hoặc thử VIM-style viewpoint imagination trước khi kết luận model "không hiểu task".