2020年05月14日

Mitsuba2のテスト その5

テクスチャの学習ができるということで、今回は画像や写真を用意して、それっぽい見た目にできるかどうか試してみることにしました。以前使ったheadモデルをレンダリングした結果が、2次元の参照画像に近づくようにテクスチャを更新していくというものです。

mitsuba2_update_texture_004.png mitsuba2_update_texture_003.png
     (左)レンダリング画像           (右)参照画像

参照画像は、FaceRigの画像を使用させていただきました。目的外利用の気もしますので、問題があればお知らせください。

手順としては、以前は普通にレンダリングしたものを参照画像にして、テクスチャを白に初期化して学習していくという流れでしたので、参照画像を差し替えただけです。画像は普通にjpgをPILを使って読込み、numpyのarrayに変換しました。

実行結果

mitsuba2_update_texture_005.png

きちんと学習できていることが確認できました。更新後のテクスチャは下記のようになっています。
mitsuba2_update_texture_006.png

MeshLabで確認すると、ボディペイントに失敗した人みたいになっています。

mitsuba2_update_texture_001.png mitsuba2_update_texture_002.png

以下コード全体です。
head.html


posted by シンドラー at 22:45| Comment(0) | Rendering | 更新情報をチェックする

2020年04月25日

Mitsuba2のテスト その4

Mitsuba2のシーンファイルはXMLを使用していて、視点の調整などがちょっと面倒です。他のレンダラも同じような感じだったので、昔Appleseed Renderer用のXMLを出力するプログラムを作っていたので、それを参考にMitsuba2用のXMLを出力するものを作ってみました。

モデルの注意点として、shapeタグはobj, ply, serializedなどに対応していますが、1つのオブジェクトに複数マテリアルが含まれる場合は、serialized形式でないと駄目なようです[1]。serializedを使えばいいのかもしれませんが、以前他のレンダラ用に、マテリアルごとにobjを分割するプログラムを書いていたので、ちょっとファイルが増えてしまいますが、今回は分割して対応することにしました。

もう一つはテクスチャのアルファチャンネルの取り扱いで、普通にテクスチャを割り当てただけでは、透明度が反映されません。Mitsuba2では、BSDFにOpacity maskが用意されており、これを使うことで透明度を反映させることができました[2]。

mitsuba2_miku_004.png
[2]より引用

emitterに関しては、環境マップとしては1個しか設置できませんが、shapeにemitterを持たせて光源として扱うことはできます。今回、環境マップと、constant光源を試してみました。他にもareaやpointも指定できます[3]。

実行結果

あぴみくさんのモデルを使用させていただきました。GUI上で視点の変更や光源の種類などを設定して、XMLを出力・そのデータをMitsuba2でレンダリングして表示するツールを作ってみました。

mitsuba2_miku_001.png
自前でレンダリングしたもの(ほぼテクスチャ色+Phong)

mitsuba2_miku_000.png
環境マップ+ガンマ補正

mitsuba2_miku_002.png
constant光源

mitsuba2_miku_003.png
constant光源+ガンマ補正

また横道にそれて微分可能レンダリングのテストが進んでないですね…。

[1] https://mitsuba2.readthedocs.io/en/latest/generated/plugins.html#multiple-shapes
[2] https://mitsuba2.readthedocs.io/en/latest/generated/plugins.html#opacity-mask-mask
[3] https://mitsuba2.readthedocs.io/en/latest/generated/plugins.html#emitters
posted by シンドラー at 21:53| Comment(0) | Rendering | 更新情報をチェックする

2020年04月13日

Mitsuba2のテスト その3

続きです。まずは[1]の後半部分(環境マップの学習)です。これは前回のものができていればほぼそのままなので特に問題なかったです。

実行結果等
mitsuba2_bunny.html

環境マップの学習もいいですが、テクスチャマップの学習を試してみたいと思いました。サンプルデータとして、Pytorch3Dのcow_meshモデルを使用させていただきました。

1. xmlファイルの書き換え
[1]のbunny.xmlをコピーして、cow_mesh.xmlに書き換えます。今回、テクスチャを使いたかったので、[2]を参考に、shapeの部分を下記のように書き換えました。

