DOI QR코드

DOI QR Code

Implementation of CUDA-based Octree Algorithm for Efficient Search for LiDAR Point Cloud

라이다 점군의 효율적 검색을 위한 CUDA 기반 옥트리 알고리듬 구현

  • Kim, Hyung-Woo (Department of Spatial Information Engineering, Pukyong National University) ;
  • Lee, Yang-Won (Department of Spatial Information Engineering, Pukyong National University)
  • 김형우 (부경대학교 공간정보시스템공학과) ;
  • 이양원 (부경대학교 공간정보시스템공학과)
  • Received : 2018.09.29
  • Accepted : 2018.11.29
  • Published : 2018.12.31

Abstract

With the increased use of LiDAR (Light Detection and Ranging) that can obtain over millions of point dataset, methodologies for efficient search and dimensionality reduction for the point cloud became a crucial technique. The existing octree-based "parametric algorithm" has proved its efficiency and contributed as a part of PCL (Point Cloud Library). However, the implementation of the algorithm on GPU (Graphics Processing Unit) is considered very difficult because of structural constraints of the octree implemented in PCL. In this paper, we present a method for the parametric algorithm on GPU environment and implement a projection of the queried points on four directions with an improved noise reduction.

라이다의 활용 증가와 함께 점군 자료의 양이 급증할 것으로 예상되며, 이에 따라 효율적인 점군 검색 및 자료 분석을 위한 차원 축소 방법의 중요성이 강조되고 있다. 이에 따라 본 연구에서는 입력된 원점과 방향 벡터를 이용해 옥트리 노드를 조회하는 파라메트릭 알고리듬의 특징에 따른 기존 CPU, GPU 기반 옥트리의 한계를 정의하고, 이를 극복할 수 있는 검색 기법을 제시한다. GPU 옥트리 환경을 활용할 수 있는 파라메트릭 알고리듬을 구현하고 이에 대한 성능평가를 수행하였으며, 또한 검색된 지점을 활용하여 잡음이 제거된 2차원 영상 투영 방법을 구현하였다.

Keywords

1. 서론

광학 센서로부터 탐지되는 3차원 점군(point cloud)은 학계뿐만 아니라 업계에서도 다양한 목적으로 활용되는 주요 데이터베이스이다. 점군은 다수의 영상에서 추출된 대응점을 활용한 3차원 좌표 복원 등 간접적인 방법이나 빛의 이동 거리와 도달 시간을 이용해 위치를 측정하는 직접적인 방법을 통해 얻을 수 있다. 특히, 최근 차량자동주행(Wolcott and Eustice, 2014), 정밀측량(Han et al., 2012), 변화탐지(Lee et al., 2011) 등 여러 분야에서 활용되고 있는 라이다(LiDAR)는 고정된 위치에서 단일레이저와 반사 거울의 정밀 회전을 통해 영상과 레이저 정보를 동시에 획득하는 방식의 2D 레이저 스캐너뿐만 아니라 다중 레이저를 활용한 3D 레이저 스캐너 등(Kim et al., 2012) 실시간 탐지를 위한 여러 상용기술이 차용되고 있어 향후 연구자가 다루어야 하는 누적 자료의 수가 큰 폭으로 증가할 것으로 예상된다. 라이다로부터 얻어지는 점군은 센서의 종류나 촬영 범위에 따라 적게는 수백에서 많게는 수백만개에 달해 관측이 누적될 경우, 지점 조회 속도가 느릴 뿐만 아니라 불연속성을 가지는 각 지점의 특성으로 인한 잡음이 발생할 수 있어 자료를 다루는데 한계가 있다. 따라서 효율적인 점군 데이터 조회 방법과 더불어 타 관측 자료와의 연계를 위한 차원 감소 방법의 제시가 중요하다.

기존 연구에서는 점군 조회를 위한 방법으로 주로 트리 기반의 알고리듬을 활용하였는데(Shen et al., 2011; Vo et al., 2015) 그 종류로는 k개의 차원을 번갈아가며 데이터 중앙값을 찾아 분할하는 k차원-트리(kd-Tree), 차원별 데이터 범위 중심점을 기준으로 하위 8개 영역을 반복적으로 분할하는 옥트리(octree)(Fig. 1) 등이 있다. 특히, 옥트리는 임의의 연속형 자료를 구성하거나 검색할 때, 전체 데이터에 대한 정렬이 필요없고 검색 대상 지점 좌표와 노드에 대한 부분적인 계산만으로도 빠르게 데이터를 검색할 수 있는 장점(Meagher, 1980)이 있으며 최근까지도 트리 구성 및 구현 방법에 관한 연구가 활발히 이루어지고 있다. Han(2013)는 OpenMP를 활용하여 지정된 검색 영역의 범위를 일정 단위로 분할하여 단말노드(leaf node) 및 반경 내에서 각 지점을 병렬적으로 탐색하는 알고리듬을 제안하였으며 Elseberg et al.(2013)는 새로운 노드 구조 및 조회 방법 제안을 통해 10억개 이상의 라이다 데이터를 효율적으로 조회하고 시각화하는 방법을 제시했다.

OGCSBN_2018_v34n6_1_1009_f0001.png 이미지

Fig. 1. Octree in Morton code in a left-handed coordinate system.

옥트리의 등장 목적은 3차원 기하 정보의 효율적인 구조화에 있으나, 최근에는 이와 더불어 옥트리 구조적 특징과 연계해 새로운 탐색 및 구조화 방법을 제안하는 많은 연구가 수행되어왔다. 대표으로 Reveles et al.(2000)은 입력 좌표를 중심으로 방향벡터와 교차하는 노드 조회를 위해 옥트리 노드 경계면과 조회 조건을 활용하는 파라메트릭 알고리듬(Parametric Algorithm)을 제안하였으며 PCL(Point Cloud Library) 등의 라이브러리에서 활용되고 있다. 하지만 구현된 알고리듬은 SISD(Single Instruction Single Data) 방식으로 동작하는 CPU 기반 옥트리 만을 활용하여 연산 환경의 물리적 선택지가 다양해진 현시점에 최선이라 담보할 수 없으며 탐색된 3차원 데이터 분석을 위한 차원 축소 방법이 추가로 제시되어야 하는 필요성이 있다.

