naverlabs / mapping-and-localization-challenge

11 stars 3 forks source link

실외 데이터셋 관련 README #3

Open JunhoJeon opened 4 years ago

JunhoJeon commented 4 years ago

NAVER LABS Outdoor Visual Mapping & Localization Challenge Dataset

이번 KCCV 2020의 Mapping & Localization 챌린지를 위해 공개되는 네이버랩스의 outdoor visual mapping & localization challenge dataset은 mapping 데이터셋과 localization 데이터셋으로 이루어져 있습니다.

Mapping 데이터셋은 네이버랩스가 하이브리드 HD 매핑을 위해 자체 개발 lightweight mobile mapping system (MMS)인 R1이 판교, 여의도 지역을 주행하며 수집한 스테레오 카메라 영상과 라이다 3D 기하 정보, 이를 수집한 각 시점의 차량의 6DOF 자세 정보로 이루어져 있습니다. 각 센서의 intrinsic calibration parameters, MMS 차량과 각 센서(카메라, 라이다)와의 상대적인 위치 관계(extrinsic calibration parameters)가 제공됩니다.

Localization 데이터셋은 Mapping 데이터셋과 유사한 판교, 여의도 지역을 주행한 MMS 차량에서 수집한 스테레오 카메라 영상으로 이루어져 있습니다. 지역별로 각각 50개의 테스트 케이스로 구성되며, 각 테스트 케이스에는 50장의 연속된 스테레오 영상 프레임이 주어집니다. 또한 각 이웃한 프레임 간의 변환(odometry)이 제공되는데, 이 변환은 쉽게 구현 가능한 stereo odometry 알고리즘을 통해 추정된 값으로 정확하지 않을 수 있으므로 필요하다면 직접 odometry를 추정해 사용하는 것도 허용됩니다.

참가자는 위에서 주어진 모든 데이터를 활용해 localization 데이터셋의 각 테스트 케이스 (판교, 여의도 각 50개)의 마지막 프레임을 촬영한 순간의 차량의 6DOF 위치와 방향 정보를 추정하는 mapping & localization 문제를 해결해야 합니다. 문제를 해결하기 위한 방법론의 제약은 없으며, 수상자는 대회가 끝난 뒤 방법론을 설명하는 짧은 문서를 제출해야 할 수 있으며 이후 KCCV 2020 학회에서 구체적인 방법론을 발표해야 합니다.

데이터셋의 구조

각 지역 데이터셋은 train, test 폴더로 이루어져 있습니다.

전체 구조

Train 폴더 (Mapping Dataset)

train 폴더는 images, lidars 폴더로 구성됩니다.

images 폴더에는 MMS 차량에서 수집한 스테레오 영상(left/%06d.png, right/%06d.png), 각 영상이 촬영된 시점의 MMS 차량의 자세 정보, 그리고 촬영된 시간 정보(timestamps)가 제공됩니다. 스테레오 영상은 lens distortion이 보정되지 않은 RGB 이미지입니다. 자세 정보를 나타내는 poses.txt 파일은 각 n번째 행이 n번째 스테레오 영상을 촬영한 시점의 차량 자세를 의미하는 4x4 자세 변환 행렬(1x16 row-major로 표현됨) 입니다. 시간 정보를 나타내는 timestamps.txt 파일은 각 n번째 행이 n번째 스테레오 영상을 촬영할 시점의 시각을 나타냅니다.

lidars 폴더에는 MMS 차량에서 수집한 라이다 3D 기하 정보(%06d.npy)와 각 기하 정보가 촬영된 시점의 MMS 차량의 자세 정보, 그리고 촬영된 시간 정보(timestamps)가 제공됩니다. 각 npy 파일은 python numpy로 저장한 바이너리 파일이며, 라이다 센서 좌표계를 기준으로 한 해당 시점의 주위 기하 정보를 표현하는 (K, 5) 차원의 numpy array로 이루어져 있으며, 각 행은 velodyne 32 channel 센서 데이터(x, y, z, ring number, intensity)를 나타냅니다. 이 때 각 정점의 3차원 좌표(x, y, z)의 단위는 cm 입니다. K는 각 시점에 측정된 points의 개수입니다. 자세 정보를 나타내는 poses.txt 파일은 각 n번째 행이 n번째 point cloud를 수집한 시점의 차량 자세를 의미하는 4x4 자세 변환 행렬(1x16 row-major로 표현됨) 입니다. 시간 정보를 나타내는 timestamps.txt 파일은 각 n번째 행이 n번째 point cloud를 수집할 시점의 시각을 나타냅니다.

