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

Apollo-PETRv1演示DEMO操作指南

Apollo-PETRv1演示DEMO操作指南

    • 一、背景
    • 二、相关知识点
      • 2.1 3D物体检测
      • 2.2 PETRv1模型概述
      • 2.3 坐标系转换
      • 2.4 NuScenes数据集
      • 2.5 3D边界框表示
      • 2.6 相机成像原理
    • 三、操作步骤
      • 3.1、环境搭建
      • 3.2、NuScenes数据集3D BOX可视化
      • 3.3、PETRv1推理及可视化
    • 四、总结

一、背景

PETR(Position Embedding Transformation for multi-view 3D Object Detection)是一种基于纯视觉的3D物体检测方法,它通过将图像特征与3D空间位置信息相结合,实现多相机视角下的3D目标检测。本文演示如何对NuScenes数据集中的3D框进行可视化,并展示如何使用PETRv1模型进行推理并对结果进行可视化。

具体内容包括:

  • 将NuScenes数据集中的3D标注框绘制在雷达点云上进行可视化
  • 通过NuScenes数据集提供的相机参数,生成PETRv1模型推理所需的img2lidars矩阵
  • 对PETRv1模型的推理结果进行可视化

二、相关知识点

2.1 3D物体检测

是自动驾驶系统中的关键技术,旨在从传感器数据中识别和定位三维空间中的物体。与2D检测不同,3D检测需要提供物体的精确三维位置、尺寸和方向。

2.2 PETRv1模型概述

PETRv1是一种基于多视角相机的3D检测方法,它通过将图像特征与3D位置编码相结合,避免了传统方法中复杂的3D到2D的投影操作。其核心思想是将3D空间位置信息编码到图像特征中,使模型能够直接感知3D空间结构。

2.3 坐标系转换

在多传感器系统中,理解不同坐标系之间的转换至关重要:

  • 图像坐标系:2D像素坐标
  • 相机坐标系:以相机光学中心为原点的3D坐标
  • 雷达坐标系:以激光雷达为原点的3D坐标
  • 车辆坐标系:以车辆为中心的统一坐标
  • 全局坐标系:世界坐标

2.4 NuScenes数据集

NuScenes是一个大规模自动驾驶数据集,包含:

  • 1000个驾驶场景,每个场景20秒
  • 6个相机提供的360度覆盖图像
  • 1个360度激光雷达点云
  • 雷达、GPS和IMU数据
  • 3D边界框标注,包括位置、尺寸、方向和类别

2.5 3D边界框表示

在3D空间中,边界框通常用7个参数表示:

  • 中心点坐标(x, y, z)
  • 尺寸(长、宽、高)
  • 偏航角(yaw,绕z轴的旋转)

2.6 相机成像原理

相机通过小孔成像模型将3D世界投影到2D图像平面,这一过程可以用内参矩阵和外参矩阵描述。内参矩阵描述相机内部光学特性,外参矩阵描述相机在世界坐标系中的位置和姿态。

三、操作步骤

3.1、环境搭建


# 启动Docker容器,提供隔离的环境并配置GPU支持
cd /home/apollo
docker run --gpus all --shm-size=128g -it -e NVIDIA_VISIBLE_DEVICES=all \--privileged --net=host \-v $PWD:/home -w /home \--rm registry.baidubce.com/paddlepaddle/paddle:2.4.2-gpu-cuda11.7-cudnn8.4-trt8.4 /bin/bash    # 安装Paddle3D,这是一个基于PaddlePaddle的3D深度学习框架
cd /home/
git clone https://github.com/PaddlePaddle/Paddle3D.git
cd /home/Paddle3D
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
python3 setup.py install
pip3 install ortools# 下载NuScenes mini数据集,这是一个小规模的示例数据集
wget -O /home/v1.0-mini.tgz https://www.nuscenes.org/data/v1.0-mini.tgz
mkdir -p data/nuscenes
tar -xf /home/v1.0-mini.tgz -C data/nuscenes# 下载预训练的PETRv1模型
wget https://apollo-pkg-beta.cdn.bcebos.com/perception_model/petrv1.zip
unzip petrv1.zip# 安装其他必要的依赖库
pip3 install nuscenes-devkit matplotlib open3d -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2、NuScenes数据集3D BOX可视化

以下代码展示了如何从NuScenes数据集中提取3D标注信息并将其可视化在点云上:

