Learning Open3DTutorial上級編→ヘッドレス・レンダリング

Headless rendering

ヘッドレス・レンダリング

このチュートリアルでは、ディスプレイなしで端末から画像をレンダリングし保存する方法について説明する。

注意 この機能は実験的なもの。Ubuntu 16.04の環境でしかテストしていない。

Install OSMesa

OSMesaのインストール

ヘッドレス・コンテクストの生成にはOSMesaのインストールが必要である。

$ sudo apt-get install libosmesa6-dev

上記の方法を使わない場合、ソースファイルからOSMesaの最新版をダウンロードし、構築する:

# download OSMesa 2018 release
$ cd
$ wget ftp://ftp.freedesktop.org/pub/mesa/mesa-18.0.0.tar.gz
$ tar xf mesa-18.0.0.tar.gz
$ cd mesa-18.0.0/

# configure compile option and build
$ ./configure --enable-osmesa --disable-driglx-direct --disable-gbm --enable-dri --with-gallium-drivers=swrast
$ make

# add OSMesa to local path.
$ export PATH=$PATH:~/mesa-18.0.0

Install virtualenv

virtualenvのインストール

次にPythonの仮想環境を作る:

$ sudo apt-get install virtualenv python-pip
$ virtualenv -p /usr/bin/python3 py3env
$ source py3env/bin/activate
(py3env) $ pip install numpy matplotlib

このスクリプトは、py3envをインストールしてアクティブにする(プロンプトがpyenvになっている)。 numpymatplotlibが必要なモジュールなのでpy3envpipを用いてインストールする。

注意

Anacondaユーザーにはこの構成を使用することを勧める。というのは、conda install matplotlibOSMesaに基づかない追加モジュールをインストールするので、実行時にセグメンテーションエラーが発生するからである。

Build Open3D with OSMesa

OSMesaを用いてOpen3Dを構築

Open3Dを構築する。

(py3env) $ cd ~/Open3D/
(py3env) $ mkdir build && cd build

次のステップでは、指定する必要がある2つのcmakeフラグがある。

  • DENABLE_HEADLESS_RENDERING = ON:このフラグはglewglfwOSMesaを使用する必要があることを通知する。
  • DBUILD_GLEW = ON -DBUILD_GLFW = ON:ヘッドレスレンダリングはglew 2.1およびglfw 3.3-devバージョンでのみ機能することに注意。 ほとんどの場合、これらのバージョンは素のUbuntuシステムにはインストールされていない。これらのCMakeオプションを使用し、ソースからglew 2.1およびglfw 3.3-devを強制的にビルドする。

その結果、cmakeコマンドは次のようになる:

(py3env) $ cmake -DENABLE_HEADLESS_RENDERING=ON \
                 -DBUILD_GLEW=ON \
                 -DBUILD_GLFW=ON \
                 -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/python3 \
                 ..

ここで-DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/python3Install virtualenvで用いたのと同じパスとすること。

cmakeが成功すればmakefileが生成されるので、Open3Dを構築する: (CPUコアがたくさんあるマシンで作るなら-jオプションを使うべき)

(py3env) $ make # or make -j in multi-core machine

Test headless rendering

ヘッドレス・レンダリングの検証

最終段階として、震度と表面法線シーケンスを格納するPythonプログラムをテストする。

(py3env) $ cd ~/Open3D/build/lib/Tutorial/Advanced/
(py3env) $ python headless_rendering.py

これにより次のような出力が得られるはず:

Capture image 00000
Capture image 00001
Capture image 00002
Capture image 00003
Capture image 00004
Capture image 00005
:
Capture image 00030

レンダリングされる画像は~/Open3D/build/lib/TestData/depth~/Open3D/build/lib/TestData/imagesディレクトリにある

注意 headless_rendering.pypngファイル形式で保存する。 これには時間がかかる場合があるため、目的に合わせてスクリプトを調整しよう。

問題発生

glewglfwOSMesaと正しくリンクしなかった場合、次のエラーでクラッシュする可能性がある。

「GLFWエラー:X11:DISPLAY環境変数がありません。 GLFWの初期化に失敗しました』

その場合は-DBUILD_GLEW = ON-DBUILD_GLFW = ONフラグを指定してcmakeし直してみよう。

対話的な可視化            プロジェクトの例