斑点人像:照片的梯度下降
用 2D 高斯斑点绘制照片。从 1500 个随机斑点开始,每步渲染它们,测量与照片的误差(L1 + SSIM),然后微调每个斑点以减少误差(Adam)。在高误差区域会生成新的小斑点。不涉及任何图像生成模型:画面是通过学习得到的。
步骤
-
获取照片。 使用附件中的文件。注意其主体位置,以便设置
--focus(最需要细致训练的区域,通常是面部)。 -
安装。 Python 3.10+。
pip install -r requirements.txt # torch, numpy, pillow如果 PyTorch 索引被屏蔽,直接从 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-30 dB 表示略为相似(快速模式),38 dB+ 则在正常尺寸下很难区分。如果面部模糊,增加步数或将--focus调整到面部区域后重新运行。 -
交付。 发送
compare.jpg、render.png和training.gif。说明使用的斑点数、步数、PSNR 值,并强调这是训练得到的,而非生成的。
输出文件
| 文件 | 说明 |
|---|---|
render.png | 完整拟合尺寸下的斑点画作 |
compare.jpg | 真实照片与代码版本的对比图 |
zoom.jpg | 眼部附近的细节放大图 |
training.gif | 从噪声到画面的动画,每个里程碑一帧 |
blobs.npz | 每个斑点的参数:位置、缩放、角度、颜色、强度(用于重新渲染或动画) |
stats.json | 步数、斑点数、PSNR、耗时、设备 |
诚实限制
- 它只能复制单张照片。无法创造新视角或新面孔。
- 质量取决于步数:短时间 CPU 运行效果较模糊;要表现细腻的皮肤纹理需要
full预设。 - 背景色取自照片边缘,因此斑点只需绘制与背景不同的部分。