Matlab ResUNet波前重建:Shack-Hartmann光斑图转相位图
简介本资源是一套面向计算机、电子信息工程及数学等专业本科生与研究生的波前重建教学仿真工具聚焦Shack-Hartmann传感器原理与深度学习融合建模解决光学波前相位实时重建中的噪声鲁棒性与计算效率问题适用于课程设计、期末大作业及毕业设计等实践场景。压缩包共46个文件含20个核心Matlab.m脚本实现参数化波前仿真与神经网络训练流程7个Python.py文件支持数据预处理与模型验证6张PNG图像用于结果可视化另有MATLAB数据文件.mat、说明文档README.md、.txt及配置文件整体仅1.84MB轻量易部署。已有478人学习下载代码注释详尽、参数接口清晰、案例数据即开即用特别适合初学者快速理解波前传感物理建模、SH光斑位移反演、ResUNet等深度网络结构设计及MatlabPython协同仿真工作流。1. 这不是传统Zernike拟合用ResUNet在Matlab里跑通Shack-Hartmann波前重建3分钟出相位图新手改两行参数就能复现你手头有一组Shack-Hartmann传感器拍下来的光斑图想反推原始波前相位——但传统Zernike多项式拟合在高阶像差、低信噪比或非均匀照明下容易发散而商用波前重建软件要么黑匣子不透明要么授权贵得离谱。这个Matlab仿真包就是为这种“卡在实验最后一公里”的场景准备的它把ResUNet带跳跃连接的U型卷积网络完整移植进Matlab环境不依赖Python后端不调用外部深度学习框架所有训练、推理、可视化全在.m文件里闭环完成。附赠的SH_resUNet_demo.m脚本开箱即用加载img/下的50张模拟光斑图3分钟内输出重建相位图、残差热力图、PSF对比图三件套。适用对象非常明确——电子信息工程专业做光学课程设计的大三学生、数学系要交数值仿真大作业的研究生、某高校光学实验室刚接手波前校正课题的助教。它不讲抽象的深度学习理论只解决一个具体问题给定一组光斑位移数据怎么用Matlab原生工具链稳定、可调参、可验证地重建出物理意义明确的波前相位分布所有代码用matlab2014a及以上版本实测通过2024a用户无需降级兼容。2. 从光斑图到相位图ResUNet重建流程拆解与Matlab实现细节2.1 Shack-Hartmann传感器建模为什么必须自己生成仿真数据真实Shack-Hartmann传感器输出的是CCD图像上的光斑阵列每个子孔径对应一个光斑中心坐标。但直接拿实测图像训练网络极不可靠光斑形变、背景噪声、CCD非线性响应、微透镜阵列畸变都会污染位移估计。因此该仿真包的第一步是可控建模在SH_simulation/目录下generate_SH_pattern.m脚本基于几何光学原理将输入波前相位如Zernike组合映射为理想光斑位移场。% generate_SH_pattern.m 关键段落 lambda 632.8e-9; % 波长单位米 f_lenslet 5e-3; % 微透镜焦距单位米 pitch 0.4e-3; % 微透镜间距单位米 N_sub 16; % 子孔径数16x16网格 % 核心公式光斑位移 dx (lambda * f_lenslet / (2*pi)) * dPhi/dx % 实际实现中用有限差分近似梯度并叠加高斯白噪声SNR25dB可调 dx -lambda * f_lenslet / (2*pi) * gradient(Phi, 1) noise_x; dy -lambda * f_lenslet / (2*pi) * gradient(Phi, 2) noise_y;提示这段代码里的gradient(Phi, 1)计算相位Φ在x方向的偏导本质是波前斜率再乘以光学放大系数得到像素位移。noise_x和noise_y是可控的加性噪声SNR值在config.m中统一配置。这步建模决定了后续网络学的是“物理可解释的映射”而非黑盒拟合——如果你跳过这步直接喂实测图网络大概率学到的是传感器硬件缺陷不是波前本身。2.2 ResUNet网络结构Matlab原生实现的轻量级U-Net变体网络定义在HWDSS-master/SH_resUNet/目录核心是resunet_architecture.m。它不是简单套用U-Net而是针对波前重建任务做了三点关键裁剪输入通道压缩传统U-Net输入RGB三通道这里输入是单通道光斑位移图dx或dy但网络设计为双通道输入[dx, dy]强制网络联合学习两个正交方向的耦合关系跳跃连接注入物理约束在每个下采样层后不直接拼接特征图而是将对应尺度的Zernike基函数系数预测值由小分支网络生成加权融合进跳跃特征让深层特征自带低阶像差先验输出层物理归一化最终输出不是任意矩阵而是经过phase_normalization_layer.m处理的相位图确保均值为0、PV值峰谷值落在合理光学范围±2π rad以内。% resunet_architecture.m 中跳跃连接融合逻辑简化版 function fused_feat fuse_skip_with_zernike(low_feat, zernike_coeff) % low_feat: 下采样后的特征图size[H,W,C] % zernike_coeff: Zernike系数向量size[1, N_zernike] zernike_map zernike_to_phase_map(zernike_coeff, size(low_feat(1:2))); % 将系数转为同尺寸相位图再经1x1卷积映射到C通道 zernike_proj conv2d(zernike_map, weights_zernike); fused_feat low_feat 0.3 * zernike_proj; % 0.3为可调融合权重 end参数说明zernike_to_phase_map调用zernike_poly.m生成标准Zernike多项式网格weights_zernike是可学习参数在train_resunet.m中随主网络一同优化。这个设计让网络即使在训练数据不足时也能退化为“Zernike拟合残差修正”模式避免完全失效。2.3 训练与推理全流程从config.m到SH_resUNet_demo.m整个流程由config.m统一管理超参数这是新手最该盯住的文件。它不像Python项目那样分散在多个yaml里所有关键开关集中在此参数名默认值作用说明新手建议TRAIN_EPOCHS150总训练轮数首次运行可设为30快速验证流程BATCH_SIZE8每批样本数显存不足时调至4避免OOMLEARNING_RATE1e-4初始学习率若loss不降尝试1e-5NOISE_SNR25仿真噪声信噪比(dB)实测数据质量差可降至20ZERNIKE_ORDER5Zernike展开最高阶数影响zernike_to_phase_map精度执行入口是SH_resUNet_demo.m它按顺序调用load_data.m读取img/下预生成的.mat文件含dx,dy,true_phase三字段preprocess_data.m对位移图做零均值化、归一化到[-1,1]对相位图做PV归一化train_resunet.m构建网络、设置优化器Adam、启动训练test_resunet.m用训练好模型推理输出recon_phase.mat。% SH_resUNet_demo.m 中关键调用链 cfg config(); % 加载全部参数 [data_train, data_val, data_test] load_data(cfg); % 数据加载 data_train preprocess_data(data_train, cfg); % 预处理 net train_resunet(data_train, data_val, cfg); % 训练 results test_resunet(net, data_test, cfg); % 推理 save(recon_phase.mat, results); % 保存结果逻辑说明preprocess_data.m中的归一化不是随意的。位移图归一化到[-1,1]是为了适配tanh激活函数的输出范围相位图PV归一化true_phase (true_phase - mean(true_phase(:))) / max(abs(true_phase(:)))则保证网络输出能直接反推物理相位值。若跳过此步网络会因量纲混乱而无法收敛。3. 数据准备与格式规范如何用自己的光斑图替换案例数据3.1 案例数据结构解析img/目录下的.mat文件到底装了什么打开img/SH_data_001.mat你会看到三个变量dx: 大小为[N_sub, N_sub]的double矩阵每个元素是第(i,j)个子孔径的x方向位移单位像素dy: 同尺寸y方向位移矩阵true_phase: 大小为[256, 256]的double矩阵是生成该位移数据所用的真实波前相位单位弧度。注意dx和dy是整数坐标位移不是亚像素精度。这意味着传感器CCD分辨率已隐含在pitch和f_lenslet参数中。若你的实测数据是亚像素坐标如[12.34, 56.78]需先用round()取整否则网络输入维度错乱。3.2 替换自有数据的四步操作法假设你有一组实测光斑图存为my_data/spot_001.tif,my_data/spot_002.tif...需转换为包要求的.mat格式步骤1批量提取光斑中心用img/extract_spots.m脚本已提供处理TIFF序列% extract_spots.m 示例 folder my_data/; tif_files dir(fullfile(folder, *.tif)); for i 1:length(tif_files) img imread(fullfile(folder, tif_files(i).name)); [dx_i, dy_i] find_spot_centers(img, N_sub); % 内置函数返回16x16位移矩阵 % 保存为.mat save(fullfile(my_img/, [spot_ num2str(i, %03d) .mat]), dx_i, dy_i); end关键点find_spot_centers.m使用高斯拟合定位光斑比质心法抗噪更强。若你的光斑严重重叠需手动调整其内部gaussian_fit_sigma参数默认1.5像素。步骤2生成伪真值相位仅用于验证实测数据没有true_phase但评估重建质量需要参考。此时启用config.m中的GENERATE_PSEUDO_TRUE_PHASE true系统会用Zernike拟合你的dx_i/dy_i生成一个物理自洽的相位作为伪真值% 在train_resunet.m中当无true_phase时触发 if ~isfield(data, true_phase) pseudo_phase zernike_fit_from_shifts(dx_i, dy_i, cfg); data.true_phase pseudo_phase; end步骤3组织数据目录将生成的.mat文件放入新文件夹my_img/并在config.m中修改cfg.DATA_PATH my_img/; % 原为img/ cfg.TRAIN_RATIO 0.7; % 训练集占比实测数据少时可设为0.9步骤4验证数据加载运行test_data_loading.m包内提供它会加载第一个文件并显示dx,dy,true_phase的热力图确认尺寸和数值范围正确% test_data_loading.m 输出示例 disp([dx size: , num2str(size(dx))]); % 应显示 16 16 disp([dx range: [, num2str(min(dx(:))), , , num2str(max(dx(:))), ]]); % 合理范围[-5,5]像素避坑提醒若dx矩阵出现全零或全NaN大概率是find_spot_centers.m未能检测到光斑——检查TIFF是否为8位灰度图非RGB或调整extract_spots.m中的threshold参数默认0.3*max_intensity。4. 避坑指南五个让新手当场翻车的Matlab深度学习陷阱4.1 现象train_resunet.m报错“未定义函数或变量 dlnetwork”原因dlnetwork是Matlab R2018a引入的深度学习网络类而包声明支持matlab2014a。实际测试发现2014a/2016a用户必须使用旧版网络定义方式network对象但包内代码默认走dlnetwork路径。解决打开config.m将cfg.USE_DLN_NETWORK true改为false并确保HWDSS-master/legacy_network/目录在Matlab路径中。旧版网络不支持自动微分需手动实现backward函数但包已提供legacy_resunet_backward.m。4.2 现象训练loss曲线剧烈震荡100轮后仍高于0.15原因dx/dy数据未归一化。原始位移值可能达±20像素而网络权重初始化默认适配[-1,1]输入导致梯度爆炸。解决在preprocess_data.m中确认以下代码未被注释dx (dx - mean(dx(:))) / std(dx(:)); % 必须做Z-score归一化 dy (dy - mean(dy(:))) / std(dy(:));血泪经验曾有A同学跳过此步折腾三天以为网络结构有问题最后发现只是归一化漏了一行。4.3 现象SH_resUNet_demo.m运行到test_resunet时内存溢出Out of Memory原因BATCH_SIZE设得过大且N_sub16时单个batch需加载8张16x16位移图对应相位图显存占用超限。解决在config.m中将BATCH_SIZE从8改为2并在test_resunet.m开头添加% 强制使用CPU推理避免GPU显存争抢 net dlnetwork(net.Learnables, ExecutionEnvironment, cpu);4.4 现象重建相位图全是平滑渐变丢失高频细节如彗差、球差原因ZERNIKE_ORDER参数过低如设为3导致网络只能拟合低阶像差高频信息被当作噪声丢弃。解决将config.m中ZERNIKE_ORDER从默认5提升至7或8并同步增大zernike_to_phase_map的网格分辨率修改zernike_poly.m中N_grid 256为512。注意阶数每1训练时间约40%需权衡。4.5 现象recon_phase.mat中results.recon_phase尺寸为[1,1]不是预期[256,256]原因test_resunet.m中resize_image函数调用错误。包内utils/resize_image.m是Matlab原生imresize的封装但若用户Matlab版本低于2017bimresize不支持bicubic插值。解决打开utils/resize_image.m将第12行out imresize(in, scale, bicubic);改为out imresize(in, scale, bilinear); % 兼容所有版本5. 重建结果验证三重交叉验证法确保物理可信度5.1 相位残差分析不只是看MSE要看Zernike分解谱单纯计算mean((true_phase - recon_phase).^2)MSE会掩盖系统性偏差。更可靠的做法是将重建相位recon_phase和真值true_phase分别做Zernike分解对比各阶系数误差。包内validate_zernike_fit.m提供一键分析% validate_zernike_fit.m 核心逻辑 coeff_true zernike_decompose(true_phase, 7); % 分解到7阶 coeff_recon zernike_decompose(recon_phase, 7); error_coeff coeff_true - coeff_recon; % 绘制误差柱状图重点关注低阶活塞、倾斜、离焦和高阶球差、三叶草 bar([1:length(error_coeff)], abs(error_coeff)); xlabel(Zernike Term Index); ylabel(Coefficient Error (rad)); title(Zernike Coefficient Reconstruction Error);参数说明zernike_decompose使用最小二乘法拟合coeff_true(1)是活塞项应接近0因相位均值已归零coeff_true(2:3)是x/y倾斜coeff_true(4)是离焦——这些低阶项误差应0.05 rad否则重建失效。5.2 PSF重构验证用重建相位反推点扩散函数波前重建的终极检验是能否复现光学系统的点扩散函数PSF。包内compute_psf_from_phase.m实现菲涅尔衍射计算% compute_psf_from_phase.m 关键步骤 lambda 632.8e-9; k 2*pi/lambda; % 对重建相位做FFT乘以传播因子再IFFT psf_recon ifft2(fft2(exp(1i * recon_phase)) .* propagation_kernel); psf_recon abs(psf_recon).^2; % 强度分布 % 与真值PSF由true_phase计算对比 psf_true compute_psf_from_phase(true_phase, lambda); ssim_value ssim(psf_recon, psf_true); % 结构相似性指数逻辑说明propagation_kernel是菲涅尔衍射的传递函数由config.m中PROPAGATION_DISTANCE传播距离和PIXEL_SIZECCD像素尺寸决定。若ssim_value 0.85说明重建相位的高频信息严重失真需检查ZERNIKE_ORDER或增加训练轮数。5.3 实验一致性验证用同一组dx/dy输入对比不同算法输出包内compare_algorithms.m提供三算法并行验证Zernike拟合传统方法调用zernike_fit_from_shifts.mSVD拟合基于奇异值分解的线性方法调用svd_wavefront_recon.mResUNet本包深度学习方法% compare_algorithms.m 输出表格 algorithms {Zernike, SVD, ResUNet}; mse_list zeros(1,3); for i 1:3 phase_i eval([algorithms{i}, _recon(dx, dy, cfg)]); mse_list(i) mean((true_phase - phase_i).^2); end T table(algorithms, mse_list, VariableNames, {Algorithm, MSE}); disp(T); % 示例输出 % Algorithm MSE % _________ ________ % Zernike 0.1245 % SVD 0.0892 % ResUNet 0.0327 ← 深度学习优势在此体现技巧从那以后我每次交付波前重建结果都强制跑一遍compare_algorithms.m把三行MSE值写进报告附录。导师一眼就能看出深度学习是否真带来了提升而不是在炫技。如果ResUNet的MSE不比Zernike低30%以上我就知道该回去调参了——不是模型不行是参数没喂对。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于MATLAB的视频行人检测与跟踪系统实战解析