따라서 본 연구에서는 CPU와 GPU 상에 구현된 옥트리와 Revelles et al.(2000)의 파라메트릭 알고리듬을 활용하여 다중 위치에서 관측된 대용량 점군 조회 및 영상 투영 방법을 구현하고 연산 과정에서 구현 환경에 따른 성능 평가를 수행하였다. 특히, 옥트리와 파라메트릭 알고리듬의 노드 경계면 조회 방식을 활용하여 임의의 위치와 지정된 자세 정보에서 관측된 점군을 투영하는 과정에서 발생할 수 있는 잡음을 제거하였다. 1절에서는 본 연구의 배경과 목적에 대해 간략히 소개하였고, 2절에서는 CPU와 GPU 기반 옥트리의 차이점과 파라메트릭 알고리듬의 특성에 따른 문제점에 대해 검토한다. 3절에서는 파라메트릭 알고리듬 구현을 위한 옥트리 환경 구성 및 투영 방법을 제시하고, 4절에서는 실험에 사용된 자료와 실험 환경 및 결과에 대해 논의한다. 끝으로 5절에서 결론 및 향후 과제에 대해 서술함으로써 본 논문을 맺는다.

2. 이론적 배경

1) 파라메트릭 알고리듬

Revelles et al.(2000)이 제안한 파라메트릭 알고리듬은 입력된 원점과 방향벡터를 기준으로 뿌리 노드부터 교차되는 단말노드를 순차적으로 검색하기 위한 알고리듬이다. 입력된 원점에서 시작되는 방향벡터와 옥트리 내 노드 경계면 교차점이 존재한다고 가정할 때, 해당 노드 경계면 상의 교차점은 입력 원점, 방향벡터 및 방향계수가 이루는 함수로 표현 가능하며((1)의 xr, yr, zr), 입력 원점, 방향벡터 및 트리 최소, 최대 좌표점을 초기변수로 활용하여 계산된 방향계수((1)의 tx, ty, tz)를 이용해 트리 내에서 교차되는 최종 노드 존재 여부와 교차 면의 위치를 결정할 수 있다. 이러한 연산을 위한 노드 교차점 및 방향계수 연산식은 (1)과 같다.

       (1)

여기에서 px, py, pz는 입력 원점 벡터 요소, dx, dy, dz는 입력 방향벡터 요소, tx, ty, tz는 노드–원점 간의 벡터와 입력된 방향벡터 간의 방향계수, xr, yr, zr는 선택된 노드의 경계면 상의 교차점이며 실제 연산에서는 초기에 트리 외곽을 기준으로 방향계수가 한 번만 연산된 후 하위 노드에 진입할 때마다 경계면이 축소되는 비율과 1/2로 나누어주는 연산만을 수행한다. 이렇게 연산된 방향계수는 입력된 방향벡터의 진입 경계면에 대한 위치를 결정하는 역할을 하므로 이를 활용한 하위 노드 진입 조건과 탐색 진행 조건의 정의가 중요하며 Revelles et al.(2000)에서 Table 1과 Table 2과 같이 제시되었다. x, y, z 축 방향 계수의 최소, 최대값을 상호 비교해 높은 값의 종류에 따라 진입 평면을 결정하고 최대, 최소값을 더해 2로 나누어준 중심값에 대한 최소값 비교를 통해 하위 노드를 결정하는 비트셋을 만들며 하위 노드가 존재하지 않을 때 노드로부터 벡터가 나가는 평면을 결정해 다음에 만나는 이웃 노드 번호를 선정한다. Table 1의 txm, tym, tzm와 tx0, ty0, tz0은 각각 tx, ty, tz의 중심값과 최소값을, Table 2는 현재 선택된 노드 번호와 벡터가 나가는 평면의 종류에 따라 이웃노드 번호를 결정하는 조건을 의미한다. Table 3은 Revelles et al.(2000)에서 제공한 코드를 PCL 구조에 따라 분리한 파라메트릭 알고리즘의 의사코드(pseudocode)이다.

Table 1. Comparisons to obtain the first node intersected(Revelles et al., 2000)

OGCSBN_2018_v34n6_1_1009_t0001.png 이미지

Table 2. State transition (Revelles et al., 2000)

OGCSBN_2018_v34n6_1_1009_t0002.png 이미지

Table 3. Initial procedure of parametric algorithm

OGCSBN_2018_v34n6_1_1009_t0003.png 이미지

알고리듬의 순서는 입력 방향벡터의 부호에 따라 초기 진입 평면에 영향을 주는 비트(a)를 결정하고, 트리의 최대, 최소 좌표점과 입력 원점, 방향벡터에 따른 방향계수(mnx, mn, mnz, mxx, mxy, mxz)를 계산한다(Table 3의 2). 이 과정에서 입력 방향벡터에 음의 값이 포함되어 있을 경우, 노드 중심 값을 기준으로 원점의 위치와 방향벡터의 부호를 변환하고 영향 비트의 해당하는 축의 자리에 OR연산을 통해 비트 1을 추가한다. 트리 최소 좌표점을 활용한 최소 방향계수(mnx, mny, mnz) 중 최대값이 트리 최대 좌표점을 활용한 최대 방향계수mxx, mxy, mxz)의 최소값보다 작아야 노드 경계면에 방향벡터가 진입하는 교차점이 존재하므로 해당하는 값의 비교를 통해 하위 노드 검색 함수를 호출할 지 결정한다(Table 3의 3). Revelles et al.(2000)은 하위 노드 탐지 과정을 종료하기 위한 분기 조건 세 가지를 제시하는데, 첫 번째는 입력노드의 단말노드 여부(성공 시)(Table 4의 4), 두 번째는 최대 방향계수가 음의 값을 포함할 경우(실패시)(Table 4의 1), 마지막은 이웃 노드의 검색 결과 하위 노드 존재 여부(실패시)(Table 4의 10)이다. 입력노드가 단말노드일 경우, 노드에 포함되는 지점의 번호를 모두 반환하고(Table 4의 5). 최대 방향계수 중 하나가 음의 값을 가질 경우 방향벡터가 노드 경계면의 좌표 범위를 벗어난 것으로 판단하여 직전 깊이로 돌아간다(Table 4의 2). 하위 노드가 존재할 경우, Revelles et al.(2000)에서 제시하는 조건에 따라 다음 진입 경계를 결정하고 함수를 한번 더 호출해 하위 레벨로 진입하며, 반대의 경우에는 이웃 노드로 이동해 한번 더 분기 조건을 판단한다(Table 4의 20). 이산적인 점군의 특징을 고려했을 때, 이렇게 순차적으로 진행되는 노드 경계면 중심 조회 방식은 연속성을 가지는 정육면체 노드의 장점을 살릴 수 있어 이산적인 점군에 대해 연속성을 부여할 수 있다는 장점이 있다.

