DEEP.I - Lab

오프라인 공간의 지능화를 꿈꾸는 딥아이 연구실입니다.

Matlab

[Matlab] 복셀화 (Voxcelization)을 이용한 LIDAR 라이다 PCD 데이터 압축 #4

Jongwon Kim 2021. 3. 10. 17:03
반응형

Concept

그림 1. 실시간으로 수집되는 점 구름 데이터

 

지난 포스팅에 이은 라이다 데이터 전처리 기법 #4 , PCD Voxcelization 알고리즘입니다.

 

3차원 희소 데이터 특성을 가지는 라이다 PCD는 채널 수에 따라 다르지만, 10,000 ~ 1,000,000 개 이상의 데이터가 초 단위로 수집됩니다. 단순한 3차원 float 형의 공간 정보이지만, 10,000 개 이상의 데이터를 실시간으로 전 처리하고 알고리즘에 활용하기에는 효율성이 매우 떨어집니다.

 

특히, 차량이나 드론과 같은 이동체에서 자율주행을 위해 활용될 경우, 연구소 환경과 같은 고성능 워크스테이션에서의 연산이 불가능 하기에 다양한 기법으로 데이터를 압축시키거나 효율적으로 연산하는 방법들이 제안되고 있습니다.

 

최신 기법은 아니지만, 비교적 쉽고 현재까지 활용되고 있는 Voxcelization 기법을 매트랩으로 구현해보도록 하겠습니다.

 

POST

1.라이다 데이터 전처리 [KITTI DATASET 활용하기]

2. 각도에 따라 라이다 데이터 분할하기 [Segmentation]

3. 변환 행렬을 이용하여 라이다 데이터 축 변환하기 [Transformation]
4. 복셀화를 이용한 LIDAR 라이다 PCD 데이터 압축 [Voxcelization]

 

 

Algorithms

그림 2. 복셀 크기에 따른 모델링

 

복셀화는 2차원적인 픽셀(Pixcel)을 3차원의 형태로 구현한 것을 정의하며 Volume+ Pixcel의 합성어로, 부피를 가진 픽셀이라 할 수 있습니다. 컴퓨터 비전이나 3차원 모델링 분야에서 랜더링을 위해 사용되는 기술이며, 우리에게 친숙한 마인 크래프트 역시 복셀화로 랜더링 된 게임입니다.

 

PCD 복셀화는 이 아이디어를 착안하여, 지정한 복셀의 크기 (가로 X 세로 X 높이) 안에 포함된 PCD 데이터를 하나의 값으로 압축하는 알고리즘으로 제안되었습니다. 기존 영상 히스토그램화와 같이 기본적인 연산만으로도 쉽게 압축되는 것이 장점입니다.

 

또한, 수집되는 데이터는 Float 형태로 저장되어 0.125486212과 같이 아날로그 신호 특성을 가지고 있지만 복셀화를 진행하면 정규화와 이산 신호 형태로 변환되어 이후 연산량에서도 효율성을 높일 수 있습니다.

 

그림 3. N x N 의 복셀로 PCD를 압축

 

SourceCode

1. SourceCode 및 샘플 데이터 다운로드

github.com/DEEPI-LAB/LiDAR-Point-Cloud-Preprocessing-matlab

 

DEEPI-LAB/LiDAR-Point-Cloud-Preprocessing-matlab

Pre-processing Technique of LIDAR PCD Data Using KITTI-Dataset - DEEPI-LAB/LiDAR-Point-Cloud-Preprocessing-matlab

github.com

git clone github.com/DEEPI-LAB/LiDAR-Point-Cloud-Preprocessing-matlab

2. 히스토그램 생성 함수로 영역 분할하기

% 2D Voxcelization
w = 200;
h = 200;
[count2D, ~, ~, ~] = histcn(xyzi(:,1:2), w , h);

% 3D Voxcelization
w = 200;
h = 200;
ch = 50;
[count3D, ~, ~, ~] = histcn(xyzi(:,1:3), w , h, ch);

readPCD 파일 내 전처리 함수를 모두 실행한 뒤, 복셀화를 시작합니다. 매트랩에서 복셀화는 histcn 함수를 통해 진행합니다. histcn 함수는 주어진 데이터를 W x H x CH의 영역으로 분할하여 내부에 포함된 데이터의 개수를 출력하는 함수입니다. 

 

예를 들어 입력으로 w와 h를 200으로 지정하면, 전체 PCD의 개수를 200x200 = 40,000 만큼의 크기로 압축이 됩니다. 

 

3. Histcn 값을 정렬하여 원본 PCD값과 1대 1 대응하기

function [transX2D] = voxcelization2D(count3D)
  [x2D,y2D] = find(count3D);
  transX2D = [x2D, y2D];
end

function [transX3D] = voxcelization3D(pcd,count)
s = 1;
for k =1:count
        if(k==1)
            [x3D,y3D,z3D] = find(pcd(:,:,k)) ;
            transX3D =[x3D, y3D,repmat(s,size(x3D,1),1)] ;
        else
            [x3D,y3D,z3D] = find(pcd(:,:,k)) ;
            transX3D = [transX3D ; x3D, y3D, repmat(s,size(x3D,1),1)];
        end
        s = s + 1;
end

이후, voxcelization2D, 3D 함수를 통해 0의 값을 제거하면 유효한 복셀 값만 남게 됩니다. 남은 복셀의 인덱스를 X축과 Y축 인덱스로 추출하면 2차원 복셀화, Z 축까지 추출하면 3차원 복셀 화가 완료됩니다.

 

그림 4. (위) 원본 (아래) 압축

 

Reference

Birdnet: a 3d object detection framework from lidar information

 

 

Your Best AI Partner DEEP.I
AI 바우처 공급 기업
객체 추적 및 행동 분석 솔루션 | 제조 생산품 품질 검사 솔루션 | AI 엣지 컴퓨팅 시스템 개발

인공지능 프로젝트 개발 외주 및 상담
E-mail: contact@deep-i.ai
Site: www.deep-i.ai

 

반응형