跳转至

第14讲 认知与计算(三)

三维视觉与三维表示

三维空间中的媒体既可以是剪刀、椅子、树等单个物体,也可以是完整室内场景;人的双目从不同视角接收光线,视差提供深度线索。很多学科都会处理和分析三维视觉数据:计算机图形学从三维世界模型出发渲染二维图像,计算机视觉从图像反推三维信息,形状处理则直接在三维模型上操作。课件展示的应用包括自动驾驶激光雷达感知、电商商品 360° 展示、增强现实或虚拟现实、虚拟手部交互和室内全景漫游。

常见三维表示可概括如下:

表示 优点 缺点
体素 可用稀疏卷积处理 效率较低,难以实现
多视图图像 便于采集和处理 效率较低
点云 便于获取、处理,存储小 难表达三维细节
网格 便于应用,表达简洁 难处理和生成
隐式表示 描述简洁 难处理,不便直接应用

显式方法直接存储几何信息。点云是一组三维点,每点包含坐标,还可附加颜色、法线;可由深度相机或 LiDAR 采集,获取方便、应用广,但缺少表面和拓扑信息,复杂物体难表示。网格由顶点、边以及三角形或四边形面组成,是图形学中最常用的表面表示,适于渲染、纹理贴图、仿真和变换,但结构不规则,不易处理。体素类似三维像素,是离散立方体单元,保存占据概率、密度等体积属性,便于卷积和体渲染,但存储、计算代价大。多视图图像能直接表达颜色、纹理且易采集处理,但达到高精度需要大量视图,计算和存储开销高。课件列出的网格与三维数据资源包括 ShapeNet、3D Warehouse、Yobi3D、SceneNN、Redwood Dataset、ScanNet、KITTI 3D 和 Dynamic MPI-FAUST。

Ball-Pivoting 是把点云重建成网格的经典算法。设一个半径为 \(r\) 的球同时接触三个点且内部不含其他点,这三点即可构成三角形;从初始三角形出发,让球沿三角形边滚动,寻找新的接触点并扩展网格。它直观、易实现,只依赖局部点云,适合大规模数据,调整球半径还能适应不同采样密度。缺点是噪声和离群点会产生错误三角形,稀疏区域可能出现网格缺口,对尖锐特征、薄壁和复杂拓扑也不易处理。

隐式方法用函数把空间点映射为标量,再以零等值面表示形状。符号距离函数(Signed Distance Function,SDF)在物体内部为负、外部为正、表面为 0;占用函数只输出 0 或 1,表示点是否在物体内部。一般隐式场写成

\[ f:\mathbb R^3\to\mathbb R, \]

满足 \(f(x)<0\) 的点在内部,\(f(x)=0\) 在表面,\(f(x)>0\) 在外部;所有 \(f(x)=0\) 的点构成零等值面。

Marching Cubes 从隐式场提取网格。先把三维标量场划分成规则的 \(1\times1\times1\) 立方体,每个单元有 8 个顶点;比较顶点值与阈值 \(\sigma\),大于阈值记正点、低于阈值记负点;按顺时针顶点顺序编码成 8 位二进制索引,因此共有 \(2^8=256\) 种状态;最后查预定义表,得到等值面与立方体边的交点以及连接交点的三角形拓扑。

神经网络可以近似隐式场:一种方式为每个形状单独训练网络;另一种给形状分配潜在编码,使同一网络表示多个形状。显式方法直观、可解释,直接存顶点、边、体素,但高分辨率计算复杂,复杂拓扑也难生成;隐式方法用数学函数或网络表达,支持复杂拓扑、无需显式存储且生成过程高效,但不直观。

刚体运动与相机模型

三维点由三个坐标确定,刚体除位置外还有姿态;相机也可看成刚体,其姿态就是朝向。两个坐标系之间的旋转和平移构成刚体运动。若向量 \(a\) 在坐标系 1、2 中的坐标为 \(a_1,a_2\),则

\[ a_1=R_{12}a_2+t_{12}, \]

其中 \(R_{12}\) 把坐标系 2 旋转到坐标系 1,\(t_{12}\) 是从坐标系 1 原点指向坐标系 2 原点的向量在坐标系 1 中的坐标。连续两次变换满足

\[ b=R_1a+t_1,\qquad c=R_2b+t_2=R_2(R_1a+t_1)+t_2. \]