Table 4. Child node search in parametric algorithm

OGCSBN_2018_v34n6_1_1009_t0004.png 이미지

2) CPU 및 GPU 기반 PCL 옥트리

본 연구에 활용된 PCL은 Rusu and Cousins(2011)에 의해 제안된 점군 데이터 연산을 위한 공개 라이브러리(Open Source Library)로서 필터링(filtering), 분할(segmentation), 특징 추출(feature estimation), 표면 재구성(surface reconstruction) 등 3차원 점군 자료 처리에 CPU 및 GPU를 활용한다. PCL은 점군에 대한 조회 및 관리를 위한 CPU 및 GPU 기반의 옥트리 알고리듬을 각각 제공하는데, CPU 기반 옥트리와 GPU 기반 옥트리의 차이점은 다음과 같다.

CPU 기반 PCL 옥트리는 구성 노드 내에 하위 노드를 포함하는 재귀적 구조를 가지므로 트리를 구성하거나 조회하는 과정이 대부분 재귀적 구조로 이루어져 있다. 옥트리를 구성하는 과정은 입력된 옥트리 해상도(r)를 이용해 전체 데이터 범위에서좌표의 차원별 최대, 최소값을 찾고(Table 5의 1) 이를 이용해 각 지점의 키 벡터를 계산하고(Table 5의 6) 트리의 깊이을 증가시키며 가지노드(branch node)인지 단말노드인지에 따라 새로운 가지노드를 만들거나 지점의 번호를 단말노드의 저장소에 저장하는 순서이다. Table 5과 6는 CPU 기반 PCL 옥트리 구성 과정을 정리한 의사코드이며, 재귀 함수(Table 6) 내에 자식 노가 존재할 경우는 그렇지 않을 경우와 거의 유사하므로 생략하였다.

Table 5. Procedure of CPU-based PCL octree

OGCSBN_2018</a></a>_v34n6_1_1009_t0005.png 이미지

Table 6. Recursive function for creation of leaf node

OGCSBN_2018_v34n6_1_1009_t0006.png 이미지

트리 구성 과정에서 트리의 최소 좌표값, 목표 지점 좌표와 해상도를 이용해 목표 지점의 키 벡터(k)와 옥트리 깊이(d)를 구하는데, 이를 표현한 식은 (2)와 같다.

\(\begin{array}{c} \operatorname{key}_{x y z}(x)=\frac{x-p_{\min }}{r} \\ \text { depth }=\operatorname{ceil}\left(\log _{2}\left(\max _{p}\left(\operatorname{key}_{x y z}\left(p_{\max }\right)\right)\right)\right) \end{array}\)       (2)

여기에서 r은 옥트리 해상도, pmin, pmax는 점군 내에서 최소, 최대 좌표로 구성된 벡터, maxp는 벡터 내 최대값을 반환하는 함수를 의미한다.

키 벡터는 점군 내에서 최소 좌표점을 기준으로 특정 지점의 상대적 위치를 표현하며 이를 정수 비트의 측면에서 보면, 왼쪽을 기준으로 각 xyz 키 비트 묶음이 해당 깊이의 하위 노드 번호가 된다(Fig. 2). 이를 이용해 옥트리 구성 시작시 자리 왼쪽으로 옥트리 깊이만큼 시프트 한 1비트를 시작 마스크(m)으로 정의(Table 5의 7)하고 깊이 방향으로 진행할수록 마스크를 1/2로 줄여가며(Table 6의 6) 깊이별 자식 노드 번호(i)를 구한 뒤(Table 6의 1) 단말노드(b)에 포함된 하위 노드의 존재 여부를 판단한다(Table 6의 3). 하위 노드가 존재하지 않을 경우, 마스크를 통해 노드 종류(Table 6의 4)를 판단한 뒤 노드를 생성(Table 6의 5와 9)하고 하위 작업을 진행한다. 노드가 존재할 경우, 노드 타입을 조회한 후 마찬가지로 하위 작업을 진행한다.

OGCSBN_2018_v34n6_1_1009_f0002.png 이미지

Fig. 2. Expression of child node using octree key and Morton code

GPU 기반 PCL 옥트리는 CUDA 메모리의 구조적 차이(Nvidia, 2018)로 인해 고정된 옥트리 깊이 값(10)과 테이블 구조로 트리를 생성한다. 그리고 연산의 효율을 위해 각 지점별 키 벡터를 계산하여 개별 저장했던 CPU와는 달리, 깊이 별 x, y, z 축의 키 비트를 연속 비트 형태로 계산하는 모턴 코드(Morton, 1966)를 활용한다. 모턴 코드 혹은 Z-order curve는 이산적 격자 체계에 연속성을 부여하기 위한 한 방법으로 CPU 옥트리 키 값의 비트를 왼쪽부터 x, y, z 순서(Fig. 2)로 교차해 옥트리 최소값을 기준으로 Z 형태로 진행되는 연속 값을 얻을 수 있다. 이를 연산하기 위한 방법은 (3)과 같다.

       (3)

여기에서 spread 함수는 계산된 키 벡터 요소 x, y, z 각 비트값을 3개 비트로 교차하는 OR 연산이다.

연산된 키 값을 기준으로 점군을 오름차순으로 정렬(Table 7의 3) 후, 전체 반복문 내에서 작업 수를 증가시켜가며 각 코어당 하나씩의 작업을 할당해 뿌리 노드로부터 하위 노드의 좌표 범위, 코드, 부모 노드를 추출하는 작업을 수행한다. Table 7은 GPU기반 PCL 옥트리를 구성하는 과정을 정리한 의사 코드로 SIMT(Single Instruction Multiple Thread) 방식으로 동작하는 GPU 기반 PCL 옥트리의 특성상 현재까지의 탐지된 노드 수, 새로운 노드 수, 현재 작업 번호, 종료 작업 번호(node_num, total_new, task_bag, task_end)를 각 스레드가 동시에 접근 가능한 공유변수로 가진다.

Table 7. Creation of GPU-based PCL octree using CUDA

OGCSBN_2018</a></a>_v34n6_1_1009_t0007.png 이미지