変更前
  <shape type="ply">
    <string name="filename" value="bunny.ply"/>
    <bsdf type="conductor"/>
  </shape>
変更後
  <texture type="bitmap" id="myImage">
    <string name="filename" value="cow_texture.png"/>
  </texture>

  <bsdf type="diffuse" id="myMaterial">
    <ref name="reflectance" id="myImage"/>
  </bsdf>

  <shape type="obj">
    <string name="filename" value="cow.obj"/>
    <ref id="myMaterial"/>
  </shape>
conductorが金属反射っぽいですが、もしかするとここにテクスチャを設定できたかもしれません。

2. 学習パラメータの変更
  # 微分可能なシーンパラメータを探す
  params = traverse(scene)
  print(params)
上記でパラメータ一覧を確認できます。今回、マテリアルの画像データ(myMaterial.reflectance.data)を学習パラメータとしました。他は特に変更していないかと思います。

実行結果等
mitsuba2_cow.html

一応予定通り、見えている部分のテクスチャだけ学習できています。ノイズも学習しているっぽいので、もうちょっとレイの数を増やした方が良さそうです。視点を色々変えて描画すればテクスチャ全体の学習もできそうですので、次回ぐらいに試してみたいと思います。

[1] 最新物理ベースレンダラー Mitsuba2を触ってみる (3) 微分可能レンダリング編
[2] Mitsuba Documentation Version 0.5.0 (pdf)
posted by シンドラー at 21:21| Comment(0) | Rendering | 更新情報をチェックする

2020年04月12日

Mitsuba2のテスト その2

[1]を参考にさせていただき、微分可能レンダリングを試そうとしたのですが、OptiXでエラーが出ました。試しにOptiXのSDK-precompiled-samplesのプログラムを動かしてみたのですが、エラーが出て動きませんでした。色々試してみましたが結局駄目っぽかったので、グラフィックドライバを入れなおしたら動くようになりました。後はexrとかtbbなどaptで古いライブラリをインストールしていると、ninjaでビルドした時にリンクエラーが出て困りました。

今回は[1]の前半の、反射率の最適化を試しました。jupyter notebook上で行っているので、ファイルに出力するのではなくmatplotlibで表示して確認しました。Bitmapクラスの使い方が良くわからなかったのですが、適当にnumpyに変換してreshapeしたらうまくいったようです。

実行結果等
10_inverse_rendering.html

今回はOptiXのエラーであまり進みませんでしたが、次回後半の方を試してみたいと思います。

[1] 最新物理ベースレンダラー Mitsuba2を触ってみる (3) 微分可能レンダリング編
posted by シンドラー at 23:17| Comment(0) | Rendering | 更新情報をチェックする

2020年04月11日

Mitsuba2のテスト

というわけで、Mitsuba2[1]を試してみることにしました。参考サイト[2]はWindows環境でしたので、こちらはUbuntu18.04で試したメモです。

1. ソースコードのクローン
  $ git clone --recursive https://github.com/mitsuba-renderer/mitsuba2
2. 環境作成(jupyter notebookを使うのでconda環境を準備)
  $ conda create -n mitsuba2  python=3.7
  $ conda activate mitsuba2
3. aptで必要なパッケージのインストール
  $ sudo apt install clang-9 libc++-9-dev libc++abi-9-dev cmake ninja-build
  $ sudo apt install libz-dev libpng-dev libjpeg-dev libxrandr-dev libxinerama-dev libxcursor-dev
  $ sudo apt install python3-dev python3-distutils python3-setuptools
  $ sudo apt install python3-pytest python3-pytest-xdist python3-numpy
  $ sudo apt install python3-sphinx python3-guzzle-sphinx-theme python3-sphinxcontrib.bibtex
4. ビルド前の設定
  $ export CC=clang-9
  $ export CXX=clang++-9
  $ export CUDACXX=/usr/local/cuda/bin/nvcc
5. ビルド準備
  $ cd mitsuba2
  $ mkdir build
  $ cd build
