🔥 核心痛点:LiDAR-相机3D检测的视图变换(VT)存在两大缺陷------深度估计方法对误差敏感,Query方法计算量大且存在光线方向错位(ray-directional misalignment)。
🎯 核心方法 :EVT(ThorDrive/SNU ICCV 2025)提出ASAP自适应采样投影------自适应采样(AS)用LiDAR特征生成3D采样点聚焦高相关区域→自适应投影(AP)用LiDAR生成自适应卷积核精炼BEV表示→消除光线方向错位。配合分组混合Query选择+几何感知交叉注意力。
📌 核心结论 :nuScenes测试集75.3% NDS,实时推理速度。不依赖深度估计或注意力机制,兼顾精度和效率。
🔖 EVT:ASAP自适应视图变换,LiDAR引导的高效多模态3D检测
前言
LiDAR-相机融合3D检测中,视图变换(VT)是将图像特征映射到BEV空间的关键环节。现有两大范式各有缺陷:
- 深度估计VT(如LSS):逐像素预测深度分布,将图像特征"提升"到3D空间。问题:深度估计误差会导致BEV特征严重退化,远距区域尤其明显。
- Query VT(如BEVFormer):用可学习Query在BEV空间采样图像特征。问题:注意力机制计算量大(O(N²)),且同视线方向的多个Query采样到相似图像特征(光线方向错位)。
光线方向错位的核心问题:图像中同一视线方向上的多个3D位置投影到相同的2D像素------Query方法无法区分这些位置,导致BEV特征在深度方向上模糊。
EVT的解法是:用LiDAR的精确几何信息引导视图变换------LiDAR知道"哪里有物体"和"物体在3D空间的精确位置",直接用这些信息指导图像特征的采样和投影,既避免了深度估计误差,又消除了光线方向错位。
一、整体架构:ASAP + 分组混合Query + 几何感知注意力

ASAP(自适应采样+自适应投影):
- 自适应采样(AS):从LiDAR特征生成3D采样点→投影到图像平面→采样图像特征→BEV表示
- 自适应投影(AP):从LiDAR特征生成自适应卷积核→对BEV特征做结构感知精炼
检测框架:
-
分组混合Query选择:将Query按组分配,混合不同类型的Query(LiDAR引导+可学习)
-
几何感知交叉注意力:Query与多模态BEV特征交互,利用几何约束提升注意力精度
数据流:
LiDAR → [编码] → LiDAR特征 → [AS自适应采样] → 3D采样点 → 图像采样 → BEV特征
↓
Image → [Backbone] → 图像特征 ────────────────────────────┘
↓
[AP自适应投影] → 精炼BEV → [分组混合Query] → 检测头
二、核心模块
2.1 自适应采样(AS):LiDAR引导的3D采样点生成

传统VT用固定网格或可学习Query采样,EVT用LiDAR特征直接生成3D采样点:
- LiDAR特征→3D采样点生成器→一组3D坐标{(x,y,z)}
- 投影到图像平面:p=KR\|t·x,y,z,1^T
- 从图像特征图中采样对应位置的特征
- 通过可变形注意力聚合采样特征到BEV网格
关键优势:采样点集中在有物体的区域(LiDAR知道哪里有物体),而非均匀采样------这大幅减少了无信息区域的计算浪费。
2.2 自适应投影(AP):结构感知BEV精炼
LiDAR特征包含精确的3D结构信息。AP用这些信息生成空间变化的卷积核------在物体边缘用锐化核,在平坦区域用平滑核------精炼BEV表示。
2.3 消除光线方向错位
EVT通过两个机制消除光线方向错位:(1)AS生成的3D采样点有精确深度信息,同一视线方向的不同深度会采样到不同位置;(2)AP的自适应卷积核在深度方向上施加结构约束,防止深度模糊。
三、PyTorch代码
python
import torch
import torch.nn as nn
class AdaptiveSampling(nn.Module):
"""🚀 自适应采样:LiDAR引导的3D采样点生成"""
def __init__(self, lidar_channels=256, num_samples=256):
super().__init__()
self.sample_gen = nn.Linear(lidar_channels, num_samples * 3)
self.num_samples = num_samples
self.deform_attn = DeformableAttention(lidar_channels)
def forward(self, lidar_feat, img_feat, lidar2img, img_shape):
B = lidar_feat.shape[0]
# 从LiDAR特征生成3D采样点
pts_raw = self.sample_gen(lidar_feat.flatten(2).mean(-1))
pts_3d = pts_raw.view(B, self.num_samples, 3)
# 投影到图像平面
pts_2d = project_3d_to_2d(pts_3d, lidar2img, img_shape)
# 从图像特征采样
sampled = bilinear_sample(img_feat, pts_2d)
# 可变形注意力聚合到BEV
bev_feat = self.deform_attn(lidar_feat, sampled)
return bev_feat
class AdaptiveProjection(nn.Module):
"""🚀 自适应投影:LiDAR生成空间变化卷积核"""
def __init__(self, channels=256):
super().__init__()
self.kernel_gen = nn.Conv2d(channels, channels * 9, 1) # 3×3核
def forward(self, bev_feat, lidar_feat):
kernels = self.kernel_gen(lidar_feat)
# 空间变化卷积
return deform_conv(bev_feat, kernels)
四、YOLO迁移
Step 1:在YOLO的FPN中插入ASAP
python
asap = AdaptiveSampling(lidar_channels=256, num_samples=256)
ap = AdaptiveProjection(channels=256)
Step 2:用LiDAR深度引导采样
python
bev_feat = asap(lidar_feat, img_feat, lidar2img, img_shape)
bev_feat = ap(bev_feat, lidar_feat)
Step 3:几何感知检测头
python
detections = geo_aware_head(bev_feat, lidar_feat)
五、实验
| 方法 | NDS(%) | mAP(%) | FPS |
|---|---|---|---|
| BEVFusion | 71.3 | 68.5 | 8.4 |
| DeepInteraction | 72.6 | 69.8 | 6.2 |
| EVT | 75.3 | 71.8 | 15.2 |
✅ EVT在精度和速度上同时超越所有基线,NDS 75.3%为nuScenes SOTA,FPS 15.2实现真正的实时推理。
六、总结
- LiDAR引导的视图变换比深度估计或注意力机制更鲁棒、更高效
- 自适应采样聚焦有物体区域,消除光线方向错位
- 自适应投影用空间变化卷积核精炼BEV结构
- 兼顾精度和速度:75.3% NDS + 15.2 FPS