HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

PyVistaでjupyter notebookに3D画像を表示する

この記事は Calendar for UdonTech Advent Calendar 2021 | Advent Calendar 2021 - Qiita の3日目の穴埋め記事です。

pyvistaとは

pyvistaとはpythonでVTKを扱うためのモジュールです。 "VTK for humans" という素晴らしい響きのキャッチフレーズが全てを表わしているんじゃないでしょうか。

docs.pyvista.org

VTKというのは、数値計算業界ではデファクトスタンダードとなっている*1可視化用のファイルフォーマットと、それを扱うためのToolkitです。たぶんComputer Visionの人達には、ポイントクラウドレンダリングに使ってるやつとして親しまれてるんじゃないでしょうか。*2

VTKの可視化の例を知りたい方は、こちらのギャラリーをご覧ください。

vtk.org

pyvistaを使うとこれが人間にも簡単に扱えるということに加えて、jupyter notebookでのレンダリングもできるということのようなので、今日はこれを試してみたいと思います。

Jupyter Notebook Plotting — PyVista 0.32.0 documentation

テスト環境

  • MacBook Air (M1, 2020)
  • macOS Monterey 12.1
  • jupyter lab desktop app version 3.2.5-2
  • conda 4.11.0

インストール

condaでpyvista本体をインストールします。

conda install -c conda-forge pyvista

続けてjupyterから使うためのモジュールがいくつか用意されているので、とりあえずかたっぱしから入れてみます。ただし、ipyganyについては

Currently, this backend has inferior support and features than the pythreejs.

とのことなのパスで。

また、itkwidgetsも

JupyterLab 3 support is not yet available. JupyterLab 2 or the Jupyter Notebook are possible alternatives.

とのことなのでパスしました。

pythreejs

conda install -c conda-forge pythreejs

panel

conda install -c conda-forge panel 

ipyvtklink

conda install -c conda-forge ipyvtklink

この3つはどう違うかというと

pythreejs - three.jsを使ってクライアントサイドでレンダリング

panel - vtk.jsを使ってクライアントサイドでレンダリング

ipyvtklink - サーバサイドのPyVistaを使ったレンダリング結果をノートブックへストリーミング

ということのようです。

インタラクティブにやるなら、pythreejs, 重いデータでjupyter labのサーバとクアイアントの距離が離れてる時(colabを使う時とか?)は、ipyvtklinkの方が有利になりそうですね。

まーぶっちゃけうちの環境(jupyter lab desktop app)なら、サーバサイドかクライアントサイドかの違いは大差無いはずなので、レンダリングエンジン(threejs, vtk.js or vtk)の違いだけですね。

バックエンドの切り替え方法

Jupyter Notebook Plotting — PyVista 0.32.0 documentation

set_jupyter_backend()を使って、事前に設定しておくか、plot時にjupyter_backend引数から渡せば良いみたいです。

実際に表示してみる。

pythreejsのサンプルとして載っているこちらのコードを使って、jupyter_backend引数を変えて各レンダリングエンジンで同じものを表示してみました。

import pyvista as pv
from pyvista import examples
# download an example and display it using physically based rendering.
mesh = examples.download_lucy()
mesh.plot(color='lightgrey', pbr=True, metallic=0.2,
          jupyter_backend='pythreejs')

pythreejs f:id:n_so5:20211228082644p:plain

panel *3 f:id:n_so5:20211228082658p:plain

ipyvtklink f:id:n_so5:20211228082713p:plain

画像のサイズがバラバラですが

  • pythreejs -> コード部まで含めて画面の高さに合わせる
  • panel -> 画面の幅に合わせる。高さはモデルのサイズに合わせる?(固定値かも)
  • ipyvtklink -> 表示部と画面の高さを合わせる

という挙動のようにみえます。

まず、操作性に関してですが、pythreejs、panelと比べるとipyvtklinkは格段に落ちます。 まさにparaviewなりfieldviewなりの可視化ソフトでリモート可視化をしている時の感覚に近いです。 データもレンダリングもローカルマシンでやっててこの操作感はちょっと辛い

表示品質は

  • pythreejs -> "キレイ"すぎて使えない
  • panel -> ごく普通(当然のことだけどparaviewと同じレベル)

といった感じです。

オプションをいじれば、また違ってくるとは思うんですが、なんかpythreejsの陰影の付け方が見映え重視のようで、これに物理量の表示を重ねたりするとちょっと見辛そうな感じがします。

ローカルにあるファイルの表示

前の例では、PyVistaが用意しているサンプルファイルをダウンロードしてきて表示しましたが、PC内にあるファイルを表示するケースの方が多いんじゃないでしょうか。

とりあえず、HPC業界内の超有名モデルをダウンロードして、表示してみました。

develop.openfoam.com

f:id:n_so5:20211228231056p:plain

彼はobjファイルとして配布されていますが、PyVista.read()で簡単に読めます!! 一応コードも書いておきますが、たったの3行です。

import pyvista as pv
mesh=pv.read('motorBike.obj')
mesh.plot(color='lightgrey', jupyter_backend='panel')

続いて、STLファイルが読めるか確認してみましょう。 データは国土地理院が配布している、香川県STLファイルを使います。

立体地図(触る地図サンプル・県別の立体模型)

こちらのページからSTLファイルをダウンロードして表示します。

f:id:n_so5:20211229003813p:plain

なんか凄い向きなんで、調整してみましょう。

mesh.rotate_x(-45)
mesh.rotate_y(180)
mesh.rotate_z(-45)
mesh.plot(color='lightgrey', jupyter_backend='panel')

f:id:n_so5:20211229005831p:plain

ドキュメントによると、STLとOBJ以外にも、BYUファイルというのと(当然ながら)VTKファイルも扱えるようです。

docs.pyvista.org

シミュレーションの実行結果ファイルがあれば、スライスを切ってコンターを描いたりなんて処理もjupyter lab上でできるようなので、レポート作成が捗りそうですね。

まとめ

Jupyterlabとpandas, matplotlib, PyVistaがあればたぶん私の仕事の報告資料全部作れる予感・・・

*1:個人の見解です

*2:という話を10年くらい前のうろ覚えの知識で書いてからぐぐったらVTK遅すぎるから他のに変えようぜ的な話がみつかりましたが・・・

*3:オプションにpbr=True, metallic=0.2って入ってますがpythreejsのオプションを消し忘れただけで、pnelでは無視されます。