6. 微分可能、偏光レンダリングの追加
  $ vi ../mitsuba.conf
  "enabled":に下記を追加
  "scalar_rgb_polarized",
  "gpu_autodiff_rgb"
7. OptiXのインストールと設定。Mitsuba2では6.5.0を使用しているようだったので、NVIDIAからダウンロード→/usr/local/OptiX6.5.0にインストール
8. CMakeとninja?でビルド
  $ cmake -GNinja -DMTS_OPTIX_PATH=/usr/local/OptiX6.5.0 ..
  $ ninja
/usr/bin/ld: -lcudaが見つかりませんというエラーが発生
力技で解決(本来はclangのライブラリパスを追加すればいいはず)
stubにあるファイルを/usr/local/libなどに置くとまずいようです。Kernel Deadになってしまうのでやめた方が良さそうです。
  $ sudo cp /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/lib64
  $ ninja
9. パスの有効化
  $ cd ..
  $ source setpath.sh
10. シーンデータのダウンロードと動作テスト
  $ git clone https://github.com/mitsuba-renderer/mitsuba-data.git
  $ cd mitsuba-data/scene/cbox
  $ mitsuba -m scalar_rgb_polarized cbox-rgb.xml
  $ mitsuba -m scalar_spectral_polarized cbox-spectral.xml
11. jupyter notebook用のライブラリをインストール/起動
  $ conda install pytorch jupyter torchvision cudatoolkit matplotlib
  $ conda install -c conda-forge -c fvcore fvcore
  $ jupyter notebook
12. 実行結果

01_render_scene.html

ここまでで参考サイトの(2)までです。説明はそちらで詳しくされていますので省略です。次回は(3)の微分可能レンダリングを試してみたいと思います。

[1] Mitsuba2
[2] 最新物理ベースレンダラー Mitsuba2を触ってみる (1) 導入編
posted by シンドラー at 01:16| Comment(0) | Rendering | 更新情報をチェックする

2020年04月10日

PyTorch3Dのバージョンアップ

3月の更新を忘れていたら、PyTorch3Dが0.1.1にバージョンアップしていました[1]。
関数名なども一部変わっているので、色々書き直したりしています。
[2][3]のMitsuba2も面白そうなので、少し試してみたいですね。

[1] https://github.com/facebookresearch/pytorch3d
[2] https://github.com/mitsuba-renderer/mitsuba2
[3] 最新物理ベースレンダラー Mitsuba2を触ってみる (1) 導入編
posted by シンドラー at 00:07| Comment(0) | 日記 | 更新情報をチェックする

2020年02月28日

PyTorch3Dのテスト その5

GANも考えてはいますが、まずは単純なCNNということで、アンチエイリアスの学習でも試してみようかと思います。前回は0~360度まで等間隔で20視点からレンダリングしましたが、基準の角度に正規乱数を加えてレンダリングして、その平均をとることでアンチエイリアスを行って、原画像とアンチエイリアス画像のセットでCNNを学習させてみようかなという感じです。

前回からの変更点は、下記の通りです。

1. tqdmを追加してプログレスバーを表示
2. カメラの設定を、initからforwardに移動
3. 全描画回数とバッチサイズを分けて、各ループでカメラ生成/レンダリングを繰り返すように変更
4. ↑でレンダリングした結果を1枚の画像に足し込む
5. 最後に全描画回数で割って平均画像を保存

バッチ数を大きくしすぎるとGPUのメモリが足りなくなるので、1000回の平均をとりたい場合は、バッチサイズ20×50セットという形にしました。1セット(20視点で1024x1024のレンダリング)に1秒ちょっとぐらいかかりました。

メモ:
正規乱数のTensor生成:torch.normal(torch.zeros(self.batch_size), self.std)
0~1の一様乱数でRGBA画像を初期化:torch.rand(self.image_size, self.image_size, 4)
Tensor→numpy:b = a.numpy()
numpy→tensor:a = torch.from_numpy(b)
cpu→device:value.to(device)
device→cpu:value.cpu()

実行結果

average_org.png
原画像

