【论文阅读 TextureMe】Texture: MeHigh-Quality TexturedSceneReconstruction in RealTime

1. Abstract

本文的工作:在线重建出高质量纹理的地图

  1. 创建TSDF模型,以及在mesh基础上,创建三角形纹理块
  2. 将颜色集成到贴片中,同时将深度图融合进TSDF中
  3. 不需要额外的 纹理图优化、网格参数、繁重的后处理

2. Introduction

背景

  1. 前人的TSDF模型很好,但若想表示更细节的纹理,需要增加体素网格数量,无疑增大了计算量
  2. Marching Cubes算法: 从TSDF模型中提取出mesh网格,mesh网格可以表示更加细节的颜色,但以往的方法都是通过插值来确定网格颜色,依然受制于体素网格数量
  3. Kinect相机可以捕捉到高质量的颜色信息,但是以往的方法都注重在提高3D模型的质量,忽略了颜色细节的重建
  4. 本文提出了一个全新的框架,同时创建一个 纹理地图几何地图,全局纹理图+TSDF图
    1. 纹理地图:包括直角三角形(存储了该位置重建表面的颜色细节);Marching Cubes算法提取出的三角形映射到RGB图上得到texture patches三角块;texture patches再集成到纹理地图上
  5. texture fusion的比较:
    1. TF和本文的实现目标手段相同,都建立了纹理地图和几何地图;
    2. 本文和TF重建的几何模型都是体素模型,但是,TF中每个体素只对应一个纹理,而本文对纹理的划分不仅局限在体素尺度上;

本文贡献

  1. 本文提出了基于纹理块的多尺度优化,让纹理块能更加高效对齐
  2. 本文提出一个TSDF 过滤器,防止三角形进行不必要的链接或者更新,进而使得纹理块的更新更加稳健
  3. 重采样算法,当三角形间的链接关系发生变化时,新全局纹理地图
  4. 提出一种考虑模糊程度加权方案来更新全局纹理

3. System Overview

  1. TSDF模型用Kinectfusion的流程,并修改了KF中ICP,加上颜色信息
  2. 获取全局纹理地图,局部纹理地图,并融合
    1. Marching Cubs算法从TSDF模型中提取mesh(三角形网格)
    2. 从当前帧中提取纹理块(纹理块表示了mesh网格的位置颜色)
    3. 利用当前帧纹理块来update全局纹理地图
  3. 本文的核心是纹理块的 表示、存储、建立、更新,融合到全局纹理
    1. Section 4 : 纹理块的表示和存储
    2. Section 5 : 纹理块的更新、减少mesh网格连接方式的变化
    3. Section 6 : 在纹理块更新前,为了避免漂移误差对重建的影响而进行的优化

4. Texture Atlas Representation

为了实现实时处理,本框架需运行在GPU上,所以需要让 纹理块 的数据结构便于并行处理

4.1 纹理块和全局纹理地图的表示

  1. 纹理块==(texture patch)==: 一个纹理块表示全局mesh网格中的一个三角区域,存储了该三角形区域的颜色、位置信息;为了存储效率,被设置为直角三角形???

  2. 全局纹理地图==(texture atlas)==:

    1. 相当于全局所有纹理块的目录

    2. 是一张由许多直角三角形组成的图片,mesh网格中每一个三角形都对应全局纹理地图中唯一的直角三角形

    3. 每个直角三角形在图中的位置为该纹理块的索引

      image-20220403145912979

