機械学習で流体シミュレーションを近似する『Physics Forests』

CG分野(特にレンダリング)では、現実の物体・現象の性質をモデル化して扱う。計算リソースには限りがあるので、大抵の場合は視覚に大きく影響する要素だけをモデル化して関数などで表現する。

実測値や物理法則に基づいた計算を行う「物理モデル」に対して、人間の経験則から導いたそれらしい近似計算方法を「推論モデル」なんて呼んだりしますね。LambertPhongなど、初期の反射モデルは大体が推論モデル。CGの質感を計算する「レンダリング」は人間の眼を相手にする分野なので、計算のごまかしが効くことが多いのかも。

これが「質感」ではなく、「動き」となるとなかなかごまかすのは難しいらしい。従来、CGで水や煙などの流体の挙動を計算するにはNavier-Stokes方程式を解くというのがお決まりで、計算負荷を抑えるには離散化(格子・粒子)の解像度を粗くしたりするのが高速化の常套手段だった。(つまり物理モデル)

で、このNavier-Stokes方程式の計算を機械学習で近似してしまおう、というのがSiggraph Asia 2015で発表された”Data-Driven Fluid Simulations using Regression Forests“という研究。Physics Forestsという公式サイトがありますね↓

PHYSICS FORESTS

従来の流体シミュレーション手法は、平均的なサイズのシーン中の非常に小さな時間ステップの計算であっても、安定性を保証するために大規模な計算リソースを必要としました。近年、並列演算の環境は大きく進歩し、圧力計算の効率的なアルゴリズムが登場しているにもかかわらず、リアルタイムの流体シミュレーションは非常に限定された条件下でなければ不可能でした。

本論文では、機械学習をベースとした新しい手法を提案します。本手法では、物理ベースの流体シミュレーションを回帰問題として定式化し、各フレームでの粒子全ての加速度を推定します。

我々は、Navier-Stokes方程式から直接個々の力と制約をモデル化し、未知のテストデータでも粒子の位置・速度を確実に予測できる強い汎化特性を持つ特徴ベクトルを設計しました。我々は、既存のシミュレーション手法で大規模な学習セットを作成し、Regression Forestsによる機械学習で粒子の挙動を近似しました。

GPU実装により、既存の粒子シミュレーションの先端手法と比較して1〜3桁ほど高速化し、200万個の粒子のシミュレーションをリアルタイムに演算可能となりました。

機械学習を使って計算負荷の低い「なんちゃって流体シミュレーション」を実現したってことなのかな。計算対象は粒子なんですね。
https://github.com/arXivTimes/arXivTimes/issues/123

2018年8月29日 追記:このPhysics Forestsのインタラクティブデモが公開されました。メールアドレスを登録するとダウンロードできます。↓
http://apagom.com/physicsforests/downloads/

推奨動作環境
Windows (64-bit) または Linux (64-bit)
NVIDIAのCUDAコア搭載グラフィックスカード(GTX1080 以上)


スポンサーリンク


この手法は、以前勉強した機械学習手法のRandom Forestを回帰問題用に拡張したRegression Forestという手法がベースになっている。
機械学習手法『Random Forest』
Kinectの骨格検出で使用されているという機械学習アルゴリズムのRandom Forestについて、ちょっと勉強してみた。オイラはRandom Forestの存在をSSII 2013のチュートリアルで初めて知ったんだけど、当時は機械学習の...

Regression Forestは、Random Forestの葉ノードを実数値にするやつですね。それぞれの決定木の結果値の平均を取るやつ。(雑な理解)

Random Forest系の手法は複数の決定木の処理を並列化しやすいので、マルチスレッドでの高速化がかなり期待できるリアルタイム向きの機械学習手法だ。

確かKinectの人検出もRandam Forestだし、DlibFace AlignmentRegression Forestをベースにした実装ですね↓
Dlib:C++の機械学習ライブラリ
画像認識系の人達の間では、高性能な顔の器官検出(Face Alignment)が手軽に利用できることで知られているC++のライブラリ Dlib。(表記は大文字、小文字どっちなんでしょう?)英語のWikipediaによると、2002年から開発...


動画を見てみると、映像作品やゲーム中で出てくる分には普通にシミュレーションと言われても気づかなそう。人間の目は細部の動きに対して意外と鈍感なのかも。



論文の著者の1人の所属が”Disney Research Zurich”って書いてあるけど、こういう技術がディズニー映画で活用されたりするんだろうか。



2019年2月追記:今度はディープラーニングで流体シミュレーションする研究が登場した↓
Deep Fluids:流体シミュレーションをディープラーニングで近似する
チューリッヒ工科大学(ETH Zurich)、ミュンヘン工科大学、Pixarによるディープラーニングで流体シミュレーションを近似する研究 Deep Fluids: A Generative Network for Parameterized...


