TensorFlow Graphicsは3Dメッシュに対してCNNを適用できるようにするフレームワークです。従来、TensorFlowで3Dメッシュを扱う場合は、ボクセルに変換して扱っていました。TensorFlow Graphicsでは、新たに、微分可能レンダラと、メッシュに対するGraph Convolutionを実装することで、3Dメッシュをそのまま扱えるようにしています。mesh_segmentationによる3Dメッシュの各ポリゴンへのラベリングなど、今までできなかった処理が可能になります。

従来のコンボリューションは2D画像に対して適用していました。

cat_image_convolutions

グラフコンボリューションでは、3Dメッシュの頂点に連結している頂点に対して重みをかけて畳み込みを行います。畳み込みを行うと、チャンネル方向に3Dメッシュが増殖していくイメージになります。

cat_mesh_convolutions

グラフコンボリューションによって、3Dメッシュの部位ラベルの付与が可能になります。

mesh_segmentation

頂点と頂点の接続関係はマトリックスで定義します。頂点iと頂点jが接続されている場合、A[i,j]に値が入ります。性質上、対角には必ず値が入ります。

A[i, j] = w[i,j] if vertex i and vertex j share an edge,
A[i, i] = w[i,i] for each vertex i,
A[i, j] = 0 otherwise.
where, w[i, j] = 1/(degree(vertex i)), and sum(j)(w[i,j]) = 1

モデルデータは、頂点列とポリゴンを構成する頂点ID、頂点の接続情報から構成され、tfrecordsに格納されます。fbxなどからの変換ツールはまだリリースされていません。(3D format to .tfrecords

それでは、MacにTensorFlow Graphicsをインストールしてみます。

TensorFlow Graphicsをインストールします。

pip3 install tensorflow-graphics

Jupyter Notebookをインストールします。

pip3 install jupyter

Colabtoolsをインストールします。

git clone https://github.com/googlecolab/colabtools.git
cd colabtools
python setup.py install

Colabtoolsをインストールしていない場合は、threejsを使ったモデルビューワで下記のエラーが発生します。

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
     19     'vertex_colors': mesh_viewer.SEGMENTATION_COLORMAP[test_labels[0, ...]],
     20 }
---> 21 input_viewer = mesh_viewer.Viewer(input_mesh_data)

/usr/local/lib/python3.7/site-packages/tensorflow_graphics/notebooks/mesh_viewer.py in __init__(self, source_mesh_data)
     56 
     57   def __init__(self, source_mesh_data):
---> 58     context = threejs_visualization.build_context()
     59     self.context = context
     60     light1 = context.THREE.PointLight.new_object(0x808080)

/usr/local/lib/python3.7/site-packages/tensorflow_graphics/notebooks/threejs_visualization.py in build_context()
     72   """Builds a javascript context."""
     73   threejs_url = 'https://www.gstatic.com/external_hosted/threejs-r98/'
---> 74   _publish.javascript(url=threejs_url + 'three.min.js')
     75   _publish.javascript(url=threejs_url + 'examples/js/controls/OrbitControls.js')
     76   return _js_builder.Js(mode=_js_builder.PERSISTENT)

NameError: name '_publish' is not defined

サンプルをcloneします。

git clone https://github.com/tensorflow/graphics.git

サンプルを実行します。

cd tensorflow_graphics
cd notebooks
jupyer notebook

notebooks/mesh_segmentation_demo.ipynbがmesh_segmentationの推論サンプルです。まだ学習側のコードは公開されていませんが、ディープラーニングの応用例が3Dにまで広がっていく未来が楽しみです。

notebooks/spherical harmonics optimization.ipynbが球面調和ライティングの環境マップを計算するサンプルです。TensorFlow Graphicsに含まれる微分可能レンダラーを使用することで、与えられた画像から、環境マップテクスチャを推定します。

学習の推移です。

spherical_harmonics2

学習結果のテクスチャです。

spherical_harmonics3

TensorFlow Graphicsの概要動画です。