wholebody-vlalibero-occvlaviewpoint-imaginationrobot-manipulationocclusion

Chạy LIBERO-Occ VIM cho VLA che khuất

Hướng dẫn LIBERO-Occ và Viewpoint Imagination để đánh giá, train và chạy VLA manipulation khi vật thể bị che khuất.

Nguyễn Anh Tuấn12 tháng 6, 202615 phút đọc
Chạy LIBERO-Occ VIM cho VLA che khuất

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:

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:

  1. Occlusion target identification: parse BDDL task spec để tìm object, receptacle hoặc goal region liên quan đến task.
  2. 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.
  3. 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.

Robot manipulation
Robot manipulation

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_KEYPERSPECTIVE_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ự:

  1. Cài upstream LIBERO và chạy một task LIBERO gốc.
  2. Clone LIBERO-Occ và install assets.
  3. Kiểm tra bốn suite occluded có load được.
  4. Chạy evaluation debug với checkpoint nhỏ hoặc released/internal checkpoint nếu bạn có.
  5. Đọc metadata loader rồi tạo stage1_multiview_meta.pkl từ vài episode.
  6. Chạy Stage 1 debug 20 bước để xác nhận view generation path.
  7. Chạy Stage 2 debug 20 bước để xác nhận action tokenizer path.
  8. 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".

Bài viết liên quan

NT

Nguyễn Anh Tuấn

Robotics & AI Engineer. Building VnRobo — sharing knowledge about robot learning, VLA models, and automation.

Khám phá VnRobo

Bài viết liên quan

Chạy Embodied-R1.5-VLA trên LIBERO
wholebody-vla

Chạy Embodied-R1.5-VLA trên LIBERO

11/6/202614 phút đọc
NT
UniIntervene: Giảm 57% human intervention
wholebody-vla

UniIntervene: Giảm 57% human intervention

11/6/202615 phút đọc
NT
ProcVLM: Dense Reward từ Video cho VLA
wholebody-vla

ProcVLM: Dense Reward từ Video cho VLA

8/6/202613 phút đọc
NT