スポンサーリンク

Siggraph 2017 Real-Time Live!

2017年追記:Siggraph 2017のReal-Time Live!でもデモされたらしい。
http://www.4gamer.net/games/999/G999902/20170821104/







公式サイトからUnrealEngineフォーラムのスレッドへのリンクがあるけど、UnrealEngine用のプラグインを開発してるみたいですね。
https://forums.unrealengine.com/community/work-in-progress/114470-physics-forests-a-new-real-time-fluid-solver

デモ動画

これ、リアルタイムなのか。



こっちの動画は、NVIDIA Pascal TITAN X(CUDA)を1枚挿した普通のPCで演算したとのこと。(それって普通か?)

CG分野での演算高速化の技術って、人間の眼を騙す近似手法が突破口になっている気がする。
そして、最近は機械学習が負荷の高い演算の事前キャッシュとして機能している感じ。

一見複雑に見える自然界の現象は、シンプルなルールが再帰的に連鎖することで成り立っている。
というのが物理計算やプロシージャルモデリングの根底にある思想だと思う。つまり、ミクロな振る舞いを積み上げることでマクロな振る舞いを再現している。

一方で機械学習によるアプローチは、マクロな振る舞いだけに着目して模倣することで演算量を削減している感じ。(描画対象のスケールが変わると対応できなくなのかな?)
考え方がCGの演算リソースが乏しかった時代に回帰しているような気もするけど、たぶん繰り返しながら進化していくんでしょうね。
物理シミュレーションの場合はスケールに依らず時間・空間解像度が上がるだけで演算コストが爆上がりしてしまうけど、機械学習でそのスケールの「経験則」を習得できれば大丈夫なのかな。

この流れで行くと、流体シミュレーションだけでなく、グローバルイルミネーションやプロシージャルモデリングも機械学習で高速に近似する時代はすぐに来そうだな。


スポンサーリンク

関連記事

書籍『開田裕治 怪獣イラストテクニック』
オープンソースのテクスチャマッピングシステム『Ptex』
GoB:ZBrushとBlenderを連携させるアドオン
Blenderでよく使うaddon
第1回 3D勉強会@関東『SLAMチュートリアル大会』
トランスフォーマーの変形パターンを覚えるのは楽しいと思うんだ
ZBrushでアヴァン・ガメラを作ってみる 爪とトゲを追加
中学3年生が制作した短編映像作品『2045』
ZBrushでアヴァン・ガメラを作ってみる 首回りの修正・脚の作り込み
ラクガキの立体化 分割ラインの変更・バランス調整
UnityユーザーがUnreal Engineの使い方を学ぶには?
Blender 2.81でIntel Open Image Denoiseを使う
ディープラーニング
AndroidもopenGLも初心者さ (でもJavaは知ってるよ)
SONY製のニューラルネットワークライブラリ『NNabla』
PythonでMayaのShapeノードプラグインを作る
ポリ男からMetaHumanを作る
オープンソースの物理ベースGIレンダラ『appleseed』
Maya LTのQuick Rigを試す
ZBrushで仮面ライダー3号を造る 仮面編 PolyGroupを分割する
顔追跡による擬似3D表示『Dynamic Perspective』
単純に遊びに行くのはだめなのか?
ゴジラの造形
顔のモデリング
3Dグラフィックスの入門書
UnityのTransformクラスについて調べてみた
オープンソースの人体モデリングツール『MakeHuman』のAPI開発プロジェクトがスタート
ラクガキの立体化 背中の作り込み・手首の移植
Unreal Engineの薄い本
TensorSpace.js:ニューラルネットワークの構造を可視化するフレームワーク
Adobe Photoshop CS5の新機能
uGUI:Unityの新しいGUI作成システム
SIGGRAPH論文へのリンクサイト
Googleが画像解析旅行ガイドアプリのJetpac社を買収
fSpy:1枚の写真からカメラパラメーターを割り出すツール
AnacondaとTensorFlowをインストールしてVisual Studio 2015で使う
Ambient Occlusionを解析的に求める
Accord.NET Framework:C#で使える機械学習ライブラリ
ZBrushでアヴァン・ガメラを作ってみる 頬の突起を作り始める
Windows Server 2008にAutodesk Maya 2009をインストール
3Dスキャンに基づくプロシージャルフェイシャルアニメーション
BlenderのGeometry Nodeで遊ぶ

コメント

  1. […] 勉強になったので備忘録 https://blog.negativemind.com/2016/05/12/physics-forests/ […]