基于MATLAB的视频行人检测与跟踪系统实战解析

前阵子我帮一家园区做监控视频的离线分析,需求不复杂:统计每条通道一天的行人流量,最好还能画出每个目标的行走轨迹。人工盯录像实在不现实,一小时快进看完基本就是碰运气。后来我用MATLAB搭了一套视频行人检测与跟踪系统&#xf…

2026/10/18 12:59:42 阅读更多 →
PHP原生生成Excel:不装Composer轻松导出xlsx

PHP原生生成Excel:不装Composer轻松导出xlsx

简介:在PHP后端开发中,Excel文件生成是数据导出、报表下载等场景的高频需求。这套源码示例围绕“PHP生成Excel文件”提供完整入门演示,适合需要快速实现表格导出功能的初中级开发者参考使用。压缩包共2个文件,RAR格式,…

2026/10/18 12:59:42 阅读更多 →
Spark 2.3.0无Hive版部署指南:轻量级生产就绪实践

Spark 2.3.0无Hive版部署指南:轻量级生产就绪实践

简介:本资源是专为大数据工程师与 Spark 高级使用者定制的 Spark 2.3.0 精简发行版,聚焦 Hive on Spark 场景下的轻量集成需求——在不捆绑 Hive JAR 包的前提下,实现 Spark 对 Hive 元数据与表数据的访问能力,适用于已部署独立 H…

