简介:基于深度学习和Shack-Hartmann波前传感器的波前重建Matlab仿真项目,面向光学、计算机、电子信息及数学等专业学生和科研人员,适用于课程设计、期末大作业和毕业设计。资源共包含46个文件,压缩包1.84MB,核心包括20个Matlab脚本、7个Python辅助脚本、MAT数据文件、PNG示意图及说明文档,构成完整的可运行项目。仿真适配Matlab2014/2019a/2024a,附赠案例数据可直接运行;代码采用参数化编程,注释清晰,便于修改和二次开发。项目内含波前传感仿真与深度学习重建两个示例模块,可帮助理解光斑位移测量、波前相位恢复及深度网络在波前估计中的应用。已有477人学习下载,适合希望快速上手波前重建、开展仿真实验并拓展研究思路的读者。
1. 波前重建的另一种解法:跳过斜率反演,直接让网络看光斑
自适应光学和光学检测里,Shack-Hartmann波前传感器通过微透镜阵列把波前分割成子孔径,探测器上得到的光斑阵列偏移量直接反映局部波前斜率。传统重建路径是先求质心偏移,再用Zernike多项式拟合或区域法积分恢复波前,流程成熟、计算快,但在低信噪比、大动态范围或子孔径内存在高频像差时,质心提取误差会被后续解算放大。基于深度学习的做法,是把“光斑图/斜率向量”到“Zernike系数/相位面”的映射直接交给网络学,训练阶段用物理模型生成大量样本,在线阶段一次前向传播就能拿到重建结果。这个思路在Matlab里完全跑得通,也适合作为波前处理算法预研的起点。这篇文章面向做自适应光学仿真、光学检测算法验证或计算成像方向的工程师,用一个可复现的Matlab仿真框架把数据生成、网络搭建、训练评估和坑位讲清楚。
2. Shack-Hartmann波前重建的数据基础:从Zernike斜率到光斑图
深度学习波前重建绕不开数据。真实波前传感器采集的样本标注成本高、真值难获取,常见做法是用Zernike多项式作为波前基底,随机生成系数组合,再正向仿真出传感器响应,构成“输入-标签”对。这一步做得扎不扎实,直接决定后面网络能学到什么。
2.1 波前传感器的物理模型与斜率-波前关系
Shack-Hartmann的原理可以压缩成三条线:入射波前经微透镜阵列分割,每个子孔径把局部波前聚焦到探测器,光斑质心相对于参考位置的偏移量正比于该子孔径内的平均波前斜率。设微透镜焦距为 f,像素尺寸为 d,质心偏移量为 Δx(像素单位),则子孔径内沿 x 方向的平均斜率为:
sx ≈ Δx · d / f
这就是整个数据生成链条的物理锚点。只要保证仿真里的偏移量满足这个关系,网络学到的就不是纯数学拟合,而是有物理语义的映射。子孔径排布常见为正方形网格,例如 8×8 或 16×16,子孔径数量越多,空间采样越密,但单个子孔径收集的光能量越少,信噪比越低,这个矛盾在后面做噪声仿真时会体现出来。
波前 W(x,y) 用 Zernike 多项式展开:
W = Σ aj · Zj(x,y)
目标是让网络从传感器数据回归系数 aj,或直接回归采样网格上的 W 值。前者好处是输出维度低、结果天然平滑、可直接对接像差分析;后者好处是不受基底截断限制,能表达高频细节,但需要处理相位缠绕和空间平滑性问题。
2.2 用Matlab生成训练样本:Zernike系数→斜率→相位面
数据生成的起点是一组随机Zernike系数。常见做法是在一定范围内均匀采样,比如前三项离焦和像散控制在 ±2 波长,高阶项控制在 ±0.5 波长,避免生成严重缠绕甚至物理上不合理的波前。下面这段代码生成一个采样网格上的相位面,并同时输出对应子孔径的平均斜率,作为两种标签形式的基础。
% generate_zernike_wavefront.m N = 8; % 子孔径网格 8x8 pupil = 64; % 波前采样点数(像素) R = pupil/2; [x, y] = meshgrid(linspace(-R, R, pupil)); [theta, rho] = cart2pol(x, y); rho = rho / R; % 归一化半径,Zernike定义域 Z = @(j, rho, theta) zernikeFun(j, rho, theta); % j: Noll序号 J = 15; % 用前15项Zernike a = randn(1, J) .* [0.5*ones(1,2), 0.3*ones(1,4), 0.15*ones(1,9)]; % 按阶数递减能量 W = zeros(pupil); for j = 2:J % 去掉平移项piston W = W + a(j) * Z(j, rho, theta); end W(rho > 1) = NaN; % 圆域外置为无效 % 计算8x8子孔径的平均斜率(解析差分+区域平均) sub_aperture_size = pupil / N; sx = zeros(N); sy = zeros(N); for m = 1:N for n = 1:N x_range = (m-1)*sub_aperture_size+1 : m*sub_aperture_size; y_range = (n-1)*sub_aperture_size+1 : n*sub_aperture_size; subW = W(x_range, y_range); subW(isnan(subW)) = 0; [dWx, dWy] = gradient(subW); sx(m,n) = mean(dWx(:), 'omitnan'); sy(m,n) = mean(dWy(:), 'omitnan'); end endZernike 多项式的具体实现是这套数据生成里最容易出错的环节。需要特别注意三点:rho 必须按半径归一化,且网格中心要对准多项式定义的原点;圆域外的点要置为无效而不能参与梯度计算;系数能量按阶数递减是保证生成波前不至于完全脱离实际像差分布。这里使用 Noll 序号索引,和常见的 ANSI 或 Fringe 序号不同,混用会导致系数语义错位,后面网络学出来的结果看着收敛,但系数无法对应到正确像差项。若本地已有标准 zernfun 这类实现,确认索引序号后替换接口即可。
2.3 从相位面到光斑图的物理正演
斜率向量是网络最直接的输入形式,维度低、信息紧凑,但它丢失了光斑形状信息。低信噪比下质心提取会引入额外误差,而光斑图保留了原始光子统计特征,网络可以直接从“带噪声的光斑形状”学习重建,这正是深度学习相对传统质心法的优势之一。仿真光斑图的标准做法是:根据每个子孔径内的平均斜率,把理想衍射光斑质心平移对应像素数,再叠加泊松噪声和读出噪声。
% generate_spot_array.m lambda = 632.8e-9; % 波长 632.8nm f_lens = 5e-3; % 微透镜焦距 5mm pixel_size = 10e-6; % 探测器像素 10um spot_sigma = 1.8; % 高斯光斑半径(像素),衍射极限附近取1-2 flat_spot = fspecial('gaussian', [15 15], spot_sigma); spot_image = zeros(N*15, N*15); for m = 1:N for n = 1:N dx_pix = sx(m,n) * f_lens / pixel_size; % 斜率→像素偏移 dy_pix = sy(m,n) * f_lens / pixel_size; spot = flat_spot; spot = imtranslate(spot, [dx_pix, dy_pix], 'FillValues', 0); row = (m-1)*15+1 : m*15; col = (n-1)*15+1 : n*15; spot_image(row, col) = spot_image(row, col) + spot; end end spot_image = imnoise(spot_image / max(spot_image(:)), 'poisson'); spot_image = spot_image + 0.005 * randn(size(spot_image)); % 读出噪声这段代码把光斑建模成高斯分布,严格来说衍射光斑应为艾里斑,高斯近似在子孔径边缘或大偏移时会有偏差。仿真的重点是让网络看到“不同斜率导致不同光斑位移”,所以只要偏移量与斜率保持线性关系,重建网络的输入输出映射就是一致且可学习的。值得注意的是,光斑图输入的网络需要更多卷积层来提取位置信息,训练数据量需求也更大;斜率输入则可以用很小的全连接网络跑通,但鲁棒性上限受制于数据增强方式。
2.4 标签设计取舍:Zernike系数还是相位面
选择标签形式前先想清楚下游任务。做像差分析、闭环校正、与现有自适应光学系统对接时,Zernike系数是首选,因为可控变量就是各阶像差系数,校正器也按系数驱动。做光学检测、面形测量时,相位面更直观,也便于和干涉仪结果比对。
| 标签形式 | 输出维度 | 优点 | 主要风险 |
|---|---|---|---|
| Zernike系数 | 10~30 | 维度低、平滑、物理语义清晰 | 截断误差,高阶信息丢失 |
| 采样相位面 | 64×64以上 | 无基底限制,表达力强 | 相位缠绕、边缘效应、训练难度大 |
| 斜率场 | 2×N×N | 和传感器数据同域,可做残差学习 | 需额外积分步骤,误差累积 |
数据生成阶段建议同时保存 Zernike 系数和相位面,训练时先用系数回归做为主任务,把相位面作为辅助监督或验证指标。这种多标签设计在后期调参时会非常省事——网络收敛了但重建面形不对,看系数误差能快速定位是哪一阶出了问题。中间阶段如果只想快速验证流程,先只回归前15项系数就够跑通整个闭环,等训练稳定后再往高频加项。
3. 网络结构选择与Matlab中的模型搭建
输入形态决定网络骨架。斜率输入是低维向量,一个三到四层全连接网络就够;光斑图输入是图像,需要卷积层提取局部偏移特征。Matlab的Deep Learning Toolbox对两种网络都原生支持,而且可以统一走trainNetwork训练通道。
3.1 从斜率到波前:全连接网络的几个超参
斜率输入维度是 128(8×8子孔径的sx和sy拼接),输出维度是 J-1 个Zernike系数。全连接层的宽度变化比深度更敏感——先固定三层隐藏层,每层从256起步,比直接堆六层更稳。激活函数用ReLU,最后一层用linear。这个任务不适合在隐藏层加dropout,因为输入是物理量,本身噪声已经通过泊松仿真注入,dropout会进一步衰减信号,泛化提升有限,用L2正则更合理。
% build_fc_net.m input_size = 2 * N * N; layers = [ featureInputLayer(input_size, 'Normalization', 'zscore', 'Name', 'in') fullyConnectedLayer(256, 'Name', 'fc1') reluLayer('Name', 'relu1') fullyConnectedLayer(128, 'Name', 'fc2') reluLayer('Name', 'relu2') fullyConnectedLayer(J-1, 'Name', 'fc_out') regressionLayer('Name', 'out') % 回归任务输出 ];zscore归一化放在网络首层而不是预处理阶段,原因是训练集和推理时的数据分布可能不同,让网络层自适应缩放更稳健。Matlab的featureInputLayer里Normalization设为zscore,会在训练时自动统计均值方差,推理时用训练集的统计量,避免手工计算和存储这些参数。fc1到fc2的维度落差不要超过4倍,否则信息瓶颈太强,导致高order像差项学不动。最后一层的输出维度必须是J-1,对应去掉piston后的项数。
3.2 从光斑图到波前:轻量CNN的搭建
光斑图的输入尺寸是 N×15 的平方量级,例如 120×120 像素。这个尺度不需要深残差网络,四层卷积足够提取光斑位置和形状特征。第一层卷积核要大一些,7×7,感受野覆盖单个光斑;后续层用3×3减小参数量。每个卷积层后面接ReLU和max pooling,最后接两个全连接层输出Zernike系数。用layerGraph串联各层,方便后续接辅助输出分支。
% build_cnn_net.m lgraph = layerGraph(); lgraph = addLayers(lgraph, [ imageInputLayer([120 120 1], 'Name', 'in', 'Normalization', 'none') convolution2dLayer(7, 16, 'Padding', 'same', 'Name', 'conv1') reluLayer('Name', 'relu1') maxPooling2dLayer(2, 'Stride', 2, 'Name', 'pool1') convolution2dLayer(3, 32, 'Padding', 'same', 'Name', 'conv2') reluLayer('Name', 'relu2') maxPooling2dLayer(2, 'Stride', 2, 'Name', 'pool2') convolution2dLayer(3, 64, 'Padding', 'same', 'Name', 'conv3') reluLayer('Name', 'relu3') fullyConnectedLayer(128, 'Name', 'fc1') reluLayer('Name', 'relu4') fullyConnectedLayer(J-1, 'Name', 'fc_out') regressionLayer('Name', 'out') ]);卷积层的通道数按16-32-64递增,这是小数据集上最稳的增长曲线。max pooling放在前两层就够了,第三层之后特征图已经很小,再池化会丢失亚像素级的光斑位移信息。光斑亚像素位移恰恰是重建精度的关键,所以特征图尺寸不能压得太狠。120×120 的输入经过两次2倍池化后为30×30,再接全连接层时信息保留充分。imageInputLayer的Normalization设none,灰度范围由训练前的手工归一化统一处理,和光斑仿真的像素值范围保持一致。
3.3 损失函数与度量指标:RMSE、PV、拟合残差
回归任务最常用MSE作为损失函数,但波前重建的最终质量不能只看系数误差。两个网络的系数误差相同,很可能一个对应的相位面PV差别很大,因为低阶系数的微小变化对面形峰值影响远大于高阶项。训练过程中监控三个指标:Zernike系数的RMSE、重建相位面与真实相位面的PV误差、以及残差相位面的RMSE。这三个指标在训练曲线上的下降速度不同,系数误差可能先降后平,但PV还在明显下降——这时候网络其实仍在学习高频信息,不要因为系数RMSE不动就提前停止。
Matlab的trainingOptions里可以同时指定多个验证指标,通过OutputFcn回调把每个epoch的预测结果反变换到相位面再计算PV和RMSE记录。这部分代码量不大,但对判断收敛非常关键,否则只盯着loss曲线经常会被误导。另一个容易被忽略的细节是去除活塞项后再比较相位面,因为piston不改变波前形状,但会让PV值凭空增大。Matlab里直接对预测系数和真实系数都做去均值处理,或在比较前减掉Zernike第1项都行。
4. 训练策略与评估闭环:Matlab深度学习管线
有了数据和网络骨架,训练阶段的细节决定整个仿真能不能复现稳定性能。物理仿真数据和自然图像不同,它的分布范围有限,归一化方式、验证集划分、数据增强策略都有讲究,不能照搬图像分类任务的经验。
4.1 数据划分与归一化:把物理量缩放到网络友好范围
首先生成20000组样本,按 70/15/15 划分训练、验证、测试。验证集和测试集要保证Zernike系数的分布和训练集一致,所以不能直接随机切分后就不管,最好按系数的范围做分层采样。如果某阶像差系数的大值样本全部落在训练集,验证集只有小值样本,指标会虚高。
归一化这部分,光斑图输入用全局最大最小值缩放到 [0,1],注意不是每张图单独归一化,而是用整个数据集的统计量做统一缩放,否则单张图会放大噪声斑块的对比度。斜率输入可以用zscore,但均值和方差必须从训练集统计,固化后应用到验证测试集,避免信息泄漏。Zernike系数的标签也要做尺度对齐——前几阶系数幅值往往远大于高阶,不缩放的话网络会把学习重心全放在低阶项上。常见的做法是每列除以训练集该列的std,让各阶系数能量在同一量级。
% normalize_and_split.m coeff_all = randn(20000, J-1) .* [0.5*ones(1,2), 0.3*ones(1,4), 0.15*ones(1,8)]; coeff_std = std(coeff_all); coeff_norm = coeff_all ./ coeff_std; spot_all = generate_spot_batch(coeff_all); % 批量生成光斑图 spot_all = spot_all / max(spot_all(:)); idx = randperm(20000); train_idx = idx(1:14000); val_idx = idx(14001:17000); test_idx = idx(17001:end);批量生成光斑图时注意内存上限。120×120×20000 的单精度数组约 1.1GB,加上标签和中间变量,8GB内存的机器会接近极限。常见的解决办法是分块生成:每次生成5000张存入mat文件,训练时用imageDatastore配合自定义read函数按需加载。Matlab的tall数组也能处理,但在这个场景下直接分块更可控,生成速度也更快。
4.2 训练选项与收敛判断
训练参数从一组保守值起步:Adam优化器,初始学习率0.001,miniBatchSize 32或64,maxEpochs 30,ValidationFrequency设为每50个迭代验证一次。物理仿真数据比自然图像干净,不需要warm-up或学习率预热的技巧,直接固定学习率训练即可。
% train_net.m options = trainingOptions('adam', ... 'InitialLearnRate', 1e-3, ... 'MiniBatchSize', 64, ... 'MaxEpochs', 30, ... 'ValidationData', {spot_val, coeff_val_norm}, ... 'ValidationFrequency', 50, ... 'L2Regularization', 1e-4, ... 'Plots', 'training-progress', ... 'OutputFcn', @(info) monitor_reconstruction(info, net, val_data)); net = trainNetwork(spot_train, coeff_train_norm, layers, options);L2Regularization设1e-4到1e-3之间,这个值对系数回归影响比图像分类大。因为输出层的权重直接对应Zernike系数幅值,正则太强会把高阶系数压向零,导致重建波前过于平滑。如果训练后验证集loss下降正常,但测试集系数RMSE偏低,优先检查L2是不是设大了。monitor_reconstruction回调里做相位面重建指标统计,详见下一节。训练过程中如果验证loss出现震荡上升,典型原因是学习率偏大,降到3e-4后通常能稳住。
4.3 验证评估:从预测系数恢复波前
训练结束后在测试集上做一次完整的重建评估。取测试集样本,前向传播得到归一化系数,先乘以训练集的coeff_std还原到物理单位,再反变换成相位面,和真值相位面做逐点比较。下面代码展示完整的评估流程。
% evaluate_reconstruction.m coeff_pred_norm = predict(net, spot_test); coeff_pred = coeff_pred_norm .* coeff_std; coeff_true = coeff_test .* coeff_std; % 去掉piston后评估 coeff_pred = coeff_pred - mean(coeff_pred); coeff_true = coeff_true - mean(coeff_true); zernike_rmse = sqrt(mean((coeff_pred - coeff_true).^2, 'all')); phase_pred = zernike_sum(coeff_pred, rho, theta); phase_true = zernike_sum(coeff_true, rho, theta); residual = phase_pred - phase_true; pv_error = max(residual(:)) - min(residual(:)); rmse_phase = sqrt(mean(residual(~isnan(residual)).^2)); fprintf('Zernike RMSE: %.3f, Phase PV: %.3f wave, Phase RMSE: %.3f wave\n', ... zernike_rmse, pv_error/ (lambda/2), rmse_phase/ (lambda/2));单位换算是评估里最容易混淆的地方。Zernike系数的单位通常定义为波长,相位面残差的PV和RMSE也相应以波长为单位。如果数据生成时系数给的是微米或弧度,这里就得统一换算后再输出,否则报告的精度指标会差一个量级。另外,即使Zernike系数RMSE看起来不大,残差相位面也可能出现局部尖峰——这往往是某阶系数预测偏差的体现,结合按阶输出的误差柱状图能快速定位是哪几阶拖了后腿。
4.4 数据增强:绕质心旋转与亮度扰动
光斑图的数据增强不能随意做随机裁剪或翻转。Shack-Hartmann光斑图有严格的物理结构:子孔径网格的相对位置一旦被打乱,网络就无法区分光斑来源于哪个子孔径。可用的增强手段包括整图旋转90度的倍数(保持网格对齐)、全局亮度随机缩放、以及高斯噪声强度的小范围扰动。水平翻转要慎用,因为会改变像差的符号,如果数据生成时正负系数已均匀采样,翻转意义不大。旋转45度这类非90度倍数的操作会破坏子孔径网格的矩形排布,不能用于这个任务。
% augment_spot_data.m aug = imageDataAugmenter(... 'RandRotation', [0 90 180 270], ... 'RandScale', [0.9 1.1], ... 'RandXTranslation', [-2 2], ... 'RandYTranslation', [-2 2]); % RandRotation接受[0 90 180 270]方式,Matlab会从列表中随机取RandXTranslation和RandYTranslation设置为±2像素,能模拟探测器安装位置的小偏差,但偏移量不能太大,否则光斑可能移出子孔径对应的像素子块。RandScale用来模拟光源亮度波动,取值范围在0.9到1.1之间,过大的亮度扰动会让网络误把整体亮度当成有效特征。数据增强适用于光斑图输入,斜率向量输入建议不做增强,直接靠扩大样本量覆盖分布即可。
5. 复现中的坑与边界:低信噪比、离焦与泛化
把网络训练出来跑通测试集只是第一步。实际部署到真实传感器数据或跨条件仿真数据时,会遇到一系列仿真里没暴露出来的问题。这一章列举几个最常见的坑,每一个都是在反复调整中总结出来的。
5.1 波长、焦距与像素尺寸的换算不一致
数据生成阶段,斜率到像素偏移的换算依赖三个物理量:波长、微透镜焦距、像素尺寸。仿真里如果只用一个固定的比例常数,网络学到的其实是“像素位移到Zernike系数”的纯数值映射,换一组物理参数时就要重新训练。更稳妥的做法是在数据生成时显式写入这三个物理量,让网络输入包含设备参数或者正则化到偏移像素域。真实传感器标定时,微透镜焦距的误差通常是最大的不确定来源,如果仿真里给焦距加±2%的随机扰动,训练出来的网络对真实光斑偏移的容忍度会显著提升。
5.2 训练与推理数据形态不一致
光斑图的输入尺寸必须严格一致。训练用的120×120输入,推理时传感器采集的图像可能是256×256或者非正方形。常见的做法是先裁出微透镜阵列对应的中心区域,再缩放到网络输入尺寸。这个缩放的插值方式要固定,不要训练用双线性、推理用最近邻,会引入亚像素级别的系统偏移。另一个形态问题是子孔径数量不同:训练时8×8子孔径,换到10×10的传感器时就必须重新训练网络,因为输入通道的空间拓扑已经变了。如果预期要兼容多种子孔径配置,可以在数据生成时把不同子孔径数的光斑图混合训练,网络输入层用较大的空间尺寸,子孔径少的情况用零填充补足。
5.3 性能边界:低信噪比与大像差下的表现
深度学习的波前重建有一个反直觉的特点:在小像差范围内,性能通常略优于传统质心+最小二乘方法;但在大像差或低信噪比下,网络的误差曲线会平缓上升而不是像传统方法那样快速恶化。这意味着评估时要画出误差-像差幅值曲线和误差-噪声强度曲线,而不是只看单一测试集的平均值。如果网络在低信噪比下反而比传统方法差,优先怀疑数据生成时的泊松噪声强度是否和信噪比范围匹配,其次检查网络首层是否无法有效区分噪声和光斑信号。
光斑混叠是另一个边界。当相邻子孔径的斜率差异过大时,光斑可能偏移到另一个子孔径的像素区域内,这时候无论网络还是传统算法都无法准确重建,属于物理信息丢失而非算法能力不足。在评估测试集时,要显式排除或单独统计这类样本,否则会拉低整体指标,掩盖网络对正常样本的重建精度。
6. 进阶:把物理先验塞进训练流程的三种做法
前面的流程是纯数据驱动。仿真数据分布和真实数据分布总有差距时,物理先验能显著提升跨域稳定性,这是目前计算成像深度学习研究里的核心方向。具体到Shack-Hartmann波前重建,可以用下面三种方式把物理知识嵌进训练。
6.1 用传感器正演模型做物理损失约束
除了网络输出层的Zernike系数做MSE监督,额外把系数展开成相位面,正向仿真得到斜率或光斑偏移,和传感器真实测量值做比较,这个损失项直接约束的是“重建结果和物理测量一致”。它的价值在于:即使标签噪声较大或分布偏移,物理一致性仍然能拉着网络输出朝着可观测的斜率方向收敛。
% 伪代码:物理一致性损失 coeff_pred = net(spot_input); phase_pred = zernike_sum(coeff_pred, rho, theta); slope_pred = compute_subap_slope(phase_pred, N); physical_loss = mse(slope_pred, slope_measured); total_loss = mse(coeff_pred, coeff_label) + 0.3 * physical_loss;实现时把zernike_sum和compute_subap_slope写成可微函数,Matlab中如果使用自定义trainingLoop而不是trainNetwork,利用自动微分工具dlgradient可以方便地加入物理损失。权重系数0.3不是固定值,要按两个损失的量级做平衡。label噪声大时增加物理损失的比重,噪声小时维持MSE为主。
6.2 解析解作为网络初值:混合重建策略
不需要完全放弃传统算法。一种实用的混合架构是:先用最小二乘或SVD从斜率得到解析Zernike系数,再把系数和原始光斑图拼接后输入一个小网络进行修正。这个网络的输出是残差系数,学习目标从“重建完整波前”退化为“修正传统算法的偏差”,训练难度大幅降低,数据量需求也更少。实现起来只需要两个改动:数据生成时额外保存传统算法的解析解,网络输入层改为两个输入分支的拼接。推理时先调用Matlab的mldivide求解一次最小二乘,再做一次前向传播,仍然远快于迭代重建算法。
6.3 验证物理一致性:仿真闭环自检
训练完成后,最后一步做一个闭环验证:拿任意一组Zernike系数生成光斑图,经网络重建得到预测系数,把预测系数再生成对应光斑图,和原始光斑图做残差比对。这一步能暴露训练流程中隐藏的系统性问题——如果重建的系数MSE很小但光斑残差很大,说明网络学到了某种捷径。另一种验证是取真实波前传感器采集的数据,直接输入网络观察重建波前是否平滑、是否符合被测光学系统的像差特征,然后和传统算法结果做横向对比,看残差的空间分布是否合理。
基于深度学习的Shack-Hartmann波前重建,本质上是用物理模型生成数据、用网络拟合映射、再用物理正演验证结果,这个闭环在任何光学仿真环境中都可以复现,也是这类算法从仿真走向工程应用的最短路径。
本文还有配套的精品资源,点击获取