直接展开多次变换会很繁琐。给三维向量补一个值为 1 的维度,使用齐次坐标,就能把旋转和平移合成矩阵乘法:

\[ \begin{bmatrix}a'\\1\end{bmatrix}=\begin{bmatrix}R&t\\0^T&1\end{bmatrix}\begin{bmatrix}a\\1\end{bmatrix}\equiv T\begin{bmatrix}a\\1\end{bmatrix}. \]

于是 \(\tilde b=T_1\tilde a\)\(\tilde c=T_2\tilde b=T_2T_1\tilde a\),多个变换可直接连乘。

相机模型把以米为单位的三维世界坐标映射为以像素为单位的二维坐标。针孔模型描述光线穿过针孔并在后方成像;为便于计算,可把真实成像面对称移到相机前方,并可再归一化到焦距 1 的平面。若相机坐标为 \(P_c=(x_c,y_c,z_c)^T\),成像平面点为 \(P'=(x,y,f)^T\),相似三角形给出

\[ \frac{z_c}{f}=\frac{x_c}{x}=\frac{y_c}{y}, \]

因此

\[ \begin{bmatrix}x\\y\\1\end{bmatrix}=\frac1{z_c}\begin{bmatrix}f&0&0&0\\0&f&0&0\\0&0&1&0\end{bmatrix}\begin{bmatrix}x_c\\y_c\\z_c\\1\end{bmatrix}. \]

由成像平面到像素坐标还要考虑主点偏移 \((c_x,c_y)^T\) 与像素物理尺寸 \(d_x,d_y\)。令 \(\alpha=f/d_x\)\(\beta=f/d_y\),则

\[ u=\frac{x}{d_x}+c_x=\alpha\frac{x_c}{z_c}+c_x,\qquad v=\frac{y}{d_y}+c_y=\beta\frac{y_c}{z_c}+c_y, \]

写成相机内参矩阵即

\[ \begin{bmatrix}u\\v\\1\end{bmatrix}=\frac1{z_c}\begin{bmatrix}\alpha&0&c_x\\0&\beta&c_y\\0&0&1\end{bmatrix}\begin{bmatrix}x_c\\y_c\\z_c\end{bmatrix}. \]

NeRF 与体渲染

神经辐射场(Neural Radiance Field,NeRF)用 MLP 隐式保存三维场景。网格、体素、点云给出明确的 \(x,y,z\) 几何;NeRF 不直接存这些显式结构,而是在给定观察角度时输出对应二维图像。

体渲染最初用于云、烟、果冻等非刚体:把物质视为粒子群,光子在传播中会被吸收,粒子也会放射光。NeRF 输入 5D 量,包括位置 \(x=(x,y,z)\) 与方向 \(d=(\theta,\phi)\),输出位置—方向相关的 RGB 颜色 \(c(x,d)=(r,g,b)\) 和仅与位置相关的密度 \(\sigma(x)\)

从相机到射线上距离 \(s\) 处仍未被吸收的透射率为

\[ T(s)=\exp\left(-\int_0^s\sigma(t)\,dt\right). \]

它可由局部关系 \(T(s+ds)=T(s)[1-\sigma(s)ds]\) 推得,因为

\[ \frac{dT(s)}{T(s)}=-\sigma(s)ds\quad\Longrightarrow\quad \ln T(t)-\ln T(0)=-\int_0^t\sigma(s)ds. \]

沿射线的连续颜色积分为

\[ \hat C(r)=\int_0^{\infty}T(s)\sigma(s)C(s)\,ds. \]

将光线离散为 \(N\) 个区间,令 \(\delta_i=t_{i+1}-t_i\),则

\[ T_i=\exp\left(-\sum_{j=0}^{i-1}\sigma_j\delta_j\right), \]
\[ \hat C(r)=\sum_{i=1}^{N}T_i\left(1-e^{-\sigma_i\delta_i}\right)c_i. \]

定义采样点不透明度 \(\alpha_i=1-e^{-\sigma_i\delta_i}\),便有 \(\hat C(r)=\sum_iT_i\alpha_ic_i\)。课件给出的实现参考是 yenchenlin/nerf-pytorch

NeRF 沿相机射线采样并按透射率合成像素颜色

数据预处理要由像素坐标、相机内参和外参恢复世界坐标系中的射线方向。内外参可通过运动恢复结构取得,常用软件是 COLMAP。为表达高频几何和纹理,NeRF 对输入作正弦位置编码:

\[ \gamma(p)=\bigl(\sin(2^0\pi p),\cos(2^0\pi p),\ldots,\sin(2^{L-1}\pi p),\cos(2^{L-1}\pi p)\bigr). \]

位置输入取 \(L=10\),方向输入取 \(L=4\),对应图中的 60 维位置编码和 24 维方向编码。消融图显示:去掉视角依赖会损失反光等外观变化,去掉位置编码会明显模糊高频细节。课件网络以多层宽度 256 的 MLP 处理位置编码,中间再次拼接位置编码;一路输出密度 \(\sigma\) 和特征,特征再与方向编码结合,经 128 维分支输出 RGB。

直接在光线上密集采样效率低,因为空白与遮挡区域对最终像素没有贡献。NeRF 用结构化的层次采样联合优化结构相同的粗、细两个网络:粗模型沿射线均匀采样;把粗模型各点的颜色贡献归一化为概率密度,再用逆变换采样产生第二批点,让细模型集中到有效区域。若目标 PDF 为 \(p(x)\),先求

\[ F(x)=\int_{-\infty}^{x}p(t)\,dt, \]

再采 \(u\sim U[0,1]\) 并令 \(x=F^{-1}(u)\),即可得到服从 \(p(x)\) 的样本。

训练输入包括场景 RGB 图像及相机位姿、内参。每次从所有像素中随机抽取一批相机光线,粗细网络同时监督:

\[ \mathcal L=\sum_{r\in\mathcal R}\left[\lVert\hat C_c(r)-C(r)\rVert_2^2+\lVert\hat C_f(r)-C(r)\rVert_2^2\right]. \]

课件设置每批 4096 条光线,每条光线粗网络采 64 点、细网络采 128 点。推理时为图像每个像素生成射线,作层次采样,并用各采样点颜色、密度体渲染。

重建评价包括 LPIPS、PSNR 和 SSIM:

\[ \operatorname{LPIPS}(I,R)=\sum_l\frac1{H_lW_l}\sum_{h,w}\left\lVert w_l\odot\left(y^l_{I,h,w}-y^l_{R,h,w}\right)\right\rVert^2, \]
\[ \operatorname{PSNR}(I,R)=10\log_{10}\frac{255^2}{\operatorname{MSE}(I,R)}, \]
\[ \operatorname{SSIM}(I,R)=\frac{2\mu_I\mu_R+C_1}{\mu_I^2+\mu_R^2+C_1}\cdot\frac{2\sigma_{IR}+C_2}{\sigma_I^2+\sigma_R^2+C_2}. \]

3DGS 三维高斯泼溅

NeRF 基于体渲染逐射线采样,速度较慢。三维高斯泼溅(3D Gaussian Splatting,3DGS)受点渲染启发,用三维高斯椭球稀疏参数化辐射场,减少存储和计算,并利用 GPU 并行光栅化实现实时渲染。每个高斯点由均值 \(p\in\mathbb R^3\)、协方差 \(V\in\mathbb R^{3\times3}\)、用球谐函数表示的颜色 \(c\) 和体密度 \(\sigma\) 定义。

光栅化把物体坐标系中的椭球高斯核变换到射线坐标系。物体坐标系是每个高斯点的局部坐标系,原点在核中心,坐标轴沿椭球主方向;相机坐标系以光心为原点;射线坐标由图像平面二维投影位置和沿光线距离组成,通常用方向和深度表示。物体到相机是刚体视图变换:

\[ p'=Wp+t,\qquad V'=WVW^T,\qquad x'=Wx+t. \]

坐标变换后高斯仍为高斯。相机到射线坐标使用投影

\[ x''=g(x')=\begin{bmatrix}x'_1/x'_3\\x'_2/x'_3\\\lVert x'\rVert\end{bmatrix}. \]

投影不是仿射变换,因此在高斯中心 \(p'\) 附近作一阶泰勒展开。Jacobian 为

\[ J(x')=\begin{bmatrix} 1/x'_3&0&-x'_1/(x'_3)^2\\ 0&1/x'_3&-x'_2/(x'_3)^2\\ x'_1/\lVert x'\rVert&x'_2/\lVert x'\rVert&x'_3/\lVert x'\rVert \end{bmatrix}, \]
\[ g(x')\approx g(p')+J(p')(x'-p')=Jx'+t'. \]

于是物体坐标下的高斯近似变换为

\[ p''\approx J(Wp+t)+t',\qquad V''\approx J(WVW^T)J^T. \]

对应密度在变量替换下满足

\[ G^3(x'';p'',V'')=\frac1{|J|}G^3(x';p',V')=\frac1{|J||W|}G^3(x;p,V). \]

由于用一阶仿射变换近似投影,射线坐标中的核仍保持高斯形式。

渲染时,对每条光线收集相交的三维高斯点,按深度排序,在射线坐标中计算高斯核,再作前向体渲染。透明度沿整条光线计算,但第 \(i\) 个点只受它前面的点影响。把三维核沿深度积分,得到二维足迹

\[ q_i(x'')=\int_0^{t_{\max}}G^3(x''_1,x''_2,t;p'',V'')\,dt=G^2\left(\begin{bmatrix}x''_1\\x''_2\end{bmatrix};\begin{bmatrix}p''_1\\p''_2\end{bmatrix},V''_{12}\right). \]

最终颜色为

\[ C(r)=\sum_{i=1}^{N}c_i\sigma_iq_i(x'')\prod_{j=1}^{i-1}\left(1-\sigma_jq_j(x'')\right). \]

训练时先用运动恢复结构(SfM)的稀疏点云初始化高斯均值,协方差设为单位矩阵;用 \(L_1+\operatorname{SSIM}\) 损失和梯度下降更新参数;在重建不足处增加高斯点,在过度重建处合并高斯点。课件随后展示了实时重建效果。

三维生成模型

三维生成是用生成式 AI 创建三维模型,把文本描述或图像转换为复杂三维结构,主要任务包括 Text-to-3D、Image-to-3D 和 3D Shape Completion。应用包括快速生成制造和 3D 打印原型、自动生成游戏场景与角色、把二维建筑设计转换成三维模型,以及生成分子三维结构辅助药物设计和筛选。课件将方法分为 3D GAN、3D Diffusion Models、无三维训练数据的三维生成和基于部件的三维生成。

3D GAN 让生成器与判别器对抗:生成器根据潜在向量产生三维形状,判别器判断其是否真实。课件目标为

\[ L_{\mathrm{GAN}}(G,D)=\mathbb E_y[\log D(y)]+\mathbb E_{x,z}[\log(1-D(G(x,z)))]. \]

训练完成后只用生成器从随机潜在向量生成形状。与易发生模式崩溃的 GAN 相比,扩散模型训练更稳定;3D 扩散把逐步加噪、反向去噪扩展到点云、网格等三维数据。Point Cloud Diffusion 逐步破坏点云,再通过逆过程恢复。

在没有三维训练数据时,可先学习三维结果的二维投影表达 \(f_\theta\),训练中把生成的三维结果降维成二维后交给判别器,因而只需二维监督。不同观察点会得到不同投影,需加入观察视点先验以提高准确性。

基于部件的方法把复杂对象拆成有意义的部件,分别生成后再组合。理想部件应有细致几何、清晰结构、分明边界和语义标签。它不是编码整个形状,而是分别编码部件,可用 VAE 编解码潜向量,再配合 GAN 或扩散生成。其优势包括:用户可用文本或图像定制部件属性,灵活生成个性化内容;即使部分不可见或被遮挡,也可借助多视图恢复完整结构;部件语义明确,便于后续三维理解和应用。

Text3D 数据集与文本感知重建

Text3D 是带文本区域语义标注的三维文本感知数据集,包含 139 个数字原生模型、412 个扫描仪获取模型和 30 个多视图重建模型。每个物体从随机视角渲染 100 张二维 RGBA 图,同时保存对应的深度图、法线图和相机参数。

标注同时覆盖三维与二维。三维形式包括 Mesh 物体上的 OCR 区域,以及渲染视图与对应相机参数;二维形式是在各渲染视图上标注 OCR 区域。课件给出了三维物品及文字真值标注示例。

文本语义区域感知重建从两处改进普通三维重建。重要性采样根据采样点与文本区域的相关性调节密度,使模型在文字区域投入更多采样;边缘损失先在每个采样点估计边缘概率,再用体渲染权重加权求和,汇成图像平面的预测边缘图。实验对比了基线、加入文本区域敏感重要性采样(IS)以及边缘真值与预测,引入 IS 和 Edge Loss 后更能保留文字边缘。

本讲要求掌握三维重建与三维生成的基本原理,相关代码资源为 threestudio-project/threestudio

思考:NeRF 和 3DGS 对物体几何结构信息的表示有何不足?

评论