深度和尺度准不准?问题出在相机视场角
检查 Blender 场景的米制尺度和三维形状,比较 DA3 与 MoGe-2,并用 H3 视频本身标定相机
结论速览
- 单看尺度,现在的做法误差不大。用“机器人身高 1.75 m”校正 DA3 后,和 MoGe-2(给它同样的 89.4° 视场角)的米制尺度只差 3–5%;两个模型去掉尺度后,形状也只差约 5%。所以只把尺度来源换成 MoGe-2,建模结果几乎不变。
- 真正的误差在视场角。我们一直按 H3 相机条件里的固定内参(水平 89.4°)测量和建模,但三类独立证据都表明,这段视频实际相当于一台约 51–60° 的相机:两个模型自己估的视场角、房间几何最合理的视场角,以及用视频里转动的帧对做的自标定。
- 视场角错了,房间就被压扁。旧场景的后墙只有约 2.6 m 远,床长 1.0 m、宽 1.5 m(比宽还短),地面和后墙夹角约 82°(应为 90°)。在参考视角下看不出来,镜头一转就和 H3 画面对不上。
- 按标定后的 60° 相机加 MoGe-2 米制深度重建,明显更准。后墙约 4.1 m,床变成 1.5 m 长、1.3 m 宽的正常比例;Astra 又改了 3 轮($3.80),最好的一轮物体 IoU 0.861,物理检查全部稳定;镜头转动后和 H3 画面的重合度从 0.22 提高到 0.46。
- 回答你的问题:先用 MoGe-2 定尺度、DA3 估深度再让 Astra 建模,会更精确,但前提是把正确的视场角一起交给模型;只换尺度来源几乎没有区别。建议流程:先用视频里转动的帧对标定视场角,再让 MoGe-2 在这个视场角下出米制深度,用机器人、门、床这些常见尺寸交叉检查,最后交给 Astra 建模。DA3 在焦距给对之后逐帧一致性很好,适合动态内容的逐帧抬升。
一、现在的尺度准不准
在第 0 帧上对比五种深度。前四种都用 H3 的名义内参(89.4°)把深度反投影成三维点;地面用 RANSAC 拟合,高度都是相对拟合出的地面算的。
| 深度来源 | 尺度(相对 MoGe-2) | 相机离地 | 机器人顶部 | 门顶 | 床头柜顶 | 后墙距离 |
|---|---|---|---|---|---|---|
| DA3 原始 | 2.06 | 2.83 m | 3.81 / 3.90 m | 4.48 m | 1.58 m | 5.16 m |
| DA3 焦距修正(乘以真实焦距 / DA3 估计焦距) | 0.89 | 1.22 m | 1.64 / 1.68 m | 1.93 m | 0.68 m | 2.23 m |
| DA3 身高先验(之前建模用的) | 0.96 | 1.31 m | 1.76 / 1.81 m | 2.07 m | 0.73 m | 2.39 m |
| MoGe-2,给定 89.4° | 1.00 | 0.65 m | 1.57 / 1.69 m | 2.11 m | 0.74 m | 2.60 m |
| MoGe-2,自己估视场角(55°) | 1.68 | 2.23 m | 3.02 / 3.13 m | 3.65 m | 1.29 m | 4.25 m |
- DA3 偏大约 2 倍,是因为它把视场角估窄了:它自己估的水平视场角只有 46.2°,焦距是真实值的 2.3 倍,而它输出的米制深度和焦距成正比。MoGe-2 自己估视场角时(55°)也一样偏大。
- 给定同一个视场角时,几种做法互相一致:身高先验和 MoGe-2 差 4%,DA3 和 MoGe-2 去掉尺度后形状差 4.8%,之前的 Blender 场景和 MoGe-2 的尺度差 2.6%。
- 但 89.4° 下 MoGe-2 算出的相机只离地 0.65 m,还不到机器人腰部,这是视场角不对的第一个迹象。
二、视场角才是关键
证据 1:两个模型自己估的视场角
DA3 估 46.2°,MoGe-2 估 55.4°,都远小于名义上的 89.4°。
证据 2:房间几何在哪个视场角下最合理
把视场角从 45° 扫到 89.4°:MoGe-2 按给定的视场角重新出深度,DA3 的深度不变、按给定的视场角反投影。每档都按机器人身高 1.75 m 统一尺度,地面和后墙用 SAM 3 分割后拟合平面。真实房间里,地面和后墙应该垂直。
DA3 在 45–50° 时最接近 90°,MoGe-2 在 60° 时是 89.8°;到了 89.4°,两者都只剩 79–83°。在 MoGe-2 的结果里,相机离地高度在 55–60° 时是 1.1–1.24 m,到 89.4° 时只剩 0.67 m。
证据 3:用视频自己标定
纯旋转时,画面怎么变化只取决于焦距和转角,和深度无关。在 H3 视频里挑了 9 对相机真正在转动的帧,在静态区域做特征匹配,对每个候选焦距计算按指令转角重投影的误差。
| 帧对 | 指令转角 | 最优焦距 | 对应视场角 | 最优焦距下的误差 | 名义焦距 679 px(89.4°)下的误差 |
|---|---|---|---|---|---|
| 20 → 28(左转) | 14.7° | 1210 px | 58.1° | 3.5 px | 115 px |
| 24 → 32(左转) | 17.3° | 1170 px | 59.7° | 3.2 px | 138 px |
| 28 → 36(左转) | 16.4° | 1100 px | 62.8° | 3.6 px | 119 px |
| 68 → 76(右转回) | 14.7° | 1100 px | 62.8° | 3.1 px | 106 px |
| 76 → 84(右转回) | 16.4° | 1140 px | 61.0° | 3.1 px | 134 px |
| 156 → 164(左转) | 20.2° | 1230 px | 57.3° | 2.5 px | 182 px |
| 180 → 188(下俯) | 11.5° | 930 px | 71.7° | 2.3 px | 52 px |
左右转的帧对给出的焦距在 1100–1230 px 之间,对应 57–63°,我取 60°(焦距 1164 px)。如果转角也放开自由拟合,最优焦距约 1400 px(51°),拟合出的转角约为指令转角的 80%。两种拟合都远离 89.4°。结论是:H3 的相机条件用的是固定内参,但它生成的画面运动跟随的是输入图本身的透视。慢速环抬升、资产证据渲染和之前的 Blender 场景,用的都是 89.4°。
三、按标定后的相机重建
| 项目 | 旧:89.4° + DA3 + 身高先验 | 新:60° + MoGe-2 米制 |
|---|---|---|
| 相机离地 / 俯仰 | 1.29 m / −9.5° | 1.06 m / −3.0° |
| 测得的后墙距离 | 2.53 m | 3.91 m |
| 建出的床(长 × 宽) | 1.00 × 1.49 m | 1.51 × 1.32 m |
| 建出的床头柜高 | 0.75 m | 0.70 m |
| 机器人身高 | 1.75 m(先验) | 1.58 / 1.64 m(MoGe-2 测得) |
| 物体 IoU(参考视角) | 0.791 | 0.861 |
| 物理静置测试 | 全部稳定 | 全部稳定 |
新场景从旧场景的脚本出发,Astra 按新的测量表又改了 3 轮($3.80)。床仍比标准床(约 2.0 m 长)短一些,可能是视场角还偏宽(自由拟合给出的是 51°),也可能是生成图本身的透视并不完全符合物理。机器人身高 1.6 m 左右,在人形机器人常见的 1.5–1.8 m 范围内;绝对尺度还有约 10% 的不确定性,要靠已知尺寸的物体才能定死。




