ES(バックプロパゲーションなし)によるニューラルテクスチャとPBRマテリアルマップのフィッティング
Fitting Neural Textures and PBR Material Maps with ES (No Backprop) (richg42.blogspot.com)
要約
本記事は、バックプロパゲーションや自動微分に依存しない進化戦略(ES)を用いたニューラルテクスチャおよびPBRマテリアルマップの圧縮手法について解説しています。この手法では、低解像度の潜在テクスチャと少数のMLPデコーダーをESで学習させ、画像圧縮やマテリアル表現の効率化を目指しています。CPUでの高速な学習が可能で、圧縮されたデータから高品質なテクスチャやマテリアルを再構築できることを示しています。
全文翻訳
ES(バックプロップなし)によるニューラルテクスチャとPBRマテリアルマップのフィッティング
リポジトリは2026年9月4日に公開されました。
https://github.com/richgel999/neural_texture_es2
ES = Evolution Strategies(進化戦略)。
以下は、先行技術の開示を含む、GitHub上のREADME.mdファイルのミラーです。
主要フレーズ:ニューラルテクスチャ圧縮、ニューラルマテリアル圧縮、PBRマテリアル圧縮、微分フリーニューラルテクスチャ最適化、ラテントテクスチャ最適化、ブロック圧縮ニューラルテクスチャ、量子化対応ニューラルテクスチャトレーニング、圧縮ドメインテクスチャ最適化。
進化戦略で学習したトイのニューラルテクスチャ圧縮
小さな自己完結型C++実験:RGB画像(または1つのマテリアルの最大4つの同サイズRGBテクスチャ)を、共有された低解像度のラテントテクスチャと小さなMLPデコーダーとしてエンコードし、両方を完全に進化戦略でトレーニングします — バックプロップなし、自動微分なし、トレーニングフレームワークなし。(オプションの遅延トレーニングの仕上げ、--mlp-fd はデコーダーを数値有限差分に切り替えます。それでもバックプロップはありません。)依存関係は stb_image、stb_image_write、およびOpenMPです。
解説記事:ESによるニューラルテクスチャデコーダーのフィッティング
I(u,v) ≈ MLP( bilinear(Z, u, v), phi(u,v) )
Z はラテントテクスチャ、phi は小さな位置エンコーディングです。デコード時に、各ピクセルはUVで Z をバイリニアサンプリングし、phi を追加してMLPを実行します。オプションの2番目の、より粗いラテントレベル(--latent2)は同じUVでサンプリングされ、そのチャンネルは最初のレベルのチャンネルに連結されます。
結果
512×512のkodim23のクロップ、3000イテレーション、トレーニング後に8ビットに量子化されたラテント、MLP重みはfp16としてカウント:
| ラテント | PSNR | bpp (raw) | bpp (エントロピー符号化) |
|---|---|---|---|
| 64×64×4 | 26.9 dB | 0.56 | 0.47 |
| 64×64×8 | 28.2 dB | 1.07 | 0.87 |
| 128×128×4 | 30.3 dB | 2.06 | 1.65 |
| 128×128×8 | 32.2 dB | 4.07 | 3.27 |
これらの実行では、元の位置エンコーディング uv,fourier:1(--nfreq 1)を使用しました。これが、評価コマンドがそれを渡す理由です。現在のデフォルトは uv のみであり、両方が実行された場所で0.26–0.32 dB高くスコアしました(METHOD.md参照)。このファイルの後の方で引用されている結果は、特に断りがない限り、そのデフォルトを使用しています。
128×128×8の実行は、14 → 24 → 24 → 3のMLP(1035重み、Leaky ReLU、シグモイド出力)を使用し、32スレッドCPUで約150秒でトレーニングされます。ラテントを8ビットに量子化すると、0.04 dBのコストがかかります。
その実行の出力(out_128c8/):ターゲットクロップ、3000イテレーション後の再構成、および8つのラテントチャンネルを並べて表示。
| ターゲット | 再構成 (32.2 dB) |
|---|---|
| [画像: target] | [画像: recon] |
out_128c8/model.bin はトレーニング済みモデルです。ntc kodim23.png --load out_128c8/model.bin --latent 128 128 8 --nfreq 1 --iters 0 で評価してください。
4層マテリアル
PavingStones070マテリアル(法線、粗さ、アルベド、AO;テスト画像参照)を、1つの共有された128×128×4 + 64×64×4のラテントと1つの10 → 36 → 36 → 12のMLP(2172重み)から共同でトレーニングしました。3000イテレーション、後半で学習率を減衰、最後の四半期でデコーダーの重みごとの有限差分。8ビットラテント:合計2.64 bpp、テクスチャあたり0.66 bpp。左がターゲット、右が量子化ラテントからの再構成(out_m1234/)。トレーニングコマンドは次のとおりでした。
ntc m1.png m2.png m3.png m4.png --latent 128 128 4 --latent2 64 64 4 --mlp 36,36 --mlp-pairs 64 --iters 3000 --lr-anneal 0.5 0.05 --mlp-fd 0.75 --out out_m1234
| 法線マップ, 23.2 dB |
|---|
| [画像: normal] |
| 粗さ, 31.5 dB |
|---|
| [画像: roughness] |
| アルベド, 23.2 dB |
|---|
| [画像: albedo] |
| 環境遮蔽, 29.6 dB |
|---|
| [画像: ao] |
out_m1234/model.bin はトレーニング済みマテリアルです。ntc m1.png m2.png m3.png m4.png --load out_m1234/model.bin --latent 128 128 4 --latent2 64 64 4 --mlp 36,36 --iters 0 で評価してください。
ESトレーニングの仕組み
-
MLP:反対称ES、ステップごとに32の摂動ペア、各ペアは同じランダムな4096ピクセルミニバッチで評価されます。推定された勾配はAdamに供給されます。オプションの後半フェーズ:フルイメージミニバッチ(
--mlp-full)、重みごとの有限差分(--mlp-fd)、または固定デコーダー(--mlp-freeze)。 -
ラテント:すべてのラテント値は一度に摂動され、フルイメージはペアごとに2回デコードされ、ステップごとに4ペアです。各ピクセルの損失変化は、そのバイリニアタップが読み取る(最大4つの)テクセルにのみクレジットされます。各ラテントレベルで。
通常のESは、反対称ペアからすべてのパラメータを更新しますが、その分散はパラメータ数とともに増加します。単一のスカラー損失差は、数千の個別の局所効果の合計であり、各テクセルのシェアは他のすべてのテクセルのシェアの下に埋もれています。ここでは、各テクセルの損失差は、その自身のバイリニアフットプリント内のピクセルでのみ測定されるため、他の約16kテクセルのノイズは平均化される代わりに破棄されます。そのクレジット割り当てが、評価ごとのコストではなく、ESを131k値のラテントでステップあたりわずか4ペアで実用的にしている理由です。
-
ラテントはトレーニング中はfp32のままです。量子化は後で適用され、設定可能なビット深度で報告されます。
ビルド
Visual Studioソリューション(MSVC)を生成するCMake、またはLinux/WSL上のOpenMPを備えた任意のC++17コンパイラ。Windows上のMSVC 2022およびMSVC 2026、およびWSL2下のgcc 13でテスト済みです。std::normal_distribution は標準ライブラリ間で異なるため、同じシードでもプラットフォームごとにわずかに異なる結果が得られることに注意してください。
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
Visual Studio 2026の場合は -G "Visual Studio 18 2026" を使用します。これにはCMake 4.2以降が必要です(VS 2026にバンドルされているCMakeで動作します)。
実行
ntc image.png --out out --latent 128 128 8 --iters 3000
ntc albedo.png normal.png rough.png --weights 1,1,0.5 --out out_mat --latent 128 128 8 --latent2 64 64 4
複数の位置画像がマテリアルを形成します。それらはクロップ後に同じサイズである必要があり、ラテントとMLP(テクスチャあたり3つの出力)を共有し、--weights(相対的;重みが0の場合はそのテクスチャはトレーニングから除外されます)で損失に重み付けできます。テクスチャごとのPSNRは全体のものと一緒に印刷され、出力ファイルには _tK サフィックスが付加され、ビットレートはマテリアルピクセルごとおよびテクスチャごとに報告されます。
引数なしで実行すると、ntc はチェックイン済みのkodim23.pngをデフォルトの64×64×4ラテントを使用してトレーニングします。画像は実行可能ファイルからの相対パスで配置されるため、ビルドディレクトリとリポジトリのルートの両方から機能します。見つからない名前付き画像はエラーです。合成フォールバックは、画像が名前で指定されていない場合にのみ適用されます。
標準出力に進捗(MSE、PSNR、量子化PSNRとビットレート、ラテント統計、スループット)が表示されます。再構成、レベルごとのラテントの視覚化、およびmodel.binは定期的に出力ディレクトリに書き込まれます。side_by_side.png(ターゲット | 8ビットラテントデコード)は最後に書き込まれます。
便利なオプション(ntc --helpで全てリスト表示):
| フラグ | 意味 |
|---|---|
--latent W H C | ラテントテクスチャサイズ(デフォルト 64 64 4) |
--latent2 W H C | オプションの2番目の(通常はより粗い)ラテントレベル、例:32 32 4(オフ) |
--weights w0,w1,... | マテリアルのテクスチャごとの損失重み、位置画像ごとに1つ(相対的;0はテクスチャを除外) |
--lat2-sigma F | 2番目のレベルのESシグマ(デフォルト:--lat-sigmaと同じ) |
--lr-anneal START FINAL | START・itersで1倍から終了時にFINAL倍まで、両方の学習率を線形に減衰 |
--mlp W1,W2,... | 隠れ層の幅(デフォルト 24,24) |
| `--act leaky | relu |
--pos SPEC | 位置特徴:uv、fourier:N、dct:N、local、lfourier:N、lquad、ldct:N、ldct2:N、ldct4:N、none |
--nfreq N | --pos uv,fourier:N のショートハンド(ヘッドラインテーブルが使用したエンコーディング) |
--qbits N | 報告される量子化PSNR / ビットレートのラテントビット深度 |
--load model.bin --iters 0 | 保存されたモデルを評価 |
--mlp-pairs, --mlp-batch, --mlp-sigma, --mlp-lr, --mlp-every, --lat-pairs, --lat-sigma, --lat-lr | ESハイパーパラメータ |
--mlp-fd START, --mlp-fd-h H | START・itersから、重みごとの中心有限差分でMLPをトレーニング |
--mlp-full START, --mlp-full-pairs N | START・itersから、フルイメージでMLP ESステップを評価 |
--mlp-freeze START | START・itersから、MLPの更新を停止(ラテントのみのフェーズ) |
--lat-alt | 2つのラテントレベル:ペアごとに1つのレベルを摂動し、ローテーションさせてレベル間のクロストークを除去 |
512×512より大きい画像はデフォルトで中央クロップされます(--crop)。マテリアルのすべてのテクスチャは同じようにクロップされ、その後一致する必要があります。
テスト画像
kodim23.png、kodim01.png、kodim02.png:Kodakテストセット(768×512、デフォルトで512×512に中央クロップ)。kodim23はオウムです。m1.png…m4.png:512×512の4層の石畳マテリアル。順に法線マップ、粗さ、アルベド、環境遮蔽。 ambientCGのPavingStones070 から派生し、Creative Commons CC0 1.0の下でリリースされています。ntc m1.png m2.png m3.png m4.png ...でマテリアルとしてトレーニングします。
先行技術の開示
上記のブログ記事と単一テクスチャの結果(元のリポジトリ、richgel999/neural_texture_es)は、2026年9月3日に公開されました。このリポジトリには、2レベルラテント、マテリアル、および「2026年9月4日追加」とマークされた項目が含まれており、2026年9月4日に公開されました。以下は、公開先行技術としてここに開示されています。
学習済みラテントグリッドと小さなニューラルデコーダーを使用したニューラルテクスチャ表現、および微分フリー最適化のための進化戦略/同時摂動法は、確立されたアイデアです。ここで探求されている技術的に特徴的な部分は、デコーダーの既知の空間依存構造との組み合わせです。すべてのラテント値は同時に摂動され、反対称のフルイメージ評価はピクセルごとの損失差を生成し、各ピクセルの損失差は実際にそのピクセルによってサンプリングされるラテントテクセルにのみ帰属します。これにより、すべてのラテントテクセルに対して同時サポート制限付きES推定値が得られ、各テクセルに影響を与えられないピクセルからの損失変動が除外されます。隣接するテクセルからの推定値は、ピクセルを共有し、同じ摂動ドローを使用するため、独立ではなく相関しています。
特定のラテント値について、省略されたピクセルごとの損失項は、その値の摂動に依存しないため、それらとラテント値の積の期待値は通常のガウスES推定器ではゼロになります。したがって、フットプリント割り当ては、バイアスなしでそれらを削除します。これは、デコーダーの依存グラフから直接従う分散削減メカニズムです。
このリポジトリで実装されていること:
- 低解像度ラテントテクスチャと小さなMLPデコーダー。ラテントとデコーダーの両方が、バックプロパゲーションや解析微分なしで、完全に反対称進化戦略によって最適化されます(デコーダーのオプションの有限差分仕上げは数値であり、自動微分ではありません)。
- サポート制限付きフットプリント割り当て(ラテントES用):すべてのラテント値は同時に摂動され、フルイメージは +ε と -ε のためにデコードされます。各ピクセルの損失差は、そのピクセルのバイリニアサンプリングフットプリント内のラテントテクセルにのみ帰属します。したがって、1つの反対称デコードペアは、ラテント全体にわたる同時局所ES推定値を生成し、各テクセルに依存できない損失項を除外します。
- パラメータサポートに合わせた別々のESスケジュール:グローバルに作用するデコーダー重み用のミニバッチ化された多数ペアのES、および空間的に局所的なラテント用のフルイメージの少数ペアのフットプリント割り当てES。これらは各イテレーションでインターリーブされ、推定値はAdamに供給されます。
- 後期トレーニングデコーダーフェーズ(2026年9月4日追加):実行の選択された割合から、デコーダーステップは(a)フルイメージで評価される反対称ES、(b)共有ミニバッチでの重みごとの中心有限差分(自動微分なしの数値勾配)に切り替えることができます。デコーダーのAdam状態は、ESフェーズの2次モーメント推定値がそれを過度に制限するため、切り替え時にリセットされます。または(c)デコーダーの更新なし(ラテントのみのフェーズ)。marioで128×128×4 + 64×64×4構成、36,36デコーダー、64ESペア、後半で学習率を減衰させた場合:最後の四半期での有限差分は、3000イテレーションで0.27 dB、6000イテレーションで0.42 dB向上しました(31.38 → 31.80 dB)。Adamリセットは効果を2倍以上にしました。フルイメージフェーズと固定フェーズは測定可能な変化をもたらしませんでした。
- ES下での学習率減衰(2026年9月4日追加):実行の後半で両方の学習率を線形に減衰させます。ES勾配ノイズは各ステップで再注入されるため、固定レートのAdam実行はジッターフロアで安定します。減衰は、marioで単一の128×128×8ラテントと
ldct:2位置入力(31.36 → 32.21 dB)を使用した場合、6000イテレーションで目に見えるテクセルアラインされたアーティファクトのほとんどを除去し、0.85 dB向上しました。また、2レベル構成(30.82 → 31.38 dB)では0.56 dB向上しました。 - 交替レベル摂動(2026年9月4日追加、
--lat-alt):2つのラテントレベルがある場合、各反対称ペアは1つのレベルのみを摂動し、ステップ間でローテーションさせます。各レベルの勾配は、自身のペア数でスケーリングされます。これにより、フットプリント割り当てにおけるレベル間のクロストークが正確に除去されます。64×64のセカンドレベルで測定した場合、0.17 dB失われました。これは、各レベルのペア数を半分にすることが、除去された小さなクロストークよりもコストがかかったためです。 - トレーニング後のラテントのスカラー量子化(チャンネルごとのスケール付き)、および任意のラテントビット深度でのビットレート報告。
- デコーダー用の位置エンコーディングのプラグイン(セルごとのバイリニアセルオフセットのコサイン特徴(
ldct:N)を含む)、これらは細かいラテント解像度で品質を向上させることがわかりました。 - 設定可能なデコーダーの深さ、幅、活性化関数。保存されたモデルは、各ラテントレベルのサイズ、MLPレイアウト、活性化関数、位置仕様、およびテクスチャ数を記録します(出力マッピングや損失重みは記録しません。METHOD.md §7参照)。
- 2レベルラテントピラミッド(2026年9月4日追加、
--latent2):同じUVでサンプリングされ、最初のラテントに連結される2番目のラテントテクスチャ。各レベルで一度適用される同じフットプリント割り当てでトレーニングされます。3000イテレーション、8ビットラテントで測定:kodim23 64×64×4 + 16×16×4は、64×64×4単独の27.16 dB(0.55 bpp)に対して、27.47 dB(0.59 bpp)を達成しました。mario 128×128×4 + 32×32×4は、28.82 dB(2.05 bpp)に対して、29.08 dB(2.18 bpp)を達成しました。 - ESによるマテリアルのトレーニング(2026年9月4日追加):最大4つの同サイズRGBテクスチャを、1つの共有ラテントとテクスチャあたり3つの出力を持つ1つのMLPから共同でトレーニングします。テクスチャごとの損失重みとテクスチャごとの報告付き。マテリアルのテクスチャを共有ラテントから共同で圧縮することは、ニューラルテクスチャ圧縮における確立された実践です。ここで開示されているのは、これを完全に微分フリーで行うことです。ピクセルごとの損失は、フットプリント割り当ての前に各テクスチャのチャンネル全体で合計されるため、マテリアル全体の1つの反対称デコードペアは、すべてのテクスチャを同時に使用した各ラテントテクセルのサポート制限付きES推定値を提供します。デコーダーはESまたは重みごとの有限差分でトレーニングされ、どのテクスチャを通してもバックプロパゲーションはありません。重みは割り当て前にピクセルごとの損失に入力されるため、ゼロ重みはラテント勾配に対するそのテクスチャの影響を正確に除去します。重みごとの有限差分を最後の四半期で使用し、8ビットラテントで3000回の減衰イテレーションでの結果:4層PavingStones070マテリアル(法線、粗さ、アルベド、AO)は、128×128×4 + 64×64×4と36,36デコーダーを共有し、テクスチャあたり0.66 bpp(合計2.64 bpp)で23.2 / 31.5 / 23.2 / 29.6 dBに達しました。最初の2層のみで、テクスチャあたり1.31 bppで25.0 / 32.5 dBに達しました。2つの無関係な写真(kodim23 + mario)は、128×128×8 + 64×64×4(減衰、有限差分フェーズなし)を共有し、テクスチャあたり2.3 bppでそれぞれ30.4 dBと29.6 dBに達しました。これは、共有するものが何もない場合に予想されるように、各テクスチャあたり同程度のビットレートで単独で達成するものと同等です。
実装されていないが説明されていること:
- ES下での量子化対応トレーニング:デコード時にラテントを量子化(またはブロック圧縮)し、それをすべてのES評価で使用します。ESは損失値のみを観測するため、非微分可能な量子化器またはコーデックは、ストレートスルー推定器や微分可能な代理なしでループ内に配置できます。
- 標準GPUテクスチャフォーマットで保存されたラテント、トレーニングループ内。ラテントテクスチャは最終的にGPUテクスチャになるため、ハードウェアがネイティブにサンプリングする任意のフォーマットで保持できます。非圧縮固定小数点フォーマット(A8R8G8B8、R8、RG8、4ビットおよび5:6:5パッキング、RGBA16)、またはブロック圧縮フォーマット(BC1–BC7、符号付きまたはHDRラテント用のBC6H、任意のブロックサイズのASTC LDRおよびHDR)。ESは損失値のみを観測するため、フォーマットのエンコード–デコードラウンドトリップは、ストレートスルー推定器または微分可能な代理なしで、各ES評価内に配置できます。トレーナーは、GPUがラテントをどのように見るか正確に見ます。ブロックフォーマットの場合、損失割り当てはテクセルごとではなくブロックごとになります。なぜなら、1つのエンドポイントの変更はブロック内のすべてのテクセルを移動させるためです。テクセルごとのフォーマットでは、割り当ては変更されません。
- エンコードされた表現での直接検索。浮動小数点ラテントをトレーニングしてエンコードするのではなく、エンコードされたテクスチャ自体をパラメータベクトルにし、その格納フィールドを直接摂動します。固定小数点フォーマットの場合は量子化テクセル値、ブロック圧縮フォーマットの場合はブロックエンドポイント、パーティションおよびモードセレクター、テクセルごとのインデックス。ESを離散摂動または受け入れ/拒否付き確率的座標降下で使用します。これは、従来のテクスチャエンコーダーが検索するのと同じ方法です。この場合、ループ内にエンコーダーはまったくなく、フォーマットのデコーダーのみが存在し、ビットレートは構成によってフォーマットで固定され、トレーナーとテクスチャコンプレッサーは、ディストーションメトリック内にMLPを持つ同じプログラムになります。
- 非オーバーラップ摂動フェーズ:評価ごとに2×2グリッドの1つのフェーズのテクセルまたはブロックのみを摂動します。これにより、バイリニアサンプリング下で、2つの摂動フットプリントがオーバーラップせず、隣接クロストークが消滅します。フェーズをサイクルしてすべてのパラメータをカバーします。(上記のレベル交替はクロスレベルのアナログであり、実装されています。レベル内バージョンは実装されていません。)
- 画像自体からのラテント初期化をESトレーニングのウォームスタートとして使用:ターゲット(マテリアルのすべてのテクスチャ)を各ラテントレベルの解像度にボックスダウンサンプリングし、各テクセルのスタックされたチャンネルベクトル(3T値、またはそれらの小さな局所パッチ)をそれらのベクトルの上位
C主成分(PCA)に射影します。これにより、初期ラテントは局所画像コンテンツの最適なCチャンネル線形要約となり、ノイズではなくなります。デコーダーはその後、線形に近い逆射影を学習することから始まります。また、以前にトレーニングされたモデルからのデコーダー初期化。 - 非RGBチャンネル数(単一チャンネルの粗さまたはAO、2チャンネルの法線)を持つマテリアルと、法線マップ対応損失。
- BRDF(レンダリング損失)を通じたマテリアルのトレーニング:シェーディングモデルをES評価内に配置します。ラテント → デコードされた法線、アルベド、粗さ、AO → BRDF(1つ以上のライトとビューの下で)→ レンダリングされた画像 → 元のマップの同じレンダリングに対する損失。現在、各マップは独自のピクセルMSEと手動設定された重みでフィッティングされます。レンダリング損失は、ゲームが実際に目にするものにどれだけ影響を与えるかに基づいて各マップに重み付けします。BRDF、トーンマッピング、またはパイプライン内の他のものの導関数を必要としません。ピクセルごとのシェーディングモデル(シャドウやスクリーン空間効果なし)の場合、損失はピクセルごとの合計のままであり、フットプリント割り当ては変更されずに適用されます。隣接ピクセルを読み取る効果はフットプリントを拡大し、粗いラテントレベルと同じように扱われます。評価ごとの複数のライトまたはビューは、ピクセルごとの項をさらに合計するだけです。
- SPSA(同時摂動確率近似)およびRademacher ES(ガウスESの代わり):SpallのSPSAは、各パラメータをランダムな±1(Rademacher)ステップ
cで摂動し、両側L± = L(θ ± cΔ)を評価し、各成分をĝ_j = (L₊ − L₋) / (2c·Δ_j)として推定します。Δ_j = ±1なので、これは(L₊ − L₋)·Δ_j / (2c)となり、これは±1方向を持つ反対称ES推定器とほぼ同じです。2回の評価でパラメータ数に関係なく完全な勾配が推定され、摂動はパラメータあたり1ビットをパックします。これはフットプリント割り当てにそのまま適用できます。なぜなら、テクセルごとの損失差は摂動分布に依存せず、局所的なクレジット割り当てはグローバルSPSAよりもノイズが少ないはずだからです。計画されている実験は、反対称Rademacher摂動とフットプリント割り当てをラテントとデコーダーの両方に適用し、現在使用されているガウスESと比較することです。 - 補間カーネルを、デコーダー入力ではなく、いくつかのグローバルパラメータとして表現して学習。
ステータス
これは学習と実験のための意図的にシンプルな研究用トイであり、コーデックではありません。何も調整されていません。明白な次のステップ:量子化対応トレーニング、トレーニングループ内のブロック圧縮(BC/ASTC)ラテント、マテリアルの非RGBチャンネル数(単一チャンネルの粗さ/AO、2チャンネルの法線)と法線マップ対応損失、および代替損失。