4.2 存储和管理纹理块

  1. 由TSDF获得mesh,对mesh中每一个三角形新建纹理块
  2. 一个体素所能对应的三角形个数是有限的,由Marching Cubes算法得到mesh,本文一个体素最多对应5个三角形
  3. 为了节省空间,用栈动态存储所有未被使用的纹理块对象
    1. 随着重建过程(KinectFusion)的进行,全局mesh网格随之变化,必然新纹理块会产生,旧纹理块会被替代
    2. 将所有新建的纹理块的索引放入栈freelist中
    3. 判断新纹理块的质量,
      1. 如果质量好,则从freelist中POP出去
      2. 如果质量不好,或者要被替代,则释放纹理块的空间,并将其索引PUSH到栈中
  4. 总结:
    1. 首先,只要TSDF模型中纳入了新的体素,就要为此体素新建纹理块,并加入全局纹理地图中
    2. 相反,如果相机重复访问了TSDF中某一片区域,
      1. 当两次访问所提取纹理块数量、形状、位置不一样时,那这片区域所对应的旧纹理块对象被释放,对应的索引PUSH到free list,创建新的纹理块,加入全局纹理地图
      2. 当两次访问所提取纹理块数量、形状、位置一样时,保留、更新旧纹理块(相当于只更新了颜色)
    3. Section5.4 中会详细讨论新旧纹理块间如何更迭

5. Texture patch Fusion

本节展示如何从RGB图像提取纹理块、加权融合至全局纹理图中的纹理块

值得注意的是,加权融合的方法考虑了图像模糊度,以及介绍了一种处理mesh网格频繁变化的方法

5.1 从当前帧提取纹理块

  1. 当前帧 k k k 对应mesh网格模型为 M k \mathcal{M}_{k} Mk , 对 M k \mathcal{M}_{k} Mk中**每一个三角形新建纹理块 T k ′ T_k' Tk **
  2. 利用当前帧的位姿 Q k \mathcal{Q}_{k} Qk 将每个纹理块 T k ′ T_k' Tk 投影到当前帧的RGB平面( C k \mathcal{C}_{k} Ck)上来确定 T k ′ T_k' Tk 中每个纹理块的颜色
  3. 利用三角形的重心坐标来确定纹理块的颜色

5.2 更新全局纹理图中的纹理块

  1. 前面对当前帧新建的一个纹理块 T k ′ T_k' Tk ,要与与 上一帧重建好的纹理块 T k − 1 T_{k-1} Tk1融合,

  2. 首先比较包含 T k ′ T_k' Tk 的体素和包含 T k − 1 T_{k-1} Tk1的体素

    1. 如果对应的纹理块数量和类型相同,直接进行下一步(进行颜色的更新)
    2. 如果对应的纹理块数量和类型不相同,则在全局纹理图中重新采样 T k − 1 T_{k-1} Tk1
    3. 如果 T k ′ T_k' Tk对应到全局纹理块区域为空的怎么办???
  3. T k − 1 T_{k-1} Tk1 代表了截止到上一帧某三角面的颜色细节信息,用公式(1)来加权平均 T k − 1 T_{k-1} Tk1 T k ′ T_k' Tk

  4. T k = W k − 1 ⊙ T k − 1 + W k ′ ⊙ T k ′ W k − 1 + W k ′ \mathrm{T}_{k}=\frac{\mathbf{W}_{k-1} \odot \mathbf{T}_{k-1}+\mathbf{W}_{k}^{\prime} \odot \mathrm{T}_{k}^{\prime}}{\mathbf{W}_{k-1}+\mathbf{W}_{k}^{\prime}} Tk=Wk1+WkWk1Tk1+WkTk
    ​ 其中 W k − 1 W k ′ W_{k-1} W_k' Wk1Wk是表示权重的矩阵

    W k = min ⁡ ( W k − 1 + W k ′ , w max ⁡ ) \mathbf{W}_{k}=\min \left(\mathbf{W}_{k-1}+\mathbf{W}_{k}^{\prime}, w_{\max }\right) Wk=min(Wk1+Wk,wmax)
    ​ 其中 w max ⁡ w_{\max } wmax 是提前定义好的常量

    W k ′ ( p ) = w n ⋅ w d ⋅ w b \mathbf{W}_{k}^{\prime}(\mathbf{p})=\mathbf{w}_{n} \cdot \mathbf{w}_{d} \cdot \mathbf{w}_{b} Wk(p)=wnwdwb
    p p p表示三角形的顶点,意思是,每个节点位置对应的权重与 观测角度、观测距离、模糊程度相关

  5. p p p 表示2D节点的位置, q q q 表示 p p p M k \mathcal{M}_{k} Mk 中对应的3D点
    1. w n w_n wn 表示 m a x ( n ⋅ v , ϵ ) max(n\cdot v , \epsilon) max(nv,ϵ) ϵ \epsilon ϵ是提前设定的常量, n n n 表示 q q q 的法向量, v v v 表示 q q q p p p的投影方向
    2. w d w_d wd 随着深度加深而减小,表示对深度不确定性的建模
    3. w b w_b wb 用于减小模糊图片纹理块节点的权重,通过perceptual blur metric 算法计算图片的模糊度(之前有篇文章???),模糊度越大, w b w_b wb 越小

