HN 日本語サマリー

← 一覧へ戻る
プログラミング

アナモルフィック彫刻の最適化

Optimizing Anamorphic Sculptures (tncardoso.com)

15 pointsby zbsc0 コメント

要約

この記事では、特定の視点から見ると認識可能なイメージが現れるアナモルフィック彫刻を生成するためのアルゴリズムについて解説しています。3Dメッシュの位置、サイズ、回転を最適化し、勾配降下法を用いてターゲットのシルエットに近づける手法が紹介されています。特に、レンダリングプロセスを微分可能にするためのソフトラスタライザーや、シルエットの精度を高めるための損失関数(IoU、スピル、アウトライン、衝突ペナルティ)の設計に焦点が当てられています。

全文翻訳

アナモルフィック彫刻の最適化

[画像: 数十個の車、豚、鳩のメッシュが空間に浮かび、単一の視点から豚のアウトラインを形成している。]

車、豚、鳩でできた豚。

私の職場には、特定の vantage point(視点)からのみ認識可能な画像が現れるアナモルフィック彫刻があります。Jonty Hurwitz の作品は、鏡(catoptric anamorphosis)と遠近法(oblique anamorphosis)でこのテクニックを探求しています。Blue Singularity では、Jonty 自身の頭部の彫刻がスライスで表示されます。これらのスライスは、特定の角度から見たときに頭部を構成します。

[画像: vantage point からアナモルフィック彫刻を見ている子供。特定の vantage point からのみ画像が完成する、頭部の異なるスライスが表示されている。]

Jonty Hurwitz による Blue Singularity

[画像: vantage point から見た結果の青い彫刻の頭部。]

vantage point から見た彫刻。 Jonty Hurwitz による Blue Singularity

私のオフィスの彫刻は、常にそのような結果をどのように最適化できるかについて私に考えさせられます。それを実験するために、私は、与えられた 3D メッシュのセットに対して、特定のカメラアングルからターゲットのシルエットがレンダリングされるように、それらを 3D 空間に配置するアプリケーションを作成しました。

[動画: ここには動画があったはずですが、お使いのブラウザではサポートされていないようです。]

車、豚、鳩でできた豚。

ランダムなメッシュを入力、シルエットを出力

彫刻は、グラディエント降下法(gradient descent)を用いて異なるメッシュの位置、サイズ、回転を最適化することで生成されます。メッシュはシーンにランダムに配置され、シーンのシルエットがレンダリングされます。次に、レンダリング結果がターゲット画像と比較され、損失(loss)が計算され、エラーが入力パラメータ(メッシュの位置、回転、スケール)にバックプロパゲーションされます。各ステップで、レンダリングされたシルエットがターゲット画像に近づくようにメッシュが移動・調整されます。

[画像: 最適化プロセスの概要。メッシュはランダムに配置され、シルエットがレンダリングされてターゲット画像と比較される。]

最適化プロセスの概要。メッシュはランダムに配置され、シルエットがレンダリングされてターゲット画像と比較される。

プロセスは数ステップで構成されますが、実装は簡単ではありません。視覚的に興味深い画像を生成するためには、多くの実装上の詳細が必要です。まず最も重要なのは、損失から入力へのエラーのバックプロパゲーションを可能にするために、レンダリングステップが微分可能(differentiable)である必要があることです。損失関数も、詳細を評価するように調整する必要があります。つまり、画像の大部分が正しくても、類似したシルエットを得るには十分ではありません。

ラスタライザーには勾配がない

ラスタライザー(rasterizer)は、頂点をピクセルにマッピングする関数です。これは、三角形のリスト(3Dメッシュ)を画像に変換する責任を負います。各ピクセルについて、そのピクセルが三角形によってカバーされているかどうかを問い合わせます。これは二項演算です:カバーされているか、されていないか。三角形をわずかに動かしても、そのエッジがピクセル中心を横切るまで何も変化せず、その時点でピクセルが反転します。これは、導関数がほとんどどこでもゼロであり、境界で定義されないことを意味します。この設定でエラーをバックプロパゲーションするには、いくつかの制約を緩和する必要があります。幸いなことに、Liu らはこの問題を以前に抱えており、ソフトラスタライザー(soft rasterizers)に関する論文を発表しました。