四、镜头转动后能不能对上 H3
把两个场景分别用各自的内参,渲染到 H3 视频中 17 帧的指令相机位姿上,和那一帧里 SAM 3 检测到的床、床头柜、窗、门、床头板比较重合度(机器人遮挡的像素不算)。
在参考视角(第 0 帧),两个场景都对得上(0.88 / 0.89)。镜头一转,旧场景就迅速错开,左转 40° 时只剩 0.06–0.08;新场景保持在 0.45–0.65。第二次访问时两者都偏低,因为 H3 在那里按提示词画了场景里没有的东西,镜头前还有机器人。
五、建议
- 每段视频先标定视场角。拿一段相机在转动的帧做特征匹配,几秒就能算出来;不同的输入图,透视不同,有效视场角也会不同。
- 米制深度用 MoGe-2,并给它标定后的视场角;再用常见尺寸(机器人、门、床、床头柜)交叉检查尺度。DA3 在焦距给对之后逐帧尺度稳定(同一视角的两帧之间相差 0.3–1.3%,MoGe-2 是 0.4–2.8%),留给动态内容的逐帧抬升。
- 之前用 89.4° 的模块都要按新相机重跑:慢速环的抬升、资产证据的渲染、Blender 证据试点。主页上“换朝向回访”的结果,重跑后可能还会变好。
- 绝对尺度还剩约 10% 的不确定性。对纯旋转的轨迹,这不影响渲染出来的画面;对物理仿真和带平移的轨迹有影响,可以用门高、床宽这类常见尺寸再收紧。