mono3d汇总

lidar坐标系

lidar坐标系可以简单归纳为标准lidar坐标系和nucense lidar坐标系,参考链接。这个坐标系和车辆的ego坐标系是一致的。

  • 标准lidar坐标系
    opendet3d,mmdetection3d和kitt都i使用了该坐标系

    复制代码
                     up z
                        ^   x front
                        |  /
                        | /
         left y <------ 0

kitti采集平台传感器安装示意图如下,其中红色圆圈标记的为lidar坐标系。

后面说的global yaw就是目标与'-y'的夹角,与'-y'重合时是0, 与x重合为90度。

  • nucense lidar坐标系
    nucense传感器坐标系示意图如下,可以看出lidar坐标系和和标准lidar坐标系有个90度的旋转关系。

local yaw & global yaw

由于透视投影的关系,目标在相平面上的成像会同时收到目标转动和相对相机位移的双重影响。所以引出了local yaw和global yaw。

网络学习的对象为local yaw(下面的 α z \alpha_z αz, 其中 α z = α x + p i / 2 \alpha_z = \alpha_x + pi/2 αz=αx+pi/2), 推理时根据目标位置+local yaw计算出global yaw。

α x \alpha_x αx在kitti数据集中的定义为:

α∈−π,π,即从 −180∘ 到 180∘。

α=0:目标物体的方向与相机光轴完全对齐(面向相机)。

α>0:目标物体的朝向偏向相机光轴的 左侧(逆时针方向)。

α<0:目标物体的朝向偏向相机光轴的 右侧(顺时针方向)。

部分公司2d目标标注的local yaw:目标与相机z同向重叠:90度,与右侧方向的相机x轴重叠:0度。

global yaw为-pi, pi之间,一般正前方为0,左边为90,右边-90. 参考lidar_box3d.py中的定义:

python 复制代码
class LiDARInstance3DBoxes(BaseInstance3DBoxes):
   """3D boxes of instances in LIDAR coordinates.

   Coordinates in LiDAR:

   .. code-block:: none

                                up z    x front (yaw=0)
                                   ^   ^
                                   |  /
                                   | /
       (yaw=0.5*pi) left y <------ 0

   The relative coordinate of bottom center in a LiDAR box is (0.5, 0.5, 0),
   and the yaw is around the z axis, thus the rotation axis=2. The yaw is 0 at
   the positive direction of x axis, and increases from the positive direction
   of x to the positive direction of y.

   Attributes:
       tensor (Tensor): Float matrix with shape (N, box_dim).
       box_dim (int): Integer indicating the dimension of a box. Each row is
           (x, y, z, x_size, y_size, z_size, yaw, ...).
       with_yaw (bool): If True, the value of yaw will be set to 0 as minmax
           boxes.
   """
   YAW_AXIS = 2

   @property
   def corners(self) -> Tensor:
       """Convert boxes to corners in clockwise order, in the form of (x0y0z0,
       x0y0z1, x0y1z1, x0y1z0, x1y0z0, x1y0z1, x1y1z1, x1y1z0).

       .. code-block:: none

                                          up z
                           front x           ^
                                /            |
                               /             |
                 (x1, y0, z1) + -----------  + (x1, y1, z1)
                             /|            / |
                            / |           /  |
              (x0, y0, z1) + ----------- +   + (x1, y1, z0)
                           |  /      .   |  /
                           | / origin    | /
           left y <------- + ----------- + (x0, y1, z0)
               (x0, y0, z0)

       Returns:
           Tensor: A tensor with 8 corners of each box in shape (N, 8, 3).
       """
       if self.tensor.numel() == 0:
           return torch.empty([0, 8, 3], device=self.tensor.device)

       dims = self.dims
       corners_norm = torch.from_numpy(
           np.stack(np.unravel_index(np.arange(8), [2] * 3), axis=1)).to(
               device=dims.device, dtype=dims.dtype)

       corners_norm = corners_norm[[0, 1, 3, 2, 4, 5, 7, 6]]
       # use relative origin (0.5, 0.5, 0)
       corners_norm = corners_norm - dims.new_tensor([0.5, 0.5, 0])
       corners = dims.view([-1, 1, 3]) * corners_norm.reshape([1, 8, 3])

       # rotate around z axis
       corners = rotation_3d_in_axis(
           corners, self.tensor[:, 6], axis=self.YAW_AXIS)
       corners += self.tensor[:, :3].view(-1, 1, 3)
       return corners

mmdetection3d box_3d_mode.py中定义的各种坐标系:

python 复制代码
class Box3DMode(IntEnum):
   """Enum of different ways to represent a box.

   Coordinates in LiDAR:

   .. code-block:: none

                   up z
                      ^   x front
                      |  /
                      | /
       left y <------ 0

   The relative coordinate of bottom center in a LiDAR box is (0.5, 0.5, 0),
   and the yaw is around the z axis, thus the rotation axis=2.

   Coordinates in Camera:

   .. code-block:: none

               z front
              /
             /
            0 ------> x right
            |
            |
            v
       down y

   The relative coordinate of bottom center in a CAM box is (0.5, 1.0, 0.5),
   and the yaw is around the y axis, thus the rotation axis=1.

   Coordinates in Depth:

   .. code-block:: none

       up z
          ^   y front
          |  /
          | /
          0 ------> x right

   The relative coordinate of bottom center in a DEPTH box is (0.5, 0.5, 0),
   and the yaw is around the z axis, thus the rotation axis=2.
   """

SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation 对local yaw给出了示意图:

  • globa2local转换
    参考fcos3d代码:
python 复制代码
def _get_target_single(..):
#...
        # change orientation to local yaw
        gt_bboxes_3d[..., 6] = -torch.atan2(
            gt_bboxes_3d[..., 0], gt_bboxes_3d[..., 2]) + gt_bboxes_3d[..., 6]
相关推荐
大江东去浪淘尽千古风流人物5 小时前
【UniSim-SLAM】前馈SLAM的双流架构:Sim(3)统一位姿图、与经典SLAM及DPVO的三范式对比
深度学习·计算机视觉·3d·交互·人体姿态估计·eccv·3d重建
高升说3 天前
手眼 3D 相机选型:先定工作距离,再谈精度,最后定安装
人工智能·数码相机·3d
利刃大大3 天前
我用 GPT-6 给江南大学建了个 3D 沙盘
gpt·3d·ai·blender·江南大学
不要生病了3 天前
从脑电到彩色三维点云:Neuro-3D 精读与证据边界
3d
时空节拍AI数字人3 天前
AI 数字人为什么需要“3D”?2D 不够用吗
人工智能·网络协议·tcp/ip·3d·信息可视化
Zldaisy3d3 天前
以光束整形3D打印,探索陶瓷-铜功能件的一体化制造
3d·制造
LeapMay3 天前
中国科学院深圳先进技术研究院-深圳职业技术大学联合培养博士后招聘(具身智能/多模态感知/视觉检测方向)
人工智能·计算机视觉·3d·机器人
tsqtsqtsq03094 天前
3DGS 端侧重建:基于 Spatial Recon Kit 的全面实践指南
3d
小溪学编程4 天前
3ds Max 2025 全面指南:新特性、安装与实战入门
3d
兜里只有三分钱~4 天前
翻卡_3D 的仪式感,和三个让它穿帮的写法
javascript·css·3d