처음 옥트리 구성 시 첫 번째 GPU 코어가 가지코드(Branchcodes), 가지노드(Branchnodes), 점군 내 가지노드의 범위를 나타내는 번호(Branchbags, Branchends), 부모 노드 번호(Parents) 및 공유변수를 초기화한다(Table 7의 6). 이후 지점을 탐색하며 해당 깊이의 가지노드 코드를 생성하고 생성된 가지노드 코드와 가지 노드의 경계에 해당하는 번호를 임시로 저장하기 위한 배열을 선언하는데 경계 번호는 시작과 끝으로 구성되어 항상 가지노드 코드보다 하나 더 많으므로 임시 저장 배열을 지정할 때 경계 번호 배열의 길이를 9, 코드의 길이를 8로 지정한다(Table 7의 9와 10). 뿌 노드부터 한번 작업을 수행할 때마다 전체 지점의 모턴 코드에 대한 이진 탐색을 통해 해당 노드에 포함되는 지점을 나누는 하위 경계 번호(bags)를 탐지하고 해당 가지노드의 코드(codes)를 탐지된 모턴 코드로부터 추출한다(Table 7의 12). 이렇게 추출된 코드와 경계 번호는 순차적으로 옥트리 테이블에 저장된 뒤(Table 7의 13, 14, 15) 현재 작업 번호를 부모 노드로 지정한다(Table 7의 16). 이후 계산된 각 스레드의 자식 노드 개수를 모두 더해 공유 변수(Table 7의 19, 20, 21, 22)를 업데이트하고 task_bag이 task_end 값과 동일할 때까지 옥트리 테이블을 구성작업을 반복한다. 여기에서 node_num은 선행작업에서 계산된 노드의 총합으로 다음 레벨의 결과 누적시 오프셋 역할을 한다. Fig. 3은 뿌리 노드가 1, 3, 6의 자식노드를 가지는 경우, 깊이 1까지 진행된 옥트리 테이블의 예이다. 여기에서 Task Count는 레벨이 진행될수록 분할되는 가지 노드의 누적 개수로 이와 비례해 작업에 사용되는 GPU 코어 수도 늘어나게 된다. n은모든 지점의 개수, dn는 가지노드에 따라 지점을 가지노드로 나누는 경계 번호이며 Octree Nodes는 자식 노드의 오프셋과 포함하는 자식노드를 나타내는 마스크로 구성된다.

OGCSBN_2018_v34n6_1_1009_f0003.png 이미지

Fig. 3. Data table for GPU-based PCL octree.

이렇게 구성된 GPU 기반 PCL 옥트리는 하위 경계 번호 탐지 과정에서 미리 계산된 단말노드 당 최대 데이터 개수에 대한 검색 범위 초과 여부를 판단하는데, 전체 노드 실제 좌표 범위는 넓으나 포함하는 데이터 개수가 최대 개수보다 적을 경우, 단말노드로 등록되어 하위 분할이 진행되지 않는다. 이에 따라 GPU 상에 구성된 옥트리는 CPU 기반 옥트리와는 달리 깊이에 따른 균일한 크기의 노드를 가지지 않는다는 단점이 있다. 또한, GPU 기반 옥트리가 고정된 깊이를 가지는 원인은 모턴 코드의 길이가 CPU 옥트리의 키에 비해 3배의 길이를 가지는데 반해, 전체 키를 표현하기 위한 비트는 32비트 이하로 한정되기 때문이다. 이에 따라 GPU 상에서 깊이 정보를 변경하거나 깊이 10을 초과하는 옥트리를 구성하고자 할 경우, 비트를 표현하는 형 변환과 코드 구조를 전반적으로 변경해야 하는 어려움이 있다.

앞서 언급한 파라메트릭 알고리듬과 CPU 및 GPU 옥트리의 특징에 따른 한계를 정리해보면, 파라메트릭 알고리듬은 깊이별 노드 경계 조건을 활용하는 특성으로 인해 분기 조건에 따라 하위 노드 탐지 및 종료를 수행하므로 옥트리 깊이 진행에 따른 노드 크기의 연속성에 의존적이다. 따라서 재귀적 구조로 깊이에 따른 함수 진행에 연속성을 가지는 CPU 옥트리는 파라메트릭 알고리듬에 적합하며, 현재에도 해당 기능을 제공한다. 하지만 테이블 방식의 GPU 옥트리는 구성 과정의 한계로 인해 각 가지노드가 균일한 노드 경계를 가지지 못하고 모턴 코드를 활용하기 때문에 동적인 옥트리를 구성할 수 없어 기존 GPU기반 옥트리를 활용해 파라메트릭 알고리듬을 구현하는 데에는 한계가 있다.

3. 방법론

본 연구에서는 2절에서 제기된 PCL 옥트리의 한계를 극복하기 위한 대안적 방법으로, GPU 기반 옥트리 환경을 구성하고 이를 이용한 파라메트릭 알고리듬을 구현하고자 한다. 또한 구현된 GPU 옥트리를 통해 점군의 효율적 검색을 수행하였으며, 그 결과로 잡음이 제거된 2차원 영상 투영 및 물리적 환경에 따른 성능 평가를 수행하였다.

1) GPU 기반 파라메트릭 알고리듬 구현

CPU 기반 PCL 옥트리에서 만들어지는 균일한 크기의 가지 및 단말노드를 GPU 상에서 활용 가능한 테이블 형태로 구성하고 파라메트릭 알고리듬 과정 중 자식 노드 조회 방식을 변경하여 GPU 환경에서도 알고리듬을 활용할 수 있도록 수정하였다. 이후 파라메트릭 알고리듬의 장점을 활용한 투영 영상 제작을 수행하였고, CPU와 GPU 환경 및 영상 크기에 따른 각 알고리듬의 소요 시간을 측정하여 성능 평가를 진행했다. 이러한 일련의 정은 CPU 옥트리 직렬화, 테이블 구성 방법, 선택된 점군 투영을 포함한다.

