
在 3D 重建场景里最让人头疼的往往不是复杂的静态结构而是画面里突然走过的行人、路边停靠的车辆、晃动不休的树叶和玻璃幕墙上的反光。这些干扰物一旦进入多视图图像序列就会让 3D Gaussian Splatting3DGS重建结果出现成片的“飞絮”、半透明拖影和错误几何。过去我们处理这类问题要么在训练阶段设计鲁棒损失要么额外训练一个 Mask 预测网络要么引入瞬态场建模每一种方案都意味着额外的训练成本和调参工作量。而近期出现的一个思路——Per-View Gaussian Predictions Enable Training-Free Distractor Filtering——把问题从“训练期隐式鲁棒”拉到了“推理期显式过滤”这是一个值得认真拆解的技术方向。这篇文章想给出一个明确判断这类方法真正降低的不是模型本身的表达力而是三维重建工程流程中“适配新场景”的成本。它不再需要为每一个杂乱场景重新训练一个去干扰物模块而是利用逐视图高斯预测结果在重建或渲染阶段直接过滤掉不属于静态场景的高斯点。如果你正在做城市级重建、AR/VR 场景采集、自动驾驶仿真数据生成或者只是想把手机拍摄的街景做成高质量三维模型这篇文章会帮你理清原理、流程、实践路径和容易踩坑的地方。全文会从问题出发先解释 3DGS 为什么对干扰物敏感再拆解 Per-View Gaussian Predictions 与 Training-Free Distractor Filtering 的核心逻辑然后给出一个可以落地的最小实现流程和代码示例最后讨论生产环境里的工程建议与技术边界。1. 这篇文章真正要解决的问题先回到一个最常见的开发场景。假设你拿手机围绕一个街头雕塑拍摄或者用车载摄像头采集一段城市道路的视频回来后用 3DGS 官方流程做稀疏重建和训练。在 COLMAP 匹配阶段动态物体会形成错误的匹配点在 3DGS 优化阶段这些动态物体会被“强行解释”成一组漂浮在空间里的半透明高斯分布在运动轨迹的各个位置。渲染时这些高斯基元会随着视角变化产生闪烁、噪声和错位把原本很好的静态重建结果毁掉。为什么这个问题比 NeRF 时代更难解决因为 3DGS 是显式表示每一个 3D 高斯点都有位置、旋转、缩放、不透明度和颜色。它不像 NeRF 那样把颜色和密度塞进一个隐式网络的权重里可以通过调整权重分布来“忘掉”瞬态信息。在高斯优化过程中优化器必须用有限数量的椭球去拟合所有输入图像的光线颜色一旦某个区域在多视角下颜色不一致比如行人走过、汽车移动、树叶摇摆它最省力的做法就是生成一排半透明高斯从各个角度把颜色“平均”掉。结果就是你看到的拖影和碎片。传统解决办法是让模型知道“哪些像素是干扰物”。最直接的是 Mask 监督在训练 loss 里把动态区域的像素权重设为 0进阶一点的是 NeRF-W 风格的瞬态场建模额外预测一个逐像素的瞬态不透明度还有人训练一个二分类网络直接预测高斯点的动态概率。这些方法都有一个问题它们几乎都需要额外的训练阶段要么为每个场景重新训练要么依赖大规模监督数据预训练一个场景专用分支。在真实生产项目中这意味着每来一批新数据都要重复标注、清洗、训练、调参的流程成本非常高。Per-View Gaussian Predictions 的思路不一样。它先对每个视角单独预测一组高斯基元或者用前馈网络直接预测每个视图对应的高斯属性然后再利用跨视图的一致性来判断某个高斯是否属于“稳定的静态场景”。如果某个 3D 高斯只在少数视图被预测支持而在其他本应能看到它的视图中得不到验证那它大概率对应干扰物、遮挡边缘或错误匹配。这个过滤过程发生在推断期不再需要重新训练模型所以叫 Training-Free Distractor Filtering。这类方法最该被关注的地方是它把“去干扰物”从模型能力问题变成了流程工程问题。也就是说你不一定需要一个更强的模型而是可以组合现有预测模型和几何一致性检查在重建管线里加一道显式过滤。这也是本文后续所有实践建议的出发点。2. 基础概念与核心原理要理解这个方法需要把几个概念拆开3DGS 的高斯表示为什么会出现干扰物伪影Per-View Gaussian Prediction 到底预测什么以及 Distractor Filtering 是如何做到无需训练即可过滤的。2.1 3DGS 中的高斯表示与渲染流程3D Gaussian Splatting 将场景表示为一组 3D 高斯分布。每个高斯点包含一组可学习参数包括中心坐标、协方差矩阵由旋转和缩放参数化、不透明度以及球谐系数颜色。渲染时这些高斯点会被投影到 2D 图像平面按深度排序后进行 alpha 混合最终得到每个像素的颜色。一个关键细节是绘制顺序。3DGS 的官方光栅化器通常采用按深度排序、从远到近或从近到远混合的方式。对于真实场景中的不透明表面排序越准确图层混合越干净如果场景里存在“半透明拖影”这些拖影会干扰排序让本应被遮挡的高斯错误地混入前景。这也是为什么社区讨论 3DGS 硬件混合和远到近绘制顺序时会特别强调基元排序质量——干扰物过滤做得不好混合顺序就算优化到硬件极限渲染出来仍然会有噪声。2.2 Per-View Gaussian Predictions逐视图预测高斯基元所谓逐视图高斯预测是指不把整个场景当成一个全局优化问题而是先从每个输入视图出发预测该视图对应的高斯分布。形式上给定一张图像可以用一个前馈网络直接回归出该视图场景的高斯参数也可以在重建过程的中间输出中为每个像素或每个补丁生成一组候选高斯基元。为什么要逐视图预测而不是全局优化因为在单视角下干扰物和静态背景的区分更容易。一个行人出现在某几个视角里但在单张图像中如果语义分割网络能识别出行人我们就可以根据 2D 语义信息标记出对应的像素区域进而知道哪些候选高斯基元可能是干扰物。而全局优化会把多视角信息纠缠在一起干扰物的错误会被“分摊”到多个高斯点上反而更难定位。2.3 Training-Free Distractor Filtering不需要训练的干扰物过滤“Training-Free”这个限定词是理解该方法的钥匙。传统做法里如果你要判断一个 3D 点是不是动态物体通常需要训练一个分类器输入高斯特征或者多视角颜色统计输出动态概率。这种分类器要么内嵌在 3DGS 优化目标里要么作为一个独立网络在大量标注数据上预训练。Per-View Gaussian Predictions 方法则不同。它利用的是已经成熟的前馈网络能力例如语义分割模型、实例分割模型、单目深度估计甚至视觉基础模型先得到每个视图的表征然后通过多视图几何关系把不同视图的预测结果投影到同一个三维空间进行一致性检查。真正完成干扰物判断的是跨视图几何一致性计算而不是一个专门训练的动态分类器。因为这一步可以在训练完成后随时执行所以称为“无需训练”。2.4 它和传统方法的本质区别传统方法是在“优化阶段”把干扰物从重建目标里剥离例如在 loss 中降低动态像素权重或者在优化变量里增加瞬态场参数。这个过程的代价是你需要重新训练整个场景模型而且对超参数敏感。比如 Mask 权重设得太高会把静态区域的细节也抹掉设得太低干扰物又过滤不干净。Per-View Gaussian Predictions 是在“推理阶段”做后处理过滤。它的判断依据不再是优化 loss而是视觉一致性和几何一致性。你可以先正常训练一个 3DGS 模型然后在推理时加载逐视图预测结果把那些在多个视角中“得不到支持”的高斯点剔除或降低不透明度。这意味着模型训练流程本身不需要改变过滤逻辑可以独立部署和回滚。对工程团队来说这是一个更友好、更容易上线的设计。3. 传统干扰物处理方法的局限性既然要理解新方法的价值就必须先知道旧方案的痛点在哪里。这一节把常见的三种干扰物处理思路拿出来对比不是为了否定它们而是为了说清楚为什么会有“无需训练”这个需求。3.1 Mask 监督方法Mask 监督是最直观的方案。先在 2D 图像上标注或预测出动态物体区域然后把这些区域的像素从 loss 中剔除或者降低权重。这样做的好处是实现简单坏处是依赖 Mask 质量。如果你用的是自动语义分割模型行人漏检、车辆误检是常态如果 Mask 边界不准确会在物体边缘产生新的伪影。更关键的是训练时必须用这些 Mask 重新跑一遍 3DGS 优化一旦 Mask 更新整个训练也要重来。3.2 瞬态场建模方法NeRF-W 提出的瞬态场建模思路也被迁移到 3DGS 中。模型额外输出一个瞬态分量学习那些只在部分视角出现的颜色偏移。这样静态背景可以保持干净动态物体被吸收进瞬态分量。问题在于额外分支显著增加了参数量和计算量而且训练更不稳定。对于大规模场景瞬态场的收敛往往需要精细的权重设置否则会出现静态内容和瞬态内容互相抢信息的情况。3.3 传统方法的共同问题把 Mask 监督和瞬态建模放在一起看有三个共同问题。第一都需要为每个新场景重新训练工程迭代速度慢。第二都依赖额外的监督信号不管是标签还是预训练模型而监督信号的质量直接决定最终效果。第三都很难在训练结束后再修改过滤策略你想调整过滤强度只能重新训练。实际上很多团队在生产中采用的最朴素方案反而是拍完数据后用视频插帧或图像修补手段把动态物体从原始图像里抹掉再进入重建管线。这种做法在数据量少时效果尚可但大规模采集中成本极高而且修补痕迹会变成新的伪影。这就让人更倾向于寻找一种“不改变训练流程、不重新训练、只在推理阶段做文章”的方案。4. 方法流程拆解如何搭建一个 Training-Free 干扰物过滤管线现在的核心问题是如果我们要在真实项目中实现类似 Per-View Gaussian Predictions Training-Free Distractor Filtering 的效果具体流程应该怎么走这一节给出一个工程视角的通用拆解。注意这并不代表某一个具体论文的官方实现而是把这类方法的共同步骤提炼出来。4.1 数据准备与相机位姿估计预处理阶段仍然需要标准的 COLMAP 流程特征提取、特征匹配、稀疏重建得到每张图像的相机内参和外参。这一步的质量决定了后续所有跨视图投影计算的正确性。只要相机位姿有误差高斯点在视图之间的投影位置就会偏移一致性检查会立刻失真。实际操作中建议先剔除模糊帧和遮挡过大的帧再进行特征匹配。如果场景里动态物体比例太高比如行人密集的商业街可以先做 2D 检测统计去掉那些动态物体占比超过 40% 的帧减少后续过滤压力。4.2 逐视图预测与候选高斯生成第二步是为每个视图生成候选高斯基元。这一阶段的做法有几种变体但核心逻辑一致利用当前视图的 2D 信息结合单目网络或者重建中间结果得到该视图下的高斯分布假设。一种通用思路是先用语义分割或实例分割模型把每个像素标记为静态类别或动态类别然后用单目深度估计模型把像素反投影到三维空间生成候选点最后在候选点上初始化高斯参数例如不透明度设为 1尺度设为像素投影尺寸的某个倍数。这样每个视图都会产生一组“该视图认为应该存在”的高斯点。4.3 跨视图一致性判定与干扰物过滤得到逐视图候选高斯后需要把它们的支持度汇总到同一个三维空间。具体做法是把候选点投影到其他可见视图检查它在那些视图中的 2D mask 标签是否一致颜色是否一致深度是否一致。一个 3D 高斯如果是静态背景的一部分那么它在所有可见视角中都应该被预测为静态类别并且投影位置的颜色应相近。如果一个高斯在视图 A 中来自“背景”但在视图 B 的对应位置被预测为“行人”那么它就不是稳定信息应该被过滤。同理如果某个区域只在少数几个视图中有候选点而在大多数视图中没有被预测支持它也很可能是干扰物或者重建噪声。过滤粒度可以按高斯点进行也可以按区域进行。按点过滤更精细但需要把每个候选点与最终训练好的 3DGS 高斯点做匹配按区域过滤则更粗糙但实现简单。一般建议先用区域过滤粗筛再用点过滤精修。4.4 与渲染管线集成硬件混合与远到近绘制的配合过滤完干扰高斯后剩下的高斯基元需要重新参与渲染。这里与热词“3DGS 硬件混合 远到近 绘制”直接相关。3DGS 在 GPU 光栅化管线中依赖逐基元深度排序通常采用远到近的混合顺序。如果过滤不彻底残留的半透明拖影会打乱排序导致位于后方的高斯错误地混合到前景而过滤干净后排序结果更接近真实深度顺序混合阶段只需要处理少量边缘像素的 alpha 值即可。生产级实现中推荐把过滤逻辑放在 3DGS 训练完成之后、渲染服务加载模型之前。这样既不影响训练也不影响渲染的在线性能。如果把过滤直接嵌入渲染循环反而会给实时绘制增加额外开销违背了 Training-Free 的初衷。5. 完整示例与代码实现下面给出一个最小可运行的实践思路。需要说明的是这里的代码是示意实现目的是帮助你理解算法流程。具体模型和 API 请以你实际选用的开源库为准。5.1 环境准备建议的基本环境如下版本请以实际项目为准Python 3.10 或以上PyTorch 深度学习框架3DGS 官方训练仓库或其社区实现例如 gsplat 风格的光栅化库COLMAP 用于稀疏重建一个可用的语义分割或实例分割模型安装命令示意# 克隆 3DGS 相关仓库以实际选择的仓库为准 git clone https://github.com/graphdeco-inria/gaussian-splatting.git cd gaussian-splatting # 安装依赖建议使用虚拟环境 python -m pip install -r requirements.txt如果你习惯轻量实现也可以选择不依赖完整仓库只把过滤逻辑写成独立的 Python 脚本输入是训练好的高斯模型和图像序列输出是过滤后的高斯模型文件。这样更符合“在推理阶段做后处理”的定位。5.2 示例一用语义分割模型生成逐视图掩码这一步会用现成的分割模型为每一张输入图片生成动态物体掩码。动态物体类别一般包括人、车辆、动物等。下面是示意代码# 文件路径filtering/generate_mask.py import numpy as np import torch from PIL import Image # 这里以通用的分割模型调用方式为例实际请替换为你的模型 model load_your_segmentation_model(devicecuda) def generate_static_mask(image_path): image Image.open(image_path).convert(RGB) # 假设模型输出 shape 为 (H, W)每个像素是类别 id seg_map model.predict(image) # 定义动态类别集合根据模型具体语义调整 dynamic_classes {0, 1, 2, 3, 4} # 示例行人和车辆类别 static_mask np.ones(seg_map.shape, dtypenp.float32) for cls_id in dynamic_classes: static_mask[seg_map cls_id] 0.0 return static_mask这段代码只描述核心逻辑预测像素语义把动态类别的像素设为 0其余设为 1。实际项目中这一步的输出质量直接决定后续过滤效果所以不能拿来即用必须结合场景做类别映射和阈值调整。5.3 示例二多视图投影一致性检查有了每个视图的静态掩码后下一步是从三维高斯点出发去检查它在每个可见视图中的支持度。示意代码如下# 文件路径filtering/consistency_check.py import numpy as np def project_point_to_image(point3d, world_to_camera, camera_matrix): # 将世界坐标点变换到相机坐标 cam_point world_to_camera np.append(point3d, 1.0) # 透视投影 uv camera_matrix cam_point[:3] uv uv[:2] / uv[2] return uv def compute_point_support(gauss_point, view_infos, static_masks, threshold0.7): 统计该高斯点在可见视图中的静态支持比例 view_infos: 每个视图的位姿和相机参数 static_masks: 每个视图的静态掩码 supported_count 0 visible_count 0 for view in view_infos: uv project_point_to_image( gauss_point[position], view[world_to_camera], view[camera_matrix] ) if not is_pixel_inside(uv, static_masks[view[id]].shape): continue visible_count 1 mask_value static_masks[view[id]][int(uv[1]), int(uv[0])] supported_count mask_value if visible_count 3: # 可见视图太少无法可靠判断保守保留 return True return (supported_count / visible_count) threshold这里的关键参数是threshold。阈值越高过滤越激进背景细节越干净但风险是误删被短暂遮挡的静态点阈值越低保留越多但干扰物残留也可能越多。建议在验证集上扫一遍阈值选择 PSNR 和主观视觉效果折中的值。5.4 示例三过滤高斯点并生成新模型当你有了每个高斯点的支持度分数后就可以对 3DGS 模型做后处理过滤# 文件路径filtering/filter_gaussians.py def filter_gaussians(gaussians, support_scores, keep_ratio0.6): gaussians: 原始 3DGS 模型中的高斯参数数组 support_scores: 每个高斯的静态支持度分数 keep_ratio: 最终保留的高斯比例上限防止过滤过度 # 按支持度从高到低排序保留前 keep_ratio 个 sorted_idx np.argsort(support_scores)[::-1] keep_num int(len(support_scores) * keep_ratio) keep_idx sorted_idx[:keep_num] filtered_gaussians { positions: gaussians[positions][keep_idx], scales: gaussians[scales][keep_idx], rotations: gaussians[rotations][keep_idx], opacities: gaussians[opacities][keep_idx], sh_coeffs: gaussians[sh_coeffs][keep_idx], } return filtered_gaussians这段代码的价值在于它完全在推理阶段执行不需要改动训练脚本。你可以先保留一份原始高斯模型文件再生成一份过滤后的模型文件以便随时对比和回滚。这也是生产环境中最安全的接入方式。5.5 训练与验证命令示意整个流程的命令可以组织如下# 第一步COLMAP 稀疏重建 colmap feature_extractor --database_path data/database.db \ --image_path data/images colmap exhaustive_matcher --database_path data/database.db colmap mapper --database_path data/database.db \ --image_path data/images --output_path data/sparse # 第二步生成逐视图静态掩码 python filtering/generate_mask.py \ --image_dir data/images \ --output_dir data/masks # 第三步训练 3DGS 模型以官方仓库命令为例具体参数以仓库为准 python train.py -s data -m output/3dgs_model # 第四步运行逐视图预测与过滤 python filtering/filter_gaussians.py \ --model_path output/3dgs_model \ --mask_dir data/masks \ --output_path output/3dgs_filtered.ply # 第五步渲染验证 python render.py -m output/3dgs_filtered运行完第五步你会在输出目录里得到过滤后的渲染图像。接下来要做的就是在固定视角下对比原始模型和过滤模型的渲染结果。6. 运行结果与效果验证6.1 怎么判断过滤生效过滤是否生效最直观的检查方式是选一个已知存在行人或车辆的视角对比过滤前后的渲染图像。如果方法有效原始渲染图里的半透明拖影应该消失静态背景的结构应该保持完整边缘不产生明显的空洞。同时你还可以计算两个指标一是在动态物体区域的背景一致性二是在静态区域的图像相似度。需要注意不要只盯着 PSNR。PSNR 是对全图平均的指标干扰物区域占比很小的时候过滤前后的 PSNR 可能差别不大但视觉感受差别会很明显。更合理的验证方式是分区域统计把图像分成动态物体经过的区域和其他区域分别计算过滤前后的误差。6.2 需要留意的问题过滤不是万能药。如果原始场景中动态物体占比太高比如一个十字路口被大量车辆和行人占据可观察的静态背景太少那么过滤后场景会出现大面积空洞。更稳妥的判断是这类方法更适合动态物体“少量但显著”的场景例如景区雕塑周围偶尔有人经过、城市街道有几辆车停靠。如果过滤后背景出现空洞可以先降低阈值或者增大keep_ratio。如果过滤后拖影仍然明显则说明语义分割模型漏检了某些动态物体需要补充训练数据或更换更强的分割模型。6.3 失败时的第一步检查顺序如果过滤效果不理想建议按以下顺序排查检查项操作说明相机位姿精度查看 COLMAP 稀疏点云是否稳定位姿不准会导致投影偏移一致性检查失效分割掩码质量随机抽取几帧可视化静态掩码漏检或误检都会直接影响支持度计算投影范围检查高斯点坐标是否在图像范围内坐标超出图像边界会导致支持度被低估阈值设定扫描 0.5 到 0.9 之间的阈值不同场景对阈值的敏感度差异很大原始模型质量先查看未过滤模型的训练收敛情况如果原始模型本身就没收敛过滤没有意义7. 常见问题与排查方法这里整理几个我在工程视角中认为最容易遇到的问题你也可以把它当作 Debug 清单。问题现象可能原因排查方式解决方案过滤后背景出现明显空洞阈值过高误删了被短暂遮挡的静态点可视化支持度分数分布降低阈值或增大 keep_ratio过滤后拖影依然存在分割模型漏检动态物体检查动态区域掩码可视化补充类别或换更强的分割模型跨视图投影位置偏差大相机位姿不准确检查 COLMAP 重投影误差重新做特征匹配剔除异常帧过滤速度快但效果不稳定逐视图预测结果噪声大检查单帧掩码是否抖动对多帧掩码做时序平滑过滤后模型渲染性能下降过滤逻辑被嵌入渲染循环查看性能 profiling改为模型加载时离线过滤过滤后的场景出现颜色不一致不同视图分割结果互相冲突检查同一静态点在多视图的标签用颜色一致性做二次校验这里特别想强调“性能下降”这个问题。很多人会把后处理过滤直接写进渲染循环结果每帧都要重新跑一次分割或投影计算实时性大打折扣。正确的做法是把过滤结果缓存下来渲染时只加载过滤后的高斯基元不再重复执行过滤逻辑。8. 生产环境工程建议与技术边界8.1 过滤策略必须可回滚在生产环境里任何对模型的后处理都应该保留原始文件。3DGS 的高斯模型通常是一个 PLY 文件你可以把原始文件和过滤后的文件分别存储。上线时先灰度加载过滤版本对比一段时间的渲染效果如果发现异常立即切回原始版本。这种最小权限、可回滚的策略对三维重建服务同样适用。8.2 硬件混合绘制与远到近排序的配合真正做实时渲染时过滤后的模型依然要面对排序问题。3DGS 在 GPU 光栅化管线中需要把高斯点按深度排序然后做透明度混合。传统绘制顺序是远到近这是因为对于半透明物体画家算法需要先画远处再画近处混合结果才正确。干扰物如果不过滤会产生很多“不应该存在的半透明层”这些层会干扰基元间的深度排序即便硬件混合单元计算得再快渲染出的画面依然是错的。所以过滤决策应该和渲染排序策略放在一起考虑。你可以先过滤掉低支持度高斯基元再对剩余基元做深度排序最后交给硬件混合阶段。这样既减少了排序负担也避免了几何上“穿帮”的半透明伪影。8.3 数据采集规范不管你用哪种过滤方法数据质量永远是最重要的。采集时尽量保证相邻帧之间有足够的视差重叠让每个 3D 点至少在 3 个以上视图中可见。如果只给两个视角有重叠一致性检查就失去意义。另外尽量在动态物体较少的时间段采集不要把“靠过滤解决一切”当成数据采集偷懒的借口。8.4 技术边界与适用场景这类 Training-Free Distractor Filtering 方法并不是所有场景都能用。它对视图重叠度、分割模型能力、相机位姿精度都有要求。对于动态物体占比超过一半的极端场景过滤策略很难稳定工作。对于完全没有语义上下文的人造物体比如随机飘动的数据线、透明玻璃上的临时贴纸分割模型可能无法有效识别。更稳妥的判断是把它当作三维重建质量控制流水线中的一个环节而不是万能的清理工具。另外社区讨论中常提到的 3DGS 硬件混合优化本质上是在解决渲染效率问题。过滤干扰物能间接提升混合质量但它不能替代光线追踪级别的真实渲染也不能解决所有由光照变化带来的颜色偏差。如果你的场景存在强烈光照变化比如阴晴交替、霓虹灯闪烁建议先做色彩校正再进入过滤流程否则 3D 点的跨视图颜色一致性会失真。9. 总结与后续学习方向这篇文章从 3DGS 重建中最恼人的干扰物问题出发拆解了 Per-View Gaussian Predictions 与 Training-Free Distractor Filtering 的核心逻辑。它的关键价值不在于发明了多么复杂的网络结构而在于把去干扰物从“训练期隐式鲁棒”改为“推理期显式过滤”让重建流程可以复用成熟的前馈网络同时保持 3DGS 训练过程不变。对工程团队来说这种设计意味着更低的场景适配成本、更灵活的模型更新策略和更容易回滚的部署方式。如果你想继续深入建议按照三个方向展开。第一阅读 3DGS 官方仓库的渲染和排序实现理解高斯点在硬件混合管线中的绘制顺序这能帮你判断过滤后的模型是否真正适合实时渲染。第二熟悉多视图几何中的投影、重投影和一致性检查数学原理这是实现过滤逻辑的基础。第三尝试在不同数据集上测试过滤阈值对最终模型质量的影响积累一套属于自己的调参经验。最后提醒一句真正做项目时不要只把过滤当成训练后的一道工序还要把它带回到数据采集和原始模型验证阶段。只有数据质量、模型质量和后处理策略三者同时过关你才能得到真正干净、可靠的三维重建结果。建议收藏这篇文章等你在实际项目中遇到干扰物问题时再回来对照流程排查一遍。