2022. 12. 21. 00:50ㆍDevelopers 공간 [Basic]/Vision & Audio
Waymo Open Dataset : https://waymo.com/open/challenges/
WaymoPaper(Perception) : https://arxiv.org/pdf/1912.04838.pdf,
WaymoPaper(Motion) :https://openaccess.thecvf.com/content/ICCV2021/papers/Ettinger_Large_Scale_Interactive_Motion_Forecasting_for_Autonomous_Driving_The_Waymo_ICCV_2021_paper.pdf
Waymo datset은 매년 업데이트 되며, 다양한 챌린지가 존재하기 때문에 task마다 metric과 용어가 다르지만 공통되는 부분에 대해 먼저 알아보려고 합니다.
아래는 매년 갱신된 Waymo Challenge의 분류입니다.
또한 데이터는 challenge와 무관하게 Motion Tasks dataset과 Perception tasks dataset으로 나뉘며, 합치면 약 4TB가까이 되는 데이터를 받아야합니다.
아래는 2022년 11월 23일 현재 기준 Dataset별 업데이트 내용입니다.
<Waymo Challenges Category>
---------------------------------------------------------------
- Challenges 2020
- 3D Detection(Perception)
- 3D Tracking(Perception)
- 2D Detection(Perception)
- 2D Tracking(Perception)
- Domain Adaptation(Perception)
- Challenges 2021
- Real-time 3D Detection(Perception)
- Real-time 2D Detection(Perception)
- Motion Prediction(Motion)
- Interaction Prediction(Motion)
- Challenges 2022
- Motion Prediction (Motion)
- Occupancy and Flow Prediction (Motion)
- 3D Camera-Only Detection (Perception)
- 3D Semantic Segmentation (Perception)
---------------------------------------------------------------
<Motion Dataset>
---------------------------------------------------------------
v1.0, March 2021: Initial release - 103,354 segments with maps data
v1.1, Aug 2021: Added lane connections, lane boundaries, and lane neighbors.
---------------------------------------------------------------
<Perception Dataset>
---------------------------------------------------------------
v1.0, August 2019: Initial release
v1.1, February 2020: Added camera labels for 900 segments
v1.2, March 2020: Added Test Set with 150 segments, plus 800 segments for domain adaptation across Training, Validation, and Test.
v1.3.0, March 2022: Added 3D semantic segmentation labels, 2D and 3D key points labels, and 2D-to-3D label correspondence labels
v1.3.1, April 2022: Updated the dataset for the 3D Camera-Only Detection Challenge.
This version includes a new test set with 80 segments, and additional fields for training and validation
v1.3.2, May 2022: Improved the quality of the 3D semantic segmentation labels and 2D key point labels. Added a new field for the 3D Camera-Only Detection Challenge.
v1.4.0, June 2022: Added 2D video panoptic segmentation labels
---------------------------------------------------------------
<구성>
1. Motion Tasks
a. Coordinates
b. Sensor Data & Labels
2. Perception Tasks
a. Coordinates
b. Sensor Data
c. Labels
3. 사용방법
글효과 분류1 : 코드
글효과 분류2 : 폴더/파일
글효과 분류3 : 용어설명
1. Motion Tasks
Motion Task는 Protocol Buffer 형식의 데이터를 포함한 TFRecord format(~.tfrecord)포맷의 파일로 저장되어 있습니다.(https://waymo.com/open/data/motion/tfexample)
a. Coordinates
- Global Frame : 좌표계에서 ‘East-North-Up’ coordinate를 따릅니다. (역시나 오른손 법칙을 따릅니다.)
- 차량이 출발할 때, 차량의 위치에 따라 정해집니다.
- Up(z) : 중력 반대 방향을 가리킵니다.
- East(x) : 동쪽을 가리키며 latitude 방향과 일치합니다
- North(y) : 북쪽을 가리킵니다.
- 좌표시스템의 origin은 매 scene마다 바뀌며, 매 scene에 나오는 object들과 무관한 곳입니다.
- 단위는 m 입니다.
b. Sensor Data & Labels
- 구성
- training/validation/test 가 70%/15%/15%로 나뉘어 있으며, 오브젝트 track(10Hz로 수집된 최대 20초)와 map데이터가 103,354개의 segments로 존재합니다.
- segment : 9초 window로 이루어져 있습니다.
- 9초 window : 1초 과거 데이터 samples, 8초 미래 데이터 samples, 현재 sample (window 간 5초 overlap)
- Training : 91개 samples (과거 데이터 10 samples, 미래 데이터 80 samples, 현재 1 sample)
- Validation : 91개 samples (과거 데이터 10 samples, 미래 데이터 80 samples, 현재 1 sample)
최대 9개의 object track 존재 - Test : 11개 samples (과거 데이터 10 samples, 현재 1 sample)
최대 9개의 object track 존재
- 두가지 form이 제공됩니다.
- 첫번째 form 은 Scenario protocol buffers
- 두번째 form은 Scenario protos를 tf.Example protos로 바꾼 포맷이며, 모델을 만들기 위한 tensor 형태로 되어있습니다.
- training/validation/test 가 70%/15%/15%로 나뉘어 있으며, 오브젝트 track(10Hz로 수집된 최대 20초)와 map데이터가 103,354개의 segments로 존재합니다.
Scenario proto | tf.Example | |
Segment length | 9 seconds (1 history, 8 future) | 9 seconds (1 history, 8 future) |
Maps | Vector maps | Sampled as points |
Representation | Single proto | Set of tensors |
- Scenario protocol buffer format : object tracks(시간 별 object state)
- scenario_id : 각 scenario의 ID
- timestamps_seconds : 각 시나리오마다의 timestamp (0~)
- tracks : 각 object에대한 track 정보
- id : object의 ID
- object_type : object의 type (vehicle, pedestrian, cyclist).
- states : object의 timestamp에 해당하는 state(3D position, velocity, heading, dimensions, valid flag)
tracks[i].states[j] = ith agent's state at timestamps_seconds[j]
- dynamic_map_states : timestamp에 해당하는 traffic signal states
dynamic_map_states[i] = occurs at timestamps_seconds[i]- lane_states : timestamp에 해당하는 traffic signal states와 lane의 IDs(하기 map_features에서 정의된 ID)
- map_features : 각 scenario의 map data(lane centers, lane boundaries, road boundaries, crosswalks, speed bumps, stop signs). 3D polylines 과 polygons로 정의 되었습니다.
- sdc_track_index : 주행차량의 track index
- objects_of_interest : object의 track영역 중 index집합.
- tracks_to_predict : object의 track영역 중 예측되어야하는 object 집합(training과 validation 집합에만 있습니다)
- current_time_index : timestamp 중 현재 시간에 대한 인덱스
2. Perception Tasks
Perception Tasks의 Lidar와 Camera의 Label은 각각 만들어졌으며, projection을 사용하지 않았다고 합니다.
a. Coordinates
- Global Frame : 위에 설명되었습니다.
- Vehicle Frame : 차량 기준으로 취득된 좌표를 의미합니다. (역시나 오른손 법칙을 따릅니다.)
- x축 : 앞쪽을 가리킵니다.
- y축 : 차량 왼쪽을 가리킵니다.
- z축 : 차량 위쪽을 가리킵니다.
- Sensor Frame : 센서마다 정의된 4x4 변환 matrix이며 extrinsic matrix와 일치합니다.
- Lidar sensor frame
- z 축 : pointing upward
- x/y 평면 : lidar의 장착 위치에 따라 정해집니다.
- Camera Frame : 카메라 렌즈의 중심으로부터의 카메라 좌표계를 의미합니다. (역시나 오른손 법칙을 따릅니다.)
- x축 : 렌즈 방향을 가리킵니다.
- z축 : 위쪽을 향합니다.
- y/z 좌표계는 image 좌표계와 평행합니다.
- Lidar sensor frame
- Image frame
- x축 가로 방향(u) : Left 시작
- y축 세로 방향(v) : Top 시작
- Lidar Spherical Coordinates
- Lidar의 Sphericla 좌표계는 Catesian 좌표계의 (x, y, z)에 근거합니다.
- 단순히 (x,y,z)를 (range, azimuth, inclination)로 바꾸어 저장합니다.
b. Sensor Data
- Lidar Data : 한 개의 mid-range Lidar(top)와 short-range Lidar(front, side left, side right, rear)의 5개의 Lidar로 이루어져 있습니다.
- 구성 : 1개의 Lidar data는 2개의 Range Image로 이루어져 있습니다.
- Range Image 채널
- channel 0 : range (spherical coordinate system)
- channel 1 : lidar intensity
- channel 2 : lidar elongation
- ** long pulse elongation : 레이저 반사는 굴절되는 등의 예측 못한 효과 때문에 return pulse가 길게 늘어지는데(elongated), 이 크기를 나타냅니다.
- channel 3 : 앞서 말한 Non Labeling Zone에 포함되는지의 유무 (1 = in, -1 = not in)
- Range Image Dimension
- Range Image의 행은 inclination을 의미합니다. 이미지 최상단 Row 0는 최대 inclination을 의미합니다.
- Range Image의 열은 azimuth를 의미합니다. 이미지 왼쪽 Column 0는 -x 축(차량 후면 방향)방향을 의미하며, 이미지 center는 +x축(차량 정면 방향)을 의미합니다.
- 이미지의 center를 +x축과 일치시키기 위해 azimuth correction이 필요합니다.
- Range Image 채널
- 센서 별 Limitation
- Mid-range lidar : 최대 75 meters
- Short-range lidars : 최대 20 meters
- 모든 Lidar는 가장 강한 두개의 intensity 값을 가집니다.
- Extrinsic Parameter : Lidar frame과 Vehicle frame간의 변화를 위한 Matrix를 제공합니다.
- mid-range lidar는 non-uniform inclination pattern을 가집니다.
** inclination : beam angle에 따른 상하 각도를 의미합니다. - 정확한 inclination을 가진 1D tensor가 존재합니다.
- mid-range lidar는 non-uniform inclination pattern을 가집니다.
- Lidar-to-Camera projection을 위한 채널 4개 (rolling shutter effect를 포함)
- channel 0 : camera name
- channel 1 : x (image width 축)
- channel 2 : y (image height 축)
- channel 3 : project할 곳의 camera name (projection이 없다면 UNKNOWN으로)
- channel 4 : x (image width 축)
- channel 5 : y (image height 축)
- ** Global shutter : 글로벌 셔터에서는 노출 시 모든 픽셀이 동시에 빛에 노출
- ** Rolling shutter : 모든 열이 동시에 노출이 시작되는 글로벌 셔터와 달리, 순차적으로 노출 및 Readout을 진행
- ** rolling shutter effect : 약간의 지연으로 인해, 빠르게 움직이는 피사체를 촬영하거나 장면 전체에서 비디오 카메라를 이동하는 경우 의도하지 않은 왜곡이 만들어질 수 있습니다.
- 구성 : 1개의 Lidar data는 2개의 Range Image로 이루어져 있습니다.
- Camera Data : 서로 다른 방향의 5개 카메라(front, front left, front right, side left, side right) 로 구성
- JPEG 포맷입니다
- 차량의 Pose정보와 속도도 제공합니다.
- rolling shutter timimg 정보도 제공합니다.
c. Labels
- 3D Bounding Boxes
- Bounding Box : 3D 7-DOF Bboxes + global tracking ID
** 7 DOF(Degree Of Freedom) : center coordinates(cx, cy, cz), length-width-height(l, w, h), heading angle(θ)
- Zero Pitch, Zero Rolll
- Heading Angle : [-π, π] radians, Z축을 기준으로 오른 나사 법칙을 따릅니다 (+X축부터의 각도)
- NLZ(No Label Zone) : 고속도로 반대편이나 주차장 같은 주행 중인 차량과 관계 없는 지역에 대해 binary로 표현되어 있습니다.
- Class Labels : vehicles, pedestrians, cyclists, signs
- Bounding Box : 3D 7-DOF Bboxes + global tracking ID
- 2D Bounding Boxes
- Bounding Box : 2D 4-DOF Bboxes + global tracking ID
** 4 DOF(Degree Of Freedom ): center coordinates(cx, cy), horizontal-vertical(l, w)
- Bbox는 tight fitting합니다
- Object가 보이는 곳만 라벨이 있습니다.
- Class Labels : vehicles, pedestrians, cyclists
- Bounding Box : 2D 4-DOF Bboxes + global tracking ID
- Key Points
- key points + 2D/3D Bboxes
- 14 key points : 사람의 nose(1), right and left shoulders(2), elbows(2), wrists(2), hips(1), knees(2), and ankle(2)
- 2D Bboxes : Camera에서의 2D Keypoint
- 3D Bboxes : Image에서의 3D Keypoint
- visibility/occlusion attribute : 보이는지, 가려지는지에 대한 정보를 제공합니다.
- key points + 2D/3D Bboxes
- 2D-to-3D Correspondence
- 앞서 2D와 3D는 각각 label이 만들어졌다고 말씀드렸지만, 일치하는 object에 대해서는 같은 objects IDs를 갖는다고 합니다.
- 단, 시야나 occlusion으로 인한 불일치는 있을 수 있습니다.
- 3D Semantic Segmentation
- Lidar Point에 대한 semantic segmentation
- high resolution Lidar로 취득했으며, 2Hz로 취득되었다고 합니다.
- Class Labels : 23가지
Car, Truck, Bus, Motorcyclist, Bicyclist, Pedestrian, Sign, Traffic Light, Pole, Construction Cone, Bicycle, Motorcycle, Building, Vegetation, Tree Trunk, Curb, Road, Lane Marker, Walkable, Sidewalk, Other Ground, Other Vehicle, Undefined
- Lidar Point에 대한 semantic segmentation
- 2D Video Panoptic Segmentation
- Semantic Segmentation + Instance Segmentation
- 2860개의 sequence들로 이루어진 100k의 이미지에 대한 값입니다.
- 5개의 camera결과가 존재합니다.
- object classes와 지리적 장소, 날씨, 시간의 다양성을 보장합니다.
- Class Labels : 28가지
Car, Bus, Truck, Other Large Vehicle, Trailer, Ego Vehicle, Motorcycle, Bicycle, Pedestrian, Cyclist, Motorcyclist, Ground Animal, Bird, Pole, Sign, Traffic Light, Construction Cone, Pedestrian Object, Building, Road, Sidewalk, Road Marker, Lane Marker, Vegetation, Sky, Ground, Static, Dynamic. - Instance labels : Vehicle, Pedestrian, Cyclist에 대해
- Semantic Segmentation + Instance Segmentation
3. 사용방법
이번엔 데이터셋을 다운받아 처리한 방식에 대해서 간단히 소개하려고 합니다.
전부 설명하기에는 어떤 task를 하는지에 따라, 혹은 어떤 데이터셋을 쓰는지에 따라 너무 다양하므로 Perception 데이터셋을 받아 간단히 3D Object Detection을 위해서 데이터셋을 만드는 과정을 예로 보여드리고자 합니다.
아래는 Waymo Open Dataset Download 화면입니다(https://waymo.com/intl/en_us/open/licensing/).
아래에서 perception 데이터셋의 training, validation, testing에 대한 압축파일을 각각 받으면 1.1TB정도가 됩니다. (Motion 데이터셋은 1TB정도 됩니다)
위와 같이 training, validation, testing에 대해 2022년 4월 데이터를 받으면 training은 총 32개, validation은 8개, testing은 8개의 압축파일을 받을 수 있습니다. 이를 각각 폴더에 풀고 나면 압축파일 하나당 ~.tfrecord파일들이 각각 생깁니다. tfrecord란 위에서 언급한 바와 같이 Protocol Buffer 형식의 데이터입니다.
이를 이제 활용해서 데이터를 만들어내야 할텐데, 필자는 mmcv의 파생 라이브러리 인 mmdet3d(https://github.com/open-mmlab/mmdetection3d)의 코드를 참조했습니다. 위 코드에서 주요 활용하는 코드 트리를 구성해보면 아래와 같습니다.
- mmdetection3d/tools
├── create_data.py
└── dataset_converter
├── create_gt_database.py
├── nuscenes_converter.py
├── kitti_converter.py
└── waymo_converter.py
이 중에 핵심인 create_data.py을 살펴보면 아래와 같습니다.
from tools.dataset_converters import kitti_converter as kitti
from tools.dataset_converters import waymo_converter as waymo
from tools.dataset_converters.waymo_converter import create_ImageSets_img_ids
from tools.dataset_converters.create_gt_database import (
GTDatabaseCreater, create_groundtruth_database)
def waymo_data_prep(root_path,
info_prefix,
version,
out_dir,
workers,
max_sweeps=5):
"""Prepare the info file for waymo dataset.
Args:
root_path (str): Path of dataset root.
info_prefix (str): The prefix of info filenames.
out_dir (str): Output directory of the generated info file.
workers (int): Number of threads to be used.
max_sweeps (int, optional): Number of input consecutive frames.
Default: 5. Here we store pose information of these frames
for later use.
"""
splits = [
'training', 'validation', 'testing', 'testing_3d_camera_only_detection'
]
for i, split in enumerate(splits):
load_dir = osp.join(root_path, 'waymo_format', split)
if split == 'validation':
save_dir = osp.join(out_dir, 'kitti_format', 'training')
else:
save_dir = osp.join(out_dir, 'kitti_format', split)
converter = waymo.Waymo2KITTI(
load_dir,
save_dir,
prefix=str(i),
workers=workers,
test_mode=(split
in ['testing', 'testing_3d_camera_only_detection']))
converter.convert()
create_ImageSets_img_ids(osp.join(out_dir, 'kitti_format'), splits)
# Generate waymo infos
out_dir = osp.join(out_dir, 'kitti_format')
kitti.create_waymo_info_file(
out_dir, info_prefix, max_sweeps=max_sweeps, workers=workers)
info_train_path = osp.join(out_dir, f'{info_prefix}_infos_train.pkl')
info_val_path = osp.join(out_dir, f'{info_prefix}_infos_val.pkl')
info_trainval_path = osp.join(out_dir, f'{info_prefix}_infos_trainval.pkl')
info_test_path = osp.join(out_dir, f'{info_prefix}_infos_test.pkl')
update_pkl_infos('waymo', out_dir=out_dir, pkl_path=info_train_path)
update_pkl_infos('waymo', out_dir=out_dir, pkl_path=info_val_path)
update_pkl_infos('waymo', out_dir=out_dir, pkl_path=info_trainval_path)
update_pkl_infos('waymo', out_dir=out_dir, pkl_path=info_test_path)
GTDatabaseCreater(
'WaymoDataset',
out_dir,
info_prefix,
f'{info_prefix}_infos_train.pkl',
relative_path=False,
with_mask=False,
num_worker=workers).create()
위 코드에서 먼저 waymo.Waymo2KITTI라고 하는 것은 tfrecord의 형식에서 아래와 같이 KITTI format으로 추출하여 저장해놓는 방식입니다. 예를 들어 이미지는 .jpg로, label은 .txt로, 라이다는 .bin파일로 추출하여 저장하는 방식입니다. 자세한 코드를 해당 코드를 살펴보시는 것이 좋을 것 같습니다.
- KITTI_FORMAT
├── ImageSets
├── testing
└── training
그 다음 kitti.create_waymo_info_file이라고 하는 것은 해당 KITTI format의 데이터에 대한 이미지와 라이다 등의 path를 담은 meta들을 저장해 .pkl파일로 만들어 내는 것입니다(calibration이나 GT등 용량이 작은 것들은 직접 담겨 있습니다). mmcv에서 .pkl을 주로 활용하기 때문에 아래와 같이 포맷으로 다시 저장하는 것 같습니다.
또한 추가적으로 GTDatabaseCreater라는 함수는 필자는 잘 활용하지 않지만 어떤 frame 안의 object별로 데이터를 추출해 활용하는 task를 진행할때 주로 활용하는 것 같습니다.
위 두 함수를 이용해 얻어내는 파일 구조는 아래와 같습니다만, GTDatabaseCreater를 활용한 부분은 지워주었습니다.
- INFO_PKLs
├──waymo_gt_database
├──waymo_dbinfos_train.pkl
├── waymo_infos_train.pkl
├── waymo_infos_val.pkl
└── waymo_infos_test.pkl
'Developers 공간 [Basic] > Vision & Audio' 카테고리의 다른 글
[Generative] Stable Diffusion 그 이후 (0) | 2024.06.06 |
---|---|
[NLP] GPT 기초 정리 (0) | 2024.06.06 |
[Calibration] Camera와 좌표계 변환 기초 (4) | 2022.12.21 |