PCL 옥트리를 GPU 상에 구현할 때 발생하는 불균일한 크기의 가지노드 문제를 해결하기 위하여, CPU 알고리듬을 변형하여 재귀적 구조를 가지는 GPU 기반 옥트리를 먼저 구성하고, 이에 필요한 요소를 GPU 상에 적재하는 형식으로 테이블을 구성하였다. 하지만 코드 안정성 유지의 이유로, 이미 구조화된 CPU 기반 PCL 옥트리는 방향벡터 연산에 필요한 노드 키에 대한 접근을 허용하지 않는다. 더욱이 CPU 기반 옥트리를 GPU 테이블 형태로 구성하기 위해서는 전체 가지노드와 단말노드가 완전히 구성된 상태에서 깊이별 너비 기준(breadth-wise)으로 작업을 수행하여야 하지만, 기존 코드에서는 너비 기준 직렬화 기능을 제공하지 않으므로 옥트리 내부에 이러한 직렬화 과정을 직접 구현하여 테이블 구성을 위한 변수 접근를 수행하였다(Table 8).

Table 8. Serialization process for CPU-based PCL octree

OGCSBN_2018</a></a>_v34n6_1_1009_t0008.png 이미지

CPU 기반 옥트리 탐색을 위해 재귀형으로 구성된 직렬화 함수는 깊이별 가지노드(b), 이전 깊이까지의 노드 오프셋(dl), 현재 깊이(d)를 입력 받아 현재 가지노드의 자식 노드를 나타내는 마스크(m), 현재 노드의 첫 번째 자식 노드까지의 오프셋(co), 단말노드의 키 값(lkb), 최종 단말노드(lb)을 출력한다. 노드를 저장할 수 있는 형태의 배열(TaskBag)에 해당 깊이의 가지노드를 저장하여(Table 8의 13) 다음 작업으로 넘기면 가지노드를 꺼내 트리 상에서의 오프셋을 계산해 저장하고(Table 8의 7) 자식노드를 다시 다음 작업으로 넘기는(Table 8의 24) 재귀적 함수이며, FIFO(First in Frst Out) 방식의 입출력을 위하여 배열(TaskBag)은 큐(queue)를 활용하였다. 첫 호출은 TaskBag에 뿌리 노드를 저장하여 실행할 수 있으며, 모든 작업은 최대 깊이에 도달하였을 때 종료한다(Table 8의 26). 이렇게 직렬화된 변수는 CUDA RuntimeAPI를 이용해 GPU 상에 복사되며, Fig. 4와 같이 Branch Masks, Child Offset은 가지노드 길이, 각 leaf key는 단말노드 길이를 가지는 연속형 테이블로 구성된다.

OGCSBN_2018_v34n6_1_1009_f0004.png 이미지

Fig. 4. GPU-based octree implemented by serialization.

GPU 기반 옥트리 환경을 파라메트릭 알고리듬에 적용하기 위해서는, 기존 파라메트릭 알고리듬에 활용하는 노드 타입과 자식 노드 조회 과정을 오프셋 연산으로 대체하여야 하며, 단말노드 여부를 판단하는 두 번째 분기 조건도 수정되어야 한다. 기존 파라메트릭 알고리듬의 경우 노드가 재귀적 구조로 되어있어 내장 함수와 관련 변수로 간편하게 자식노드를 조회할 수 있으나(Table 4의 16), Fig. 4와 같이 자식노드 프셋(ChildOffset)과 마스크(BranchMasks)를 저장하는 구조의 경우, 비트 연산을 통해 자식노드 존재 여부와 자식노드의 오프셋을 구해야 한다. 마스크는 8개의 자식 노드 중 존재하는 노드의 위치를 1로 표현하는 마스크로 파라메트릭 알고리듬이 진행될 때 업데이트 되는 자식 노드 번호(ci) 만큼 마스크를 오른쪽으로 시프트시켜 해당 노드의 존재 여부를 확인할 수 있다(Table 9의 1). 자식 노드가 존재할 경우, 현재 노드 직전까지의 오프셋에 해당 자식 노드 직전까지의 마스크 비트 수를 더해(BitCount) 최종 오프셋을 반환한다(Table 9의 4). 이렇게 계산되는 자식 노드 번호는 가지노드의 마지막 층에도 동일하게 적용되므로, 자식노드 번호가 전체 가지노드의 수를 초과할 경우, 단말노드로 판단하여 자식노드 번호에서 전체 가지노드 수를 뺀 값을 단말노드 번호로 저장하고 GPU 파라메트릭 알고리듬을 종료한다.

Table 9. Search for child node in a GPU-based octree

OGCSBN_2018_v34n6_1_1009_t0009.png 이미지

2) 점군의 2차원 영상 투영

2차원 영상 좌표계에서 화소별 방향벡터 및 3차원 원점을 이용하여 파라메트릭 알고리듬으로 점군 검색을 수행할 경우에는, 어느 방향에 단말노드가 존재하는지 추정할 수 없기 때문에 모든 화소별 방향벡터를 구하여 검색 알고리듬의 입력 자료로 활용하여야 한다. 하지만 옥트리 단말노드 중심좌표를 영상에 투영한다고 가정했을 때, 투영된 단말노드의 화소 수는 영상 총 화소 수보다 항상 작거나 같다. 따라서 투영 과정의 속도 향상을 위해 영상 화소별 개별 방향벡터가 아닌 옥트리에서 구성된 단말노드의 중심값을 활용한 방향벡터를 입력자료로 활용 할 수 있다.

본 연구에서는 투영 FOV(ield of View)를 90도로 지정한 네 면의 영상을 제작하기 위하여, 파라메트릭 알고리듬의 입력자료 구성을 위한 단말노드의 방향벡터 조회를 수행하였다. 단말노드 방향벡터 조회의 과정은 단말노드 중심점과 입력된 원점을 이용한 방향벡터 계산, 3차원 회전 적용, 지점의 소속된 면 결정, 2차원 영상 화소 연산, 마스크 및 방향벡터로 구성된 행렬 제작으로 구성되며, 자세한 사항은 다음과 같다.

단말노드 중심 좌표를 연산하기 위해 앞서 직렬화를 통해 얻어진 각 단말노드의 키, 옥트리 깊이 및 점군 최소 벡터를 이용할 수 있으며, 이는 (4)와 같다.

\(c_{x y z}=\left(k e y_{x y z}+0.5\right) \times\left(2^{\left(d_{o}-d_{c}\right)} r+p_{\min }\right)\)       (4)

여기에서 c는 중심좌표, keyxyz는 단말노드 키, do는 옥트리 깊이, dc 현재 깊이, pmin은 점군 내 최소 벡터를 의미한다.

