当前位置: 首页 > news >正文

【端到端智驾基础】1.LSS-based BEV特征 Encoder

1. 端到端智驾基础之LSS

目标:理解 LSS 的几何投影逻辑

  1. 相机投影与逆投影
    小孔成像模型:3D 点 → 像素坐标的公式
    相机内参矩阵 K、外参矩阵 [R|t]
    核心:理解 (u, v, d) ↔ (X, Y, Z) 的双向映射(d 是深度)

  2. LSS 三大核心步骤
    Lift:给每个像素生成「深度分布」,把 2D 特征抬升到 3D 特征
    Splat:把 3D 特征投影到 BEV 网格上
    Shoot:对 BEV 网格特征做池化,得到最终 BEV 特征图

  3. 关键概念
    深度分布:每个像素不是单深度,而是多个离散深度的概率分布
    体素化:把 3D 空间划分为体素,每个体素存储加权的特征

LSS代码示例

import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter # ---------------------- 1. 相机与BEV配置 ---------------------- fx, fy = 500.0, 500.0 cx, cy = 320.0, 240.0 K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]]) bev_range = 50.0 # 前后左右各50米 bev_res = 0.1 # 每个栅格0.1米 grid_size = int(bev_range * 2 / bev_res) num_channels = 3 # 模拟3个通道的BEV特征 # 初始化多通道BEV特征图 (C, H, W) bev_features = np.zeros((num_channels, grid_size, grid_size), dtype=np.float32) # ---------------------- 2. 模拟图像像素与"特征" ---------------------- # 模拟从CNN backbone提取的图像特征,这里简化为3通道 H_img, W_img = 480, 640 # 生成一个简单的"图像特征":中心亮、边缘暗的3通道特征图 img_feat = np.zeros((num_channels, H_img, W_img), dtype=np.float32) # np.exp(...):高斯分布,离中心越近,特征值越大;越边缘越小。 # 三个通道写了不同中心、不同方差,目的是模拟: # 通道 0:图像中心区域特征强(对应路面) # 通道 1:图像左右两侧特征强(对应两侧障碍物) # 通道 2:图像中下区域特征强(对应近处车辆 / 物体) for c in range(num_channels): # 每个通道有不同的模式,模拟不同的语义响应 if c == 0: # 通道0:中心十字响应(类似道路/车道线) img_feat[c, :, :] = np.exp(-((np.arange(H_img)[:, None] - 240)**2 / (2*80**2) + (np.arange(W_img)[None, :] - 320)**2 / (2*120**2))) elif c == 1: # 通道1:左右边缘响应(类似障碍物轮廓) img_feat[c, :, :] = np.exp(-((np.arange(H_img)[:, None] - 240)**2 / (2*150**2) + (np.arange(W_img)[None, :] - 100)**2 / (2*50**2))) + \ np.exp(-((np.arange(H_img)[:, None] - 240)**2 / (2*150**2) + (np.arange(W_img)[None, :] - 540)**2 / (2*50**2))) else: # 通道2:中下部响应(类似车辆前方物体) img_feat[c, :, :] = np.exp(-((np.arange(H_img)[:, None] - 350)**2 / (2*60**2) + (np.arange(W_img)[None, :] - 320)**2 / (2*150**2))) # 采样像素点(步长10,减少计算量) pixel_step = 10 pixel_coords = [] pixel_feats = [] for v in range(0, H_img, pixel_step): for u in range(0, W_img, pixel_step): pixel_coords.append(np.array([u, v, 1.0])) pixel_feats.append(img_feat[:, v, u]) # 取该像素的3通道特征 pixel_coords = np.array(pixel_coords) pixel_feats = np.array(pixel_feats) # (N, 3) # ---------------------- 3. Lift + Splat 过程 ---------------------- inv_K = np.linalg.inv(K) depths = np.linspace(5.0, 40.0, 8) # 深度假设 depth_probs = np.array([0.05, 0.1, 0.15, 0.2, 0.2, 0.15, 0.1, 0.05]) # 深度分布 # 像素和特征, 深度及分布 for uv, feat in zip(pixel_coords, pixel_feats): for d, p in zip(depths, depth_probs): # Lift: 2D像素 -> 3D相机坐标 cam_pt = d * (inv_K @ uv) bev_x = cam_pt[2] # 相机Z轴是BEV的X(向前) bev_y = -cam_pt[0] # 相机X轴是BEV的Y(向左为负,向右为正) # 过滤超出BEV范围的点 if abs(bev_x) > bev_range or abs(bev_y) > bev_range: continue # 计算栅格索引 x_idx = int((bev_x + bev_range) / bev_res) y_idx = int((bev_y + bev_range) / bev_res) if 0 <= x_idx < grid_size and 0 <= y_idx < grid_size: # Splat: 把特征乘深度概率,累加到对应栅格 bev_features[:, y_idx, x_idx] += feat * p # 高斯平滑,模拟真实Splat的软分配 sigma = 3 for c in range(num_channels): bev_features[c] = gaussian_filter(bev_features[c], sigma=sigma) # ---------------------- 4. 可视化3个通道的BEV特征 ---------------------- fig, axes = plt.subplots(1, num_channels, figsize=(15, 5)) cmap = "jet" for c in range(num_channels): ax = axes[c] im = ax.imshow(bev_features[c], cmap=cmap, origin="lower") ax.set_title(f"BEV Feature Channel {c}") ax.axis("off") plt.colorbar(im, ax=ax, shrink=0.8) plt.suptitle("Multi-Channel LSS BEV Features (Simulated)", y=1.02) plt.tight_layout() plt.show() # 也可以看所有通道的最大值合成图(类似语义热力图) plt.figure(figsize=(8, 6)) max_bev = bev_features.max(axis=0) plt.imshow(max_bev, cmap="jet", origin="lower") plt.colorbar(label="Max Feature Value Across Channels") plt.title("BEV Feature Max Response (All Channels)") plt.axis("off") plt.show()

可视化显示:

BEV 每个网格最终存的是什么?

每个栅格内:
不是单个数,是和图像通道数一致的特征向量
向量中每一维 = 所有投影到这里的「图像特征 × 深度概率」之和
物理含义:该地面位置,综合所有视觉观测 + 深度置信后得到的聚合特征

图像特征:人工用高斯模拟 CNN 输出的 (C,H,W) 特征图,每个像素自带一组多维特征;
深度 & 概率:两个数组按下标一一配对,代表像素在不同距离上的出现置信度;
特征 × 概率:用深度置信做权重,计算特征期望,让可信位置特征更强,是 LSS 标准 Lift 操作,用来建模深度不确定性。

http://www.rkmt.cn/news/1527479.html

相关文章:

  • 2026年义乌律师咨询服务现状分析:多家专业机构与资深律师的客观评测参考 - 优质品牌商家
  • MySQL连接池配置避坑指南:解决‘The last packet...’报错,让你的应用不再断连
  • 避坑指南:220/110/10kV变电站电气一次设计中最容易被忽略的5个细节(附计算实例)
  • C#/.NET 从入门到精通:一个老程序员踩过的5个坑和3个实战技巧
  • 2026年跷脚牛肉加盟品牌实力评估:谁在供应链与运营上更具优势? - 优质品牌商家
  • 从指纹识别到ChatGPT:一文读懂AI的过去、现在与未来(附面试高频考点解析)
  • 别再乱调iPerf3的-w参数了!TCP/UDP场景下的正确用法与避坑指南
  • CPU设计避坑指南:硬连线控制单元实战与指令集缺陷分析
  • 2026年新消息:深耕西北,信誉的宁夏吨包袋供应商——平罗县强盛塑料包装有限公司实力解析 - 品牌鉴赏官2026
  • K8s Pod卡在Pending状态?别慌,这5个检查点帮你快速定位问题
  • 避开海思3559 BT656调试的那些‘坑’:从硬件引脚到VI日志的完整避坑指南
  • 普冉PY32F0驱动1602LCD避坑指南:5V供电、I2C地址与PCF8574模块那些事儿
  • 别再踩坑了!Docker Compose里network_mode和dns配置的相爱相杀(附完整排查流程)
  • Linux mutex_lock慢路径MCS锁与optimistic spinning
  • KEGG数据库又更新了?别慌,手把手教你更新R和clusterProfiler包搞定报错
  • STM32的BOOT0引脚接错会怎样?一个硬件工程师的踩坑实录与设计建议
  • 2026年贵阳老酒回收市场观察:哪些回收厂/商更靠谱?本地回收服务深度评测 - 优质品牌商家
  • 2026北京铁艺公司实力观察:从工艺细节到项目落地,谁在持续输出交付力? - 优质品牌商家
  • 装饰器原理、手写装饰器、带参装饰器、装饰器嵌套全解
  • 深入Vitis平台工程:从‘fatal error: xxx.h’报错理解BSP的Makefile机制
  • 2026年智能电磁流量计口碑解析:耐用性与工程适配深度评测 - 优质品牌商家
  • 网络内容安全与合规创作指南:技术博主的红线意识
  • GitLab启动慢到怀疑人生?别急着重启,先看看你的服务器内存够不够
  • 告别玄学调网:用示波器给STM32H743的RMII接口做一次“体检”(附LAN8720A实测波形)
  • STM32串口接收中断‘幽灵’BUG排查实录:从ORE标志位到彻底关闭中断的实战
  • 从水仙花数到八位自幂数:用Python和C++探索‘自幂数’家族的奥秘
  • 2026永城奔驰宝马奥迪维修靠谱的门店推荐 - 品牌排行榜
  • 从Good到Bad:深入理解OPC UA状态码背后的设计哲学与最佳实践
  • 从‘镜子’到‘智能画笔’:一文看懂RIS(可重构智能超表面)如何重塑无线信号
  • 从Alpha到Beta:一次讲透软件发布前的用户测试,别再傻傻分不清了