Paper · 2025-10-19 · cs.CV
Vision-Centric 4D Occupancy Forecasting and Planning via Implicit Residual World Models
IR-WM is a vision-centric driving world model that predicts only the residual change of a bird's-eye-view scene state, not the whole future scene, and aligns features to limit error build-up. It forecasts 4D occupancy and plans trajectories. Author-reported on nuScenes: average planning L2 0.53 m vs 0.85 m for Drive-OccWorld.
World modelBird's-eye-view (BEV) representationImitation learningautonomous-drivingworld-modeloccupancy-forecastingend-to-end-planning
arXivPDFCodeMarkdown17 min read
AI-compiled by claude-haiku-5-5 on 2026-10-24, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Self-driving cars have to guess what the road will look like a few seconds ahead so they can pick a safe path. Many recent systems try to imagine the whole future scene from scratch, including the static background that does not change. IR-WM takes a different route. It first builds a top-down map of the current scene from the camera images. For the next moment it predicts only what changes on that map: which objects move, and how the scene shifts because the car itself moves. Those changes are added to the previous map, and an alignment step corrects drift so that errors do not pile up.
The model also predicts which parts of space will be occupied by objects in the future, and a planner uses those future features to propose the car's path. The authors found that the predicted future features improve planning, at the cost of extra computation time. They evaluate on the nuScenes driving dataset and report better forecasting and lower trajectory error than the earlier methods they compare against, notably Drive-OccWorld.
TL;DR
- Vision-centric driving world model: a BEVFormer-based encoder builds a bird's-eye-view (BEV) state from camera images, and a future predictor outputs the residual change of that state per step §3.2, §4.1.3.
- Feature alignment with predicted semantics and ego motion gives small per-class IoU gains; the authors call the effect slight §3.2.2, §4.4, tab. 8.
- Author-reported on nuScenes: 4D occupancy forecasting beats Drive-OccWorld on every reported metric group tab. 1–3, and open-loop planning reaches an average L2 of 0.53 m vs 0.85 m for Drive-OccWorld tab. 4.
- The released code is on the
ir-wmbranch, not the default branch. Several details differ from the paper (losses, collision term, training schedule); see Paper vs code.
Problem
Vision-centric world models for end-to-end planning often regenerate the whole scene for both the current and the future state. This spends capacity on mostly static background and limits how much scene context is encoded from past and current observations §1. The authors move away from full-scene regeneration toward modelling the current state and its future changes §1.
All experiments use nuScenes and its occupancy labels §4.1.1. Training targets are voxel-level occupancy labels plus ego trajectories §4.1.1.
Method
Overview
IR-WM has three parts §3.2, fig. 2:
- A scene encoder E (BEVFormer) turns past and current camera images into BEV features §3.2.1.
- An autoregressive future predictor W with a streaming memory of BEV features predicts the residual change of the BEV state at each future step, conditioned on the ego trajectory and a high-level command §3.2.2.
- Two task heads read the BEV state: an occupancy head D_o for 4D occupancy and a planning head D_p for trajectories §3.2.3.
The planning problem and the decomposition are written as eq. 1–eq. 5:
\tau_{1:f} = \mathcal{F}(I_{-h:0}, \tau_{-h:0}) eq. 1
S_{-h:0} = \mathcal{E}(I_{-h:0}, \tau_{-h:0}) eq. 2
S_t = \mathcal{W}(S_{-h:t-1}, \tau_{-h:t}) eq. 3
\tau_{t+1} = \mathcal{D}_p(S_t) eq. 4
O_t = \mathcal{D}_o(S_t) eq. 5
Here h is the number of past frames, f the number of future steps, S the BEV state and τ the ego trajectory §3.1. The occupancy head is an auxiliary output: it is used for supervision and interpretability, not as an input to planning in the default variant §3.1, §3.2.4.
Residual state update
The predictor does not output the next BEV state directly. It outputs a change ΔS_t, which is added to the previous BEV state §3.2.2, eq. 6:
S^{bev}_t = \Delta S^{bev}_t + S^{bev}_{t-1} eq. 6
The predictor is a stack of transformer layers that takes learnable BEV queries. Each layer runs deformable self-attention, deformable temporal cross-attention to the m memory frames, conditioning on the ego-trajectory embedding, and a feed-forward network that outputs ΔS_t §3.2.2. Reference points for the temporal cross-attention come from the ego-motion transform δτ_t, which is derived from the last two trajectory points, so that memory features are pre-aligned in time before aggregation §3.2.2.
Feature alignment
After the residual update, an alignment module modulates the BEV features with scale and shift parameters from layer normalization §3.2.2. Two separate MLPs produce the parameters: one from the predicted semantic occupancy map O^align_t and one from the ego-motion transform δτ_t §3.2.2. The modulated result is the feature that is pushed into the memory for the next step §3.2.2:
\hat S^{bev}_t = \gamma_s(O^{align}_t)\,\mathrm{LN}(S^{bev}_t) + \beta_s(O^{align}_t) + \gamma_e(\delta\tau_t)\,\mathrm{LN}(S^{bev}_t) + \beta_e(\delta\tau_t) §3.2.2
LN is layer normalization. A light head of MLPs on S^bev_t produces O^align_t, which is supervised with a cross-entropy loss L_align §3.2.2. The authors say the alignment slightly reduces error accumulation over time §4.4, tab. 8.
Occupancy and planning heads
The occupancy head applies an MLP and a channel-to-height mapping to lift each BEV feature into a vertical volume of dense semantic occupancy O_t. Rolling out several steps gives O_{0:f-1} for the current and future frames §3.2.3.
The planning head uses a learnable plan query that is concatenated with a command embedding §3.2.3, fig. 3. A transformer decoder cross-attends from this query to S_t + Adapter(S_t), where the adapter is a stack of convolutions that enhances features §3.2.3. An MLP then outputs the ego translation δτ_{t+1}, and the pose is updated as τ_{t+1} = τ_t + δτ_{t+1} §3.2.3.
Forecasting and planning coupling
The paper compares three ways the planner can use the forecast §3.2.4, fig. 4:
- Tightly coupled: the planner uses predicted occupancy to filter sampled candidate trajectories with a safety cost, then refines the chosen one from the BEV features §3.2.4, eq. 9, eq. 10.
- Semi-coupled (the default): the planner uses only the generated BEV features. Occupancy is auxiliary supervision and optional output §3.2.4.
- Fully decoupled: the planner reads only the current BEV features S_0, and no future features are needed at inference §3.2.4, eq. 11.
The authors adopt semi-coupled by default, based on their ablation [§3.2.4, tab. 5].
Training objective
The total loss is L = L_align + L_occ + λ_plan L_plan §3.3, eq. 14.
Occupancy uses a sum of three terms per future step: cross-entropy, a Lovász loss on IoU, and a binary free/occupied loss §3.3, eq. 12. The planning loss is an imitation term plus a collision term with weight λ_coll §3.3, eq. 13. Both λ_plan and λ_coll are set to 1 §4.1.3.
# Implicit residual rollout [§3.2] [fig. 2]
# Input: images (B, T, N_cam, 3, H, W); ego trajectory (B, T, 2)
# Output: planned trajectory (B, F + 1, 2); aligned BEV (B, F, HW, C)
def rollout(images, ego_traj, command, num_future):
# Encode history and current frame into BEV features [§3.2.1]
memory = scene_encoder(images, ego_traj) # (B, M, HW, C)
# Start from the newest BEV state [§3.2.2]
bev = memory[:, -1] # (B, HW, C)
traj = zeros(B, 1, 2) # (B, t, 2)
for step in range(num_future):
# Predict only the change from the previous BEV [§3.2.2] [eq. 6]
delta = future_predictor(memory, traj, command, step)
# Add the residual to the previous BEV [§3.2.2] [eq. 6]
bev = bev + delta # (B, HW, C)
# Plan the next displacement from the un-aligned BEV [§3.2.3]
step_delta = planner(bev, command[:, step])
traj = append(traj, traj[:, -1] + step_delta)
# Predict semantics for the alignment step [§3.2.2]
semantics = semantic_head(bev) # (B, HW, Z, K)
# Align BEV with semantics and the ego transform [§3.2.2]
bev = feature_alignment(bev, semantics, traj)
# Push the aligned BEV into the memory queue [§3.2.2]
memory = push(memory, bev)
return traj, memory# Planning loss [§3.3] [eq. 13]
def planning_loss(pred_traj, gt_traj, valid, gt_boxes):
# Distance per waypoint, averaged over valid steps [§3.3]
# Code uses an unsquared L2 norm [code: planning_loss.py#L21-L27]
error = norm(pred_traj - gt_traj, axis=-1) # (B, F)
imitation = masked_mean(error, valid)
# Overlap of the ego box with GT boxes [code: planning_loss.py#L36-L69]
collision = box_overlap(ego_boxes(pred_traj), gt_boxes)
return imitation + lambda_coll * collisionTraining details (as stated in the paper)
The scene encoder is BEVFormer-based §4.1.3. Training uses AdamW with an initial learning rate of 2e-4, a cosine annealing schedule, and 8 NVIDIA A100 GPUs §4.1.3. The paper does not state the backbone, weight decay, warmup, gradient clipping or number of epochs. The released code sets these, as listed in the hyperparameter table.
Hyperparameters
Values marked "not stated" are absent from the paper. Code values are from the
ir-wm branch at code_commit; configs are in projects/configs/.
| Name | Value | Where | Notes |
|---|---|---|---|
| Training scenes | 850 annotated; 700 train, remainder eval | §4.1.1 | nuScenes |
| History input | 2 past frames plus the current frame | §4.1.1 MMO_MSO_with_plan_semi_coupled.py | config queue_length = 2; whether the current frame is counted on top is not stated |
| Future frames, fine-grained configs | 4 | action_condition_MMO_MSO.py | paper text says four timestamps §4.1.1; tables label 2 s tab. 2 |
| Future frames, e2e config | 5 | MMO_MSO_with_plan_semi_coupled.py | tables label 2.5 s tab. 3 |
| Planning steps evaluated | 6 | drive_occworld.py | step length in seconds not stated |
| Occupancy range | x, y in [-51.2, 51.2] m; z in [-5, 3] m | §4.1.1 MMO_MSO_with_plan_semi_coupled.py | |
| Voxel size | 0.2 m | §4.1.1 MMO_MSO_with_plan_semi_coupled.py | |
| Occupancy grid | 512 x 512 x 40 | §4.1.1 MMO_MSO_with_plan_semi_coupled.py | loss is computed at a lower resolution, see Paper vs code |
| BEV resolution | 200 x 200 | §4.1.3 MMO_MSO_with_plan_semi_coupled.py | |
| Feature width | 256 | §4.1.3 MMO_MSO_with_plan_semi_coupled.py | |
| FFN width | 512 | MMO_MSO_with_plan_semi_coupled.py | not stated; = 2 x 256 |
| Future predictor layers | 3 | §4.1.3 MMO_MSO_with_plan_semi_coupled.py | |
| Attention heads (predictor) | 8 | MMO_MSO_with_plan_semi_coupled.py | not stated |
| Dropout (predictor) | 0.1 | MMO_MSO_with_plan_semi_coupled.py | not stated |
| Planning decoder layers | 1 | MMO_MSO_with_plan_semi_coupled.py | not stated in paper |
| Image backbone | ResNet-101, DCNv2 in stages 3–4, stage 1 frozen | MMO_MSO_with_plan_semi_coupled.py | paper says BEVFormer-based only §4.1.3 |
| Optimizer | AdamW, lr 2e-4 | §4.1.3 MMO_MSO_with_plan_semi_coupled.py | |
| Weight decay | 0.01 | MMO_MSO_with_plan_semi_coupled.py | not stated |
| Backbone lr multiplier | 0.1 | MMO_MSO_with_plan_semi_coupled.py | not stated |
| Gradient clipping | max norm 35, L2 | MMO_MSO_with_plan_semi_coupled.py | not stated |
| LR schedule | cosine annealing, linear warmup 500 iters from 1/3 of lr, min ratio 1e-3 | §4.1.3 MMO_MSO_with_plan_semi_coupled.py | warmup details not stated |
| Epochs | 24 | MMO_MSO_with_plan_semi_coupled.py | not stated |
| Hardware | 8 x NVIDIA A100 | §4.1.3 | |
| Samples per GPU | 1 | MMO_MSO_with_plan_semi_coupled.py | global batch 8 is inferred from this and 8 GPUs; not stated |
| λ_plan | 1 | §4.1.3 | code has no explicit weight on the imitation term plan_head.py |
| λ_coll | 1 | §4.1.3 | code uses three collision terms with weights 2.5, 1.0, 0.25 MMO_MSO_with_plan_semi_coupled.py |
| Teacher-forced trajectory | ground truth for the first 12 epochs | drive_occworld.py | not stated |
| Class weight in cross-entropy | 1 for empty, 5 for every other class | world_head_v1.py | not stated |
| Loss grid | 256 x 256 x 20 | world_head_v1.py world_head_v1.py | not stated |
| Pretrained initialisation | fine-grained MMO/MSO checkpoint, epoch 24 (e2e); R101 FCOS3D pretrain (fine-grained) | MMO_MSO_with_plan_semi_coupled.py action_condition_MMO_MSO.py | not stated in paper |
Results
Author-reported. Setup: nuScenes, with nuScenes-Occupancy for fine-grained labels §4.1, tab. 1–4. The proposed model and most planning baselines use camera input; four planning baselines use LiDAR tab. 4. The model is a BEVFormer-based encoder with a three-layer future predictor, trained on 8 A100 GPUs §4.1.3. The baseline numbers come from Drive-OccWorld; whether they were re-run or copied is not stated. Hardware for the latency column is not stated.
Headline claims from the paper:
- Inflated GMO forecasting (nuScenes): IoU_c 40.8, IoU_f 37.2 vs 39.8 and 36.3 for Drive-OccWorld tab. 1.
- Fine-grained GMO (nuScenes-Occupancy): IoU_c 16.2, IoU_f 14.5 vs 13.6 and 12.0 tab. 1.
- Open-loop planning on nuScenes validation: average L2 0.53 m vs 0.85 m for Drive-OccWorld; average collision rate 0.17% vs 0.29% tab. 4. The abstract's "top performance" does not hold for average collision, where SSR is lower at 0.15% tab. 4.
Table 1 tab. 1: inflated GMO (nuScenes) and fine-grained GMO (nuScenes-Occupancy).
| Method | nuS IoU_c | nuS IoU_f (2 s) | nuS IoU~_f | nuS-Occ IoU_c | nuS-Occ IoU_f (2 s) | nuS-Occ IoU~_f |
|---|---|---|---|---|---|---|
| OpenOccupancy-C | 12.17 | 11.45 | 11.74 | 10.82 | 8.02 | 8.53 |
| SPC† | 1.27 | - | - | 5.85 | 1.08 | 1.12 |
| PowerBEV-3D | 23.08 | 21.25 | 21.86 | 5.91 | 5.25 | 5.49 |
| BEVDet4D | 31.60 | 24.87 | 26.87 | - | - | - |
| OCFNet (Cam4DOcc) | 31.30 | 26.82 | 27.98 | 11.45 | 9.68 | 10.10 |
| OccProphet | 34.36 | 26.94 | 29.15 | 15.38 | 10.69 | 11.98 |
| Drive-OccWorld | 39.80 | 36.30 | 37.40 | 13.60 | 12.00 | 12.40 |
| IR-WM (this paper) | 40.80 | 37.20 | 38.20 | 16.20 | 14.50 | 15.00 |
† SPC is SurroundDepth + PCPNet + Cylinder3D tab. 1.
Table 2 tab. 2: fine-grained GMO and GSO (nuScenes-Occupancy).
| Method | IoU_c GMO | IoU_c GSO | IoU_c mean | IoU_f (2 s) GMO | IoU_f (2 s) GSO | IoU_f (2 s) mean | IoU~_f GMO |
|---|---|---|---|---|---|---|---|
| OpenOccupancy-C | 9.62 | 17.21 | 13.42 | 7.41 | 17.30 | 12.36 | 7.86 |
| SPC† | 5.85 | 3.29 | 4.57 | 1.08 | 1.40 | 1.24 | 1.12 |
| PowerBEV-3D | 5.91 | - | - | 5.25 | - | - | 5.49 |
| OCFNet (Cam4DOcc) | 11.02 | 17.79 | 14.41 | 9.20 | 17.83 | 13.52 | 9.66 |
| OccProphet | 13.71 | 24.42 | 19.06 | 9.34 | 24.56 | 16.95 | 10.33 |
| Drive-OccWorld | 16.90 | 20.20 | 18.50 | 14.30 | 21.20 | 17.80 | 14.90 |
| IR-WM (this paper) | 17.50 | 23.10 | 20.30 | 15.20 | 24.50 | 19.90 | 15.70 |
† SPC is SurroundDepth + PCPNet + Cylinder3D tab. 2.
Table 3 tab. 3: fine-grained MMO and MSO (nuScenes-Occupancy), per-class IoU~_f.
| Method | mIoU_c | mIoU_f (2.5 s) | Barrier | Bicycle | Bus | Car | Construction | Motorcycle | Pedestrian | Traffic cone | Trailer | Truck | Drivable surface | Other | Sidewalk | Terrain | Manmade | Vegetation | mIoU~_f |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Drive-OccWorld | 12.9 | 11.5 | 11.5 | 6.9 | 10.2 | 13.2 | 7.7 | 8.3 | 7.6 | 6.5 | 4.8 | 10.5 | 29.1 | 20.1 | 19.2 | 16.1 | 6.4 | 10.8 | 11.8 |
| IR-WM (this paper) | 15.2 | 14.4 | 14.8 | 9.2 | 12.7 | 15.8 | 9.4 | 9.7 | 9.0 | 9.7 | 8.1 | 13.2 | 32.5 | 23.8 | 21.5 | 19.4 | 10.3 | 14.4 | 14.6 |
Table 4 tab. 4: open-loop planning on nuScenes validation. L2 in metres, collision in percent; lower is better. Aux. Sup. is the auxiliary supervision the method uses.
| Method | Input | Aux. Sup. | L2 1s | L2 2s | L2 3s | L2 Avg | Col 1s | Col 2s | Col 3s | Col Avg |
|---|---|---|---|---|---|---|---|---|---|---|
| IL | LiDAR | None | 0.44 | 1.15 | 2.47 | 1.35 | 0.08 | 0.27 | 1.95 | 0.77 |
| NMP | LiDAR | Box & Motion | 0.53 | 1.25 | 2.67 | 1.48 | 0.04 | 0.12 | 0.87 | 0.34 |
| FF | LiDAR | Freespace | 0.55 | 1.20 | 2.54 | 1.43 | 0.06 | 0.17 | 1.07 | 0.43 |
| EO | LiDAR | Freespace | 0.67 | 1.36 | 2.78 | 1.60 | 0.04 | 0.09 | 0.88 | 0.33 |
| BevFormer + OccWorld | Camera | 3D-Occ | 0.43 | 0.87 | 1.31 | 0.87 | - | - | - | - |
| BevFormer + Occ-LLM | Camera | 3D-occ | 0.26 | 0.67 | 0.98 | 0.64 | - | - | - | - |
| ST-P3 | Camera | Map & Box & Depth | 1.33 | 2.11 | 2.90 | 2.11 | 0.23 | 0.62 | 1.27 | 0.71 |
| UniAD | Camera | Map & Box & Motion & Tracklets & Occ | 0.48 | 0.96 | 1.65 | 1.03 | 0.05 | 0.17 | 0.71 | 0.31 |
| VAD-Base | Camera | Map & Box & Motion | 0.54 | 1.15 | 1.98 | 1.22 | 0.04 | 0.39 | 1.17 | 0.53 |
| OccNet | Camera | 3D-Occ & Map & Box | 1.29 | 2.13 | 2.99 | 2.14 | 0.21 | 0.59 | 1.37 | 0.72 |
| GenAD | Camera | Map & Box & Motion | 0.36 | 0.83 | 1.55 | 0.91 | 0.06 | 0.23 | 1.00 | 0.43 |
| UAD | Camera | Box | 0.39 | 0.81 | 1.50 | 0.90 | 0.01 | 0.12 | 0.43 | 0.19 |
| RenderWorld | Camera | None | 0.48 | 1.30 | 2.67 | 1.48 | 0.14 | 0.55 | 2.23 | 0.97 |
| SSR | Camera | None | 0.24 | 0.65 | 1.36 | 0.75 | 0.00 | 0.10 | 0.36 | 0.15 |
| PARA-Drive | Camera | Map & Box & Motion & Tracklets & Occ | 0.40 | 0.77 | 1.31 | 0.83 | 0.07 | 0.25 | 0.60 | 0.30 |
| GaussianAD | Camera | 3D-Occ & Map & Box & Motion | 0.40 | 0.64 | 0.88 | 0.64 | 0.09 | 0.38 | 0.81 | 0.42 |
| Drive-OccWorld | Camera | 4D-Occ | 0.32 | 0.75 | 1.49 | 0.85 | 0.05 | 0.17 | 0.64 | 0.29 |
| IR-WM (this paper) | Camera | 4D-Occ | 0.23 | 0.51 | 0.85 | 0.53 | 0.14 | 0.20 | 0.16 | 0.17 |
Table 5 tab. 5: coupling variants, fine-grained MMO and MSO on nuScenes-Occupancy validation, with planning L2 and latency. The latency device is not stated.
| Variant | mIoU_c | mIoU_f (2.5 s) | mIoU~_f | L2 1s | L2 2s | L2 3s | L2 Avg | Latency (ms) |
|---|---|---|---|---|---|---|---|---|
| Tightly coupled | 15.1 | 14.3 | 14.6 | 0.23 | 0.50 | 0.84 | 0.52 | 764 |
| Semi-coupled (default) | 15.2 | 14.4 | 14.6 | 0.23 | 0.51 | 0.85 | 0.53 | 706 |
| Fully decoupled | 14.9 | 14.3 | 14.5 | 0.29 | 0.78 | 1.55 | 0.87 | 558 |
Table 6 tab. 6: temporal self-supervision on BEV features (fine-grained GMO and GSO).
| Method | IoU_c GMO | IoU_c GSO | IoU_c mean | IoU_f (2 s) GMO | IoU_f (2 s) GSO | IoU_f (2 s) mean | IoU~_f GMO |
|---|---|---|---|---|---|---|---|
| IR-WM | 17.50 | 23.10 | 20.30 | 15.20 | 24.50 | 19.90 | 15.70 |
| W/ TSS | 17.50 | 23.20 | 20.30 | 15.10 | 24.50 | 19.80 | 15.60 |
Table 7 tab. 7: action conditioning by addition vs cross-attention (fine-grained MMO and MSO).
| Conditioning | mIoU_c | mIoU_f (2 s) | mIoU~_f |
|---|---|---|---|
| Cross-attention | 14.2 | 13.8 | 13.9 |
| Addition (default) | 14.3 | 13.9 | 14.1 |
Table 8 tab. 8: feature alignment, per-class IoU_f on nuScenes-Occupancy validation.
| Variant | Barrier | Construction | Sidewalk | Drivable surface |
|---|---|---|---|---|
| w/o FA | 14.0 | 8.5 | 20.7 | 32.0 |
| w/ FA | 14.4 (+0.4) | 8.9 (+0.4) | 21.1 (+0.4) | 32.2 (+0.2) |
Table 9 tab. 9: BEV resolution, fine-grained GMO on nuScenes-Occupancy validation.
| Method | Resolution | IoU_c | IoU_f (2 s) | IoU~_f |
|---|---|---|---|---|
| Drive-OccWorld | 200 x 200 | 13.60 | 12.00 | 12.40 |
| IR-WM | 200 x 200 | 16.20 | 14.50 | 15.00 |
| IR-WM | 128 x 128 | 11.80 | 10.80 | 11.10 |
The paper also includes qualitative visualisations of forecasts at different times of day fig. 5, described in words only here.
Paper vs code
Code: the repository yuyang-cloud/Drive-OccWorld is linked in the abstract. Owner yuyang-cloud matches co-author Yu Yang; the paper's
author list includes Yu Yang. The default branch of that repository is the
Drive-OccWorld baseline. The README links the IR-WM code on the ir-wm branch
[README, News], and that branch is what we recorded: commit a83e4a2
("update readme"). The ir-wm branch is Apache-2.0 (LICENSE). All paths below
are relative to the repository root at that commit. The paper's default
semi-coupled variant is the config at
projects/configs/e2e/MMO_MSO_with_plan_semi_coupled.py.
Searched for an official repository: the abstract link, and the README. No other repository was used.
Differences found on reading the code (not run):
- Training path of the default config appears broken. The semi-coupled
config uses detector type
Drive_OccWorldMMO_MSO_with_plan_semi_coupled.py. Itsforward_trainreadsret_dict['next_bev_preds']drive_occworld.py, butfuture_predreturns a dict in which that key is commented out drive_occworld.py. TheDrive_OccWorld_V2class does return it drive_occworldV2.py, and is used by the fully decoupled config only. As read, the default training path raises a KeyError. We did not run it. - Planning loss is not squared. The paper writes the imitation term as a squared L2 norm §3.3, eq. 13. The code takes the square root of the summed squares, i.e. a Euclidean distance planning_loss.py.
- Collision term uses ground-truth boxes, not occupancy voxels. The paper
says the collision term penalises waypoints that overlap occupied voxels of
the target occupancy §3.3, eq. 13. The code computes overlap of the ego box
with ground-truth future bounding boxes planning_loss.py,
passed in from
compute_plan_lossdrive_occworld.py. - Collision weights differ from λ_coll = 1. The planning head has three collision terms at margins 0.0, 0.5 and 1.0 with weights 2.5, 1.0 and 0.25 MMO_MSO_with_plan_semi_coupled.py. The paper states λ_coll = 1 §4.1.3. The imitation term has no explicit weight plan_head.py.
- Occupancy loss terms differ. The paper uses cross-entropy, Lovász and a binary occupancy term §3.3, eq. 12. The code's voxel loss uses cross-entropy, a semantic scene-class term, Lovász and a geometric scene-class term. There is no BCE term world_head_v1.py. Cross-entropy also uses class weight 5 for all non-empty classes world_head_v1.py.
- Averaging over future steps is not visible. The paper averages the
occupancy loss over the f future steps §3.3, eq. 12.
loss_occreturns one dictionary per term per decoder layer, with no 1/f factor visible world_head_v1.py. - Occupancy loss is at 256 x 256 x 20. The config's grid is 512 x 512 x 40 MMO_MSO_with_plan_semi_coupled.py. The loss head defaults to output scale 2, so targets are downsampled by majority vote to 256 x 256 x 20 world_head_v1.py world_head_v1.py.
- Teacher forcing for the first 12 epochs. During training, the first 12 of 24 epochs roll out with ground-truth trajectories rather than predicted ones drive_occworld.py MMO_MSO_with_plan_semi_coupled.py. The paper does not mention this.
- Semantic conditioning is an argmax. The code takes the argmax of the
predicted semantics, detached from the graph, because
sem_gt_trainis False conditionalnorm.py MMO_MSO_with_plan_semi_coupled.py. The paper describes the conditioning as coming from the predicted map O^align §3.2.2. - Ego conditioning uses a transform, not δτ. The ego branch takes the 3 x 4 future-to-history transform, positional-encoded to a 144-dimensional input conditionalnorm.py conditionalnorm.py. The paper writes this term as a function of δτ_t §3.2.2.
- Sum of two modulations. The code sums the semantic and ego modulated outputs conditionalnorm.py. The paper's formula applies layer normalization to the same input in both terms §3.2.2. Both are the same idea, but the normalization placement is not identical.
- Temporal self-supervision is off in released configs.
use_lwmdefaults to False drive_occworld.py and no released config sets it. The TSS ablation tab. 6 cannot be reproduced from the released configs. - Pretrained initialisation is not in the paper. The fine-grained configs start from an R101 FCOS3D pretrain checkpoint action_condition_MMO_MSO.py. The e2e config starts from the fine-grained MMO/MSO epoch-24 checkpoint MMO_MSO_with_plan_semi_coupled.py.
- Planner inputs. The planner's forward takes BEV features and a command only plan_head.py. That matches the caption that ego status is not used by planning tab. 4. The BEVFormer perception head uses CAN bus MMO_MSO_with_plan_semi_coupled.py; the paper does not say whether the encoder uses it.
- Horizon differs by config. Fine-grained configs use 4 future frames action_condition_MMO_MSO.py. The e2e config uses 5 MMO_MSO_with_plan_semi_coupled.py. The paper's dataset section says four timestamps §4.1.1, and its tables use both 2 s and 2.5 s tab. 2, tab. 3.
Pitfalls
- The default training path does not run as released (as read). Use the
V2 class or fix the missing
next_bev_predsbefore reproducing the semi-coupled result. See Paper vs code. - Use the
ir-wmbranch. The default branch is the Drive-OccWorld baseline, not IR-WM. - Compare numbers only at the same horizon. Fine-grained tables use 2 s and the MMO/MSO and e2e settings use 2.5 s tab. 3, tab. 5. The paper's text says four timestamps §4.1.1.
- Ground-truth trajectories are used for 12 of 24 epochs. If you reproduce from scratch, the early rollout uses GT ego trajectories, and the trained model may behave differently when it switches to predicted ones at epoch 12 drive_occworld.py.
- Pretraining is required for the e2e result. The e2e config starts from a fine-grained checkpoint MMO_MSO_with_plan_semi_coupled.py. The paper does not say so, so a from-scratch run will differ.
- Collision signal differs from the paper's description. The code's collision term checks the predicted ego box against ground-truth boxes of other objects planning_loss.py. An implementer who follows the paper's voxel-overlap description will get a different planning signal.
- Planning error feeds back into the memory. The memory alignment uses the planned trajectory §3.2.2, so a bad plan also distorts the aligned BEV used by the next step. The paper does not discuss this.
- Unstated values. Weight decay, warmup, gradient clipping, epochs, backbone, head counts and loss class weights are not in the paper. See the hyperparameter table for the code values.
- Latency hardware is not stated. The latency column tab. 5 cannot be compared with other papers without the device.
- Baseline provenance is not stated. The paper does not say whether the Drive-OccWorld and other baseline numbers were re-run or copied from their papers.
- Input frame count is ambiguous. The paper says "two past frames and the
current frame" §4.1.1; the config's
queue_length = 2is described as the history frame count MMO_MSO_with_plan_semi_coupled.py. Whether the current frame is additional is not clear from either. - No ground-truth semantic conditioning in released configs. The early-epoch
ground-truth path in the detector needs
sem_gt_trainTrue, and every released config sets it to False MMO_MSO_with_plan_semi_coupled.py. Only the trajectory teacher forcing above applies. - Average collision is not best in the paper's own table. SSR reports 0.15% vs 0.17% for IR-WM tab. 4. Treat the abstract's "top performance" as about L2 and forecasting, not collision.
Lineage
- Builds on: BEVFormer as the scene encoder §3.2.1; Drive-OccWorld for the overall setup and the fine-grained occupancy comparison §2, tab. 1–4. The Drive-OccWorld arXiv id is 2408.14197, from the code README.
- Compared against: OpenOccupancy-C, PowerBEV-3D, BEVDet4D, Cam4DOcc (OCFNet), OccProphet, Drive-OccWorld for forecasting tab. 1–3; IL, NMP, FF, EO, ST-P3, UniAD, VAD, OccNet, GenAD, UAD, RenderWorld, SSR, PARA-Drive and GaussianAD for planning tab. 4.
- Superseded by: not known from content already in this wiki.
Source and license
Adapted from “Vision-Centric 4D Occupancy Forecasting and Planning via Implicit Residual World Models” by Jianbiao Mei, Yu Yang, Xuemeng Yang, Licheng Wen, Jiajun Lv, Botian Shi, Yong Liu (arXiv:2510.16729), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/yuyang-cloud/Drive-OccWorld at commit a83e4a24a8db (Apache-2.0). Any quoted code is shown under that license.