예를 들어, 특정 시점의 차량 중심 좌표계의 3차원 정점 p_vehicle를 왼쪽 카메라 중심 좌표계의 정점 p_lcam으로 옮긴 뒤, 렌즈 왜곡이 보정된 영상에 투영한 2차원 좌표 uv를 얻기 위해서는 아래와 같은 연산이 필요합니다.

T_LCam = Calibration['Extrinsic']['LCam']
K_LCam = Calibration['Intrinsic']['LCam']['K']
p_vehicle = np.array([223.9, 38.41, 17.23, 1.0])
p_lcam= numpy.matmul(numpy.linalg.inv(T_LCam), p_vehicle.T)
uv = numpy.matmul(K_LCam, p_lcam)
uv /= uv[2]

Test 폴더 (Localization Data)

test 폴더는 각 테스트 케이스 별 폴더로 구성됩니다. 각 폴더 명이 곧 테스트 케이스 이름이며, 이는 제출할 결과 파일에도 동일하게 사용되어야 합니다. 각 테스트 케이스는 50프레임의 스테레오 영상 (%02d_L.png, %02d_R.png)과 각 프레임 사이의 자세 변화(odometry.txt)가 제공되며, odometry.txt 파일의 n번째 행은 n번째 프레임에서 n+1번째 프레임으로 이동하는 4x4 자세 변환 행렬(1x16 row-major로 표현됨)입니다. 예를 들어, 0번째 프레임으로부터 마지막 프레임까지의 변환은 odometry[0] @ odometry[1] @ .. @ odometry[48]가 됩니다.

참가자는 주어진 모든 데이터를 활용해 각 테스트 케이스의 마지막 프레임(49_L.png, 49_R.png)에 해당하는 차량의 자세 정보(카메라의 자세가 아님)를 측정해 제출하면 됩니다.

Sensor Calibration 파라미터

calibration.json 파일은 intrinsic/extrinsic calibration parameters를 나타냅니다. intrinsic calibration parameters는 4x4 left/right camera matrix K와 1x5 distortion coefficient D를 각각 나타냅니다. extrinsic calibration parameters는 차량의 중심 좌표계와 각 센서 좌표계 사이의 변환 행렬을 나타내며, row-major 4x4 행렬입니다.

결과 제출

각 테스트 케이스별로 참가자가 추정해 제출할 차량의 자세 정보는 (x,y,z,qw,qx,qy,qz)의 7개의 실수값으로 이루어집니다. 차량의 자세는 각 지역의 매핑 데이터와 동일한 좌표계를 기준으로 하며 (x,y,z)는 차량의 위치, (qw,qx,qy,qz)는 차량의 회전 방향을 의미하는 Quaternion 값입니다.

결과는 JSON 포맷의 텍스트 파일로 제출해야 하며, 각 지역의 테스트 케이스 별 자세를 아래와 같은 형태로 저장해야 합니다.

{
    "pangyo": {
        "pangyo00": {
            "qw": 0.000,
            "qx": 0.000,
            "qy": 0.000,
            "qz": 0.000,
            "x": 0.000,
            "y": 0.000,
            "z": 0.000
        },
        "pangyo01": {
            "qw": 0.000,
            "qx": 0.000,
            "qy": 0.000,
            "qz": 0.000,
            "x": 0.000,
            "y": 0.000,
            "z": 0.000
        },
        ...
    },
    "yeouido": {
        "yeouido00": {
            "qw": 0.000,
            "qx": 0.000,
            "qy": 0.000,
            "qz": 0.000,
            "x": 0.000,
            "y": 0.000,
            "z": 0.000
        },
        ...
    }
}