Fast and Memory-Efficient Exact BEV Transformation with IO-Awareness
A drop-in, numerically exact view transformation for camera-based BEV perception (3D object detection, map segmentation) that projects features on the fly and materializes no intermediate tensors in HBM β peak memory is the output alone, independent of height bins. The large speedups follow from that reduced memory traffic.
Sampling-based view transformation (Sampling-VT) maps multi-camera image features into a bird's-eye-view grid, but its standard tensorized implementation materializes large intermediate tensors over BEV cells, cameras, and height bins β so memory and latency scale poorly with vertical resolution and camera count.
FlashBEV is a fully fused, IO-aware execution strategy that is mathematically
equivalent to Tensorized Sampling-VT (same operator output) while substantially reducing global
memory traffic and kernel-launch overhead. It reduces the operator's peak memory to O(BCXY)
(output only) β effectively independent of the number of height bins β and delivers
significant inference-latency speedups. This unlocks higher BEV range/resolution and vertical
discretization within fixed deployment budgets on memory-constrained devices where tensorized execution
would otherwise be infeasible.
View transformation (VT) lifts features from multiple camera images into a shared bird's-eye-view grid. Designs fall into two families:
Sampling-VT's density is what makes it powerful β but its standard tensorized implementation pays for that density in memory and latency.
FlashBEV recasts Sampling-VT as a single fused, IO-aware kernel: it computes projection coordinates on the fly and accumulates straight into the BEV output, so no intermediate tensor is ever allocated in HBM. Peak memory collapses to O(BCXY) (output only), independent of the number of height bins. Because it no longer streams large intermediates through global memory, it also runs ~5Γ faster β the speedup is a consequence of the memory-aware execution, not a separate trick. It is numerically identical to Tensorized Sampling-VT (bit-exact output and gradients) β a drop-in replacement that needs no retraining.
On the SimpleBEV reference config (RTX A6000): >37Γ lower peak memory, β5.2Γ faster forward, numerically exact. FlashBEV slots into any sampling-based VT pipeline (SimpleBEV- and BEVFormer-style); the same idea transfers to BEVFormer's Spatial Cross-Attention (FlashSCA).
O(BCXY) (output only), independent of height bins (Z) β >37Γ lower peak memory.View transformation at the SimpleBEV reference config (BEV 200Γ200, Z=8, C=128), RTX A6000, FP32:
| Method | Fwd latency | Fwd peak mem | Bwd latency | Bwd peak mem |
|---|---|---|---|---|
| Tensorized Sampling-VT | 9.18 ms | 1971.94 MB | 17.90 ms | 1174.86 MB |
| FlashBEV (ours) | 1.77 ms | 52.82 MB | 3.27 ms | 105.63 MB |
| improvement | β5.2Γ faster | β37Γ smaller | β5.5Γ faster | β11Γ smaller |
FlashBEV's view transformation is a drop-in nn.Module:
import torch
from flashbev import SamplingVT
# BEV grid as (min, max, cell size) per axis; reference config -> 200 x 200 x 8
vt = SamplingVT(
grid_x=(-50.0, 50.0, 0.5), # X -> 200 cells
grid_y=(-50.0, 50.0, 0.5), # Y -> 200 cells
grid_z=(-5.0, 5.0, 1.25), # Z -> 8 height bins
image_height=448, image_width=800, # original image size (for projection)
fuse_projection=True,
).cuda()
# from your 2D backbone + camera calibration
features_pv = torch.randn(1, 6, 128, 56, 100, device="cuda") # [B, N, C, H, W]
projection = torch.randn(1, 6, 3, 4, device="cuda") # [B, N, 3, 4]
bev = vt(projection, features_pv) # -> [B, C, X, Y] = [1, 128, 200, 200]
# feed `bev` into your BEV encoder + detection / segmentation heads
@inproceedings{yokokawa2026flashbev,
title = {FlashBEV: Fast and Memory-Efficient Exact BEV Transformation with IO-Awareness},
author = {Yokokawa, Shunsuke and Kasahara, Hironori},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2026},
eprint = {2607.10071},
archivePrefix = {arXiv},
primaryClass = {cs.CV}
}