几何、光度与来源的联合验收
验收的对象是一个完整执行链,而不是一张好看的截图。固定输入图像、标定靶、配置和源码后,重新检测像素、估一般相机、自动匹配、三角化、拟合并渲染保留视角,才能判断各模块是否共同工作。把一个版本的检测结果、另一版本的最佳训练和第三版本的截图拼在一起,不能支持同一系统的结论。本章把实际交付与失败边界写成可重做协议。
环境最低 Python 三点一一,因为固定的 NumPy 二点三点五要求该版本;实际验证为 Python 三点一二、PyTorch 二点六,Pillow 十二点三。CPU 强制一个线程,避免在个人电脑启动不必要负载。三个依赖的固定版本写入 requirements,不把系统里恰好能导入当成完整环境说明。项目命令从 README 所在目录运行,相对路径由该工作目录解释,清单再绑定实际文件内容。
原件共有五张场景 RGB PNG 与五张单独标定 PNG,每张九十六乘八十像素。标靶十六个非共面点,场景十二个发光珠;真值单独保存在 evaluation-only 文件。每个输入有 SHA256,清单说明生成方式、单位、背景和外部资产为空。它们是独立原创合成图像,并不因“合成”自动覆盖其他项目的版权;这里没有复制第三方照片、模型或原论文代码。主源引用只支持机制核对。
重建函数读取场景与标定图片、已知标靶和视图划分,不读取未知场景真值。它先为每视角估相机,再在前两训练图用颜色与几何得到十二条轨迹。第三训练图只参与光度优化。两保留图的场景像素不进入梯度,但它们的相机来自各自独立标定图。这是明确的已标定视角重建任务,既不是全未知相机的 SfM,也不是把手写证据点表装成自动视觉。
算例一:同一模型的训练与留出指标
一百八十更新后,三个训练视角全图 MSE 约一点七一九四、一点七零一九、一点五七六一乘十的负五次方;两保留视角约一点七二九二、一点六七九九乘十的负五次方。按定义 PSNR 为负十乘以十为底的 MSE 对数,动态范围固定一。第一保留图 MSE 一点七二九二乘十的负五次方对应约四十七点六二分贝,可用计算器独立核对,不从截图目测补出数字。
全图分数之外,第一保留图前景 MSE 从约零点零一零五一四降至零点零零零三三四八九,第二图从零点零零九八五二降至零点零零零三零七二零。前景掩码由观测强度大于零点零八定义,数百像素的分母与全图不同。改掩码会改指标含义,因此保存各图前景像素数。对现实场景,还需轮廓、深度和局部遮挡质量;当前协议不把没有实现的指标写成通过。
三维几何使用评价专用真值匹配后计算每点米制欧氏误差,最后平方平均开根号。原始图像三角化 RMS 为零点零零二九零八米,拟合后零点零零一五五四米。低像素误差与低几何误差是两种互补证据:前者检验图像解释,后者借合成真值检验结构。现实照片没有完整三维真值时应明确缺失,不用重投影误差冒充同等地面真值检验。
算例二:错误对应和不可识别失败
负对照把右图观测编号相对左图错开三个位置,构造十二组假对应。实际运行一组因背后点拒绝,其余因像素重投影超过一像素拒绝;详细原因与数值逐组保存。这是故意错误的检测能力,不进入正常重建。若另造同一极线上的重复颜色错配,有可能通过几何门槛,所以报告不能把十二组全拒绝写成“任何错误都能发现”。
另一个失败来自纯旋转或太弱基线。精确投影可以有极低重投影残差而深度仍无法唯一决定;共面标靶也可能完美拟合其平面却误投影离平面点。这两类应由配置约束和退化测试显式拒绝,不能只靠最后图像分数发现。当前测试对共面 DLT 输入报错,并对一般旋转三角化的精确例验证;弱基线连续敏感性则由第五章公式说明,不宣称测试覆盖所有条件数。
十二项独立机制测试分别覆盖合法旋转和相机中心、手算针孔与背后拒绝、一般 DLT 与共面退化、旋转双目三角化、极线和错误对应、深度缓冲、实际 PNG 检测匹配、重复颜色拒绝、渲染梯度有限差分、移除真值仍重建、篡改保留图不影响参数、真实短训下降。测试合并只说明这些命名断言通过,不等于任意物体和光照上的视觉能力证明。
代码检查要包含反证,避免实现和测试重复同一个错误公式。手算投影采用明确数值,DLT 用未参与估计的点检验,Gaussian 梯度用数值差分;删除真值和改黑保留图直接改变输入信息。它们各自建立独立参照,比只检查输出形状或函数是否返回更有意义。仍没有形式化证明所有浮点情况,尤其极端深度、重叠核和破坏文件的行为需作为扩展测试而非现有证据。
实际训练耗时约一点七一秒,只对应这台环境的一次 CPU 小实验。包含图片读取、相机标定和文件写入的总流程耗时与该纯训练计时不同;不能把一个数字当整个端到端延迟。每次重新训练即使参数可能确定,也应保存当次报告与来源,不覆盖历史文件后沿用旧时间。当前模型、输入散列、源码散列和逐项测试放入共同版本收据,便于下载后独立重跑。
拟合检查点保存位置、颜色、半径、优化器、步数和相机,但没有声明跨硬件精确恢复接口。图片输出包括各视角初始预测与最终预测,原输入保留原件。查看时应把输入与同视角预测并排,特别检查点是否缺失、宽度是否过大、颜色是否交换。截图大小很小,是机制场景的真实尺度,不通过插值放大来假装高分辨率细节。
完整复做先生成自有数据,再运行主链与测试。如果只想评估已给输入,省略 create-data,避免覆盖自己修改的文件;输出目录可另指定以保存原报告。更换阈值、焦距、场景或步数后,原结果就不再是该配置的证据,必须重新运行。源码收据记录当前版本,训练历史不因只改讲义就冒称重新训练;任何测试与训练记录都保留它真正对应的来源。
迁移到自然场景需要新的模块与新的失败协议:稳定特征或学习描述子、未知相机定位与鲁棒轨迹、镜头畸变、遮挡材质、稠密表示以及更大留出视角集。课程已经推导这些问题之间的连接,但没有声称全已实现。这里可验收的能力是从实际小图自动观测到米制几何,再到一个真实训练的受限三维场景与新视图,不是把旧点表换成长说明,也不是完整生产级三维重建。
python -m vision3d.make_data --output-dir data/inputs
python -m vision3d.run --input-dir data/inputs --steps 180 --output-dir evidence/reproduction
python -m tests.run_testsTRY IT YOURSELF
练习一:PSNR换算
MSE从零点零零一降到零点零零零一,动态范围为一,PSNR增加多少?若改用八位整数却仍套同公式,会发生什么?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习二:泄漏与标定条件
保留场景图没进梯度,但该视角标定图参与估相机。这是否矛盾?应如何准确表述,不能声称什么?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习三:共同版本验收
甲报告检测测试通过,乙报告另版本渲染好,丙提供没有输入散列的训练模型。能否合成完整PASS?给出最小修复步骤。