입력된 원점과 노드 중심 좌표의 차를 부호가 결정지 않은 파라메트릭 알고리듬을 위한 방향벡터로 정의하고, 방향벡터에서 영상 좌표로의 변환을 위해 x축에 음의 부호를 적용한다.

\(d=\frac{O-c}{\|o-c\|}, d_{x}=-d_{x}\)       (5)

여기에서 d는 방향벡터, o는 원점, c는 중심좌표, dx는 방향벡터의 x요소이다.

구해진 방향벡터를 사용자가 원하는 자세 정보로 전환하기 위해 지정된 임의의 3차원 회전 행렬 R을 적용해 최종 방향벡터를 연산한다.

dr = R·d       (6)

여기에서 dr는 3차원 회전이 적용된 방향벡터, R는 3차원 회전 행렬이다.

이렇게 구해진 방향벡터 요소 x, y, z를 이용해 중심점 기준 Yaw와 Pitch를 구할 수 있으며 여기에서 Yaw는 단말노드가 속하는 영상면을 결정하는 기준으로 활용된다.

 \(\begin{array}{l} \theta_{z}=\operatorname{atan} 2\left(d_{r}^{y}, d_{r}^{x}\right) \\ \theta_{y}=\operatorname{asin}\left(d_{r}^{z}\rght) \end{array}\)      (7)

여기에서 θz는 Yaw, θy는 Pitch, \(d_{r}^{x}\), \(d_{r}^{y}\), \(d_{r}^{z}\)은 3차원 회전이 적용된 방향벡터의 x, y, z 축 요소이다.

앞서 투영 영상의 FOV를 90도로 정의하였으므로 Z축을 중심으로 -45도보다 크고 45도 작은 경우, 45도보다 크고 135도보다 작은 경우, 135도보다 크거나 -135도보다 작은 경우, -135도보다 크고 -45도보다 작은 경우로 각 방향벡터를 구분한다.

\(\text { i, } \theta_{z}^{\prime}=\left\{\begin{array}{l} i=0, \theta_{z} \text { if }-\frac{\pi}{4} \leq \theta_{z}<\frac{\pi}{4} \\ i=1, \theta_{z}-\frac{\pi}{2} \text { if } \frac{\pi}{4} \leq \theta_{z}<\frac{3 \pi}{4} \\ i=2, \theta_{z}-\pi \text { if } \frac{3 \pi}{4} \leq \theta_{z} \text { or } \theta_{z}<-\frac{3 \pi}{4} \\ i=3, \theta_{z}+\frac{\pi}{2} \text { if }-\frac{3 \pi}{4} \leq \theta_{z}<-\frac{\pi}{4} \end{array}\right.\)       (8)

여기에서 i는 선택 그룹 번호를 의미한다.

이렇게 분리된 방향각과 영상 FOV 이용해 (8)에서 결정된 그룹의 영상 좌표에 마스크와 방향벡터를 저장한다. 이때 3차원 회전은 영상의 2차원 좌표에 미리 반영 되었으므로, 최종 저장되는 방향벡터는 회전이 적용되지 않은 본래의 방향벡터를 활용한다.

\(\begin{aligned} p_{x} &=\left(\frac{\tan \theta_{z} \cos \theta_{f}}{2 \sin \theta_{f}}+0.5\right) \times w \\ p_{y} &=\left(\frac{\tan \theta_{y} \cos \theta_{f}}{2 \sin \theta_{j} \cos \theta_{z}}+0.5\right) \times h \end{aligned}\)    nbsp;  (9)

\(M_{i}(x, y)=1, d_{y}=-d_{y}, d_{z}=-d_{z} D_{i}(x, y)=d\)       (10)

여기에서 px, py는 영상 좌표, w, h는 영상 너비와 높이, θf는 FOV/2이다, (10)에서 Mi은 i번째 방향 마스크 행렬, dy, dz는 방향벡터의 y, z 요소, Di는 i번째에 분류된 방향벡터를 저장하는 3차원 행렬이다.

최종 방향벡터를 정의할 때는 중심점에서 원점을 가리키는 벡터의 방향을 바꿔주기 위해 y, z축에 음의 부호를 적용한다. 이후 파라메트릭 연산을 적용할 때 방향 마스크 행렬을 통해 방향벡터 존재 여부를 판단하고 원점과 방향벡터 행렬을 이용해 각 화소별 단말노드를 구한다. 그리고 단말노드를 이용해 조회된 최종 지점을 앞서와 동일하게 3차원 회전을 적용하여 영상에 투영한다. 최종 투영 과정은 앞서 소개한 방향벡터 결정 과정에 기초하여 수행되었다.

4. 실험 환경 및 결과

1) 사용자료 및 환경설정

본 연구에서는 부산 소재 모 대학교 캠퍼스 내 9개의 관측 지점에서 획득한 30,895,261개의 LiDAR 점군을 활용하였으며(Fig. 5), 점군 관측 센서는 지상 라이다인 Topcon사의 GLS-1000를 이용하였다. 해당 관측 센서는 관측시 3개의 타겟을 이용해 기준 좌표를 등록하는 기능을 제공하며 이를 위한 타겟 좌표 측량은 RTK GNSS 수신기인 SOKKIA사의 GRX2 모델을 활용하였다. 탐지 범위는 MIN(209315.813, 281655.375, -5.599), MAX(210402.844, 282446.344, 206.026)이며 좌표계는 XY축 기준 ITRF2000 동부원점(EPSG:5187), Z축 기준 EGM 2008(EPSG:3855)로 단위는 미터이다. 관측 센서를 통해 각 지점에 대한 절대 좌표, 영상 화소 정보(RGB), 반사 강도(intensity)를 획득하였으며 전체 알고리듬의 구현은 C/C++, CUDA 및 PCL, OpenCV를 이용하였다. 연산을 위해 활용된 CPU는 Intel i7-8700, GPU는 Nvidia GTX-1080(총 코어 2560)이며 구현된 알고리듬 연산을 위한 CUDA 커널의 블록 및 스레드 수는 128×128로 설정하였다.

Fig 5. LiDAR image gathered from 9 sites.

2) 구현 및 실험결과

