ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • nuscene의 데이터 구조 설명
    openxlab 2024. 7. 17. 23:42

    nuscene 파일 구조를 약간 보고 가자

     

    아래 같이 명령어를 치면 터미널에서 많은 종류의 속성이 나올것이다.

     

    해당 속성들은 리스트로 구성되어 있다.

     

    그러나 token방식으로 접근하기 때문에 대부분 리스트 속성은 인덱스로 접근하지 않는다.

    from nuscenes.nuscenes import NuScenes
    
    # Initialize NuScenes
    nusc = NuScenes(version='v1.0-mini', dataroot='/data/sets/nuscenes', verbose=True)
    
    # Loading NuScenes tables for version v1.0-mini...
    # 23 category,
    # 8 attribute,
    # 4 visibility,
    # 911 instance,
    # 12 sensor,
    # 120 calibrated_sensor,
    # 31206 ego_pose,
    # 8 log,
    # 10 scene,
    # 404 sample,
    # 31206 sample_data,
    # 18538 sample_annotation,
    # 4 map,
    # Done loading in 0.268 seconds.

     

    위 속성들의 관계를 보면 아래와 같다.

     

    위 그림에서 쉽게 scene --> sample --> sample data 로 데이터 흐름이 흐르는데 코드로는 어떻게 작성되는지 확인 해보자!

     

    아래 코드 처럼 처음  token을 추출하고 그 token기반으로 nusc.get함수를 통해서 정보를 추출한다.

     

    nusc 는 아래 처럼 많은 속성을 list와 dictionary형태로 가지고 있다.

     

    0 번째 scene --> sample --> sample data --> ego, sensor 정보 --> 상세 정보 rotation, translation 값을 얻는 과정

    from nuscenes.nuscenes import NuScenes
    
    # Initialize NuScenes
    nusc = NuScenes(version='v1.0-mini', dataroot='/data/sets/nuscenes', verbose=False)
    
    # Loading NuScenes tables for version v1.0-mini...
    # 23 category,
    # 8 attribute,
    # 4 visibility,
    # 911 instance,
    # 12 sensor,
    # 120 calibrated_sensor,
    # 31206 ego_pose,
    # 8 log,
    # 10 scene,
    # 404 sample,
    # 31206 sample_data,
    # 18538 sample_annotation,
    # 4 map,
    # Done loading in 0.268 seconds.
    
    
    scene = nusc.scene[0]  # Adjust the scene index as needed
    current_sample_token = scene['first_sample_token']
    
    sample = nusc.get('sample', current_sample_token)
    
    radar_smaple_front_token = sample['data']['RADAR_FRONT']
    
    sensor_info = nusc.get('sample_data', radar_smaple_front_token)
    
    #sensor_info['filename']
    #sensor_info['calibrated_sensor_token']
    #sensor_info['ego_pose_token']
    #이렇게 들어 있고 해당 값은 아래 코드로 읽음.
    ego_pos_info = nusc.get('ego_pose', sensor_info['ego_pose_token'])
    cal_sensor_info = nusc.get('calibrated_sensor', sensor_info['calibrated_sensor_token'])
    print(sensor_info['filename'])
    print('ego rotation',ego_pos_info['rotation'])
    print('ego translation',ego_pos_info['translation'])
    print('sensor rotation',cal_sensor_info['rotation'])
    print('sensor translation',cal_sensor_info['translation'])
    ------------------------------------------------------------------
    #결과
    samples/RADAR_FRONT/n015-2018-07-24-11-22-45+0800__RADAR_FRONT__1532402927664178.pcd
    ego rotation [0.5721129977125774, -0.0014962022442161157, 0.011922678049447764, -0.8200867813684729]
    ego translation [411.25243634487725, 1180.7511754315697, 0.0]
    sensor rotation [0.9999984769132877, 0.0, 0.0, 0.0017453283658983088]
    sensor translation [3.412, 0.0, 0.5]

     

     

    출처 :https://www.nuscenes.org/nuscenes#data-collection

     

    https://www.nuscenes.org/nuscenes#data-collection

     

    www.nuscenes.org

     

    공식문서를 보면 아래 처럼 token 기반으로 정보가 있다.

     

    이런 식으로 정보가 있기 때문에 파일 명만 가지고 있고 실제로 정보는 가지고 있지 않다 그래서 구조는 복잡하지만 크기는 크지 않다. 이점이 이 구조의 장점 같다.

     

     

    마지막으로 scene 구조를 보면 first_sample_token과 last_sample_token이 있는 해당의미는 처음과 마지막 프레임이다. linked list 같은 구조이므로 한번에 중간을 갈수 없다. 찾고찾고 하면서 가야한다. 이것은 단점임.

    반응형
Designed by Tistory.