空间产品工程个人项目演示· Shanks Engine 重建训练管线
高斯泼溅重建与训练管线
面向单相机与多相机刚性阵列的 3DGS 端到端流水线,具备状态机、质量门禁与断点续跑,减少手工脚本的不可复现问题。
- Python 3.11
- COLMAP 4.2
- FFmpeg
- Brush
- Nerfstudio splatfacto
- Docker
实验场(渲染产物):管线产物的 3DGS 渲染演示
- 我的角色
- 独立设计与开发(编排内核、SfM 质量门禁、训练后端接入)
- 职责边界
- 编排内核、SfM 质量门禁、训练后端接入
- 材料说明
- 项目资料与演示
- 幂等阶段(prepare → supersplat)
- 6
- SfM 门禁(有效图像数 / 注册率)
- ≥ 20 / ≥ 0.85
- GPU 训练后端(Brush / splatfacto)
- 2
其余 1 项指标与口径
- GPU 训练后端(Brush / splatfacto)
- 2
背景问题
单相机视频与多相机阵列采集的数据,需要经过抽帧、去畸变、SfM、训练与导出等多步骤。手工脚本存在三个问题:结果不可复现、SfM 失败后仍会空耗 GPU 训练时间、中途崩溃无法续跑。
下游创作、编译与查看发布见Scene 离线三维创作与发布工具链,本篇只覆盖训练侧。
约束
- 编排层尽量只依赖 Python 标准库,降低部署环境的依赖面。
- Windows 与 Linux/Docker 两套环境并存,配置需要保持键集合一致。
- 外部工具(COLMAP、FFmpeg、训练后端)版本要可锁定、可校验。
架构
视频 / 多路鱼眼 Rig
└─ FFmpeg 抽帧 + FishPoly 去畸变 + 位姿先验
└─ COLMAP SfM(rig 约束)──► sfm_validation.json(门禁)
└─ Brush 0.3.0(Windows)或 Nerfstudio splatfacto(Docker/CUDA)
└─ 导出 .ply ──► splat-transform 生成 .compressed.ply / .sog / 独立查看器
关键决策与取舍
- 状态机而非脚本:prepare、sfm、convert、train、export、supersplat 六个阶段解耦。重跑某阶段时自动清理本阶段产物并使下游失效,
--from-stage支持断点续跑。 - 门禁前置:训练前读取
sparse/0,检查有效图像数与注册率,不达标直接中止,避免算力空耗。 - 工具版本锁定:
tools/manifest.toml记录工具来源、版本与 SHA-256,bootstrap 时校验,不静默升级。 - 训练后端二选一:Windows 用 Brush(WebGPU/Vulkan),生产 Linux 用 splatfacto,两者共用上游数据契约。
结果
- 同一份输入在两个后端之间的前后处理保持一致,失败点可以定位到具体阶段。
- 测试全部使用标准库 unittest,并校验两套配置的键集合一致。
局限与后续优化
- SfM 门禁为静态阈值(有效图像数 / 注册率),对弱纹理与重复纹理场景仍依赖人工复核输入质量。
- Brush 与 splatfacto 共用上游数据契约,但训练参数未完全对齐,跨后端结果存在不可比差异。
- 当前面向本机与单机 GPU 编排,未纳入分布式或队列优先级调度。
我的职责
- 编排内核与状态机设计,阶段产物与级联失效规则。
- SfM 门禁、rig 配置生成与鱼眼去畸变链路。
- 目录队列 Worker、事件流与 Docker 双 target 构建。