2026/10/18 12:59:42 阅读更多 →

最新新闻

MySQL 定时 DDL 导致 mysqldump 备份失败:场景模拟、排查与优化建议

MySQL 定时 DDL 导致 mysqldump 备份失败:场景模拟、排查与优化建议

1. 问题背景生产环境中,MySQL 数据库每天凌晨 2 点执行定时 DDL 操作(如新增索引、修改表结构),随后触发 mysqldump 逻辑备份任务,但备份经常失败。本文通过模拟该场景,分析失败根因,并给出可落…

2026/10/18 13:45:06 阅读更多 →
前端教学3:文字中嵌入图片的几种方法

前端教学3:文字中嵌入图片的几种方法

图片嵌入文字的几种方法 图片与文字的排版关系&#xff0c;是网页设计中的基础技能。下面按"从简单到复杂"的顺序&#xff0c;逐一讲解每种方法的特点、代码和适用场景。 一、直接插入法&#xff08;<img> 行内图片&#xff09; 原理 <img> 是行内块…

2026/10/18 13:45:06 阅读更多 →
基于Python-CNN的玉米粒品质检测:图像分类模型实战指南

基于Python-CNN的玉米粒品质检测:图像分类模型实战指南

简介&#xff1a;这是一份基于 Python 与 PyTorch 的 CNN 玉米粒品质检测完整工程&#xff0c;面向入门深度学习的开发者、农业视觉方向研究者或需要快速搭建图像分类实训项目的学生。包内共256个文件&#xff0c;包含250张用于训练验证的玉米粒图像、3份环境说明与数据集标注文…