# 创建Python脚本文件
cat > 0_vis_box_from_annotation.py <<-'EOF'
import numpy as np
import open3d as o3d
from nuscenes import NuScenes
from nuscenes.utils.data_classes import LidarPointCloud, Box
from pyquaternion import Quaternion
import os
import shutil# 初始化NuScenes数据集接口
datapath = 'data/nuscenes'
nusc = NuScenes(version='v1.0-mini', dataroot=datapath, verbose=False)# 函数:获取传感器到顶层激光雷达的变换矩阵
def obtain_sensor2top(nusc,sensor_token,l2e_t,l2e_r_mat,e2g_t,e2g_r_mat,sensor_type='lidar'):"""获取从通用传感器到顶层激光雷达的变换信息"""# 获取传感器数据记录sd_rec = nusc.get('sample_data', sensor_token)# 获取校准传感器信息cs_record = nusc.get('calibrated_sensor', sd_rec['calibrated_sensor_token'])# 获取ego姿态信息pose_record = nusc.get('ego_pose', sd_rec['ego_pose_token'])data_path = str(nusc.get_sample_data_path(sd_rec['token']))  # absolute pathif os.getcwd() in data_path:  # path from lyftdataset is absolute pathdata_path = data_path.split(f'{os.getcwd()}/')[-1]  # relative path# 构建传感器信息字典sweep = {'data_path': nusc.get('sample_data',sd_rec['token'])['filename'],  # relative path'type': sensor_type,'sample_data_token': sd_rec['token'],'sensor2ego_translation': cs_record['translation'],'sensor2ego_rotation': cs_record['rotation'],'ego2global_translation': pose_record['translation'],'ego2global_rotation': pose_record['rotation'],'timestamp': sd_rec['timestamp']}# 提取旋转和平移信息l2e_r_s = sweep['sensor2ego_rotation']l2e_t_s = sweep['sensor2ego_translation']e2g_r_s = sweep['ego2global_rotation']e2g_t_s = sweep['ego2global_translation']# 计算从传感器到激光雷达的旋转矩阵l2e_r_s_mat = Quaternion(l2e_r_s).rotation_matrixe2g_r_s_mat = Quaternion(e2g_r_s).rotation_matrixR = (l2e_r_s_mat.T @ e2g_r_s_mat.T) @ (np.linalg.inv(e2g_r_mat).T @ np.linalg.inv(l2e_r_mat).T)# 计算从传感器到激光雷达的平移向量T = (l2e_t_s @ e2g_r_s_mat.T + e2g_t_s) @ (np.linalg.inv(e2g_r_mat).T @ np.linalg.inv(l2e_r_mat).T)T -= e2g_t @ (np.linalg.inv(e2g_r_mat).T @ np.linalg.inv(l2e_r_mat).T) + l2e_t @ np.linalg.inv(l2e_r_mat).Tsweep['sensor2lidar_rotation'] = R.T   # 点云变换公式: points @ R.T + Tsweep['sensor2lidar_translation'] = Treturn sweep# 函数:获取2D旋转矩阵
def _get_rot( h):return np.array([[np.cos(h), np.sin(h)],[-np.sin(h), np.cos(h)]])# 主程序开始  
sample_idx=0 # 选择第一个样本sample = nusc.sample[sample_idx]
lidar_token = sample['data']['LIDAR_TOP']
sd_rec = nusc.get('sample_data', sample['data']['LIDAR_TOP'])
cs_record = nusc.get('calibrated_sensor',sd_rec['calibrated_sensor_token'])
pose_record = nusc.get('ego_pose', sd_rec['ego_pose_token'])
lidar_path, boxes, _ = nusc.get_sample_data(lidar_token)
lidar_data = nusc.get('sample_data', lidar_token)# 构建信息字典,包含所有必要的变换信息info = {'lidar_token': lidar_token,'lidar_path': lidar_path,'token': sample['token'],'sweeps': [],'cams': dict(),'lidar2ego_translation': cs_record['translation'],'lidar2ego_rotation': cs_record['rotation'],'ego2global_translation': pose_record['translation'],'ego2global_rotation': pose_record['rotation'],'timestamp': sample['timestamp'],
}# 提取变换矩阵
l2e_r = info['lidar2ego_rotation']
l2e_t = info['lidar2ego_translation']
e2g_r = info['ego2global_rotation']
e2g_t = info['ego2global_translation']
l2e_r_mat = Quaternion(l2e_r).rotation_matrix
e2g_r_mat = Quaternion(e2g_r).rotation_matrix# 定义相机通道名称(6个环视相机)
camera_typ
http://www.dtcms.com/a/354985.html

相关文章:

  • 【Qt】QCryptographicHash 设置密钥(Key)
  • Deeplizard 深度学习课程(四)—— 模型构建
  • jwt原理及Java中实现
  • 海盗王64位dx9客户端修改篇之二
  • 学习Java29天(tcp多发多收)但是无解决客户端启动多个问题
  • ProfiNet 转 Ethernet/IP 柔性产线构建方案:网关技术保护新能源企业现有设备投资
  • LeetCode Hot 100 第7天
  • 第三十天:世界杯队伍团结力问题
  • EF Core 编译模型 / 模型裁剪:冷启动与查询优化
  • QT之双缓冲 (QMutex/QWaitCondition)——读写分离
  • 企业如何管理跨多个系统的主数据?
  • MaxCompute MaxFrame | 分布式Python计算服务MaxFrame(完整操作版)
  • 【Lua】题目小练12
  • 如何实现HTML动态爱心表白效果?
  • 多版本并发控制MVCC
  • 黑马点评|项目日记(day02)
  • C#和Lua相互访问
  • 基于金庸武侠小说人物关系设计的完整 SQL 语句,包括数据库创建、表结构定义和示例数据插入
  • Docker 详解+示例
  • map底层的数据结构是什么,为什么不用AVL树
  • 机器学习回顾(一)
  • 陪诊小程序系统开发:搭建医患之间的温暖桥梁
  • Scrapy 基础介绍
  • 安全运维——系统上线前安全检测:漏洞扫描、系统基线与应用基线的全面解析
  • lwIP MQTT 心跳 Bug 分析与修复
  • 边缘计算(Edge Computing)+ AI:未来智能世界的核心引擎
  • HarmonyOS 组件与页面生命周期:全面解析与实践
  • Paimon——官网阅读:Flink 引擎
  • 【秋招笔试】2025.08.27华为秋招研发岗真题
  • 【新启航】3D 逆向抄数效率提升:自动化拼接工具与智能建模能力如何缩短 50% 项目周期