HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

ES(バックプロパゲーションなし)によるニューラルテクスチャとPBRマテリアルマップのフィッティング

Fitting Neural Textures and PBR Material Maps with ES (No Backprop) (richg42.blogspot.com)

4 pointsby ibobev0 コメント

要約

本記事は、バックプロパゲーションや自動微分に依存しない進化戦略(ES)を用いたニューラルテクスチャおよびPBRマテリアルマップの圧縮手法について解説しています。この手法では、低解像度の潜在テクスチャと少数のMLPデコーダーをESで学習させ、画像圧縮やマテリアル表現の効率化を目指しています。CPUでの高速な学習が可能で、圧縮されたデータから高品質なテクスチャやマテリアルを再構築できることを示しています。

全文翻訳

2026年9月4日 金曜日 ES(バックプロパゲーションなし)によるニューラルテクスチャとPBRマテリアルマップのフィッティング リポジトリは2026年9月4日に公開されました。こちらです: https://github.com/richgel999/neural_texture_es 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でサンプリングされ、そのチャンネルは最初のレベルのチャンネルに連結されます。 結果 kodim23の512×512クロップ、3000イテレーション、トレーニング後に8ビットに量子化された潜在テクスチャ、MLP重みはfp16としてカウント: Latent | PSNR | bpp (raw) | bpp (entropy coded) 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のみであり、両方が実行された場合(METHOD.mdを参照)よりも0.26–0.32 dB高いスコアでした。このファイルの後の方で引用されている結果は、特に断りがない限り、そのデフォルトを使用しています。 128×128×8の実行は、14 → 24 → 24 → 3のMLP(1035重み、leaky ReLU、sigmoid出力)を使用し、32スレッドCPUで約150秒でトレーニングされます。潜在テクスチャを8ビットに量子化すると、0.04 dBのコストがかかります。 その実行の出力(out_128c8/):ターゲットクロップ、3000イテレーション後の再構築、および8つの潜在チャンネルを並べて表示。 Target | Reconstruction (32.2 dB) out_128c8/model.bin はトレーニング済みのモデルです。 ntc kodim23.png --load out_128c8/model.bin --latent 128 128 8 --nfreq 1 --iters 0 で評価してください。 A 4-layer material PavingStones070マテリアル(法線、ラフネス、アルベド、AO;テスト画像参照)を、共有された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 Normal map, 23.2 dB Roughness, 31.5 dB Albedo, 23.2 dB Ambient occlusion, 29.6 dB 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)またはLinux/WSL上のOpenMP対応のC++17コンパイラを生成するCMake。Windows上のMSVC 2022およびMSVC 2026、WSL下のgcc 13でテスト済み。std::normal_distributionは標準ライブラリ間で異なるため、同じシードでもプラットフォームごとにわずかに異なる結果が得られることに注意してください。 cake -S . -B build -G "Visual Studio 17 2022" -A x64 cake --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|tanh|sine | 隠れ活性化関数 --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は、parrots.m1.png