一、简介
KITTI数据集是一个免费的自动驾驶视觉数据集,用于估计车辆和行人的深度,运动或感知物体的姿态。KITTI数据集是由德国卡尔斯鲁厄理工学院和丹麦技术大学联合提供的,其中包括关于城市驾驶场景的图像、深度、激光雷达以及相机和IMU的本地化和定位信息。数据集包括22个序列,具有23个不同的城市场景,并提供基本的平面和3D注释。
二、数据集构成
该数据集由以下组件组成:
- Color images: 依Webp格式存储。每个序列有大约1000-4000张图像。Kitti Raw 数据集提供了原始图像,kitti Velodyne 数据集提供了激光雷达数据,这些数据可以用于制作多种图像和传感器模拟。
- Lidar scans: 基于Velodyne HDL-64激光雷达数据进行制作。Velodyne 64线激光雷达是一种流行工具,因为它显示三维场景的高分辨率360度信息。它包括每个扫描线的垂直角度,并且在扫描中以一个特定排列的次序存储。
- Velodyne scans: 用于定位对象并标记其位置。Kitti Velodyne 数据集存储Laserscan.cpp中在几个点云上进行格式化的激光雷达数据。
- Calibration files: 存储相机和激光雷达校准所需的元数据。本地化和地图制作经常使用相机和雷达校准来计算物体在三维世界中的位置。Kitti 数据集包含针对每个相机的六个参数,以及相机和车辆坐标系原点之间的平移模量。
- Raw data sequences:包括激光雷达扫描,GPS/IMU数据以及完全基于视频的运动形式。 Raw 数据的每个时间戳都记录了在该特定时间戳分别测量的轴向、角度速度和加速度值。
- Calibration and Sync Data: 存储相机和 Velodyne 激光雷达之间的同步信息。
- Annotations: 标有车、行人和 Cyclist。一些注释数据可能需要进行转换以进行各种标注操作。
三、数据集使用
1. 存储格式
KITTI 数据集基于Unix文件夹结构,其中每个序列有8个不同格式化的文件夹。文件夹之间管理相机、雷达和标注数据之间的同步和对齐。每个文件夹都包含标记和时间戳,时间戳是数据处理中非常重要的部分,可以帮助在多个传感器之间同步数据。下面是传感器数据存储的文件夹:
- image_00:左彩色相机灰度图像
- image_01:右彩色相机灰度图像
- image_02:左针孔相机色彩图像
- image_03:右针孔相机色彩图像
- velodyne:Velodyne 点云
- calib:相机和激光雷达的校准文件
- oxts:GPS/IMU数据
- label_02:行人、车辆和 Cyclist 目标的标注
2. 解释数据
要使用KITTI数据集,必须了解各个组件。下面是对每个组件的详细说明。
2.1 图像数据
要访问KITTI数据集的彩色图像,数据集中的图像文件夹分别包含了左、右、彩色以及灰度图像。数据集中的黑白图像为PNG格式,而彩色图像为WebP 格式。
2.2 激光雷达数据
Velodyne的64线点云数据格式通常用于 KITTI 数据集。小数据集包括 22 个序列(大约 39GByte)和一些用于校准和同步的元数据文件。激光雷达文件以二进制格式存储,且包含一个顶层目录和一个名为velodyne的子文件夹。文件夹中的文件名按照帧号来进行编排。对于每个测量值(每条线有1225个点),激光雷达的扫描角度输出64个激光束数据。
2.3 校准信息
校准信息存储在calib文件夹中。其中, .txt 类型的文件包含描述各种物理传感器和摄像机相对于参考帧的校准数据。
2.4 GPS/IMU数据
GPS/IMU文件存储在data文件夹下的oxts文件夹中。 这些文件以相机时间戳命名,以映射时间戳和 IMU 数据之间的对齐。文件包含在本地参考系下的位置、方向等信息。
2.5 标注数据
标注文件包含车辆、行人和 Cyclist 的位置。每个标签文件都以 .txt 格式存储,且包含有关具有 2D 边界框的每个对象的位置和尺寸以及其在序列中的起始和结束帧号。
四、代码示例
1.下载数据集
import urllib.request
url = 'https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0001/2011_09_26_drive_0001_sync.zip'
urllib.request.urlretrieve(url, '../data/kitti_data.zip')
2.读取图像数据
from PIL import Image
import numpy as np
import os
def read_images(path):
filenames = os.listdir(path)
filenames.sort()
images = []
for filename in filenames:
img_path = os.path.join(path, filename)
image = np.asarray(Image.open(img_path))
images.append(image)
return np.array(images)
3.读取标签数据
import pandas as pd
def read_labels(path):
df_label = pd.read_csv(path, sep=' ', header=None, names=['type', 'truncated', 'occluded', \
'alpha', 'b_box_l', 'b_box_t', \
'b_box_r', 'b_box_b', 'h', 'w', \
'l', 'x', 'y', 'z', 'rot_y'])
return df_label
4.读取激光雷达数据
import struct
def read_velodyne(path):
with open(path, 'rb') as f:
velodyne_data = f.read()
velodyne_data = np.frombuffer(velodyne_data, dtype = np.float32).reshape(-1,4)
return velodyne_data
5.读取GPS/IMU数据
import pandas as pd
def read_gps_imu(path):
with open(path) as f:
gps_imu_data = f.read().splitlines()
gps_imu_data = np.array([gps_imu.split(' ') for gps_imu in gps_imu_data]).astype('float32')
return pd.DataFrame(data=gps_imu_data,columns=['lat', 'lon', 'alt', 'roll', 'pitch', 'yaw', 'vn', 've', 'vf', 'vl', 'vu', \
'ax', 'ay', 'ar', 'af', 'al', 'au', 'wx', 'wy', 'wz', 'wf', 'wl', 'wu', \
'pos_accuracy', 'vel_accuracy', 'navstat', 'numsats', 'posmode', 'velmode', \
'orimode'])
五、总结
KITTI 数据集是自动驾驶视觉领域中最受欢迎的数据集之一。通过对KITTI数据集的分析,我们可以看出它是一个丰富的数据集,能够提供多种格式数据和标注信息。在使用该数据集时,需要了解各个组件的含义,方便进行进一步的数据处理和分析。