SoftRas の主なアイデアは、ブール値(ピクセルが三角形の内側か外側か)を、三角形の境界線からの符号付き二乗距離のシグモイド(sigmoid)に置き換えることです。ピクセル (i) と三角形 (j) について、ピクセル中心から三角形のアウトラインまでの距離を (d
ight){ij}) とし、(
ight. ext{sgn}
ight.
{ij}) = +1 が内側、-1 が外側、( ext{sigma}) を遷移を制御する定数とすると、三角形へのピクセルの「所属」は (p
ight)_{ij}) で測定できます。

$$ p
ight){ij} = \operatorname{sigmoid}!\left(\frac{\delta
ight)
{ij}, d
ight)_{ij}^2}{\sigma}\right) $$

異なる (\sigma) 値での実験

ピクセル中心を三角形のエッジに沿って移動させます。(\sigma) が小さいほど遷移はシャープになり、(\sigma) が大きいほど、形状を逃したときに勾配がより遠くまで伝わります。ハードラスタライザーは (\sigma) → 0 の極限です。

インタラクティブな図 — JavaScript が必要です。

ご覧のとおり、異なる (\sigma) 値には異なるトレードオフがあります。(\sigma) が小さい場合、エラーは三角形のエッジの近くにのみ伝播されます。遠くに配置されたメッシュは移動しません。(\sigma) が大きいと、シルエットはよりぼやけます。採用された解決策は、(\sigma) をアニーリング(annealing)することでした:大きく始めて、最適化が進むにつれてそれを縮小します。大きい (\sigma) は、レンダラーが目を細めている状態です。シルエットはぼやけていますが、あるべき場所から遠く離れたメッシュはまだ引力を感じます。(\sigma) を縮小すると、レンダラーの目が開き、エッジがシャープになります。

もう一つの最適化は、メッシュをビンに分割することでした。すべてのピクセルをすべての三角形に対してチェックする必要はありません。また、バックプロパゲーション中に勾配を再計算することで、メモリを抑制するのに役立ちます。

エッジがシルエットを認識可能にする

ナイーブなアプローチは、レンダリングされたシルエットをターゲット画像と比較してオブジェクトを調整することです。この問題点は、シルエットが中心に多くの「質量」を持つことができる一方で、エッジがシルエットを区別可能にするものであるということです。それに加えて、私は生成された彫刻が現実世界で製造可能であることを望んでおり、それは配置されたコンポーネント間の衝突を避けることを意味しました。

損失関数は、現在の配置が良いか悪いかを表す単一の数値を計算します。オプティマイザーの目的は、各オブジェクトの配置、回転、サイズを微調整することで、この数値を小さくすることです。損失は、4つの異なるコンポーネントで構成されます。

  1. 計算されたシルエットとターゲットの間の交差(比較)。
  2. ターゲットシルエットの外側にペイントすることに対するペナルティ(spill)。
  3. シルエットのエッジの品質(outline)。
  4. 衝突するオブジェクトに対するペナルティ(collisions)。
シルエットの比較

シルエットを比較するために、Intersection over Union(IoU)が使用されます。この関数は、さまざまなコンピュータビジョン問題におけるマスクとバウンディングボックスの比較に広く使用されています。生成された画像 (\alpha) とターゲット画像 (t) が与えられた場合、IoU は次のように与えられます。

$$IoU = \dfrac{|\alpha \cap t |}{|\alpha \cup t|}$$

言い換えれば、2つのシルエット間で共有されるピクセルを、「ペイントされた」ピクセルの和集合で割ったものです。損失と互換性を持たせるために、(1 - IoU) がメトリックとして使用されます。いくつかの実験では、シルエットの周囲のみを考慮するバンド IoU ロスも追加しました。

Spill の削減

ターゲットシルエットの外側にペイントすることは IoU を妨げますが、その影響は小さい場合があります。ほとんどの質量は画像の中心部にあるため、エッジ周辺や画像周辺のわずかな変化は、十分に類似したシルエットを生成するには損失に十分な影響を与えません。配置されていないメッシュをペナルティ化する追加コンポーネントを追加すると、画像の最終的な品質が向上します。重み (c)、画像内のピクセルの総数 (|F|)、ターゲット画像の外側でペイントされたピクセルの合計で Spill は次のように与えられます。

$$\text{spill} = c \cdot \frac{1}{|F|}\sum
ight.{i} \alpha
ight.
{i} (1 - t
ight._{i})$$

Outline の改善

これらのコンポーネントがあっても、生成されたシルエットはギザギザのエッジを持つ可能性があります。例えば、小さな鳩の足が豚のシルエットの下に漏れてエッジにスパイクを生成する可能性があります。Outline コンポーネントは、ターゲット画像が必要とするものよりも大きい周長に対するペナルティを追加します。

その情報を捉えるために、Total Variation (TV) メトリックを使用します。これは、すべてのピクセルにわたる、そのピクセルで画像がどれだけシャープに変化するかを合計したものです。

$$\operatorname{TV}(\alpha) = \sum
ight.{i,j} \sqrt{(\partial
ight.
{x} \alpha)^2 + (\partial
ight._{y} \alpha)^2 + \epsilon}$$

損失の Outline コンポーネントは、レンダリングされた画像とターゲットの TV の比率です。

$$\text{outline} = \dfrac{TV(\alpha)}{TV(t)}$$

衝突のペナルティ

損失式の最後のコンポーネントは、メッシュ間の重なりを減らすことを目的としています。これにより、彫刻はさまざまなオブジェクトの組み合わせで実際に現実世界で構築できるようになります。

衝突ペナルティは、すべてのオブジェクトのペア((P) はすべてのオブジェクトのペアのセット)に対して、Axis-Aligned Bounding Boxes(AABB)で計算されます。オブジェクト (a) と (b) 間の貫通量 (\text{pen}
ight.{ab}) と、画像内の平均フレーム幅 (\text{width}
ight.
{ab}) を使用します。

$$\text{collisions} = \frac{1}{|P|}\sum
ight.{(a,b) \in P} \frac{\text{pen}
ight.
{ab}}{\text{width}
ight._{ab}}$$

この実装では、実際に衝突する可能性のあるペアに対してのみメトリックを計算するようにこの衝突を最適化しており、各最適化ステップのコストを削減しています。

損失関数

すべてのコンポーネントは重みで乗算され、合計されます。生成された画像 (\alpha) とターゲット画像 (t) が与えられ、手作業で調整された重み (c, s, w) を使用すると、損失関数は次のように与えられます。

$$ L = \underbrace{\bigl(1 - IoU(\alpha, t)\bigr)}_{comparison} ;+; c \cdot \underbrace{\frac{1}{|F|}\sum
ight.{i} \alpha
ight.
{i} (1 - t
ight.{i})}_{\text{spill}} ;+; s \cdot \underbrace{\frac{\operatorname{TV}(\alpha)}{\operatorname{TV}(t)}}_{\text{outline}} ;+; w \cdot \underbrace{\frac{1}{|P|}\sum
ight.
{(a,b) \in P} \frac{\text{pen}
ight.{ab}}{\text{width}
ight.
{ab}}}_{\text{collisions}} $$

複数の視点からの最適化

この最適化プロセスには興味深い副産物があります。同じオブジェクトセットで、異なるカメラアングルに対して異なる画像を組み立てることが可能です。

[動画: ここには動画があったはずですが、お使いのブラウザではサポートされていないようです。]

フレンドリーな犬の視点と、同じコンポーネントから組み立てられたウサギを持つ一つの彫刻。

この場合、追加の制限があります。2つのカメラのフラスタム(frustum)の交差内にあるオブジェクトは両方の vantage point から見えるため、両方のターゲット画像はそこでペイントされるものについて一致する必要があります。それらが一致しない場合、一方のビューは、それが要求したことのないコンポーネントで終わります。

画像の自由度を最大化するために、私は2つのカメラを90度の角度で使用しています。カメラの損失は調和平均(harmonic mean)で結合され、より悪い方の値に引き下げられます。オプティマイザーは、ウサギをバラバラにすることで犬をシャープにすることはできません。

次にレンダリングしたいもの

[動画: ここには動画があったはずですが、お使いのブラウザではサポートされていないようです。]

今度は鳩だけでできた別の豚。他のどの角度から見ても、それはどこにも行かない群れです。

探求すべきことはまだあります:より多くのコンポーネントでのレンダリング、 vantage point の近くの角度で結果が耐えられるようにすること、そして補完的なビューをより良く使用することです。私がグラディエント降下法をアートに使用したのはこれが初めてではありません。私は抽象的な機械学習アートでも同じことを行い、分類器を騙しつつ私たちには認識可能な画像を生成しました。次に何をレンダリングしてほしいですか?