ブロブポートレート:写真の勾配降下
写真を2Dガウシアンブロブで描画します。1500個のランダムブロブから始め、各ステップでそれらをレンダリングし、写真との誤差(L1 + SSIM)を測定し、各ブロブを少しずつ移動させて誤差を減らします(Adam)。誤差が最も大きい場所には新しい小さなブロブが出現します。画像生成器は関与せず、画像は学習されます。
手順
-
写真を入手する。 添付ファイルを使用します。
--focus(最も密な学習を行う領域、通常は顔)を設定できるよう、被写体の位置を確認します。 -
インストール。 Python 3.10+。
pip install -r requirements.txt # torch, numpy, pillowPyTorchインデックスがブロックされている場合は、PyPIから単純に
pip install torchで動作します。 -
プリセットを選ぶ。 利用可能なハードウェアと時間に基づいて選択します。
プリセット ステップ数 最大ブロブ数 2コアCPU GPU quick300 15,000 ~8分 ~1分 default1,600 45,000 ~35分 ~5分 full6,000 100,000 時間単位 ~20-40分 CPUの場合は、
defaultをバックグラウンドで実行し、ログを確認します。処理中はブロックしないでください。 -
実行。
python scripts/blobfit.py photo.jpg --out result/ --preset default \ --aspect 4:5 --focus 0.5,0.4,0.45,0.5--aspectは中央を中心に w:h にクロップします(noneで写真の元の形状を保持)。--focus cx,cy,w,hはクロップ後の画像の0-1範囲です。中央の自撮りでは0.5,0.4,0.45,0.5で顔をカバーします。--steps/--blobsでプリセットを上書きできます。- デバイスは自動選択:CUDA → Apple MPS → CPU。
-
結果を確認してから納品する。
compare.jpgとzoom.jpgを開いて確認します。stats.jsonにPSNRが記録されています:約28-30dBでソフトな類似度(quick)、38dB以上で通常サイズでは区別がつきにくくなります。顔がソフトな場合は、ステップ数を増やすか--focusを顔に合わせて再実行します。 -
納品。
compare.jpg、render.png、training.gifを送ります。ブロブ数とステップ数、PSNR、そして生成ではなく学習で作成されたことを伝えます。
出力
| ファイル | 説明 |
|---|---|
render.png | 最適化されたサイズでのブロブペインティング |
compare.jpg | 実際の写真とコード版の比較 |
zoom.jpg | 目周辺の拡大証明 |
training.gif | ノイズから画像へ、マイルストーン毎のフレーム |
blobs.npz | すべてのブロブ:位置、スケール、角度、色、強度(再レンダリングやアニメーション用) |
stats.json | ステップ数、ブロブ数、PSNR、経過秒数、デバイス |
正直な限界
- 1枚の写真を複製します。新しい視点や新しい顔を生成することはできません。
- 品質はステップ数に依存します:短いCPU実行ではソフトな仕上がりになり、細かい肌の質感には
fullプリセットが必要です。 - 背景色は写真の端から取得されるため、ブロブはそれと異なる部分のみを描画すればよいです。