在传统成像系统中,光学设计与图像处理往往是彼此独立的两个环节,而超表面作为一种能够在亚波长尺度调控光场的新型器件,虽具备实现超薄成像的潜力,却长期受限于大孔径和低F数条件下严重的像差问题,导致成像质量远逊于传统透镜。针对这一瓶颈,本期跟着文献实现一个端到端优化框架,将超表面的物理结构设计与基于神经网络的图像重建过程统一到同一个可微学习体系中,实现“光学+算法”的协同优化。
Tseng, E., Colburn, S., Whitehead, J. et al. Neural nano-optics for high-quality thin lens imaging. Nat Commun 12, 6493 (2021). https://doi.org/10.1038/s41467-021-26443-0
https://www.nature.com/articles/s41467-021-26443-0
在实现超表面端到端优化的过程中,一个关键挑战在于:如何将复杂的纳米结构光学行为纳入可微分的学习框架中。为此,本期跟着文献实现了一个可微超表面模型(Differentiable Metasurface Proxy Model),具体的,论文将整个成像过程拆解为三个连续且可求导的阶段:超表面相位生成、点扩散函数(PSF)建模与卷积,以及传感器噪声模拟。在建模过程中,研究者并未直接对每个纳米结构逐点优化,而是通过一组多项式系数来参数化相位分布,从而在降低优化复杂度的同时避免陷入局部最优。同时,通过构建“相位—结构—相位”的双向映射关系(神经网络的前向传播过程和反向过程),实现了从设计波长到多波长响应的可微传播建模,使系统能够支持全彩成像优化。相比传统的FDTD等全波电磁仿真方法,该模型在保持合理精度的前提下,实现了超过千倍以上的计算加速与内存压缩,使得整个“超表面设计 + 成像重建”的端到端训练可以在GPU上高效完成。这一方法本质上打通了“纳米结构物理”与“深度学习优化”之间的壁垒,是实现智能光学系统设计的重要一步。
TensorFlow >= 2.2
TensorFlow Probability
TensorFlow Addons
Numpy
Scipy
matplotlib
pycharm
四、核心代码拆解:物理先验与深度学习的融合
在完成了前端“超表面相位可微建模”后,整个端到端系统的另一个核心在于
后端图像重建。由于超表面透镜(尤其是单片结构)在宽波段成像时会产生极其严重的色差和空间模糊,传统的图像处理算法(如维纳滤波)或纯粹的“黑盒”深度学习网络都难以取得理想的重建效果。为此,论文设计了一个非常巧妙的神经特征传播网络(Neural Feature Propagator Network),将光学物理先验(OTF)直接硬编码到了神经网络的特征提取过程中(没有盲目堆叠卷积层)。我提取了源码中最核心的网络构建代码进行拆解分析:
1. 物理启发的特征提取(Physics-Informed Feature Extraction)
在传统的 CNN 中,网络只能输入一张模糊图像,靠数据驱动去“猜”清晰图像。而这里是网络被直接告知了光学系统的物理特性:
# 特征提取模块核心代码片段def feat_extract(img, snr, otf_1x, ew_1x, otf_2x, ew_2x, otf_4x, ew_4x, params, args): # ... (省略基础卷积下采样过程) # 在 4x, 2x, 1x 三个不同尺度的特征图上,直接引入物理维纳反卷积 wien_l2_b, _, = deconvolve_wnr(conv_l2_k5, snr, tf.tile(otf_4x, [1, 20, 1, 1]), tf.tile(ew_4x, [1, 1, 1, 20]), do_taper=(args.do_taper)) wien_l1_b, _ = deconvolve_wnr(conv_l1_k7, snr, tf.tile(otf_2x, [1, 10, 1, 1]), tf.tile(ew_2x, [1, 1, 1, 10]), do_taper=(args.do_taper)) # 1x 尺度下手动构建 Wiener filter 并进行反卷积 wiener_1x = tf.math.conj(otf_1x) / (tf.cast(tf.abs(otf_1x) ** 2, tf.complex64) + tf.cast(1 / tf.abs(snr), tf.complex64)) wien_l0_b, _ = deconvolve_wnr(conv_l0_k7, snr, tf.tile(otf_1x, [1, 5, 1, 1]), tf.tile(ew_1x, [1, 1, 1, 5]), do_taper=(args.do_taper)) return wien_l0_b, wien_l1_b, wien_l2_b, ew_1x, ew_2x, ew_4x
代码将系统当前的 OTF(光学传递函数,即PSF的傅里叶变换) 和 SNR(信噪比) 作为输入。在特征下采样的不同尺度(1x, 2x, 4x)上,调用 deconvolve_wnr 在特征图层面执行物理公式级别的维纳反卷积。这样做极大地减轻了神经网络的负担:让“物理公式”去完成基础的光学去模糊工作,而让“神经网络的卷积层”去专门负责修补反卷积带来的振铃伪影(Ringing Artifacts)和色彩偏移。
2. 消除边界伪影的工程细节(Boundary Cropping)
在反卷积处理中,图像边缘通常会产生严重的伪影。通过在前端计算时故意使用比目标输出更大的分辨率尺寸(Padding),在经历完物理反卷积后,通过切片操作 [:,side:-side,side:-side,:] 将边缘的伪影区域直接丢弃,保证了最终成像视野内的纯净度,这是提升画质的关键一步。
## Feature Extractor 输出后的处理 deconv0, deconv1, deconv2, edge0, edge1, edge2 = \ feat_extract(inputs, tf.math.pow(10.0, snr), otf_1x, ew_1x, otf_2x, ew_2x, otf_4x, ew_4x, params, args) # 计算需要裁剪的边缘宽度 side = (h - params['out_width']) // 2 # 切割掉边缘伪影区域,只保留中心高质量特征传入Decoder deconv0 = deconv0[:,side:-side,side:-side,:] deconv1 = deconv1[:,side//2:-side//2,side//2:-side//2,:] deconv2 = deconv2[:,side//4:-side//4,side//4:-side//4,:]
3. U-Net 架构(大部分都采用这个架构)解码器与跳跃连接(Skip Connections)
## Decoder 核心代码片段 up_l2 = conv_transp(60, 2, 2, LReLU, apply_instnorm=False)(conv_l2_k4) # 跳跃连接:将上采样特征与对应的编码器特征拼接 conv_l1_k3 = conv(60, 3, 1, LReLU, apply_instnorm=False)(tf.concat([conv_l1_k2, up_l2], axis=3)) up_l1 = conv_transp(30, 2, 2, LReLU, apply_instnorm=False)(conv_l1_k4) conv_l0_k2 = conv(30, 5, 1, LReLU, apply_instnorm=False)(tf.concat([conv_l0_k1, up_l1], axis=3))
在主函数 FP 的后半段,也就是解码器(Decoder)部分:为了恢复图像的原始分辨率,代码使用了 conv_transp(转置卷积)进行上采样,并通过 tf.concat 引入了跳跃连接。这种类似 U-Net 的结构能够将底层的空间细节特征(如物体的边缘轮廓)与高层的语义特征(经过物理去模糊的干净特征)进行融合,确保重建出的最终图像不仅清晰,而且色彩还原准确。最后通过 tf.clip_by_value 将像素值限制在 0 到 1 之间,输出最终的高质量 RGB 图像。