ChatSim icon indicating copy to clipboard operation
ChatSim copied to clipboard

How to get the Lane Map?

Open 13678066760 opened this issue 1 year ago • 2 comments
trafficstars

Hi,great works! I wonder how do you can the GT Lane Map? The paper mentioned that "Generally, we use the lane map from the ground-truth data".

13678066760 avatar Sep 04 '24 15:09 13678066760

hello, I also have the same problem, did you solve it?

lt-wang avatar Dec 03 '24 06:12 lt-wang

You could use the following code snippet to get the waymo map data. The output map is stored in waymo's global coordinate. Note that this data processing script is not in line with ChatSim, just for the case you want to extract the map data.

import numpy as np
import tensorflow as tf

from pathlib import Path
from typing import List, Dict, Any, Union
from waymo_open_dataset import dataset_pb2, label_pb2
from waymo_open_dataset.utils import frame_utils
from google.protobuf import json_format

def extract_map_data(frame: dataset_pb2.Frame) -> Dict[str, Any]:
    """
    frame.map_features have many MapFeature item
    message MapFeature {
        // A unique ID to identify this feature.
        optional int64 id = 1;

        // Type specific data.
        oneof feature_data {
            LaneCenter lane = 3; # polyline
            RoadLine road_line = 4; # polyline
            RoadEdge road_edge = 5; # polyline
            StopSign stop_sign = 7; 
            Crosswalk crosswalk = 8; # polygon
            SpeedBump speed_bump = 9; # polygon
            Driveway driveway = 10; # polygon
        }
    }

    Returns:
        map_data: Dict
            'lane': list of polylines, each polyline is noted by several vertices.
            'road_line': list of polylines, each polyline is noted by several vertices.
            ...
    """
    def hump_to_underline(hump_str):
        import re
        return re.sub(r'([a-z])([A-Z])', r'\1_\2', hump_str).lower()

    map_features_list = json_format.MessageToDict(frame)['mapFeatures']
    feature_names = ["lane", "road_line", "road_edge", "crosswalk", "speed_bump", "driveway"]
    map_data = dict(zip(feature_names, [[] for _ in range(len(feature_names))]))

    for feature in tqdm(map_features_list):
        feature_name = list(feature.keys())
        feature_name.remove("id")
        feature_name = feature_name[0]
        feature_name_lower = hump_to_underline(feature_name)

        feature_content = feature[feature_name]
        if feature_name_lower in ["lane", "road_line", "road_edge"]:
            polyline = feature_content['polyline'] # [{'x':..., 'y':..., 'z':...}, {'x':..., 'y':..., 'z':...}, ...]
        elif feature_name_lower in ["crosswalk", "speed_bump", "driveway"]:
            polyline = feature_content['polygon'] # [{'x':..., 'y':..., 'z':...}, {'x':..., 'y':..., 'z':...}, ...]
        else:
            continue

        polyline = [[point['x'], point['y'], point['z']] for point in polyline] # [[x, y, z], [x, y, z], ...]
        map_data[hump_to_underline(feature_name)].append(polyline)

    return map_data

def extract_map_data_from_one_scene(self, segment_tfrecord: Path, out_dir: Path) -> int:
    dataset = tf.data.TFRecordDataset(segment_tfrecord.as_posix(), compression_type="")

    for frame_idx, data in enumerate(dataset):
        frame = dataset_pb2.Frame()
        frame.ParseFromString(bytearray(data.numpy()))

        if frame_idx == 0:
            # only stored at the first frame
            map_data = extract_map_data(frame)

        return map_data

yifanlu0227 avatar Dec 03 '24 13:12 yifanlu0227