【3D目标检测】KITTI数据集介绍

概述

KITTI数据集很大,包括了很多任务,使用的训练样本7481个,测试样本7518个。但测试样本我们是不可见的,所以一般将将7481个训练样本划分为3712与3769分别作为训练集和测试集。
下载部分参考:OpenPCDet——环境配置和训练测试(升级系统、Nvidia驱动、cuda11.3、cudnn8.2)
具体解释部分参考:【KITTI】KITTI数据集简介(一) — 激光雷达数据

数据集下载

我们可以从官网下载,也可以网友们分享的百度云链接下载
下载数据:http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d
百度云链接: https://pan.baidu.com/s/1sywToVQu3eIBG8zcAXwTVw ,提取码:2lyj

基于点云的算法需要的是以下部分:包括激光雷达数据(data_ object_velodyne)、图像数据(data_ object_image_ 2)、标注数据(data_ object_label 2)以及标定校准数据(data_ object_calib
在这里插入图片描述
或者
在这里插入图片描述

激光雷达数据(data_ object_velodyne

解压下载后的data_ object_velodyne.zip文件,包含了training和testing两个文件夹,这两个文件夹下各自包含一个velodyne文件夹。velodyne文件夹下存储了点云文件,以bin格式存储。激光雷达坐标系中,z方向是高度方向,x方向是汽车前进方向,前进左手边方向为y方向,满足右手定则

以“000000.bin”文件为例,点云数据以浮点二进制文件格式存储,每行包含8个数据,每个数据由四位十六进制数表示(浮点数),每个数据通过空格隔开。一个点由四个浮点数数据构成,分别表示点云的x、y、z、r(强度 or 反射值)。

点云的存储格式有很多,KITTI中采用的是bin格式,bin格式将全部数据放在一行中。

读取与可视化如下:

# -*- coding: utf-8 -*-
"""
乐乐感知学堂公众号
@author: https://blog.csdn.net/suiyingy
"""
 
from mayavi import mlab
import numpy as np
 
def viz_mayavi(points, vals="distance"):
    x = points[:, 0]  # x position of point
    y = points[:, 1]  # y position of point
    z = points[:, 2]  # z position of point
    fig = mlab.figure(bgcolor=(0, 0, 0), size=(640, 360))
    mlab.points3d(x, y, z,
                          z,          # Values used for Color
                          mode="point",
                          colormap='spectral', # 'bone', 'copper', 'gnuplot'
                          # color=(0, 1, 0),   # Used a fixed (r,g,b) instead
                          figure=fig,
                          )
    mlab.show()
 
if  __name__ == '__main__':
    points = np.fromfile('000001.bin', dtype=np.float32).reshape([-1, 4])
    viz_mayavi(points)

图像数据(data_ object_image_ 2

KITTI数据集种共包含了4相机数据,2个灰度相机和2个彩色相机,其中image_2存储了左侧彩色相机采集的RGB图像数据(RGB)。相机坐标系中,y方向是高度方向,以向下为正方向;z方向是汽车前进方向;前进右手边方向为x方向(车身方向),满足右手定则。

文件夹下进一步分为训练集和测试集,存储方式为png格式。KITTI相机的分辨率是1392x512,而image_2种存储的图像是矫正后的图像,分辨率为1242x375。

标注数据(data_ object_label 2

文件夹下只有训练的标注,存储方式为txt格式。

标注文件中16个属性,即16列。但我们只能够看到前15列数据,因为第16列是针对测试场景下目标的置信度得分,也可以认为训练场景中得分全部为1但是没有专门标注出来。下图是000001.txt的标注内容和对应属性介绍。

Pedestrian 0.00 0 -0.20 712.40 143.00 810.73 307.92 1.89 0.48 1.20 1.84 1.47 8.41 0.01

在这里插入图片描述

第1列
目标类比别(type),共有8种类别,分别是Car、Van、Truck、Pedestrian、Person_sitting、Cyclist、Tram、Misc或’DontCare。DontCare表示某些区域是有目标的,但是由于一些原因没有做标注,比如距离激光雷达过远。但实际算法可能会检测到该目标,但没有标注,这样会被当作false positive (FP)。这是不合理的。用DontCare标注后,评估时将会自动忽略这个区域的预测结果,相当于没有检测到目标,这样就不会增加FP的数量了。此外,在 2D 与 3D Detection Benchmark 中只针对 Car、Pedestrain、Cyclist 这三类。

第2列
截断程度(truncated),表示处于边缘目标的截断程度,取值范围为0~1,0表示没有截断,取值越大表示截断程度越大。处于边缘的目标可能只有部分出现在视野当中,这种情况被称为截断。

第3列
遮挡程度(occlude),取值为(0,1,2,3)。0表示完全可见,1表示小部分遮挡,2表示大部分遮挡,3表示未知(遮挡过大)。

第4列
观测角度(alpha),取值范围为( − π , π -\pi, \pi π,π)。是在相机坐标系下,以相机原点为中心,相机原点到物体中心的连线为半径,将物体绕相机y轴旋转至相机z轴,此时物体方向与相机x轴的夹角。这相当于将物体中心旋转到正前方后,计算其与车身方向的夹角。

第5-8列
二维检测框(bbox),目标二维矩形框坐标,分别对应left、top、right、bottom,即左上(xy)和右下的坐标(xy)。

第9-11列
三维物体的尺寸(dimensions),分别对应高度、宽度、长度,以米为单位。

第12-14列
中心坐标(location),三维物体中心在相机坐标系下的位置坐标(x,y,z),单位为米。

第15列
旋转角(rotation_y),取值范围为(-pi, pi)。表示车体朝向,绕相机坐标系y轴的弧度值,即物体前进方向与相机坐标系x轴的夹角。rolation_y与alpha的关系为alpha=rotation_y - theta,theta为物体中心与车体前进方向上的夹角。alpha的效果是从正前方看目标行驶方向与车身方向的夹角,如果物体不在正前方,那么旋转物体或者坐标系使得能从正前方看到目标,旋转的角度为theta。

第16列
置信度分数(score),仅在测试评估的时候才需要用到。置信度越高,表示目标越存在的概率越大。

标定校准数据(data_ object_calib

文件夹下进一步分为训练集的校准数据和测试集的校准数据,存储方式为txt格式,标定校准数据的主要作用是把激光雷达坐标系测得的点云坐标转换到相机坐标中去。

这部分内容有点多,直接看大佬原文吧,【KITTI】KITTI数据集简介(四) — 标定校准数据calib

### 单目3D目标检测KITTI数据集上的实现 对于单目3D目标检测,在KITTI数据集上存在多种有效的算法和技术。一种流行的方法是通过伪激光雷达(Pseudo-LiDAR),该技术利用图像中的深度估计来构建点云,从而使得基于LiDAR的传统3D对象检测器能够应用于仅具有摄像头输入的情况[^1]。 #### 使用伪激光雷达进行单目3D目标检测 具体来说,研究者们提出了从视觉深度估计创建伪激光雷达的技术,这有助于弥合自动驾驶领域中3D目标检测的差距。这种方法不仅提高了模型性能,还减少了对昂贵传感器的需求。为了进一步提升精度,可以采用更先进的神经网络架构来进行深度预测,并将其转换成类似于真实LiDAR扫描的结果用于后续处理。 ```python import numpy as np from PIL import Image import torch from torchvision.transforms import ToTensor def load_depth_map(image_path): """加载并预处理深度图""" img = Image.open(image_path).convert('L') tensor_transform = ToTensor() depth_tensor = tensor_transform(img) return depth_tensor.unsqueeze(0) def pseudo_lidar_from_depth(depth_image, intrinsic_matrix): """根据给定的相机内参矩阵将深度图转化为伪激光雷达成像""" h, w = depth_image.shape[-2:] y_range = np.arange(h)[:, None].repeat(w, axis=1)[None,...] x_range = np.arange(w)[None,:].repeat(h, axis=0)[None,...] fx,fy,cx,cy = intrinsic_matrix[0][0],intrinsic_matrix[1][1],\ intrinsic_matrix[0][2],intrinsic_matrix[1][2] z = depth_image.view_as(torch.ones_like(x_range)) x = (x_range - cx)/fx * z y = (y_range - cy)/fy * z points_3d = torch.cat([x,y,z],dim=0).permute((1,2,0)).reshape(-1,3) return points_3d.numpy() # 加载测试图片路径以及相机参数文件... depth_img_path = 'path/to/your/kitti/depth/image.png' camera_intrinsics = [[7.215377e+02, 0., 6.095593e+02], [0., 7.215377e+02, 1.728540e+02]] depth_data = load_depth_map(depth_img_path) pseudo_points = pseudo_lidar_from_depth(depth_data, camera_intrinsics) ``` 此代码片段展示了如何读取来自KITTI数据集中的一张深度图,并依据已知摄像机内部校准信息生成相应的三维坐标系下点的位置集合——即所谓的“伪激光雷达”。 #### 双目立体匹配辅助下的改进方案 除了上述提到的单目方法外,还有其他工作探索了结合双目视觉的优势来增强3D目标识别的效果。例如,“Triangulation Learning Network”就是这样一个例子,它可以从单一视角逐渐过渡到多视图设置以提高准确性;而Stereo R-CNN则专注于开发专门针对立体图像对的目标探测框架[^2]。 尽管这些不是纯粹意义上的单目解决方案,但对于理解整个领域的进展仍然非常重要,因为它们提供了额外的信息源,可用于验证和补充纯单目的结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值