Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consecutive scenes #900

Closed
Alt216 opened this issue Mar 23, 2023 · 1 comment
Closed

Consecutive scenes #900

Alt216 opened this issue Mar 23, 2023 · 1 comment

Comments

@Alt216
Copy link

Alt216 commented Mar 23, 2023

Hi, is there a way to get consecutive scenes from the same map?

Also how can we determine the length of a particular scene.

@whyekit-motional
Copy link
Collaborator

@Alt216 you could try something like this:

from typing import List

import numpy as np
from nuscenes.nuscenes import NuScenes


def get_scenes_per_log(nusc: NuScenes):
    scenes_per_log = {}
    for scene in nusc.scene:
        log_token = scene['log_token']
        scene_token = scene['token']
        
        if log_token not in scenes_per_log:
            scenes_per_log[log_token] = [scene_token]
        else:
            scenes_of_log = scenes_per_log[log_token]
            scenes_of_log.append(scene_token)
            scenes_per_log[log_token] = scenes_of_log
    
    assert len(nusc.scene) == sum([len(scenes) for scenes in scenes_per_log.values()])
    assert len(nusc.log) == len(scenes_per_log)
    
    return scenes_per_log


def sort_scenes_by_timestamp(nusc: NuScenes, list_of_scene_tokens: List[str]):
    """
    Sort a given list of scene tokens in temporal order. Assume scenes do not overlap within a log 
    (this should be the case in nuScenes).
    """
    # Get the timestamp of each scene's first sample.
    scene_first_sample_timestamps = []
    for scene_token in list_of_scene_tokens:
        scene = nusc.get('scene', scene_token)
        scene_first_sample_token = scene['first_sample_token']
        scene_first_sample = nusc.get('sample', scene_first_sample_token)
        scene_first_sample_timestamps.append(scene_first_sample['timestamp'])
    
    # Sort the scenes based on the timestamp of their respective first samples.
    sorted_idxs = np.argsort(scene_first_sample_timestamps)
    return [list_of_scene_tokens[i] for i in sorted_idxs]


nusc_ = NuScenes(version='v1.0-mini', dataroot='/data/sets/nuscenes', verbose=False)

some_scenes_per_log = get_scenes_per_log(nusc_)

some_scenes_per_log_sorted = {}
for log_token, scene_tokens_of_log in some_scenes_per_log.items():
    some_scenes_per_log_sorted[log_token] = sort_scenes_by_timestamp(nusc_, scene_tokens_of_log)

print(some_scenes_per_log_sorted)

The above code snippet will return a dictionary in which each key is a log token, and each value is a list of scene tokens (sorted in temporal order) which belong to the corresponding log token, e.g.:

{
    "7e25a2c8ea1f41c5b0da1e69ecfa71a2": [
        "cc8c0bf57f984915a77078b10eb33198"
    ],
    "53cf9c55dd8644bea67b9f009fc1ee38": [
        "fcbccedd61424f1b85dcbf8f897f9754"
    ],
    "881dd2f8aaec49b681eb54be5bf3b3e2": [
        "6f83169d067343658251f72e1dd17dbc"
    ],
    "6f7fe59adf984e55a82571ab4f17e4e2": [
        "bebf5f5b2a674631ab5c88fd1aa9e87a"
    ],
    "3a43824b84534c98bda1d07548db5817": [
        "2fc3753772e241f2ab2cd16a784cc680"
    ],
    "8ff48ad1df8e4966a2151730c92b7f3c": [
        "c5224b9b454b4ded9b5d2d2634bbda8a"
    ],
    "5bd40b613ac740cd9dbacdfbc3d68201": [
        "325cef682f064c55a255f2625c533b75"
    ],
    "8fefc430cbfa4c2191978c0df302eb98": [
        "d25718445d89453381c659b9c8734939",
        "de7d80a1f5fb4c3e82ce8a4f213b450a",
        "e233467e827140efa4b42d2b4c435855"
    ]
}

To get the length of each scene, you could simply get the difference between the timestamp of the last sample in a scene, and the first sample in the same scene (I'll leave that as an exercise for you to implement the code)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

2 participants