|
|
1. KITTI dataset
(1) 공식사이트 -> https://www.cvlibs.net/datasets/kitti/
3d object detection -> https://youtu.be/_imrrzn8NDk
(2) KITTI dataset는 시카고에 위치한 2개의 기관 Karlsruhe Institute of Technology와 Toyota Technological Institute에서 개발한 자율주행을 위한 데이터셋임
데이터셋은 영상, 라이다 데이터, GPS/IMU 데이터로 구성되어 있고 stereo vision, optical flow, visual odometry, 3D object detection, and 3D tracking과 같은 컴퓨터 비전 연구를 위하여 사용할 수 있음
(3) 데이터 측정 환경 설명
- KITTI 데이터셋 측정시 사용한 센서의 종류
카메라 4대(cam0,1,2,3), 라이다센서(Velodyne laserscanner) 1대, GPS/IMU(OXTS RT 3003) 1대
- KITTI 데이터셋 측정시 사용한 좌표계
카메라 좌표계, 라이다 좌표계, GPS/IMU 좌표계
- KITTI Coordinate Transformations
https://medium.com/towards-data-science/kitti-coordinate-transformations-125094cd42fb
The ground truth annotations of the KITTI dataset has been provided in the camera coordinate frame (left RGB camera), but to visualize the results on the image plane, or to train a LiDAR only 3D object detection model, it is necessary to understand the different coordinate transformations that come into play when going from one sensor to other. The KITTI GT annotation details have been described in the table below.
라이다 좌표계 -> 라이다센서의 중심에 위치, 점의 좌표를 측정하기 위하여 먼저 좌표계가 정의되어야 함
우수계(right handed system)
x축: 자동차 전방
y축: 자동차 좌측
z축: 하늘(up) 방향
카메라좌표계 -> 0번 카메라의 중심에 위치, 3차원 좌표계
우수계(right handed system)
x축: 자동차 우측(right)
y축: 지면 방향 (down)
z축: 자동차 전방(front)
Rectified camera coordinate -> 스테레오 카메라로(컬러 카메라 2대) 객체를 측정할때 기준이 되는 3차원 좌표계
우수계(right handed system)
x축: 수평방향
y축: 지면 방향 (down)
z축: 자동차 전방(front)
카메라 좌표계와 좌표축의 방향이 다름
stereo camera image rectification 참고자료
https://en.wikipedia.org/wiki/Image_rectification
https://www.cs.cmu.edu/~16385/s17/Slides/13.1_Stereo_Rectification.pdf
영상 좌표계(image coordinate) -> 우리가 잘아는 2차원 좌표계
X축 : 영상의 가로축 우측방향
Y축 : 영상의 세로축 아래방향
좌표변환
좌표축의 위치가 모두 다르므로 각 좌표계사이의 변환 관계식(행렬로 정의됨) 필요함
예를들어 카메라좌표계에서 좌표값을 라이다 좌표계의 좌표로 변환하는 경우, 또는 반대 경우 좌표변환식이 있어야함
실제로 라이다좌표계에서 3d객체를 검출한 후 3d 바운딩 박스를 포인트 클라우드 프레임 뿐만아니라 영상에도 그려주어야 하는데 이런경우에 좌표변환 행렬이 필요함
Cam to CamRect, CamRect to Cam : 카메라 좌표계과 자동차 무게중심 좌표계사이의 관계식
Vel to Cam : 라이다 좌표계과 카메라 좌표계사이의 관계식
IMU to Velo : IMU 좌표계과 자동차 라이다 좌표계사이의 관계식
레이블 파일의 좌표들은 Rectified camera coordinate에서 측정된 3차원 좌표임
컬러 카메라 2대를 이용하여 거리를 측정가능하므로 객체의 3차원 정보를 측정가능함
KITTI 좌표변환 설명 공식논문
3d 좌표변환 교재(9장만 보면됨)
2. KITTI dataset 다운로드
(1) 사용자 등록 및 활성화
데이터셋을 다운로드하기 위해서 사용자 등록이 필요함, 첫화면 우측 상단 log in 클릭하면 로그인 화면 하단의 Register here 링크를 클릭하여 등록
아래처럼 개인정보 입력하고 다운로드 목적 창에는 100문자이상 입력해야하므로 Kitti 사이트 첫화면의 문장을 적당히 복사해서 붙여넣기 할것, 마지막에 submit 클릭하고 등록한 이메일 확인하여 메일에 포함된 링크를 클릭하면 등록 완료됨
(2) 로그인
우측상단의 Log in 메뉴 클릭하여 로그인
(3) 데이터셋 다운로드
로그인후 홈페이지 첫화면 상단의 메뉴중에서 object -> 3d object 메뉴를 클릭하면 아래 쪽에 다음과 같은 화면이 보임
(4) 데이터셋의 파일구성
- left color images -> 왼쪽 컬러 카메라 영상(png파일, 자동차 단면도에서 cam 2)
- right color images -> 오른쪽 컬러카메라 영상(png파일, 자동차 단면도에서 cam 3)
- the 3 temporally preceding frames(left color) -> left color images의 3개 선행프레임 영상 (png파일) , 현재영상 기준으로 이전 3개의 프레임을 의미
- the 3 temporally preceding frames(right color) -> right color images의 3개 선행프레임 영상(png파일), 현재영상 기준으로 이전 3개의 프레임을 의미
- velodyne point clouds -> 벨로다인 라이다 센서로 측정된 포인트 클라우드 데이터, 이진파일형식(bin 파일), 포인트의 라이다좌표계 기준으로 3차원 좌표(x,y,z)와 반사된 레이저의 강도(intensity)를 float(4바이트)형식으로 저장함, 프레임당 100k 포인트를 저장함
- camera calibration matrices -> 카메라 캘리브레이션 행렬(txt 파일), 카메라와 라이다 좌표계사이의 변환 행렬
- training labels -> 훈련용 레이블(txt 파일), 자동차 단면도에서 카메라좌표계를 기준으로 객체의 3d 바운딩박스 정보를 저장함
모든 파일은 7481개로 동일하고 라이다의 측정주기 10Hz에 동기화되어 측정됨,
즉, 1초에 10번씩 같은 장면을 라이다 포인트 클라우드 프레임(bin 파일)과 카메라 영상 프레임(png 파일)으로 저장했다는 의미
the 3 temporally preceding frames의 파일갯수는 3x7481개로 3배임
훈련 레이블은 카메라 좌표계로 저장되어 있음 -> 레이블링은 라이다 포인트 클라우드 프레임에서 한게 아니고 영상에서 했다는 의미
캘리브레이션 행렬은 라이다와 카메라 좌표계변환 행렬을 저장하고 있음 -> 포인트 클라우드 프레임에서 객체를 검출한 후 영상에 3d 바운딩 박스를 그릴때 필요
- 데이터셋 파일내용에 대한 설명
(5) 다운로드할 파일
3d 객체검출을 위해서 left color images, velodyne point clouds, camera calibration matrices, training labels 4개의 압축파일을 다운로드할것, 다운로드후 압축을 풀면 아래처럼 폴더가 생성됨
3. KITTI dataset 시각화 방법
numpy 라이브러리로 kitti 포인트 클라우드 파일(bin)을 읽고 open3d tensor를 생성후 (x,y,z)좌표값으로 초기화함
포인트 클라우드의 시각화는 o3d.visualization.Visualizer 클래스를 이용하여 윈도우 생성 후 출력 옵션 파라미터(배경색, 점색, 점크기, 좌표축, 줌 등)를 설정하고 출력할 데이터를 추가해주면 됨
<소스코드>
import numpy as np
import open3d as o3d
lidar_file_path = r"D:\Users\2sungryul\Dropbox\Work\Dataset\KITTI\data_object_velodyne\training\velodyne\000000.bin"
"""
bin format
(x, y, z, r), where (x, y, z) is the 3D coordinates
and r is the reflectance value (referred as intensity in Waymo)
"""
# read point cloud file(bin format)
pc_data = np.fromfile(lidar_file_path, "<f4")
pc_data = pc_data.reshape((-1, 4))
# create open3d tensor
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(pc_data[:, :3])
pcd.colors = o3d.utility.Vector3dVector(np.ones((len(pcd.points), 3)))
# create open3d window
vis = o3d.visualization.Visualizer()
vis.create_window(window_name='kitti',width=960, height=540)
# set background_color and point_size
vis.get_render_option().background_color = np.asarray([0,0,0]).astype(float)
vis.get_render_option().point_size = 0.5
# add lidar axis
axis_pcd = o3d.geometry.TriangleMesh.create_coordinate_frame(size=3.0, origin=[0, 0, 0])
vis.add_geometry(axis_pcd)
# add point cloud
vis.add_geometry(pcd)
# set zoom, front, up, and lookat
vis.get_view_control().set_zoom(0.1)
vis.get_view_control().set_front([0, 0, 1])
vis.get_view_control().set_up([1, 0, 0])
vis.get_view_control().set_lookat([0, 0, 0])
vis.run()
vis.destroy_window()
<실행결과>
마우스 왼쪽 버튼을 클릭 후 드래깅하면 시야각을 조정할수 있음, 마우스 휠로 줌을 조정할 수 있음
가운데 라이다 좌표축이 그려지고 포인트 클라우드는 흰색으로 배경은 검정색으로 그려짐
4. 포인트 클라우드에 3d 바운딩박스 그리기
KITTI\data_object_label_2\training\label_2 폴더아래에 영상좌표계에서 레이블링을 수행한 3차원 바운딩박스가 정보가 저장되어 있음, 3차원 바운딩박스의 중심점이 바운딩박스 밑면의 중심좌표임을 주의할것
포인트 클라우드를 출력하고 레이블링 정보를 이용하여 3차원 바운딩박스를 그려줌
소스코드
https://github.com/2sungryul/kitti_visualization
<소스코드>
import kitti_utils as kitti
lidar_file_path = r"D:\Users\2sungryul\Dropbox\Work\Dataset\KITTI\data_object_velodyne\training\velodyne\000010.bin"
label_file_path = r"D:\Users\2sungryul\Dropbox\Work\Dataset\KITTI\data_object_label_2\training\label_2\000010.txt"
calib_file_path = r"D:\Users\2sungryul\Dropbox\Work\Dataset\KITTI\data_object_calib\training\calib\000010.txt"
_, pc_data = kitti.parse_point_cloud(lidar_file_path)
_, matrix_tr_velo_to_cam, R_cam_to_rect = kitti.parse_calib(calib_file_path)
_, class_ids, bbox3D = kitti.parse_labels(label_file_path, matrix_tr_velo_to_cam, R_cam_to_rect)
kitti.draw_scenes(pc_data, bbox3D, ref_labels=class_ids)
<실행결과>
위 결과는 000010.bin, 000010.txt 파일을 이용하여 그린것임
아래 레이블 파일에서 보듯이 9개의 레이블 정보가 들어있음, 레이블링을 영상에서 했기 때문에 그림 아래쪽에 다른 차량들이 많은데도 레이블링 정보에는 작성되어 있지 않음
좌표계사이의 변환행렬은 KITTI\data_object_calib\training\calib\000010.txt 안에 들어있음(아래 그림)
Tr_velo_to_cam : 카메라좌표계에서 좌표를 라이다좌표계의 좌표로 변환할때 사용하는 변환행렬
R0_rect : 카메라좌표계에서 Rectified 카메라 좌표계로 변환시 사용하는 변환행렬
5. 참고 사이트
Exploring KITTI Dataset: Visual Odometry for autonomous vehicles
https://medium.com/@jaimin-k/exploring-kitti-visual-ododmetry-dataset-8ac588246cdc
Paper with code : KITTI
https://paperswithcode.com/dataset/kitti
KITTI-For-Beginners
https://github.com/dtczhl/dtc-KITTI-For-Beginners/blob/master/README.md
포인트 클라우드 처리를 위한 pptk 사용법 정리
https://gaussian37.github.io/autodrive-lidar-pptk/
3 temporally preceding frames 파일 설명
https://github.com/bostondiditeam/kitti/blob/master/README.md
파일포맷설명 및 cli명령어로 다운로드 하는 방법
https://csj000714.tistory.com/968
how to parse point cloud(bin), label(txt), and calib(txt) files in KITTI
https://github.com/koraykoca/Kitti2TFrecords/blob/main/kitti2tfrecords.py
Visualization 3D object detection results using meshlab.
https://github.com/yeyang1021/KITTI_VIZ_3D/tree/master
pykitti -> KITTI python utility
https://github.com/utiasSTARS/pykitti
KITTI Object data transformation and visualization
https://github.com/kuixu/kitti_object_vis/tree/master
3D LiDAR Visualization using Open3D: A Case Study on 2D KITTI Depth Frames for Autonomous Driving
https://learnopencv.com/3d-lidar-visualization/
set_lookat(), set_front(), set_up() usage of VisualControl
https://github.com/isl-org/Open3D/issues/2139
open3d kitti visualization
https://github.com/chaomath/open3d-kitti-visualization
포인트 클라우드 처리를 위한 open3d 사용법 정리
https://gaussian37.github.io/autodrive-lidar-open3d/
6. 과제
(1) KITTI 포인트 클라우드 파일(velodyne 폴더의 bin파일)의 형식을 설명하라.
(2) KITTI 레이블파일(label_2 폴더의 txt파일)의 내용물을 설명하시오.
(3) KITTI 캘리브레이션(calib 폴더의 txt파일)의 내용물을 설명하시오.
(4) rectified camera coordinate 를 설명하라.
|
|
