写在前面:
“工欲善其事,必先利其器”!
在深度学习中,数据是实现人工智能任务的三大基本要素之一,另外两个分别是算力和算法。
在深度学习任务中,数据的质量和数量对最终效果有决定性的影响。由于深度学习模型的复杂性,需要大量的数据来训练,否则模型的泛化能力会比较差,也就是过拟合。数据的质量和数量都很重要,数据的质量主要体现在数据的清洗和标注,一个高质量的数据集能够提高模型训练的质量和预测的准确率.
数据处理的步骤主要有以下几个环节:数据采集、数据存储、数据清洗、数据标注、数据增强等.
数据处理的目的是从大量的、可能是杂乱无章的、难以理解的数据中抽取并推导出对于某些特定的人们来说是有价值、有意义的数据.数据决定了一个深度学习任务的上限,而模型仅仅是无限接近这个上限。
1. 轨迹数据集总览
数据集 | 预测类别 | ||
---|---|---|---|
Argoverse v1 | 机动车 | ||
Argoverse v2 | 机动车 | ||
Nuscense | 机动车、行人 | ||
WaymoOpenSource | 机动车 | ||
ApolloScape | 机动车 | ||
ETH | 行人 | ||
UCY | 行人 |
2. Argoverse v2数据集
数据集官网:Argoverse 2
2.1 传感器布局与坐标系统
- 激光雷达:
激光雷达扫描以 10 Hz 的频率收集。此外,还提供了全局坐标系中的 6-DOF 自车辆位姿。激光雷达回波由两个 32 束激光雷达捕获,它们以 10 Hz 的频率沿同一方向旋转,但方向相差 180°。所有雷达感知到的数据都转到了自车坐标系中。坐标系:X向前,Y向左,Z向上,符合右手系
- 相机:
7个环形摄像机的 20 fps 图像,以提供全全景视野,以及来自 2 个立体摄像机的 20 fps 图像;提供了相机内参、外参和全局坐标系中6-DOF自车位姿。坐标系:Z向前(景深方向),Y向下,X向右,符合右手系。
- 自车坐标系:ISO坐标系,坐标系:X向前,Y向左,Z向上,符合右手系。
- BEV坐标系:
上图所示为argoverse数据集的bev坐标系和bev像素坐标系,在argoverse数据集中,标注结果是建立在自车系基础上的,而自车坐标系是以车轴中心点作为坐标原点,以车辆朝向为x方向,以车辆左侧为y方向,以垂直向上为z方向,所形成的右手坐标系。所以在argoverse数据集中,bev坐标系使用与自车坐标系相同的坐标系。而bev像素坐标系则是坐标原点位于bev图的左下角,向上是y轴,向右是x轴,形成右手坐标系。所以在argoverse数据集中的bev图一般h小于等于w,车头朝右。
2.2 轨迹预测数据集
1. 数据集的下载和读取
按照教程(建议使用s5cmd)下载motion-forecast数据集以及安装av2的api,下载后的数据集目录:
data_root
├── train
│ ├── 0000b0f9-99f9-4a1f-a231-5be9e4c523f7
│ │ ├── log_map_archive_0000b0f9-99f9-4a1f-a231-5be9e4c523f7.json
│ │ └── scenario_0000b0f9-99f9-4a1f-a231-5be9e4c523f7.parquet
│ ├── 0000b6ab-e100-4f6b-aee8-b520b57c0530
│ ├── ...
├── val
│ ├── 00010486-9a07-48ae-b493-cf4545855937
│ ├── 00062a32-8d6d-4449-9948-6fedac67bfcd
│ ├── ...
├── test
│ ├── 0000b329-f890-4c2b-93f2-7e2413d4ca5b
│ ├── 0008c251-e9b0-4708-b762-b15cb6effc27
│ ├── ...
每个场景数据文件包括一个以log_map_archive_{uuid}.json
命名的地图文件,和一个以scenario_{uuid}.parquet
命名的场景文件,数据集文件的读取:
import pandas as pd
from av2.map.map_api import ArgoverseStaticMap
def load_av2_df(scenario_file: Path):
scenario_id = scenario_file.stem.split("_")[-1] # unique uuid like: '37052017-85f3-4676-bf91-9f275a7389e2'
df = pd.read_parquet(scenario_file)
static_map = ArgoverseStaticMap.from_json(
scenario_file.parents[0] / f"log_map_archive_{scenario_id}.json"
)
return df, static_map, scenario_id
2. 场景文件的数据结构:
scenario_id
:场景唯一的uuidcity
:该场景处于的城市名称track_id
:障碍物唯一的idfocal_track_id
: 该场景中用于做单轨迹预测的障碍物idobserved
:布尔值,指示障碍物状态是否属于当前场景position_x/position_y
: (x, y) 障碍物边界框中心坐标。heading
:朝向角(以弧度为单位,地图坐标系)。velocity_x/velocity_y
:(v_x, v_y) 障碍物的瞬时速度(以米/秒为单位)。timestep
:与障碍物状态对应的时间步[0, num_scenario_timesteps)。num_timestamps
:场景的时长/帧数start_timestamp
:开始的时间戳end_timestamp
:结束的时间戳object_type
: 推理得到的障碍物类别(10)- Dynamic
VEHICLE
PEDESTRIAN
MOTORCYCLIST
CYCLIST
BUS
- Static
STATIC
BACKGROUND
CONSTRUCTION
RIDERLESS_BICYCLE
UNKNOWN
- Dynamic
object_category
:用于该条轨迹在轨迹预测任务中的类别TRACK_FRAGMENT
: 质量较低的轨迹,可能仅包含一段时间戳.UNSCORED_TRACK
: 用于上下午输入的未打分的轨迹.SCORED_TRACK
: 高质量的轨迹 - 用于多智能体预测.FOCAL_TRACK
: 场景中主要的轨迹 - 用于单轨迹预测.
3. 地图文件的数据结构
drivable_areas
:可行驶区域- value:
area_boundary
:list(x,y,z)
- key:
id
- value:
pedestrain_crossing
:人行横道- value:
edge_1
:list(x,y,z)
;edge_2
:list(x,y,z)
- key:
id
- value:
lane_segmments
:车道段- value:
centerline
:list(x,y,z)
id
is_intersection
:boollane_type
:车道类型VEHICLE
BIKE
BUS
left_lane_boundary
:list(x,y,z)
left_lane_mark_type
:左侧车道线线形left_neighbor_id
:左侧车道id,None为空predecessors
:前继车道idright_lane_boundary
:list(x,y,z)
right_lane_mark_type
right_neighbor_id
successors
:后继lane id
- key:
id
- value: