2020年06月17日

PIFuHDのテスト

Twitterを見ていたら、PIFuHD[1]というものが流れてきましたので、試してみることにしました。Google Colaboratory上で動かせるようになっていてありがたいですね。サンプルそのまま動かして生成された.objの中身を見てみると、テクスチャ座標は出力されていませんでした。せっかくなので前回の手法でテクスチャを付けられないか試してみることにします。

1. UV展開
bff[2]を使用させていただきました。出力されたモデルをそのまま使うと警告が出てずっと終わらなかったので、MeshLab[3]のFilter→Cleaning and Repairingで適当にクリーニングして出力したものをbffにかけると、今度はすんなりUV展開できました。今回コマンドラインから実行したのですが、--normalizeUVsというオプションを付けないと1枚に収まらなかったような気がします。

PIFuHD_001.png

確認として[4]のUVマップ確認画像を使用させていただきました。

2. Mitsuba2[5]用のXML出力
こんなこともあろうかと?前回作成したXML出力のプログラムでは、目標画像を半透明表示する機能を追加して位置合わせができるようにしていました。カメラの位置も学習させるといいかと思いましたが、Mitsuba2だとPerspectiveCameraのパラメータに*が付いていなかったので、学習できないかもしれない(未確認)ので今回は手動です。

PIFuHD_002.png

一応レンダリングすると下記のような感じです。

PIFuHD_003.png

3. Mitsuba2で環境マップとテクスチャの学習
後はほぼ前回のhead.htmlと同様の処理ですが、違う点としてはテクスチャの学習だけではなく、環境マップも同時に学習しています。

# 微分したいパラメータを除いて、すべてのパラメータを破棄する
params.keep(['material_000.reflectance.data','my_envmap.data'])

実行結果

1000回学習した結果は下記のような感じです。まだ誤差は下がっているようなのでもうちょっと回しても良かったかもしれません。自前のGPU1枚しかない環境なのでSPP数を上げることができず、あまりきれいには学習できていません。後、視野角が小さい方が画像とモデルの一致率が高かったので、結構小さくしています。そのせいで環境マップの利用領域がものすごく狭くなっているので、こちらは殆ど学習できていません。
PIFuHD_005.jpg

学習後のテクスチャです。ジーパンっぽいところは分かりますが、他はほぼ白ですね。
PIFuHD_006.jpg

MeshLabで確認すると、手の部分も色がおかしいので、なかなか難しいです。環境マップも同時に学習しているので、肌色はそちらが学習してしまったのかもしれません。
PIFuHD_004.png

というわけで、前後2枚の写真があれば解像度は微妙ですがテクスチャ付きのモデルも作れそうかなといった感じでした。

以下Mitsuba2のコード
mitsuba2_pifuhd.html

[1] AIで1枚の人物写真から高精細3Dモデル作成 Facebookなど開発 - ITmedia
[2] Boundary First Flattening
[3] MeshLab
[4] UVマップ確認用テクスチャーの制作 - リカのきままなブログ
[5] Mitsuba 2
posted by シンドラー at 21:35| Comment(0) | Machine Learning | 更新情報をチェックする

2020年06月08日

Zoom配信の前処理について

新型コロナウイルスの影響でオンライン会議などが増えましたね。Zoomを使った会議などにそのままカメラを使うのも面白くないので、OpenCVで前処理をしてから配信を試してみることにしました。今回はFaceRig→OpenCV(C++)→OBS Studio→Zoomという流れです。 OBS StudioはPythonのScriptが使えますので、多分OpenCV(C++)は必要ないのですが、使い慣れた環境でやりたかったので間に挟みました。

1. FaceRigの使用
Steamで購入しました。Webカメラでもいいです。FaceRigの配信を他アプリから使用するためには、FaceRigのVirtual Camera Driverをインストールする必要があります[1]。FaceRigを起動してブロードキャストすればいいです。

2. OpenCV(C++)
前処理は何でも良かったのですが、今回はOpenCV 4.3.0 + CUDA 10.2 + CuDNN 7.6.5でDNNを使用して顔検出して笑い男を貼り付けるよくあるやつを試してみました。DNNを使った顔検出[2]とマスク処理[3]と笑い男画像[4]を使用/参考にさせていただきました。FaceRigのバーチャルカメラは普通のWebカメラのように認識できますので、VideoCaptureでOpenすれば画像を取得できます。

3. OBS Studio
最初はDirectShowを使ったりGStreamerを使ったりしてOpenCVからZoomに配信できないかなと調べてみたのですが、なかなか難しそうだったのでOBS Studio[5]を使うことにしました。使い方は[6]を参考にさせていただきましたが、こちらもVirtual Cameraのプラグインをインストールする必要があります。cv::imshowで表示したウィンドウをOBS Studioでキャプチャして、VirtualCamのOBS-Cameraに配信します。

4. Zoom
最終的にOBS-Cameraから画像が流れてきますので、Zoomのビデオにはこれを選択します。

実行結果


一応頭の上に確信度を表示していますが、一般外国人男性のアバターだとかなりの確信度で顔検出できていますね。思い付きで試しただけなどで顔隠し以外の前処理が思いつかないですね…。

[1] ZoomでFaceRig使ってバーチャル参加する方法
[2] OpenCV 4.1 DNNによる顔検出
[3] OpenCV 2.0 でマスク処理してみた。
[4] 笑い男マーク
[5] OBS Studio
[6] OBSをバーチャルカメラとして出力してZoomやTeamsで映像ソースとして認識させる方法
posted by シンドラー at 01:24| Comment(0) | Image Processing | 更新情報をチェックする

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 | 更新情報をチェックする