5.3 降低Mesh 的变化频率

由于深度图噪声的影响,会导致某些帧重建出的TSDF有所震荡,同时也就导致了Marching Cubes算法提取出的纹理块频繁的发生变化,这样的话,即使新纹理块即使与旧纹理块对应真实世界同一区域,但由于TSDF模型震荡,二者所提取出的纹理块不同,则会在没必要重新建图的区域上频繁地删除、新建纹理块。

5.4 重采样纹理块

  1. 5.2节中,表述了如何用当前帧的纹理块 T k ′ T_k' Tk来更新全局纹理块 T k − 1 T_{k-1} Tk1,但前提是要保证 T k ′ 、 T k − 1 T_k'、T_{k-1} TkTk1的类型相同的情况下,进行颜色的更新
  2. 重采样的目的是:当 T k ′ 、 T k − 1 T_k'、T_{k-1} TkTk1类型不同(形状、位置不同的三角形)时,就要对全局网格地图重新划分网格,使全局纹理块的形状结构与当前帧纹理块相同
  3. 做法是利用位姿 Q k Q_k Qk ,像kinectfusion一样得出当前帧的预测图 M k \mathcal{M}_{k} Mk (会投影到当前帧的部分地图、文章中说的是rendered image)
  4. M k \mathcal{M}_{k} Mk 上用Marching Cubes采样,但相比5.1从当前帧中采样颜色,这里颜色是从预测图中采样

6. Texture patch Optimization

  1. 针对的问题
    1. 由于位姿估计的漂移、累计误差,kinectfusion估计的位姿不一定准确
    2. 并且TSDF是在加权多个视角深度图的基础上建成的模型,并不一定能够与每一帧RGB图对齐。并且每一帧的深度图与RGB图也不一定是同步的
    3. 所以5.1 中对当前帧提取的纹理块无法和当前RGB图完全对齐,在模型与帧没有对齐的情况下直接加权更新(5.2)的话,会造成不同部位的颜色、纹理加权。使最终结果不准确
  2. 解决的办法
    1. 获得图像变形域,从而将预测图和观测图对齐
    2. 通过变形域来优化 5.1 中采样的位置
    3. 将优化过程并行化,实现实时性

6.1 图像变形域

  1. 对2D预测图(render image) C k r C_k^r Ckr进行均匀的采样
  2. image-20220409155252082
  3. 目的是要在2D观测图(RGB image) C k C_k Ck中获取一个采样点集合,使 C k C_k Ck C k r C_k^r Ckr间的采样互相匹配

