最近这段时间,我一直在死磕一个课题:单目转头短视频的静态头部重建(基于 3DGS)

从最初只有一个“泛泛的想法”,到现在终于在服务器上搭起了一条真实的实验生产线,这中间经历了不少自我怀疑和“面向 Bug 编程”的深夜。

今天写下这篇博客,复盘一下项目“前半程打地基”的完整过程。目前的我已经不再是刚接触这个课题时不知从何下手的新手,而是正式跨入了第一轮真实的实验迭代期。

以下是我的通关记录。


一、 从零开始:跑通官方 Baseline 与夯实基建

1. 验证跑通官方 3DGS Baseline 这不是仅仅“看了论文”或“配了环境”,而是将官方的链路完整走了一遍。我从官方 GitHub 仓库拉取代码,用 Demo 数据依次跑通了 train.pyrender.pymetrics.py,并成功拿到了第一批指标和渲染结果。

这一步的意义在于建立信任底座:它验证了我的 AutoDL + RTX 4090 + 当前环境 + 官方 Repo 是完全可用的,提前排除了后续实验中环境带来的干扰变量。

2. 建立规范的代码与环境管理 为了走向“可复现研究”,我并没有打算只当个“跑一次就扔”的过客。

  • 我 Fork 了官方仓库,配置了 Git 用户信息,处理了 .gitignore,清晰地界定哪些文件该进版本库。
  • 保存了环境快照,记录了 pip freezeconda env export

这不仅是工程习惯的养成,也是为后续长期的消融实验买了一份保险。

二、 搭建“流水线”:把想法变成可执行的数据链路

我原本的目标是“单目转头短视频 → 静态头部重建”,现在我已经把它拆解成了一条真实可执行的生产线:

拍视频 → 抽帧/筛帧 → 做 A/B Set → 跑 COLMAP → 送进官方 3DGS → 看输出 → 失败分析

为了支撑这条流水线,我用视频预处理基础设施(如 process_video.py),实现了自动化流程:

  • 从视频中按固定步长读取并采样帧。
  • 引入 Laplacian variance(拉普拉斯方差) 计算图像清晰度,自动过滤运动模糊帧,并控制最终保留数量。
  • 统一分辨率,输出筛选后的图片,自动生成处理报告和模糊度曲线。

这意味着,我拥有了属于自己的数据前处理工具链。

三、 直面真实数据:踩坑、重拍与构建 A/B 测试

1. 发现第一版数据的致命问题:视角严重失衡 在处理第一轮自己拍摄的视频时(A_set),我发现筛完的帧分布极其不均:左脸很多,但正脸和右脸极少。数据分布对 3D 重建结果具有决定性作用,这不是靠算法能弥补的小瑕疵。

2. 拒绝“死调参”,选择重拍闭环 很多新手会在错误的数据(Garbage In)上死磕网络参数,但我选择了另一条路:

  • 先承认第一版数据不行,但保留它作为**“失败对照组”**。
  • 重新拍摄一条视角更均衡的视频。
  • 重新跑筛帧流程,最终生成了包含 80 张高质量图片的 B_set

3. 跑通 COLMAP 拿到场景结构 利用重拍的 B_set,我成功跑出了 database.db 以及 sparse/0/*.bin 文件。这是我自己拍的视频,第一次真正转换成了 3DGS 官方链路所需的前置格式。

四、 摸清系统边界:直击工程痛点与初次训练

在这条通路上,我踩到了一个非常真实的工程大坑:相机模型不兼容

当我兴冲冲地把 B_set 送进官方 train.py 时,迎面撞上了关键报错:

Error: only undistorted datasets (PINHOLE or SIMPLE_PINHOLE cameras) supported.

它让我深刻认识到:“COLMAP 成功” 绝不等于 “能直接训练 3DGS”。这强迫我去处理 COLMAP 的相机畸变(Distortion)问题,也让我真正摸到了官方数据接口的真实边界。

解决问题后,我终于完成了一轮完整的训练。这标志着我正式跨越了“准备期”,进入了“自己的数据 → 训练 → 渲染/评估/对比”的实质性产出阶段。


五、 阶段性总结与 Next Steps

为了支撑后续的多轮对比和失败复盘,我建立了一个结构化的项目目录(包含 dataset/runs/reports/compare/notes/scripts/ 等),为写出论文级的实验记录做好了准备。

回顾这段时间,我的认知发生了几个重要的跃迁:

  • 清扫环境障碍: 从“不会配环境” $\rightarrow$ “官方 baseline 顺利跑通”。
  • 打通数据链路: 从“只有原始视频” $\rightarrow$ “能稳定产出结构化训练输入”。
  • 建立数据直觉: 从“凭感觉拍” $\rightarrow$ 深刻理解“视角分布会如何毁掉重建结果”。
  • 形成实验思维: 从“乱试” $\rightarrow$ 知道如何利用失衡旧数据与重拍新数据进行 A/B 对照分析。

一句话概括:我已经把这个课题从一个“方向想法”,推进成了一个真正能跑、能出错、能比较、能复盘的实验系统。

🚀 下一步计划 (Action Items)

当前阶段最重要的不再是盲目扩充新路线,而是沉淀这一轮的成果:

  1. 整理出详细的 run_log.mdfailure_notebook.md
  2. 完成 A_setB_set 之间严格的 Render 结果对比与结论分析。
  3. 基于对比结果做一个关键战略决策:下一步是优先继续优化数据源(Data-centric),还是开始突进 head-aware / GPHM 风格的技术路线(Model-centric)

地基已经打好,好戏才刚刚开始。 我们下篇科研日志见!