average_0.2_1000.png
標準偏差0.2、1000回平均

average_1.5_1000.png
標準偏差1.5、1000回平均

average_5.0_1000.png
標準偏差5.0、1000回平均

原画像はギザギザですが、平均画像でアンチエイリアスができているのが確認できます。標準偏差5まで増やすとブレがひどくなります。今回、基準の角度は固定しましたが、ここも乱数にして色々な角度から見た原画像と平均画像のセットを学習用画像として準備しようかなと思います。

以下コードです。
pytorch3d_render_obj2.html
posted by シンドラー at 22:38| Comment(0) | Machine Learning | 更新情報をチェックする

PyTorch3Dのテスト その4

生成したobjの確認などが面倒だったので、objファイルを20視点から表示して保存するだけのプログラムを作ってみました。基本的にはチュートリアルの内容を簡潔にまとめたのと、Phongシェーダのためかどうかわかりませんが、テクスチャ画像やUV座標がないobjをレンダリングしようとするとエラーが出たので、テクスチャが無いモデルについてはダミーの白一色のテクスチャ画像を読み込んで、適当にテクスチャ座標を設定するようにしてみました。

実行結果

形状変形のチュートリアルで生成されたイルカを表示した結果です。

tile_image.jpg

以下コード
pytorch3d_render_obj.html

何か面白い使い道は…やっぱりGAN系ですかね…。
posted by シンドラー at 01:05| Comment(0) | Machine Learning | 更新情報をチェックする

2020年02月21日

PyTorch3Dのテスト その3

前回の続きです。今回は3つ目のチュートリアルであるRender textured meshes[1]です。

・.objの読込み
・光源やカメラ位置の変更
・バッチ処理を使って異なる視点を一度に描画

今後改良されるとは思いますが、objのローダがテクスチャ1枚のモデルにしか対応していないみたいなことが書かれていました。なので、今回はついでにテクスチャを横一列に並べて、テクスチャ座標を更新するプログラムを別途作りました。

もう一点、読み込んだテクスチャがRGB3チャンネルになっていましたので、透過処理は対応していない気がします。

実行結果

opencv_concat_tile.jpg

[2]のモデルを使用させていただきました。透過処理ができていないところがピンク色になってしまっています。

以下改変したコードです。
pytorch3d_rendertexture.html

[1] Render a textured mesh
[2] https://3d.nicovideo.jp/works/td1586
posted by シンドラー at 19:52| Comment(0) | Machine Learning | 更新情報をチェックする

2020年02月20日

PyTorch3Dのテスト その2

前回の続きです。今回は[1]のDeform a source mesh to form a target mesh using 3D loss functionsサンプルです。前回と似ている部分も多かったので、分かりやすかった気がします。

画像を見たところ、ポイントクラウドを使っているようでしたので、メッシュじゃなくてポイントクラウドの変形かと思ったのですが、lossの一つにchamfer_distanceというものがあり、これを使うために、メッシュの表面からポイントクラウドをサンプリングしているだけで、変形元も変形先もポリゴンメッシュでした。

他のポイントとしては下記のような点かと思います。
・変形の方法としては、元の形状の頂点座標に、オフセットとして変位を加算することで行う
・学習するパラメータは上記のオフセット値で、点群間の誤差が小さくなったり、スムーズな形状の誤差などを目的関数として最適化
・最適化手法はSGDを使用

dolphin.png
左:球から変形させたもの 右:元の対象メッシュ

それなりに近づいていますが、ちょっと丸っこい気もします。重みのパラメータを調整すれば改善できるかもしれません。

今回は、変形元の球と対象のイルカの両方とも頂点数が同じでしたが、今回の手法であれば違っていてもできそうなので、別のメッシュで少し試してみようかと思います。後は、LoDのような頂点数が変わるような学習の方法も少し調べてみたいかなとは思います。

前回同様、ちょっと追記したものです。
pytorch3d_test_002.html

[1] Deform a source mesh to form a target mesh using 3D loss functions

posted by シンドラー at 00:40| Comment(0) | Machine Learning | 更新情報をチェックする