실험을 위해 임의의 위치(209876.984, 282015.774, 6.627)와 투영 자세(1.7, -1.4, 5.9)를 지정하고 (1)PC에서 제공하는 CPU 기반 옥트리 조회 및 투영(이하 CPU), (2)구현된 GPU 알고리듬을 활용한 조회 및 투영(이하 GPU), (3)구현된 GPU 방향벡터 연산과 CPU 기반 PCL 옥트리 조회 및 투영(이하 CPU+GPU)으로 연산 종류를 분리하여 생성 영상 크기별 연산 소요 시간을 비교하였다. GPU 연산은 단말노드로부터 방향벡터 생성과 옥트리 조회가 개별적으로 수행되고, CPU 연산은 PCL에서 제공하는 단말노드 반복자(iterator)를 활용해 연산 여부를 마스크에 저장함과 동시에 조회가 수행되므로 과정별 일대일 비교는 불가능하다. 하지만 CPU와 GPU의 물리적 특징에 따른 최적의 연산을 수행하기 위한 순서를 고려 하였으므로 전체 연산에 대한 비교는 충분히 가능하리라 사료된다. Fig. 6에서 마지막 위치한 Direction은 GPU를 활용한 단말노드별 방향벡터 연산에 소요된 시간이며, 평균 30.75 ms로 영상 크기에 상관없이 일정한 속도를 나타내었다.

OGCSBN_2018_v34n6_1_1009_f0006.png 이미지

Fig. 6. Elapsed time for octree algorithms in different environment.

GPU 연산은 영상 크기 감소에 비례해 평균 41.4%의 소요시간이 감소하는 것을 확인할 수 있으며, CPU+GPU 연산의 경우, 평균 55.6%, CPU 연산은 평균 21.4% 감소되었다. 특히, 영상 크기에 따른 CPU 소요시간의 변화율이 타 연산에 비해 작다는 점을 고려해보면, 전체 CPU 연산 과정 중 일정한 소요시간을 가지는 노드별 방향벡터 연산 시간이 많은 비중을 차지하는 것으로 판단할 수 있다. CPU+GPU 연산은 영상 크기가 상대적으로 작은 256×256과 128×128의 경우에 GPU를 활용한 연산보다 빠르거나 유사했으며, 반대로 영상의 크기가 상대적으로 커서 옥트리 연산량이 많아지는 경우에는 GPU 연산이 CPU+GPU 연산보다 약 2배 정도 빠르게 동작하는 것으로 나타났다. 전반적으로 GPU 연산이 가장 적은 소요시간을 기록했으며 CPU+GPU가  그 다음으로 나타났다. 이러한 결과를 통해, 파라메트릭 알고리즘을 활용한 점군 조회와 투영 연산을 수행할 경우, 연산의 생성 영상 크기와 활용하는 점군의 옥트리 규모에 따라 CPU, GPU 혼용 비율을 최적화하고 이를 기준으로 한 알고리듬의 활용하는 것이 효율적임을 확인할 수 있다.

Table 10. Elapsed time for different image sizes

OGCSBN_2018_v34n6_1_1009_t0010.png 이미지

Fig. 7은 512×512 영상 크기에서 (1)전체 데이터에 대한 투영을 통해 선택된 지점과 (2)현된 알고리듬을 통해 선택된 데이터를 z축 상단에서 비교한 영상이다. 전체 데이터에 대한 투영의 경우, 총 399,883개 점군이 선택되어 영상에 투영되었으며 Fig. 7 왼쪽에서 확인할 수 있듯이 실세계의 구조적 특징으로 인해 원점에서 볼 수 없는 지점의 정보(1, S2, S3, S4)가 투영 영상에 포함되어 있는 것을 확인 할 수 있다. 반면, 알고리듬을 통해 선택된 지점 수는 219,534개로 약 18만 개의 지점 생략이 이루어진 것을 확인할 수 있다.

OGCSBN_2018_v34n6_1_1009_f0007.png 이미지

Fig. 7. Selected points by regular projection (a) and by GPU-based octree (b).

Fig. 9는 512×512 크기로 20 cm 간격의 옥트리와 파라메트릭 알고리듬 적용 결과를 전체 데이터에 대한 투영 및 동일지역의 파노라마 영상과 비교한 것이다. 왼쪽이 단순 투영, 가운데가 옥트리를 활용한 투영, 오른쪽이 파노라마 영상이다. 단순 투영된 영상의 경우, 첫 번째, 세 번째, 네 번째 행의 건물면을 보면 실제 영상과 상이한 건물 뒷면의 지점 정보가 투영된 것을 확인할 수 있으며, 특히 첫 번째 파노라마 영상에서 나무에 의해 가려진 부분이 단순 투영에서는 확연히 나타난다. 이에 반해, GPU 기반 옥트리에 의해 투영된 영상은 잡음이 깨끗이 제거된 것을 확인할 수 있다.

OGCSBN_2018_v34n6_1_1009_f0009.png 이미지

Fig. 9. Regular projection (a), projection by GPU-based octree (b), and panorama image (c).

하지만 입력된 원점을 기준으로 노드를 탐지하는 만큼 원점에서 가까운 영역에 존재하는 단말노드의 경우, 2차원 영상에서 상대적으로 큰 비중을 차지하게 되는데 가까운 영역에 잡음이 존재할 경우, 검은색 빈 공간을 생성하는 단점을 보여준다(Fig. 9의 E1). 한편, (5)에서 제시한 바와 같이 원점에서 노드 중심점으로 이어지는 벡터를 활용할 경우, 노드 중심점은 해당 노드의 경계면이라 할 수 없으므로 Fig. 8와 같이 목표 노드에 도달하기 전 이웃 노드와 접촉해버려 탐지(Table 4의 4)로 판단해버리는 문제가 발생할 수 있다(Fig. 9의 E2).

OGCSBN_2018_v34n6_1_1009_f0008.png 이미지

Fig. 8. Early intersected nodes problems (red cubes : Intersected nodes, gray lines : vectors between origin and node centers).

E1의 경우, PCL의 CPU 옥트리에서 제시하는 Table 4의 10의 종료 조건에 최대 노드 탐지 개수를 지정하는 방안을 활용할 수 있으나 이는 원점-노드 중심점 벡터가 진행하는 방향에서 만나는 연속된 노드들이 같은 객체를 이루는 지점들로 구성된 노드가 아닌 경우, 본 연구에서 제안하는 잡음 제거의 효과를 감소시킬 수 있다. 따라서 탐지된 노드 점군의 개수 등 같은 추가적인 조건을 도입하는 기술 방안이 개발되어야 할 것이다. E2의 경우, 노드 점군이 이루는 평면의 법선 벡터와 만나는 노드의 표면 좌표를 활용하는 방법을 통해 해결할 수 있으나 노드를 구성하는 점이 최소 3개 이상 필요한 추가적인 문를 해결할 수 있는 심도 있는 연구가 진행되어야 할 것으로 사료된다.

