2017-05-27

Siphon memo 5 - shape manipulation

現在開発している Blender-addon である Siphon は Freestyle から抽出した輪郭線を NodeTree 上でパラメータを変更しながらインタラクティブに編集するのが一つの目標である。 今回は shape manipulation についていくつか調査し、Siphon への実装案についてメモする。

1) 2.5D Cartoon Models

MIT 2.5D Cartoon Models from lester banks on Vimeo.

Alec Rivers, Takeo Igarashi, and Frédo Durand. 2010. 2.5D cartoon models. ACM Transactions on Graphics 29, 4, Article 59 (July 2010), 7 pages.

この研究は 2D vector を三次元空間に配置し、擬似的なレンダリングを行うことによって様々な方向からキャラクターを描画できるようにする。上下左右などいくつかの方向の 2D vector を準備し対応付けしている。3Dモデルの作成は必要なく絵を描くことで立体的表現を構築できるメリットがある。また 3Dモデルでは不可能に近いイラストライクな表現を実現することができる。ちなみに Frédo Durand 氏は Freestyle の研究にも携わった人物である。

Live2D Euclid は極めてイラストライクで自然なキャラクターを表現することができるが、顔部分の基本的な動作原理は 2.5D Cartoon Models とほぼ同じではないかと考えている。

2) Latent Doodle Space

Latent Doodle Space (Eurographics 2006) from Bill Baxter on Vimeo.

W. V. Baxter and K.-I. Anjyo. Latent doodle space. In EUROGRAPHICS, volume 25, pages 477–485, Vienna, Austria, September 4-8 2006.

入力ストロークの対応付けを行うアルゴリズムと、そこから low-dimensional latent space を構築することで、画像間の interpolation を行っている。特に SIGGRAPH 2014 の Course である Scattered Data Interpolation for Computer Graphics (OLM Digital R&D) は参考になる。Ken Anjyo 氏の研究は NPR に関連したものも多く興味深いものが多い。

3) Learning a Manifold of Fonts

Neill D.F. Campbell and Jan Kautz. Learning a Manifold of Fonts. In ACM Transactions on Graphics (SIGGRAPH) 33(4), 2014

Learning a Manifold of Fonts は複数のフォントのキャラクターを2次元の latent space で操作し補間することができる。オンラインデモでブラウザ上でアルファベットをマウスで様々に変化させることができ、たとえばセリフ体とサンセリフ体のあいの子のようなものを作り出すことができる。フォントはアウトラインを polyline で抽出され正規化される。同じアルファベットでも例えば g のようにフォントによってはトポロジが異なる場合だと補間することができず、別種として取り扱われる。複数のキャラクターを energy-based optimization を使って対応付け(同じ頂点数にする)、その後 generative non-linear manifold に GPLVM (Gaussian Process Latent Variable Models) を用いて次元削減する。

4) Roto++

Wenbin Li and Fabio Viola and Jonathan Starck and Gabriel J. Brostow and Neill D.F. Campbell. Roto++: Accelerating Professional Rotoscoping using Shape Manifolds. ACM Transactions on Graphics (In proceeding of ACM SIGGRAPH'16)

ロトスコープは撮影した映像から frame by frame で形状を切り出し、アニメーションにする手法である。frame-by-frame であるため、かなり手間のかかる作業であり、コンピュータによる自動切り出しや補助技術が以前から開発されていたようである。Roto++ は shape manifold framework を使って作業補助する手法を提案している。ここでは polyline ではなく Bezier 曲線を low-dimensional latent space に GPLVM で落とし込んでいる。

5) Sketch-RNN

Quick, Draw! はスケッチを人間が 20 秒で描き NN がそれを判定する。つい最近そうして収集された5000万件のデータセットが公開された。Sketch-RNN は Bidirectional RNN を用いたスケッチの生成モデルであり、 Google の Magenta プロジェクトの一部として現在公開されている。これまで紹介してきたものと違うのは、ストロークのデータにタイムスタンプが付けられており、時系列データとして扱っているところである。以下のツイートのように word2vec のようなアナロジー計算も行うことができる。

6) Menpo

Menpo は Python の deform library であり、活発に開発が行われている。しっかりと把握はできていないのだがどちらかというと raster images に対してトポロジーをフィットする機能が重点的に開発されているように見える。

実装案

Siphon では 2.5D Cartoon Models のような 2D vector の3次元空間への配置手法と GPLVM による shape manifold を使った Freestyle の線画 (ViewMap) の編集を使おうと考えている。いまのところ以下に示した画像のように Blender 上で ViewMap やオブジェクトの配置を latent space に落とし込み manifold をノード上で操作することで輪郭線を編集する方針で進めている。Pot object という Python クラスを Siphon で定義し、そこに manifold 構築などの機能を加える予定である。

Pot object

BayesianGPLVM 等は Python だと GPy が使いやすそうなので、こちらを試し始めている。GPflow という TensorFlow バックエンドを用いたものも登場しており、こちらは GPU を用いて高速化もできるそうなので、そのうち移行するかもしれない。

Blender アドオンをいろいろ調べたりして気づいたのは SpaceImageEditor などのインターフェースを操作する際、Blender API だけではアクセスできない属性が存在するため ctypes を使って直接メモリ上を参照するワザがよく使われていることだ。Blender のヘッダーファイルを参照し構造体を記述するため、プログラムのライセンスは自動的に GPL になる。Shape manipulation などのライブラリを用いたりするときにライセンスが競合したりすると困るので、以下のように siphon-server というものとアドオンを分離する設計で進めようと考えている。すぐには分離しないかもしれないが...

輪郭線編集のときに問題になるのは Z-order である。ここは Freestyle で QI (quantitative invisibility) の情報が取れるので、この情報と 2D Vector の Boolean operations を使い解決できないかと考えている。

separation

アドオンとサーバは gRPC で通信するように上の画像だとあるが、もっと簡単なものから始めるかもしれない。また、個人的に Cycling '74 の Max もよく使うので OSC でそのうちアドオンと通信できればと考えている(確か Sverchok に OSC による通信ノードが存在している)。