戒めのMitsuba2

レイトレベースのdifferentiable rendererとしてMitsuba2が広く知られています。

github.com

Mitsuba2の使い方に関しては、公式Installationの他、以下の記事が参考になります。

日本語のDocumentationも充実してきたので、自宅Windows PCにも導入しようとしたところコケたのでメモ。

続きを読む

行列/Tensor分解のメモと実装

はじめに

行列で表現された膨大なデータの傾向を得たい場合、主成分分析(PCA)を用います。

一般的なPCAではデータの分散が大きい方向 {\bf v}を求めるために、

\displaystyle  \max_{{\bf v}: || {\bf v} || =1} f({\bf v}) =  \max_{{\bf v}: || {\bf v} || =1} {\bf v}^{T} {\bf \Sigma} {\bf v} \tag{1}

を解きますが、これはデータ行列の共分散行列の固有値/固有ベクトルを求める問題に他なりません*1

そのため、この問題は比較的容易に解くことができます。

一方、式(1)の最適化対象の関数が fだけでなく {\bf v}に対するさらなる正則化項や非負制約がある場合には、 単純な固有値問題には落とし込めなくなります。

このような複雑な行列分解や行列の拡張であるテンソル*2に対する分解を扱った書籍として、 講談社サイエンティフィク出版の『関係データ学習』(石黒 勝彦/林 浩平・著)があります。

www.kspub.co.jp

この書籍では第4章以降で行列分解とテンソル分解を扱っているのですが、 誤植が多いようなので、検証も兼ねて実装してみました。
理論の説明は本に任せるとして、この記事では該当箇所のコードをベタっと貼っていきます。
なお、以下の実装はすべて第1刷をもとにしています。

*1:式(1)の f({\bf v}) {\bf v}微分してあげれば自明 参考: http://ibis.t.u-tokyo.ac.jp/suzuki/lecture/2015/dataanalysis/L7.pdf

*2:あくまでこの書籍における位置づけ

続きを読む

Deformation Transferの解説

はじめに

Source meshの変形をTarget meshに転移したいけど、トポロジーが異なっていて困る!
生きていると毎日このような悩みを抱えることかと思います。
この問題を解決する手法として、Deformation Transfer for Triangle Meshes [Sumner and Popovic. SIGGRAPH 2004]が有名です。

..有名な手法なのですが、日本語で触れている文献がかなり少ないので、理解を早めるために以下のようにスライドを用意しました。

speakerdeck.com

SpeakerDeck経由だとボケて見えるかもしれないので、手元に落として読んでください。

ちなみにGitHubに実装転がってました。是非試してください。

github.com

Open3Dで楽にDepth-based Voxel Carvingの実装

以前、色情報を用いたSpace Carvingの手法を紹介しました。
mocobt.hatenablog.com

以前の手法ではPhoto Consistencyを考慮する必要があり、実装がなかなかダルいです。

3次元形状処理Libraryとして知られるOpen3DにはシルエットとDepth画像を用いてCarvingを行う方法(+API)が提案されていました。

www.open3d.org

このTutorialでは、

  1. ReadしたSphere上のメッシュの各頂点をカメラ位置と見なす
  2. 中央にあるArmadilloが未知であるとして、カメラから撮影したDepth画像を用いてVoxel Carvingを行う

という2つのStepを踏むのですが、文脈上意味がよくわからないコードを含んでいたり、必要なGeometryファイルが含まれていなかったりしていてそのままでは動きません。

そこで、パッと動くように直しておきました。

github.com

出力をタイムステップ毎に可視化するとこんな感じ。

f:id:mocobt:20200727010756g:plain

いい感じに削れてますね。

Shape by Space Carvingの雑な解説

はじめに

今も昔も変わらずCV界隈では三次元復元が盛り上がっています。
特に、複数枚の画像から点群を推定するStructure from Motion (SfM)やMulti-View Stereo (MVS)に関する日本語資料はググれば大量に出てきます。

medium.com

blog.negativemind.com

一方で、対象の形状をVoxel群として得る三次元復元手法として知られるSpace Carving*1に関する日本語資料はあまり見当たりません*2

本稿では、Space Carvingの源流として知られるA Theory of Shape by Space Carving [Kutulakos and Seitz. ICCV 1999] を解説します*3
この手法を用いれば、複数枚の写真を用いてこのように三次元形状を復元できます。

f:id:mocobt:20200725184449p:plain

また、今回は相互反射やSpecularが激しい物体や透明な物体の再構成は考えないことにします。
論文は以下の通りです。

ieeexplore.ieee.org

CMUの公式pdf: http://www.cs.cmu.edu/~seitz/papers/carve.pdf
Toronto大の公式pdf: https://www.cs.toronto.edu/~kyros/pubs/00.ijcv.carve.pdf

*1:Shape from Silhouette, Visual Hull, Voxel Carving, Space Carvingの具体的な違いはよくわからなかったので、本稿では区別しません。

*2:SlideShareで関東CV勉強会の資料を漁った限りだとあまり見つかりませんでした。
またVisual Hullに関して見つかった資料は以下の通りです。

www.sanko-shoko.net

他にご存知でしたらコメントで教えて下さい。(多分検索ワードが悪い)

*3:ちなみに、今更このような古典を紹介するのは、 最近流行りの陰関数表現やRadiance Fieldによる三次元復元手法はVoxel Carvingから着想を得ていて、最近の手法を追う上で有用だと考えたからです。
このようなことを迂闊に書くと、「いや、mocobtさん。それは全然違うと思います。」と職場からマサカリが飛んでくるので違うのかもしれません。

続きを読む

Material Point Method (物質点法)の雑な解説 ~APIC編~

はじめに

前回、物理シミュレーション手法であるMPM(物質点法)を簡単に紹介しました。

mocobt.hatenablog.com

MPMのAlgorithmを振り返ってみます。

  1. 内挿関数を用いた重み付き和によりParticleの速度と質量をGrid view上の格子点へと変換
  2. Grid viewで各格子点における力を求め、格子点上での速度を更新
  3. PICFLIPという手法で求めた速度の線形和で、Grid viewからParticleへ速度を転送

ここで用いたPIC, FLIPにはそれぞれ以下のような特徴があります。

  • PIC (Particle-in-Cell)
    • Pros: 計算が安定している(stable)
    • Cons: 散逸性が高い(highly dissipative)
  • FLIP (Fluid Implicit Particle)
    • Pros: あまり散逸しない
    • Cons: time step毎の計算で生じるノイズが激しく、計算が不安定 (unstable)

PICの長所はFLIPの短所であり、PICの短所はFLIPの長所です。

f:id:mocobt:20200719214939p:plain

2つの手法を混ぜ合わせればお互いの長所を備えた手法となりそうですが、これを単なる線形和で表現することは難しいようです。

今回はPICを改良することでこの問題を解決した手法であるAPIC (Affine Particle-In-Cell)について紹介します。
元論文はThe affine particle-in-cell. Jiang et al. TOG 2015.です。

APICは2020年現在のMPM研究でも有用なテクニックとして頻繁に応用されています*1
著者による解説動画は以下の通りです。

www.youtube.com

この記事では、PICとFLIPの問題を改めてまとめた後に、APICを簡単に紹介します*2

*1:APIC以降はMPMのGPU最適化とアプリケーション寄りの論文が多い印象

*2:APICでは手法の導出は補足資料に書かれているため、詳しく知りたい方は論文リンクから辿れる補足資料を読んでください。
パッと見たところ突拍子もない定理は用いずにひたすら式変形しているだけなので、そこまで難しくないと思います。

続きを読む