Concept
한동안 라이다 (LiDAR) 센서 관련 프로젝트를 하면서 PCD(Point Cloud Data) 데이터 분석 업무를 진행했었습니다. 관련 자료가 많이 없다보니 많이 힘들었었던 기억이납니다. PCD는 희소 데이터 특성을 갖는 3차원 공간 데이터이며 현재 다양한 산업 분야에서 활용되고 있습니다.
비록 테슬라는 다른 길을 걷고 있지만, 최근 제안되는 자율 주행 기술 관련 논문에서는 PCD 데이터를 위치 데이터로 활용하고 있으며 더 나아가 영상과 융합하여 탐지 성능을 향상시키고도 있습니다.
기업이나 연구소 수준에서는 자체 데이터를 이용하지만 저널이나 컨퍼런스에서는 오픈된 데이터로 검증하게 됩니다. 공개 데이터 중, 가장 유명한 데이터는 아마 KITTI-DATASET이 아닐까 싶습니다. 다양한 센서 데이터를 포함하고있어 Detection, Tracking, SLAM 등 다양한 평가에 활용되고 있습니다. 2010년대 초반에 공개된 데이터지만 아직까지 활용도가 높은 데이터입니다.
이번 포스팅 시리즈에서는 KITTI-DATASET에 포함되는 Velodyne 라이다 센서의 PCD 데이터 전처리 과정을 다뤄보겠습니다. 간단한 데이터 전처리부터 지면 데이터 제거, Depth Map 변환 등 기본적으로 응용되고 있는 기법들을 매트랩으로 구현해보도록 하겠습니다.
POST
1.라이다 데이터 전처리 [KITTI DATASET 활용하기]
2. 각도에 따라 라이다 데이터 분할하기 [Segmentation]
3. 변환 행렬을 이용하여 라이다 데이터 축 변환하기 [Transformation]
4. 복셀화를 이용한 LIDAR 라이다 PCD 데이터 압축 [Voxcelization]
SourceCode
1-1. KITTI-DATASET PCD 데이터 다운로드 (30GB)
www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=2d
우선 라이다 데이터가 필요합니다. 센서를 가지고 있다면 괜찮지만, 없다면 공개된 데이터를 받아야겠죠. KITTI의 전체 데이터 용량은 상당히 큽니다. 샘플 데이터는 하단의 링크 또는 GIT CLONE을 통해 받으실 수 있습니다.
1-2. Sample 데이터 및 소스코드 다운로드
github.com/DEEPI-LAB/LiDAR-Point-Cloud-Preprocessing-matlab
2. BIN FILE OPEN (PCD 데이터 열기)
% load pcd file
lidar_dir = fopen('sample\pcd.bin');
lidar_file = fread(lidar_dir,[4 inf],'single')';
fclose(lidar_dir);
데이터 로드는 fopen으로 쉽게 할 수 있습니다. KITTI-DATASET은 BIN파일 형식으로 제공되며 X축, Y축, Z축, 그리고 Intensity 값이 포함되어있습니다. 라이다 센서는 빛을 쏘고 다시 받는 시간을 측정 (TOF : Time Of Filght) 하여 거리를 측정하게 되는데, 이때 반사된 빛의 강도에 따라 Intensity 값이 PCD에 함께 저장됩니다. 일반적으로 표면의 재질이나 반사각 등에 의해 값이 변하게 되는 성질을 가지고 있습니다.
이처럼 라이다 PCD는 객체와의 거리, 높이, 방향, Intensity 정보를 포함하고 있습니다. 영상 카메라에서는 수집할 수 없는 데이터이기 때문에 센서 융합을 통해 보강하고 있으며 많은 자율주행 차량에서 라이다를 부착하는 이유입니다.
3. Preprocessing (PCD 공간 데이터 정의 및 압축)
% X, Y, Z
x_1 = lidar_file(:,1:3);
% X, Y, Intensity
x_2 = [lidar_file(:,1:2), lidar_file(:,4)];
% preprocessing
x_1(:,3) = round(x_1(:,3),1);
x_2(:,3) = round(x_2(:,3),1);
시각화를 위해 데이터를 X,Y,Z 축 PCD로 구성된 x_1 과 X,Y,Intensity로 구성된 x_2로 나눴습니다. 이후, 데이터가 소숫점 5~6자리까지 표현되면 gscatter 연산이 오래걸리므로 반올림하여 압축하였습니다.
3-1. 2D Visualization
figure(1)
%2D Visualization
subplot(3,1,1)
title('origin')
scatter(x_1(:,1),x_1(:,2),1,'.k')
subplot(3,1,2)
title('height')
gscatter(x_1(:,1),x_1(:,2),x_1(:,3))
legend off
subplot(3,1,3)
title('intensity')
gscatter(x_2(:,1),x_2(:,2),x_2(:,3))
legend off
3-2. 3D Visualization
figure(2)
%3D Visualization
subplot(3,1,1)
title('origin')
scatter3(x_1(:,1),x_1(:,2),x_1(:,3),1,'.k')
subplot(3,1,2)
title('height')
gscatter3(x_1(:,1),x_1(:,2),x_1(:,3),x_1(:,3))
legend off
subplot(3,1,3)
title('intensity')
gscatter3(x_2(:,1),x_2(:,2),x_1(:,3),x_2(:,3))
legend off
시각화를하면 멋진 공간 데이터를 볼 수 있지만 10만개가 넘는 데이터를 표현해야하기 때문에 컴퓨터가 상당히 힘들어합니다. 이러한 문제를 해결하기 위해 불필요한 각도나 위치의 데이터를 줄이고, 필요 이상의 데이터를 압축하고 있습니다. 다음 포스팅에서는 축 변환과 각도 분할 방법 등을 활용해서 데이터를 압축하고 제거하는 알고리즘을 구현해보도록 하겠습니다.
4. gscatter3 함수
kr.mathworks.com/matlabcentral/fileexchange/37970-gscatter3
Your Best AI Partner DEEP.I
AI 바우처 공급 기업
객체 추적 및 행동 분석 솔루션 | 제조 생산품 품질 검사 솔루션 | AI 엣지 컴퓨팅 시스템 개발
인공지능 프로젝트 개발 외주 및 상담
E-mail: contact@deep-i.ai
Site: www.deep-i.ai
'Matlab' 카테고리의 다른 글
[Matlab] 이미지로 동영상 만들기 및 동영상의 프레임을 이미지로 저장하기 (0) | 2021.01.11 |
---|---|
[Matlab] 극좌표계를 이용한 LIDAR 라이다 PCD 데이터 Segmentation #2 (0) | 2021.01.04 |
[Matlab] 다층 퍼셉트론(MLP)을 이용한 MNIST 손글씨 인식 알고리즘 구현 (0) | 2020.12.05 |
[Matlab] 매트랩에서 GIF 이미지(애니메이션) 파일 만들기 (1) | 2020.11.29 |
[MATLAB] 클러스터링 (군집화) 기법 구현을 위한 기본 2D 데이터셋 모음 (0) | 2020.11.26 |