DeepLens E2 执行笔记:课程学习镜头设计全流程实录
论文:Curriculum Learning for ab initio deep learned refractive optics (Nature Communications, 2024)
代码库:github.com/vccimaging/DeepLens(AutoLens 评价/设计框架)
实验路线:理解优先复现路线 E1–E4 之 E2
执行环境:AutoDL 西北B区 · RTX 4090 · PyTorch 2.1.2+cu121
执行日期:2026-10-07 22:42 – 2026-10-08 00:23(约 101 分钟)
目录
- 摘要
- 一、E2 的定位与实验设计
- 二、执行环境与成本
- 三、Stage 1:课程学习 40 分钟实录
- 3.1 课程热启动效应(iter 0 → 40)
- 3.2 课程调度核心观测指标
- 3.3 边缘视场的"故意欠拟合"
- 四、Stage 2:精修 60 分钟实录
- 4.1 关键现象:进入精修后 RMS 反而变大
- 4.2 精修结果与论文成品对标
- 五、结果解读:边缘未收敛说明了什么
- 六、素材产出与公众号用法
- 七、经验沉淀
- 附录 A:命令清单
- 附录 B:下一步(E3 预告)
摘要
E2 在 RTX 4090 上以百分钟、3 元成本跑通 AutoLens 两阶段设计:课程学习 2000 迭代将中心 RMS 光斑从 962μm 压至 8.5μm,精修 3000 迭代后达 5.6μm,对齐论文成品;边缘视场 60/91μm 未收敛,印证课程长度对边缘像质的关键作用。
一、E2 的定位与实验设计
E1 已完成"评价论文成品"(cellphone.json 的 RMS 光斑分析),回答了**“论文做出来了什么”。E2 则回答"论文是怎么做出来的"**——直接运行1_autolens.py,从平板玻璃初始结构出发,完整经历论文的核心贡献:两阶段可微光线追迹优化。
两阶段流程与论文方法的对应关系:
| 阶段 | 论文机制 | 实现细节 |
|---|---|---|
| Stage 1: Curriculum learning (2000 iter) | 正弦课程调度逐步放开 FoV 边缘视场权重;三项正则(光线角度、面间距、面梯度) | lr=[1e-4, 1e-3, 1e-2, 1e-4],spp=512,num_ring=8,num_arm=1 |
| Stage 2: Fine-tuning centroid=True (3000 iter) | 全视场全权重精修,光线质心对齐 | lr 整体降 20 倍,num_arm=2,rays_per_fov=1024 |
设计目标:foclen=5.0mm,FoV=90°,F/1.8。最终输出规格:FoV=0.8015 rad(半视场约 45.9°,全视场约 91.8°)、F/1.74、r_sensor=5.0mm——三项设计约束均达成。
二、执行环境与成本
| 项目 | 明细 |
|---|---|
| 实例 | AutoDL 西北B区deeplens(E1 同一实例,环境与补丁原样保留) |
| GPU | RTX 4090(有卡模式 ¥1.88/h) |
| 软件 | PyTorch 2.1.2+cu121 + numpy 1.26.4(base 环境零安装) |
| 用时 | Stage 1: 40min46s;Stage 2: 59min55s;合计约 101 min |
| 成本 | 约 ¥3.2(含少量调试时间) |
| 产出目录 | ~/AutoLens/results/1007-224249-AutoLens-OhbV/ |
迁移插曲:实验前西北B区显卡一度售罄,已规划跨区迁移至内蒙B区并完成新实例环境部署(DeepLens-main.zip + torch 2.1.2+cu118 + numpy 降级)。临执行时西北B区 4090 恢复可用,遂放弃迁移直接续跑——旧实例上 E1 的三处补丁(r_sensor、NBS 分辨率卡、渲染 OOM 规避)全部继承,省去重复踩坑。教训:迁移决策前先刷新一遍库存页面。
三、Stage 1:课程学习 40 分钟实录
3.1 课程热启动效应(iter 0 → 40)
| 节点 | FoV 0.0 | FoV 0.5 | FoV 1.0 | 解读 |
|---|---|---|---|---|
| iter 0 | 962.4 μm | 964.3 μm | 964.0 μm | 平板玻璃,无聚焦能力 |
| iter 40 | 55.5 μm | 26.9 μm | 60.5 μm | 17 倍骤降,课程热启动生效 |
| iter 1905 (95%) | 8.3 μm | 82.3 μm | 84.5 μm | 中心收敛,边缘仍粗 |
| iter 2001 (结束) | 8.5 μm | 81.9 μm | 86.1 μm | 课程全程走完 |
iter 0→40 的骤降是论文 Fig.2"课程调度避免优化陷入坏极小值"的直接证据:三项正则尚未收紧时,系统先以最小阻力把光斑收敛到可用量级。
3.2 课程调度核心观测指标
loss_distortion的完整轨迹:
iter 0: 1.88 → iter 40: 1.88 → iter 320: 1.39 → iter 1905: 0.0127 → 课程结束: 0.0178约148 倍降幅,单调缓降无突跳——正弦课程t_i = t_a + (t_b - t_a)·sin(iπ/2N)将边缘视场约束平滑注入,而非阶跃式加载。这是"课程"区别于普通多目标加权调度的本质特征,也是本实验最值得画进 GIF 的一条曲线。
其余损失项行为:loss_clearance(面间距约束)从 1.26 快速压至 0.01 量级;loss_ray_bend稳定在 0.05–0.08;loss_rms全程 0.04–0.06 微幅波动(归一化后梯度通道保持活跃)。
3.3 边缘视场的"故意欠拟合"
课程结束时边缘视场仍在 82/86 μm,这不是失败而是课程设计:正弦调度把大 FoV 权重留到最后才完全放开,课程结束时刻恰是边缘视场"刚刚解锁"的状态,细磨任务交给 Stage 2。
四、Stage 2:精修 60 分钟实录
4.1 关键现象:进入精修后 RMS 反而变大
| 节点 | FoV 0.0 | FoV 0.5 | FoV 1.0 |
|---|---|---|---|
| 课程结束(稀疏采样) | 8.5 μm | 81.9 μm | 86.1 μm |
| 精修 iter 0(加密采样) | 21.0 μm | 101.5 μm | 66.7 μm |
| 精修结束 / final | 5.6 μm | 60.4 μm | 91.2 μm |
镜头没变差,是尺子变细了:Stage 2 将采样从 num_arm=1 加密到 num_arm=2、rays_per_fov=1024,原先被稀疏网格漏采的高阶像差全部暴露。这正是"评价精度必须与优化精度同步升级"的方法论体现——若精修仍用粗网格,等于在错误的坐标系里做精细调整。
4.2 精修结果与论文成品对标
| 指标 | E2 自研成品(final_lens.json) | E1 论文成品(cellphone.json) | 差距 |
|---|---|---|---|
| FoV 0.0 RMS | 5.6 μm | 6.4 μm | 反超 ✓ |
| FoV 0.5 RMS | 60.4 μm | 5.6 μm | 约 11 倍 |
| FoV 1.0 RMS | 91.2 μm | 4.1 μm | 约 22 倍 |
| 畸变损失 | 1.12e-5 | — | 已近零 |
中心视场达到论文水平(甚至略优),但边缘视场差一个数量级以上。
五、结果解读:边缘未收敛说明了什么
这是本次实验最有价值的发现,与论文动机形成闭环:
- 课程长度决定边缘像质。本次仅用论文设定 1/10 量级的迭代预算(2000+3000 vs 完整训练),中心视场可以"抄近道"收敛,边缘视场的像差空间需要课程充分展开后长时间精修才能压平——课程不是加速器,而是边缘视场可行性的门票。
- 这是论文的卖点而非 bug。若不用课程学习、直接全权重优化,文献与论文消融均显示边缘视场会卡死在不可用区域;本实验"压缩课程"得到的 60/91 μm,恰是介于"完全不用课程"与"完整课程"之间的中间态证据。
- 对复现者的启示:验证课程学习价值的最小实验,不在于跑出论文级数字,而在于复现"课程阶段 loss_distortion 平滑下降 + 边缘视场可被继续优化"的动力学特征——本实验两者均观察到。
六、素材产出与公众号用法
产出目录~/AutoLens/results/1007-224249-AutoLens-OhbV/,每 40 迭代存一份镜头 JSON + 光斑图,天然构成演化帧序列:
- 演化 GIF:
ffmpeg -framerate 3将课程+精修两段帧序列拼接,直观呈现"平板玻璃 → 透镜成形 → 边缘解锁"过程,适合作为公众号首图或文末彩蛋; - 对比图:
curriculum_final.json与final_lens.json的剖面对比,量化 Stage 2 贡献; - 曲线素材:loss_distortion 全程轨迹(1.88 → 1.1e-5)与三视场 RMS 轨迹,可从日志直接重绘。
七、经验沉淀
- 长任务先起 tmux:本次进程未包 tmux,靠 SSH 稳定撑完 101 分钟属侥幸。标准动作
tmux new -s 任务名后再启动训练,断线可tmux attach -t 任务名续看。 - 无warn不慌:
libgomp: Invalid value for OMP_NUM_THREADS与Nimbus Sans字体缺失警告全程刷屏但零影响,判断标准是结果数值是否正常产出。 - 迁移决策先刷新库存:跨区迁移成本(重装环境+重踩三坑)远高于等卡 2 小时;GPU 云的库存是分钟级波动的。
- 环境快照意识:本次能"零安装"续跑,完全依赖 E1 实例的环境原样保留。跨区新装一遍 DeepLens 环境实际花掉约 1.5 小时(含 numpy 2.x 兼容坑),可作为迁移成本的经验系数。
附录 A:命令清单
# 环境验证(有卡模式开机后)python-c"import torch, numpy; print(numpy.__version__); \ print(torch.__version__, torch.cuda.is_available())"# E2 全流程(建议 tmux 内执行)cd~/AutoLens&&tmux new-se2 python 1_autolens.py# 结果打包cd~/AutoLens/resultstarczf E2_results.tar.gz1007-224249-AutoLens-OhbV/# 演化 GIF(文件名 pattern 以实际产出为准)ffmpeg-framerate3-pattern_typeglob\-i'spot_diagram_iter*.png'-vfscale=640:-1-pix_fmtyuv420p\../E2_evolution.gif附录 B:下一步(E3 预告)
E2 验证了两阶段流程的可复现性;E3 计划做微型消融——关闭课程调度(直接全权重优化)跑对照,观察边缘视场是否如论文所述陷入劣质解,用最小成本把"课程必要性"从文献结论变成一手证据。