6.2 优化目标

  1. 为了找到预测图中采样点 { u 0 i } \{u_0^i\} {u0i}在RGB图中的对应点,定义一个损失函数来寻找一个2D点集合 U = { u i } U = \{u^i\} U={ui}

  2. 其中,左图是预测图(render image)、右图是观测图image-20220409164324171优化目的就是调整右图 u i u^i ui的位置,使右图红点与左图蓝点对应图片中的内容相同

  3. 损失函数由两项组成
    E t e x ( U ) = E data  ( U ) + λ reg  E r e g ( U ) E_{t e x}(\mathrm{U})=E_{\text {data }}(\mathrm{U})+\lambda_{\text {reg }} E_{r e g}(\mathrm{U}) Etex(U)=Edata (U)+λreg Ereg(U)

    1. 光度误差项:
      E d a t a ( U ) = ∑ v ∈ V M ∑ f ∈ F v ∑ b ∈ B f ( C k ( s ( b , { u f } ) ) − C k r ( s ( b , { u 0 f } ) ) ) 2 E_{d a t a}(\mathbf{U})=\sum_{v \in \mathbf{V}_{M}} \sum_{f \in \mathbf{F}_{v}} \sum_{\mathbf{b} \in \mathbf{B}_{f}}\left(\mathbf{C}_{k}\left(\mathbf{s}\left(\mathbf{b},\left\{u^{f}\right\}\right)\right)-\mathbf{C}_{k}^{r}\left(\mathbf{s}\left(\mathbf{b},\left\{u_{0}^{f}\right\}\right)\right)\right)^{2} Edata(U)=vVMfFvbBf(Ck(s(b,{uf}))Ckr(s(b,{u0f})))2
      通过调整 C k C_k Ck上采样点的位置,从而最小化 C k C_k Ck C k r C_k^r Ckr 之间的光度误差

    2. 正则化项
      E r e g ( U ) ) = ∑ v ∈ V M ∑ v ′ ∈ N 1 ( v ) ( l ( u v , u v ′ ) − l ( u 0 v , u 0 v ′ ) ) 2 \left.E_{r e g}(\mathrm{U})\right)=\sum_{v \in \mathbf{V}_{M}} \sum_{v^{\prime} \in \mathbf{N}_{1}(v)}\left(l\left(u^{v}, u^{v^{\prime}}\right)-l\left(u_{0}^{v}, u_{0}^{v^{\prime}}\right)\right)^{2} Ereg(U))=vVMvN1(v)(l(uv,uv)l(u0v,u0v))2
      为了防止过拟合,限制 C k C_k Ck上采样点位置的优化程度,使优化前后,采样点与采样点1-邻域的邻居间位置程度相似,保证采样点网格平滑的形变

6.3 在GPU上高效优化

  1. 将多维变量的高斯牛顿问题,转为多个一维问题,

  2. 优化 u i u^i ui的时候,保持 U U U中其他采样点位置 u j u^j uj不变,从而实现并行

6.4 多尺度优化

  1. 优化时间取决于 C k C_k Ck上采样点的密度( U k U_k Uk的大小)、非重叠区域的大小区域、非重叠的幅度
  2. 为了减小优化工作量,对 C k C_k Ck C k r C_k^r Ckr 建立高斯金字塔,用同样密度的网格在金字塔不同层采样、优化
  3. 用这种coarse to fine 的方法渐近式的优化,

6.5 优化采样过程

  1. 本节的优化结果是 预测图 与 RGB图之间的点匹配关系
  2. 之前5.1节中,第k帧对应的纹理块集合 M k \mathcal{M}_{k} Mk ,以及每一纹理块 T k ′ T_k' Tk的节点点是来自于mesh网格中的节点投影到第k帧的位置
  3. 经过本节优化过程,我们可以在mesh投影到 k 帧RGB图后,利用优化所得的匹配关系,将mesh投影的位置修改为更加精确的RGB位置,就可以获得更加精确的颜色信息,从而能将纹理更完整地重建出来
    配关系**
  4. 之前5.1节中,第k帧对应的纹理块集合 M k \mathcal{M}_{k} Mk ,以及每一纹理块 T k ′ T_k' Tk的节点点是来自于mesh网格中的节点投影到第k帧的位置
  5. 经过本节优化过程,我们可以在mesh投影到 k 帧RGB图后,利用优化所得的匹配关系,将mesh投影的位置修改为更加精确的RGB位置,就可以获得更加精确的颜色信息,从而能将纹理更完整地重建出来
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值