Open3D Library Review

Dong-Won, Shin
8 min readFeb 4, 2018

--

최근에 Intel Labs에서 3차원 데이터 처리를 위한 Open3D라는 오픈소스 라이브러리를 릴리즈 했습니다.
github: https://github.com/IntelVCL/Open3D
paper: http://www.open3d.org/paper.pdf

2차원 영상 처리에는 OpenCV가 있고, 딥러닝 분야에는 tensorflow, pytorch, keras 등 다양한 라이브러리가 포진해있으나 3차원 데이터 처리에는 다른 것들 만큼 활용가치가 높은 라이브러리를 찾기 어려웠습니다.

기존에 PCL (Point Cloud Library)이라는 오픈소스 라이브러리가 있긴 했지만 dependency가 많아서 컴파일하는 것부터 좀 힘들고 사용하기 다소 어려운(?) API 인터페이스를 가지고 있어서.. 잘 활용되고 있지는 않았었죠..

그러던 차에 Open3D의 릴리즈 소식을 우연히 접하고 나서 논문을 읽고 일단 1번 감탄했고 실제 설치와 테스트를 해보면서 2번을 감탄했습니다ㅎㅎ 제가 감탄한 Open3D 라이브러리의 몇가지 key feature들을 소개 해드리고자 이 글을 쓰게 되었습니다ㅎ 개인적인 사견이 포함되어 있으니 감안해주시고 읽어주시면 감사하겠습니다 ㅎ

(1) 컴파일이 쉽다.

쉬워도 너무 쉽습니다. 저는 일단 ubuntu 16.04에서 테스트를 진행했습니만 windows와 MAC에서도 컴파일이 가능합니다. document에서 소개하는 바대로 github 저장소를 내려받은 다음, dependency를 위한 쉘스크립트를 실행해주고, cmake후 make하면 끝입니다. PCL을 설치할때는 dependency가 훨씬 더 많고 (기능이 더 많아서 그런것일지도 모르겠습니다..ㅎ) 특히 VTK관련해서 에러가 많이 났었던 것으로 기억해서.. 설치하는데 시간을 많이 잡아먹었었는데 그러한 부분에서 드는 노력을 많이 줄여주었습니다.

그러한 배경에는 외부 dependency를 줄이고 내부적인 구현을 늘린 것에 있다고 할수 있습니다. 논문에서 관련된 부분을 인용하자면 아래와 같습니다.

We carefully chose a small set of lightweight dependencies, including Eigen for linear algebra [9], GLFW for OpenGL window support, and FLANN for fast nearest neighbor search [14]. For easy compilation, powerful but heavyweight libraries such as Boost and Ceres are excluded. Instead we use either lightweight alternatives (e.g., pybind11 instead of Boost.Python) or in-house implementations (e.g., for Gauss-Newton and Levenberg-Marquardt graph optimization).

컴파일 후에 몇가지 튜토리얼을 테스트 해봤는데 문제없이 잘 실행되는 것을 확인할 수 있었습니다.

Point-to-Plane ICP
Pose graph optimization
Mesh rendering

튜토리얼도 python파일로 잘 구현되어있고 document도 웹에 잘 정리되어 있어서 그 부분도 점수를 주고 싶습니다.

(2) Python 바인딩

Open3D는 딥러닝 라이브러리들 처럼 실제 계산을 수행하는 부분은 C++로 작성이 되어있고 API부분은 python으로 바인딩 되어 있어서 쉽고 간편하게 프로그램을 작성할수 있습니다. import py3d 명령어 하나면 Open3D의 모든 함수들을 사용할수 있습니다. 또한 선형대수 계산 라이브러리인 numpy와도 잘 연동이 되어 행렬 데이터 처리의 간편함을 그대로 사용할수 있습니다. 아래는 3차원 포인트 클라우드를 불러와서 downsampling과 normal estimation을 수행한 코드를 보여줍니다.

동일한 작업을 하는 코드를 PCL의 c++코드로 작성했을때 보다 Open3D의 c++과 python코드로 작성했을 때 훨씬 간결해진 것을 확인할수 있습니다. (PCL도 python 바인딩을 제공합니다만 공식적인 것이 아니고 코드의 양도 PCL의 C++코드로 구현했을때와 비슷하게 필요합니다.)

또한 jupyter notebook을 이용해서 인터랙티브한 환경에서 코드 수정과 디버깅을 할수 있다는 장점도 있습니다.

(3) OpenMP를 이용한 병렬 계산 처리 및 속도 최적화

Backend를 C++로 구현했다고 해도 3차원 데이터 처리는 그 계산량이 어마어마 하기때문에 빠른 속도를 기대하기 어렵습니다. 따라서 Open3D에서는 OpenMP를 이용하여 병렬화를 적용하였고 그에 따른 속도 향상을 도모하였습니다. 관련된 부분을 논문에서 인용하자면 다음과 같습니다.

For each major function, we used profiling tools to benchmark the execution of key steps. This analysis accelerated the running time of many functions by multiplicative factors. For example, our optimized implementation of the ICP algorithm is up to 25 times faster than its counterpart in PCL [18]. Our implementation of the reconstruction pipeline of Choi et al. [5] is up to an order of magnitude faster than the original implementation released by the authors.

(4) 입력 데이터 구조

Open3D에서는 point clouds, meshes, and RGB-D images의 3가지의 입력 데이터 구조를 갖습니다. 이 세가지 데이터 구조 모두 널리 사용되는 데이터 구조이며 각각에 대한 load와 write 함수도 다양한 형태로 구현되어 있습니다.

특이한 점은 RGB-D 데이터에 대한 데이터 구조가 정의되어 있다는 점인데 기존에 많이 사용되는 NYU, TUM, SUN3D, and Redwood의 데이터 셋에 대해서 간편하게 활용할수 있도록 함수구현을 마련해 놓았습니다. 논문에서 관련된 부분을 인용하자면 아래와 같습니다.

A pair of depth and color images of the same resolution can be combined into a data structure named RGBDImage. Since there is no standard depth image format, we have implemented depth image support for multiple datasets including NYU [19], TUM [20], SUN3D [21], and Redwood [5]. The following code sample reads a pair of RGB-D images from the TUM dataset and converts them to a point cloud.

결론

앞에서 설명드린 여러가지 장점들 덕분에 Open3D의 릴리즈가 저는 일단 개인적으로 환영할만한 일인것 같고 저의 SLAM 연구에도 적극적으로 활용해 볼 생각입니다. 장점만 너무 나열한 것 같아서 단점도 나열하고 싶지만 아직 Open3D를 깊게 분석하지는 않았기에 차후 더욱 내용을 이해하게 되면 업데이트를 하도록 하겠습니다. 앞으로 더 많은 사람들이 Open3D를 통해 3차원 데이터 처리를 간편하게 수행하고, 단점도 찾아서 보완하는 Open3D 오픈소스 생태계가 활성화 되었으면 좋겠습니다.

--

--