ControlVLA: Few-shot Object-centric Adaptation for Pre-trained Vision-Language-Action Models
Apr 20, 2026

Task
- 적은 demonstration(10~20개) 만으로 새로운 로봇 manipulation task에 빠르게 적응시키기
- 입력
- RGB image
- language instruction
- proprioception(로봇 내부 상태)
- 출력
- 로봇 action sequence / motor command
문제의식
- 기존 few-shot manipulation 방식은 보통 아래 한계가 있음
- simulation augmentation, CAD model, 정확한 pose estimation 등에 의존 → 실환경 적용 어려움
- object-centric representation을 써도 수백 개 demonstration 이 필요한 경우가 많음
- 반면 pre-trained VLA는 일반적인 action prior는 좋지만, downstream task에 맞게 fine-tuning하려면 여전히 데이터가 많이 듦
- 그래서 논문 핵심 질문은:
- “pre-trained VLA의 action prior + object-centric hint를 결합하면 few-shot adaptation이 가능하지 않나?”
핵심 아이디어
- Pre-trained diffusion-based VLA에 object-centric condition을 ControlNet-style zero-init branch로 주입해서 few-shot adaptation을 안정적으로 만든다
전체 구조
1. Large-scale VLA pre-training
- 먼저 일반-purpose policy (\pi_g)를 large-scale manipulation dataset으로 pre-train
- 논문 appendix 구현 기준
- DROID dataset 사용
- wrist camera RGB
- end-effector pose, gripper width
- language description 사용
- backbone
- Diffusion Transformer policy
- 이미지/텍스트/로봇상태를 condition으로 받아 action sequence 생성
2. Object-centric representation 만들기
- task-relevant object를 찾고 mask를 뽑음
- GroundingDINO + SAM2 사용
- 각 object mask에서 아래 두 feature를 만듦
- positional feature
- mask 평균 좌표를 positional encoding
- geometrical feature
- mask에 CNN을 적용해 shape/local geometry feature 추출
- 둘을 concat해서 object representation (z_i) 생성
- 여러 object를 모아 (Z={z_i}) 생성
3. ControlNet-style fine-tuning
- 기존 observation branch와 별도로 object-centric branch를 추가
- 기존 cross-attention에 대해 추가로
- (K_z, V_z = W_z Z + B_z)
- 를 통해 object-centric condition을 넣음
- 여기서 (W_z, B_z)를 0으로 초기화(zero-init) 함
diffusion transformer architecture
- action을 한 번에 회귀하는 대신
- Gaussian noise에서 시작해서 action sequence를 점점 denoising 하여 생성하는 policy
- 즉
- 이미지 diffusion: noise → image
- 여기서는: noise → action trajectory
- diffusion을 쓰는 이유
- action이 multi-modal해서 단순 regression보다 유리함
- 여러 가능한 trajectory 분포를 더 잘 표현할 수 있음
- transformer는
- noisy action + observation condition을 받아
- 각 diffusion step에서 denoising하는 backbone 역할
zero init
- 새로 붙인 branch의 가중치를 처음엔 0으로 두는 것
- 이 논문에서는 object-centric branch용 (W_z, B_z)를 0으로 둠
- 그러면 처음에는
- (K_z = 0)
- (V_z = 0)
- 이라서 object branch 영향이 없음
- 의미
- fine-tuning 첫 단계에서는 pretrained policy와 동일하게 동작
- 기존 action prior를 안 망가뜨리고 시작
- 이후 학습되면서 object condition을 점진적으로 반영
ControlNet과의 연관성
- 이 논문에서 “ControlNet-style”이라는 말의 핵심은
- mask를 그냥 넣었다 가 아니라
- 새로운 condition을 pretrained 본체를 망가뜨리지 않게 zero-init branch로 추가했다 는 점
- Stable Diffusion의 ControlNet과 비교하면
- Stable Diffusion + depth/pose/sketch condition
- ControlVLA + object-centric representation condition
- 둘 다 공통적으로
- pretrained 본체 유지
- 새 condition을 zero-init branch로 점진 주입
- 하는 구조임
GroundingDINO와 SAM2는 뭐고, 왜 같이 쓰나
GroundingDINO
- 텍스트를 보고 그 텍스트에 해당하는 object 위치(box)를 찾는 open-vocabulary detector에 가까움
- 예:
- “green toy”
- “blue bowl”
- “black handle”
- 같은 표현을 보고 이미지에서 대응 위치를 찾음
- CLIP처럼 텍스트-이미지 정렬을 더 region/box 수준으로 한 느낌으로 이해하면 됨
SAM / SAM2
- promptable segmentation model
- 점/박스/힌트가 주어지면 해당 대상을 정교하게 mask로 따는 모델
- 즉 SAM 자체가 “green toy”라는 class를 분류한다기보다,
- 누가 대상 위치를 알려주면
- 그 대상을 정확하게 분할하는 역할에 가까움
둘의 관계
- 원래 별개 모델
- 보통 파이프라인으로 연결함
- GroundingDINO: 텍스트 보고 box 찾기
- SAM2: box를 바탕으로 mask 생성
- 즉
- 찾기: GroundingDINO
- 정교하게 자르기: SAM2
SAM raw output → Z로 바꾸는 과정
- policy에 raw mask를 그대로 image channel처럼 넣는 건 아님
- 흐름
- GroundingDINO + SAM2로 object mask (M_i) 획득
- mask 평균 좌표 → positional feature (z_i^{pos})
- mask 자체를 CNN에 넣어 geometry feature (z_i^{geo}) 추출
- concat해서 (z_i=[z_i^{pos}, z_i^{geo}])
- 여러 object를 모아 (Z={z_i})
- (Z)를 추가 attention condition으로 사용
- 즉
- mask → object token 비슷한 representation → attention branch
- 구조임
- 위치 힌트가 중요하고 segmentation이 과하면
- box condition이 더 실용적일 수 있음
- 반대로
- 가위
- 손잡이
- 옷
- pouring
처럼 geometry/contact가 중요하면 mask가 유리할 가능성이 큼
Share article