1、整体方法
利用参数可微模版,与众不同地定义了长方体。将其定义为有8个参数的“棍子”
用三视图方法代替点云描述三维形状
2、实现细节
A. 通过算法获取SDF
Cuboids 𝑩, Three-view details 𝑫, Resolution R, in(p, d): whether point p is inside polygon of detail d, dis(p, d): the distance from point p to polygon of detail d.
SDF 𝑽
𝑽 ← the volumes of SDF with resolution R
for volume v in 𝑽 do
p ← v.coordinate
i ← the index such that p is inside 𝑩[i]
if i is not exist then
v.value ← 1
else
p ← MB[i]−1p
px,py,pz ← projection p to yz, xz, xy plane
flag ← in(px, 𝑫[i]x) and in(py, 𝑫[i]y) and in(pz, 𝑫[i]z)
dis ← min(dis(px, 𝑫[i]x), dis(py, 𝑫[i]y), dis(pz, 𝑫[i]z))
v.value ← −dis if flag else dis
end if
end for
- 需求:首先定义了表示整个物体的长方体集合
B
,三视图细节集合D
,分辨率R
:其中in(p,d)
表示当前点是否在多边形细节d
内,dis(p,d)
则代表点p
与多边形细节d
之间的欧氏距离。 - 计算:定义
SDF
值为V
V
代表对应分辨率的体素R
的SDF
值 - 遍历对应分辨率体素V中的体素点v
p
为v
的坐标i
为某个 当P
在B[i]
中的索引- 若
i
不存在 则 对应点sdf
值为1 - 若
i
存在 p
代表第i
个长方体的逆变换矩阵乘p
将点坐标系转换为三视图坐标系- 将三个维度的分量
px,py,pz
投影到yz,xz,xy
平面 flag
判断 点p
的三个分量 是否均在三个平面内部dis
为三个分量到三视图平面的最短距离若
flag
为true
则在part
内,sdf
值为-dis
,否则点在part
外sdf
值为正 即可求得点在此部分中的sdf
值B. 形状参数化
1) 可微分的计算图模版
针对第$i$个长方体的参数化表示$b_i$如下所示:$b_i = c_i + r_i \textcolor{red}{a_{i1}} + s_{i1} K_{j1k1} e_1 + s_{i2} \left( \textcolor{red}{a_{i2}} K_{j2k2} + (1 - \textcolor{red}{a_{i2}}) K_{j3k3} \right)e_2$
其中每一部分记为1⃝2⃝3⃝4⃝
其中$\textcolor{red}{K_{jk}}$ 指的是第$j$个长方体的第$k$个关键点(其中定义了26个关键点,包括6个面的中心,8个顶点和12条边的中心点)其中$a_{i1}, a_{i2} \in [0,1]$, $c_i, r_i \in \mathbb{R}$, $s_{i1}, s_{i2} \in \{-1,0,1\}$, $j_1, j_2, j_3 \leq i$, $K_{j_k}$ $e1,e2$表示x,y,z三轴上的单位向量$[1,0,0]^T,[0,1,0]^T,[0,0,1]^T$
1⃝代表一个固定的偏移量
2⃝代表被一个参数控制的偏移量
3⃝代表$b_i$与第$j$个长方体有关
4⃝代表$b_i$与两个关键点之间的连线有关
仅有$a_{i1},a_{i2}$是参数,其他变量都定义在模版配置文件中。某一类物体的参数是固定的。当$b_i==1$时,整个方程是可微的
若要计算$K_{jk}$ 遵循以下的流程:
1)计算第$J$个长方体的变换矩阵M
2)找到单位长方体上的第k个关键点坐标$p_k$
3)应用变换矩阵得到$K_{jk}=M_jp_k$
配置与表达式参数关系如下所示
Code | ci | ri | si1 | j1 | k1 | e1 | si2 | j2 | k2 | j3 | k3 | e2 | Npara |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
const: 0.5 | 0.5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
range: [-1,0,1] | -1 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
relate: -C.k4.x | 0 | 0 | -1 | #C | 4 | x | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
range: [-1,0,1] const: 0.5 | -0.5 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
range: [-1,0,1] relate: B.k9.y | -1 | 2 | 1 | #B | 9 | y | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
line: p1:D.k2,p2:E.k6 relate:line.z | 0 | 0 | 0 | 0 | 0 | 0 | 1 | #D | 2 | #E | 6 | z | 1 |
2) 模版配置:
由如上图Fig.3模版语言表示 包括两个长方体之间的各种联系
C. 模版自动配置流程
1) 将长方体由长方体参数转换为前文所讲的”stick”参数
1) 找到长方体最长的轴
2) 找到上述长方体的两个控制点
2) 检查每一个长方体是否轴对称
1) 将长方体标准化到坐标轴中心
2) 对YZ XZ XY平面做翻转
3) 计算翻转后的长方体与原始长方体的距离
4) 若此距离低于某个设定好的阈值,则此长方体是对称的
5) 用图3中的关系3来表示这种关系
3) 检查每个长方体是否与其他长方体轴对称,与自轴对称检查方法类似
4) 寻找每个长方体之间的交点
1) 取长方体的一个控制点
2) 计算控制点和其他所有长方体关键点的距离
3) 找到距离最小的关键点
4) 如果两点之间距离小于一定的阈值,则认为两个长方体之间有连接关系
5) 用图3中的关系1来表示这种关系
每个长方体会根据PartNet数据集中语义层级关系进行标注。
D. 点云重建细节
编码器使用PointNet++ 解码器使用简单MLP结构 输出1024维的特征
解码器层特征数量分别为1024 512 256 以及$N_a(参数数量)$通过MSEloss计算预测的参数与真实值之间的差距
1) 根据输入点云重建结构
1) 利用重建网络预测长方体参数
2) 通过可微模版生成表示结构的长方体
2) 重建立方体内部细节
1) 根据每个立方体的位置分割原始点云
2) 将分割好的点云标准化到单位立方体中
3) 将点云投影到三视图平面
4) 对2D投影做Alpha Shape算法 计算其广义凸包 即形状边界
5) 讲这些边界存储当做立方体的细节
3) 利用最开始提到的算法A来重建mesh网格
E. 生成细节
1) 结构生成:
1) 文章使用VAE作为backbone,利用简单的MLP作为生成手段。编码器输入为原始的形状参数,输出则为预测的有32个通道的高斯分布均值µ以及方差σ 。编码器MLP每层的通道数为$N_{para}$,512,256,128,128,128,32。解码器则为32,128.256,256,256,$N_{para}$.其中$N_{para}$为待预测的参数长度。
2) 和标准VAE思路相同,进行生成任务时,我们从标准高斯分布中sample出$C_{norm}$并且通过公式$C_{real}= σ*C_{norm} + µ$作为判别器的输入,判别器用于评估输入真实性的概率。loss也和标准VAE的思路相同包括:
1) 参数重建的MSE loss
2) 隐含特征与标准高斯分布的KL散度loss
2) 细节生成:
1) 文章对每个cuboid的边界生成了分辨率为128×128的二进制图像,在细节内部为1 细节外部为0。
2) 同样使用了VAE对边界特征图做生成工作,其中编码器每层通道数为128 × 128, 1024,1024,512,256,256,128 解码器则为128,256,256,512,1024,1024,128 × 128,重建损失与结构生成中VAE类似
3) 整体生成完整流程为:
1) 生成一个长方体的参数
2) 根据参数生成对应的长方体
3) 生成长方体的细节
1) 为长方体生成三视图
2) 找到生成的图片的边界并将其作为三视图绘制细节
3) 如果该长方体与某个长方体对称,则不需要生成,将对应长方体三视图翻转即可
4) 用最开始提到的算法A来重建mesh网络
我的总结 limitations
- 文章对于一个物体表示需要依赖的参数过多
- 同1的结论,训练依赖大量的标注数据。和作者在自己limitation中写到的一样,可以有更少数据的无监督方案
- 由于参数非常细致,对于结构依赖过于苛刻,甚至将单独的椅子分类都再次分出了5种
- 需要训练多个网络完成整个流程