5. 결론

본 연구에서는 PCL에서 제공하는 CPU 기반 옥트리와 GPU 기반 옥트리의 구조적 차이를 분석하고, 파라메트릭 알고리듬의 특성에 따른 GPU 옥트리 환경을 구현하여 9개 지역에서 관측된 라이다 데이터에 대해 임의의 위치에서 2차원 영상 투영 및 물리적 환경에 따른 성능 평가를 수행하였다. PCL에서 제공하는 GPU 기반 옥트리는 고정된 옥트리 깊이로 인해 동적 옥트리 구현이 불가능하고 트리 구성 방식에서 균일한 크기의 가지 노드를 생성하지 않아 파라메트릭 알고리듬에 활용하기에는 적합하지 않다고 판단되었으며, 이에 따라 CPU 기반 옥트리 내부 구조에 접근할 수 있는 직렬화 함수를 구현하고 얻어진 변수를 이용해 GPU에 적합한 옥트리 환경을 구성하였다. 이후 파라메트릭 알고리듬의 자식 노드 접근 방식 및 분기 조건을 대체하여 임의의 위치에서 네 방향의 2차원 영상을 제작하였다.

영상을 제작하는 과정에서 GPU 기반 옥트리 조회, GPU 및 CPU 기반 PCL 옥트리 조회, CPU 기반 옥트리 조회로 범주를 나누어 소요 시간 비교를 수행한 결과, 전반적인 속도는 GPU, GPU 및 CPU, CPU 순서로 빠르게 동작하는 것을 확인하였다. 전체 연산 과정을 고려하였을 때 옥트리 입력 변수에 영향을 주는 영상 크기와 옥트리 규모에 따라 GPU와 CPU의 혼용 여부를 결정하고 작업을 수행하는 것이 효율적일 것이다. 제작된 영상을 3차원 지점과 2차원 영상의 측면에서 비교한 결과, 구현된 알고리듬을 활용하는 것이 모든 지점에 대한 단순 투영을 하는 것보다 실세계 환경를 반영해 잡음을 제거하는 것으로 확인되었다. 하지만 원점과 목적 노드 사이에 존재하는 잡음에 따라 일부 지점 정보가 생략되거나 노드 중심점과 원점 사이에 존재하는 접촉 노드의 존재에 따라 일부 탐지가 생략되는 문제가 발생하였다. 이를 위해 향후에는 옥트리 구조뿐만 아니라, 목적 노드을 구성하는 지점의 수와 이를 활용한 법선 벡터 등 추가적인 기하학 정보를 활용한 개선 연구가 진행되어야 할 것으로 사료된다.

References

  1. Kim, J., K.-K. Kwon, and S.-I. Lee, 2012. Trends and applications on LiDAR sensor technology, Electronics and Telecommunications Trends, 27(6): 134-143.
  2. Lee, S., J. Lee, S. Han, J. Choi, and Y. Kim, 2011. Object-based building change detection from LiDAR data and digital map using adaptive overlay threshold, Journal of the Korean Society for Geospatial Information Science, 19(3): 49-56 (in Korean with English abstract).
  3. Han, D., K. Yu, and Y. Kim, 2012. Georegistration of airborne LiDAR data using a digital topographic map, Journal of the Korean Society of Surveying, Geodesy, Photogrammetry and Cartography, 30(3): 323-332 (in Korean with English abstract). https://doi.org/10.7848/ksgpc.2012.30.3.323
  4. Han, S., 2013. Multi-core-based parallel query of 3D point cloud indexed in octree, Journal of the Korean Society of Surveying, Geodesy, Photogrammetry and Cartography, 31(4): 301-310 (in Korean with English abstract). https://doi.org/10.7848/ksgpc.2013.31.4.301
  5. Elseberg, J., D. Borrmann, and A. Nuchter, 2013. One billion points in the cloud: An octree for efficient processing of 3D laser scans, ISPRS Journal of Photogrammetry and Remote Sensing, 76: 76-88. https://doi.org/10.1016/j.isprsjprs.2012.10.004
  6. Meagher, D. J. R., 1980. Octree encoding: A new technique for the representation, manipulation and display of arbitrary 3-D objects by computer, Electrical and Systems Engineering Department Rensseiaer Polytechnic Institute Image Processing Laboratory, Troy, NY, USA.
  7. Morton, G. M., 1966. A computer oriented geodetic data base and a new technique in file sequencing, International Business Machines Co., Ottawa, ON, Canada.
  8. Nvidia, 2018. CUDA C programming guide, https://docs.nvidia.com/cuda/cuda-c-programming-guide, Accessed on Sep. 6, 2018.
  9. PCL, 2018. PCL documentation, http://pointclouds.org/documentation, Accessed on Sep. 6, 2018.
  10. PCL, 2018. PCL Source codes, https://github.com/PointCloudLibrary/pcl, Accessed on Sep. 6, 2018.
  11. Revelles, J., C. Urena, and M. Lastra. 2000. An efficient parametric algorithm for octree traversal, Journal of WSCG, 8(2): 212-219.
  12. Rusu, R. B. and S. Cousins, 2011. 3D is here: Point Cloud Library (PCL), Proc. of 2011 IEEE International Conference on Robotics and automation, Shanghai, May 9-13, pp. 1-4.
  13. Shen, J., J. Liu, R. Zhao, and X. Lin, 2011. A kd-treebased outlier detection method for airborne LiDAR point clouds, Proc. of 2011 International Symposium on Image and Data Fusion, Tenchong, Yunen, Aug. 9-11, pp. 1-4.
  14. Vo, A. V., L. Truong-Hong, D. F. Laefer, and M. Bertolotto, 2015. Octree-based region growing for point cloud segmentation, ISPRS Journal of Photogrammetry and Remote Sensing, 104: 88-100. https://doi.org/10.1016/j.isprsjprs.2015.01.011
  15. Wolcott, R. W. and R. M. Eustice, 2014, Visual localization within lidar maps for automated urban driving, Proc. of 2014 IEEE International Conference on Intelligent Robots and Systems, Chicago, IL, Sep. 14-18, pp. 176-183.