文章目录
一、前言
传统方法进行点云分割也有很好的效果,这篇博客是本系列的第二篇,介绍的是发表于2014年CVPR上的LCCP算法,LCCP原文 。VCCS是使用LCCP进行分割前的预处理工作,该方法的介绍可以看上一篇博客,LCCP的效果如下,
二、LCCP论文阅读
2.1 摘要部分
本文提出了一种高效的,无需学习的点云分割方法,避免了对数据集的需求。算法首先利用VCCS获得supervoxel的邻接图,然后判断邻接图的每条边是凸边还是凹边。以这种方式,邻接图被分成了一系列的可以用来代表物体的局部凸连接子图。除此以外,本文还提出了depth dependent voxel grid(DDVG)来解决点云密度随距离降低的问题。下面是LCCP算法的流程图:
2.2 方法部分
LCCP的灵感来自于心理物理学(以科学的方法研究刺激与感觉的关系)中的一个观点,人具有将物体分解成不同部分的能力,与对3D凹凸性的判断是密不可分的。
2.2.1 Building the Surface-Patch Adjacency Graph
本文使用了该实验室在2013年CVPR发表的工作VCCS来将点云数据聚类成一系列的patches,这被他们称作supervoxel,VCCS的核心算法是一个考虑了连通性和流动性的k-means,最后的结果是输出一些独立的超体素 p i ⃗ = ( x i ⃗ , n i ⃗ , N i ) \vec{p_i}=(\vec{x_i}, \vec{n_i}, N_i) pi=(xi,ni,Ni) , x i ⃗ \vec{x_i} xi是超体素的质心, n i ⃗ \vec{n_i} ni是法向, N i N_i Ni是一个集合,包含了当前超体素的邻接边信息。
但文中所说,LCCP对VCCS进行了一些优化:1)使用邻接图来判断计算法线所用的近邻点,而不是简单的radius-search;2)使用了一种新的法线计算方法[1]。目的是为了锐利边缘处的法线能更准确
如何准确高效的计算锐利边缘的法线,是一直困扰我的问题,这篇论文里的效果图看起来很好,有时间再学习一下
2.2.2 Locally Convex Connected Patches(LCCP)
这部分是本文的核心,目的是判断两个邻接体素的连接 e = ( p i ⃗ , p j ⃗ ) e=(\vec{p_i},\vec{p_j}) e=(pi,pj)是凸的还是凹的,凸的认为是有效,而凹的视为无效(再看看,思考下这种想法的合理性),判断基于两个准测——Extended Convexity Criterion(CC)和Sanity criterion(SC)。
2.2.2.1 Extended Convexity Criterion(EC)
CC利用两个超体素的质心连线与法线来判断二者的凹凸关系 ,前提是法线的指向得是正确的,论文中法线要指向相机,如果法线反向或者不连续,这个准则将不再适用。
定义质心连线
d
⃗
=
x
1
⃗
−
x
2
⃗
\vec{d}=\vec{x_1}-\vec{x_2}
d=x1−x2,
α
1
\alpha_1
α1和
α
2
\alpha_2
α2分别是两条法线与质心连线的夹角,可以观察到对于凸连接
α
1
<
α
2
\alpha_1<\alpha_2
α1<α2,即
(
n
1
⃗
−
n
2
⃗
)
⋅
d
>
0
(\vec{n_1}-\vec{n_2})\cdot d>0
(n1−n2)⋅d>0,凹连接
α
1
>
α
2
\alpha_1>\alpha_2
α1>α2。并且不需要担心二者的顺序,计算是可交换的。
在平坦区域,理想情况下
β
=
∣
α
1
−
α
2
∣
=
0
\beta=|\alpha_1-\alpha_2|=0
β=∣α1−α2∣=0,但是因为噪声存法线往往存在误差,导致
β
\beta
β在零点附近不是很稳定,所以在此处作者引入了
β
T
h
r
e
s
h
\beta_{Thresh}
βThresh(Concavity tolerance threshold)来提升
β
\beta
β在零点附近的稳定性。平坦区域理应不做划分,所以对于
β
<
β
t
h
r
e
s
h
\beta<\beta_{thresh}
β<βthresh部分很自然归类为有效的凸类,基础版本
C
C
b
CC_b
CCb如下:
C
C
b
(
p
i
⃗
,
p
j
⃗
)
=
{
true
if
(
n
1
⃗
−
n
2
⃗
)
⋅
d
⃗
>
0
or
(
β
<
β
thresh
)
false
otherwise
CC_b(\vec{p_i}, \vec{p_j}) = \begin{cases} \text{true} & \text{if } (\vec{n_1} - \vec{n_2}) \cdot \vec{d} > 0 \text{ or } (\beta < \beta_{\text{thresh}}) \\ \text{false} & \text{otherwise} \end{cases}
CCb(pi,pj)={truefalseif (n1−n2)⋅d>0 or (β<βthresh)otherwise
但这样处理会使得小幅度凹面容易被忽略掉,所以作者使用更强的凸性判断标准,找到
p
i
⃗
\vec{p_i}
pi和
p
j
⃗
\vec{p_j}
pj的共同邻居
p
c
⃗
\vec{p_c}
pc,需要
C
C
b
(
p
i
⃗
,
p
c
⃗
)
CC_b(\vec{p_i},\vec{p_c})
CCb(pi,pc)和
C
C
b
(
p
j
⃗
,
p
c
⃗
)
CC_b(\vec{p_j},\vec{p_c})
CCb(pj,pc)均为true,才会最终确定
e
=
(
p
i
⃗
,
p
j
⃗
)
e=(\vec{p_i},\vec{p_j})
e=(pi,pj)为凸连接。完整的凸性判断准则
C
C
e
CC_e
CCe如下:
C
C
e
(
p
i
⃗
,
p
j
⃗
)
=
C
C
b
(
p
i
⃗
,
p
j
⃗
)
∧
C
C
b
(
p
i
⃗
,
p
c
⃗
)
∧
C
C
b
(
p
j
⃗
,
p
c
⃗
)
CC_e(\vec{p_i}, \vec{p_j}) = CC_{b}(\vec{p_i}, \vec{p_j}) \land CC_{b}(\vec{p_i}, \vec{p_c}) \land CC_{b}(\vec{p_j}, \vec{p_c})
CCe(pi,pj)=CCb(pi,pj)∧CCb(pi,pc)∧CCb(pj,pc)
2.2.2.2 Sanity criterion(SC)
对于一些奇异位置,判断他们连接是凹还是凸是没有意义的,这种位置经常会出现,如下箭头所指位置:
在这种情况下,两个patch的相对关系可能会呈现右边左下子图的样子,因此需要分辨这种情况,视为无效连接。
文中定义了
v
(
p
1
⃗
,
p
2
⃗
)
=
m
i
n
(
∠
(
d
⃗
,
s
⃗
)
,
180
°
−
∠
(
d
⃗
,
s
⃗
)
)
\mathcal{v}(\vec{p_1},\vec{p_2})=min(\angle (\vec{d},\vec{s}),180\degree-\angle(\vec{d},\vec{s}))
v(p1,p2)=min(∠(d,s),180°−∠(d,s)),其中
s
⃗
=
n
1
⃗
×
n
2
⃗
\vec{s}=\vec{n_1}\times\vec{n_2}
s=n1×n2,上图中按箭头方向
v
\mathcal{v}
v逐渐减小。可以看到当
v
\mathcal{v}
v比较小的时候,连接是无效的,所以引入
v
T
h
r
e
s
h
\mathcal{v}_{Thresh}
vThresh,当
v
<
v
T
h
r
e
s
h
\mathcal{v}<\mathcal{v_{Thresh}}
v<vThresh时,连接无效。
v
T
h
r
e
s
h
v_{Thresh}
vThresh是一个以
β
\beta
β(两个法向量夹角)为自变量的sigmoid函数——一个柔和的阶跃函数
这个地方也是为了考虑噪声的影响,如果相差法线相差较小,就放宽限制。(还需要注意对
β
=
0
\beta=0
β=0时的特殊处理,但这地方总觉得怪怪的。。。。)
最后一个连接是否有效,要由这两个准则同时判断:
c
o
n
v
(
p
i
⃗
,
p
j
⃗
)
=
C
C
e
(
p
i
⃗
,
p
j
⃗
)
∧
S
C
(
p
i
⃗
,
p
j
⃗
)
conv(\vec{p_i}, \vec{p_j}) = CC_{e}(\vec{p_i}, \vec{p_j}) \land SC(\vec{p_i}, \vec{p_j})
conv(pi,pj)=CCe(pi,pj)∧SC(pi,pj)
判断完每条边的属性之后,沿凸边使用区域生长法。接着对于区域生长法生成的每个聚类,检查其中包含的超体素个数,如果个数小于
n
f
i
l
t
e
r
n_{filter}
nfilter,就把他合并到相邻的最大聚类中,文中
n
f
i
l
t
e
r
n_{filter}
nfilter使用的是3。
2.2.3 Depth Dependent Voxel Grid(DDVG)
这一部分作者提出了一个可以应用于所有RGB-D应用中的小技巧,随着距离的增加,点云密度会不断减小并且误差也会以距离的二次方增加。这个问题也严重影响了VCCS的效果,这在上一篇博客的最后可以明显的看到。
文中对原始点云
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)做如下变换:
x
′
=
x
/
z
,
y
′
=
y
/
z
,
z
′
=
l
o
g
(
z
)
x'=x/z,y'=y/z,z'=log(z)
x′=x/z,y′=y/z,z′=log(z)
这步变换会使得变换后的点云在x-y平面上分布是均匀的,并且z轴也被压缩,这样点的密度就不会像变换前那样随深度增加而降低的那么剧烈。
并且这个变换有个很好的性质,即:
∂
x
′
∂
x
=
∂
y
′
∂
y
=
∂
z
′
∂
z
=
1
z
\frac{\partial x'}{\partial x}=\frac{\partial y'}{\partial y}=\frac{\partial z'}{\partial z}=\frac{1}{z}
∂x∂x′=∂y∂y′=∂z∂z′=z1
也就是说在各个方向被相同的拉伸了,这可以保证原来的体素还会以。。。。。。。。。。这个变换对于VCCS的效果提升是显著的,如下图所示
三、实际效果与调参建议
四、参考文献
[1]Boulch A, Marlet R. Fast and robust normal estimation for point clouds with sharp features[C]//Computer graphics forum. Oxford, UK: Blackwell Publishing Ltd, 2012, 31(5): 1765-1774.