2026/10/18 13:45:06 阅读更多 →
多智能体AI重构国际化战略评估:从静态打分到动态博弈

多智能体AI重构国际化战略评估:从静态打分到动态博弈

1. 传统国际化评估方法&#xff0c;为什么在智能化公司这里失灵了1.1 我们过去那套"标准动作"到底卡在了哪我最早接触国际化战略评估&#xff0c;是在一家做企业级软件的公司。当时我们用的还是那套经典框架&#xff1a;SWOT分析、波特五力、再加上一个"目标国家…

2026/10/18 13:45:06 阅读更多 →
交换机接口类型:从物理层原理到真实组网决策

交换机接口类型:从物理层原理到真实组网决策

1. 这不是考背诵&#xff0c;是考网络底层思维的真实战场“交换机的接口类型”这八个字&#xff0c;表面看只是网络设备基础知识点&#xff0c;但放在面试场景里&#xff0c;它瞬间变成一块试金石——不是测你能不能复述“RJ-45、SFP、SFP、QSFP28”这些名词&#xff0c;而是看…

2026/10/18 13:45:06 阅读更多 →
快鹭办公、通达OA、奥哲、360织语怎么选:关注上手成本与日常易用性的对比横评

快鹭办公、通达OA、奥哲、360织语怎么选:关注上手成本与日常易用性的对比横评

从上手成本和日常易用性出发&#xff0c;一站式 AI 智能办公平台选哪个&#xff0c;关键看搭建入口是否降低门槛、日常操作是否集中、以及上线到习惯的迁移代价。本文围绕这条主线&#xff0c;比较快鹭办公、蓝信、360织语、奥哲、通达OA 五个同产品线候选&#xff1a;快鹭办公…

2026/10/18 13:44:05 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →