プログラミング
アナモルフィック彫刻の最適化
Optimizing Anamorphic Sculptures (tncardoso.com)
要約
この記事では、特定の視点から見ると認識可能なイメージが現れるアナモルフィック彫刻を生成するためのアルゴリズムについて解説しています。3Dメッシュの位置、サイズ、回転を最適化し、勾配降下法を用いてターゲットのシルエットに近づける手法が紹介されています。特に、レンダリングプロセスを微分可能にするためのソフトラスタライザーや、シルエットの精度を高めるための損失関数(IoU、スピル、アウトライン、衝突ペナルティ)の設計に焦点が当てられています。
全文翻訳
車、豚、鳩でできた豚。
私の職場には、特定の視点から見ると認識可能なイメージが現れるアナモルフィック彫刻があります。
Jonty Hurwitzの作品は、鏡(鏡面アナモルフォーシス)と遠近法(斜めアナモルフォーシス)を用いてその技法を探求しています。
Blue Singularityでは、Jonty自身の頭部の彫刻がスライス状に展示されています。
それらのスライスは、特定の角度から見たときに頭部を構成します。
Blue Singularity from Jonty Hurwitz
視点から見た彫刻。
Blue Singularity from Jonty Hurwitz
私のオフィスの彫刻は、常にそのような結果をどのように最適化できるかについて私に考えさせられます。
それを実験するために、私は3Dメッシュのセットが与えられたときに、特定のカメラアングルからターゲットのシルエットがレンダリングされるように、それらを3D空間に配置するアプリケーションを作成しました。
ここにはビデオがあるはずですが、お使いのブラウザではサポートされていないようです。
車、豚、鳩でできた豚。
ランダムなメッシュを入力すると、シルエットが出力されます。
彫刻は、勾配降下法を用いて異なるメッシュの位置、サイズ、回転を最適化することによって生成されます。
メッシュはシーン内にランダムに配置され、シーンのシルエットがレンダリングされます。
次に、レンダリング結果がターゲット画像と比較され、損失が計算され、エラーが入力パラメータ(メッシュの位置、回転、スケール)に逆伝播されます。
各ステップで、メッシュは移動および調整され、レンダリングされたシルエットがターゲット画像に近づきます。
最適化プロセスの概要。
メッシュはランダムに配置され、シルエットがレンダリングされてターゲット画像と比較されます。
プロセスにはいくつかのステップがありますが、実装は単純ではありません。
視覚的に興味深い画像を生成するためには、複数の実装上の詳細が必要です。
第一に、そして最も重要なことは、損失から入力への誤差を逆伝播できるようにするためには、レンダリングステップが微分可能である必要があるということです。
損失関数も、詳細を評価するように調整する必要があります。
つまり、画像の大部分を正しくするだけでは、類似したシルエットを得るには十分ではありません。
ラスタライザーには勾配がありません。
ラスタライザーは、頂点をピクセルにマッピングする関数です。
それは、三角形のリスト(3Dメッシュ)を画像に変換する責任があります。
各ピクセルに対して、そのピクセルが三角形によって覆われているかどうかを尋ねます。
これは二項演算です:覆われているか、そうでないか。
三角形をわずかに動かしても、そのエッジがピクセル中心を横切ってピクセルが反転するまで、何も変わりません。
これは、導関数がほとんどどこでもゼロであり、境界で未定義であることを意味します。
この設定で誤差を逆伝播するには、いくつかの制約を緩和する必要があります。
幸いなことに、Liuら(Liu et al.)は以前この問題を抱えており、ソフトラスタライザーに関する論文を発表しました。
SoftRasの主なアイデアは、ブール値(ピクセルが三角形の内側か外側か)を、三角形の境界からの符号付き二乗距離のシグモイド関数に置き換えることです。
ピクセルiと三角形jについて、d_ijをピクセル中心から三角形の輪郭までの距離、δ_ij = +1(内側の場合)、-1(外側の場合)とし、σを遷移を制御する定数とします。
すると、三角形に対するピクセルの「所属」はp_ijで測定できます。
$$ p_{ij} = ext{sigmoid}\\\left(\\\frac{\\\delta_{ij}\\,\\[d_{ij}^2}{\\\sigma}\\\right) $$$$
異なるσ値での実験。
ピクセル中心を三角形のエッジに沿って移動させます。
σが小さいほど遷移はシャープになり、σが大きいほど、形状をわずかに外れた場合でも勾配がより遠くまで伝わります。
ハードラスタライザーはσ → 0 の極限です。
インタラクティブな図 — JavaScriptが必要です。
ご覧のとおり、異なるσ値には異なるトレードオフがあります。
σが小さい場合、誤差は三角形のエッジの近くでのみ伝播されます。
遠くに配置されたメッシュは移動しません。
σが大きいと、シルエットはよりぼやけます。
採用された解決策は、σを焼きなまし(anneal)することでした:大きく始めて、最適化が進むにつれてそれを縮小します。
大きなσは、レンダラーが目を細めている状態です。
シルエットはぼやけていますが、あるべき場所から遠く離れたメッシュはまだ引っ張られる感覚があります。
σを縮小すると、レンダラーの目が開き、エッジがシャープになります。
別の最適化は、メッシュをビンに分割することでした。
すべてのピクセルをすべての三角形に対してチェックする必要はありません。
また、逆伝播中に勾配を再計算することも、メモリを管理するのに役立ちます。
エッジがシルエットを認識可能にするものです。
ナイーブなアプローチは、レンダリングされたシルエットをターゲット画像と比較してオブジェクトを調整することです。
この問題点は、シルエットが中心に多くの「質量」を持つことができる一方で、エッジがシルエットを区別可能にするものであるということです。
それに加えて、私は生成された彫刻を現実世界で製造可能にしたいと考えていました。これは、配置されたコンポーネント間の衝突を回避することを意味します。
損失関数は、現在の配置がどれだけ良いか悪いかを表す単一の数値を計算します。
オプティマイザーの目的は、各オブジェクトがどこに配置されるか、どのように回転するか、どのくらいの大きさになるかを微調整することによって、この数値を小さくすることです。
損失は、4つの異なるコンポーネントで構成されています。
計算されたシルエットとターゲットの間の交差(比較)。
ターゲットシルエットの外側をペイントすることに対するペナルティ(スピル)。
シルエットのエッジの品質(アウトライン)。
衝突するオブジェクトに対するペナルティ(衝突)。
シルエットの比較。
シルエットを比較するために、Intersection over Union(IoU)が使用されます。
この関数は、さまざまなコンピュータビジョン問題におけるマスクとバウンディングボックスの比較に広く使用されています。
生成された画像αとターゲット画像tが与えられた場合、IoUは次のように与えられます。
$$IoU = \\dfrac{|\\alpha \\cap t |}{|\\alpha \\cup t |}$$
言い換えれば、2つのシルエット間で共有されるピクセルを、「ペイントされた」ピクセルの和集合で割ったものです。
損失との互換性を持たせるために、1 - IoUがメトリックとして使用されます。
いくつかの実験では、シルエットの周囲のみを考慮するバンドIoU損失も追加しました。
スピルの削減。
ターゲットシルエットの外側をペイントすることはIoUを妨げますが、その影響は小さい場合があります。
質量の大半は画像の中心部にあるため、エッジや画像周辺のわずかな変動は、十分に近く正確なシルエットを生成するのに十分な損失に影響を与えません。
配置されていないメッシュをペナルティする追加コンポーネントを追加すると、画像の最終的な品質が向上します。
重みcと画像内の総ピクセル数|F|が与えられた場合、スピルはターゲット画像の外側でペイントされたピクセルの合計として与えられます。
$$\\text{spill} = c \\cdot \\frac{1}{|F|}\\\sum_i \\alpha_i (1 - t_i)$$
アウトラインの改善。
これらのコンポーネントがあっても、生成されたシルエットはギザギザのエッジを持つことがあります。
たとえば、小さな鳩の足が豚のシルエットの下に漏れて、エッジにスパイクを生成することがあります。
アウトラインコンポーネントは、ターゲット画像が必要とするものよりも大きな周波数に対するペナルティを追加します。
その情報を捉えるために、Total Variation(TV)メトリックを使用します。
それは、すべてのピクセルにわたって、そのピクセルで画像がどれだけシャープに変化するかということです。
$$\\operatorname{TV}(\\alpha) = \\sum_{i,j} \\sqrt{(\\partial_x \\alpha)^2 + (\\partial_y \\alpha)^2 + \\epsilon}$$
損失のアウトラインコンポーネントは、レンダリングされた画像とターゲットのTVの比率として与えられます。
$$\\text{outline} = \\dfrac{TV(\\alpha)}{TV(t)}$$
衝突のペナルティ。
損失関数の最後のコンポーネントは、メッシュ間のオーバーラップを減らすことを目的としています。
これにより、彫刻はさまざまなオブジェクトの組み合わせで実際に構築できるようになります。
衝突ペナルティは、すべてのオブジェクトのペアに対して軸配置バウンディングボックス(AABB)を使用して計算されます(Pはすべてのオブジェクトのペアのセット)。
オブジェクトaとbの間の貫通量pen_abと、画像内の平均フレーム幅width_abとします。
$$\\text{collisions} = \\frac{1}{|P|}\\\sum_{(a,b) \\in P} \\frac{\\text{pen}_{ab}}{\\text{width}_{ab}}$$
実装では、この衝突を最適化して、実際に衝突する可能性のあるペアに対してのみメトリックを計算するため、各最適化ステップのコストが削減されます。
損失関数。
すべてのコンポーネントは重みを掛けられ、合計されます。
生成された画像αとターゲット