1. 点云缺陷检测
三维点云异常检测旨在从训练集中检测异常数据点,常用的点云异常检测方法通常采用多个特征记忆库来完全保留局部和全局表示,这种要考虑高昂的计算复杂度和特征间的不匹配问题。
2.实现方法
当前的异常检测方法大多是无监督的,主要针对二维图像,其模型通常在具有成熟架构的图像上进行训练。与二维图像相比,三维点云具有更丰富的结构信息,但也存在无序、高度稀疏和不规则分布的问题。
Real3D-AD
Real3D-AD一个大规模、高分辨率的三维异常检测数据集Real3D-AD被提出。该数据集中的对象具有0.001mm-0.0015mm的分辨率、360度覆盖范围和完美的原型。Real3D-AD将图像异常检测中的PatchCore应用于点云异常检测,并开发了一种通用的基于配准的点云异常检测器Reg3D-AD。Reg3D-AD采用双特征表示方法来保留训练原型的局部和全局特征,虽然检测精度显著,但推理速度较慢。当前的点云异常检测器主要分为两类:
(1)基于重建的方法,通过自动编码器重建输入点云数据,并通过比较原始数据和重建数据之间的偏差来识别异常。然而,这些方法对分辨率敏感,导致推理速度较慢且精度较低。
(2)基于记忆库的方法,其中记忆库用于存储代表性特征,以隐式构建正态分布并寻找分布外的缺陷。与前者相比,直接使用预训练的特征提取器构建记忆库具有训练速度快且不受点云分辨率影响的优点。
(3)现有的点云异常检测器通常采用多个特征记忆库来完全保留局部和全局表示,这会带来高昂的计算复杂度和特征间的不匹配问题。
3. PointCore
为优化当前点云异常检测算法存在的问题,如计算复杂、特征不匹配等,可参考PointCore框架对算法进行改进和升级。
3.1全局和局部配准
使用FPFH特征描述符和随机抽样一致性(RANSAC)算法来实现点云的全局配准。为了增强点云配准的稳定性,引入了点到平面ICP算法来对全局配准的输出进行局部优化。假设需要配准的两个点云分别为XsX_sXs(源点云)和XtX_tXt(目标点云),配准过程如下:
- 应用从全局配准获得的旋转矩阵和平移向量来变换XsX_sXs。
- 在XtX_tXt中搜索与XsX_sXs中的pip_ipi最接近的qiq_iqi,其中qiq_iqi的法向量表示为nin_ini。
- 假设最优旋转欧拉角α\alphaα、β\betaβ、γ\gammaγ接近0,则cos(θ)→1\cos(\theta)\to1cos(θ)→1,sin(θ)→0\sin(\theta)\to0sin(θ)→0,θ→0\theta\to0θ→0。旋转矩阵RRR可以近似表示为:R≈[1−γβγ1−α−βα1]R\approx\begin{bmatrix}1&-\gamma&\beta\\\gamma&1&-\alpha\\-\beta&\alpha&1\end{bmatrix}R≈1γ−β−γ1αβ−α1
- 假设最优平移向量为t=[tx,ty,tz]t = [t_x, t_y, t_z]t=[tx,ty,tz]。损失函数通过Moore-Penrose逆表示为最小二乘问题:E(R,t)=∑i=1n((Rpi+t−qi)Tni)2E(R,t)=\sum_{i = 1}^{n}((Rp_i + t - q_i)^Tn_i)^2E(R,t)=i=1∑n((Rpi+t−qi)Tni)2
- 应用计算得到的旋转矩阵和平移向量来变换XsX_sXs,并重复,直到损失值低于预定义的阈值。注意,用于配准的目标点云(X_t)是固定的。
3.2记忆库构建
- 坐标采样:采用贪婪下采样算法对输入点云进行采样。给定输入点云(X)和点集CaC_aCa,α\alphaα是CaC_aCa中的点数。我们的目标是从CaC_aCa中获得SmaxS_{max}Smax个均匀分布的点。具体步骤如下:
- 从CaC_aCa中随机选择SinitS_{init}Sinit个点,构建初始点集Pinit={P1,P2,P3,⋯ ,PSinit}P_{init} = \{P_1, P_2, P_3, \cdots, P_{S_{init}}\}Pinit={P1,P2,P3,⋯,PSinit}。
- 计算CaC_aCa与PinitP_{init}Pinit之间的距离,得到维度为a×Sinita\times S_{init}a×Sinit的矩阵d2dd_{2d}d2d:d2d=[d11⋯d1Smax⋮⋱⋮da1⋯daSmin]d_{2d}=\begin{bmatrix}d_{11}&\cdots&d_{1S_{max}}\\\vdots&\ddots&\vdots\\d_{a1}&\cdots&d_{aS_{min}}\end{bmatrix}d2d=d11⋮da1⋯⋱⋯d1Smax⋮daSmin。
- 计算矩阵d2dd_{2d}d2d每行的平均值,得到d1d=[d1mean,d2mean,⋯ ,damean]d_{1d} = [d_{1_{mean}}, d_{2_{mean}}, \cdots, d_{a_{mean}}]d1d=[d1mean,d2mean,⋯,damean]。
- 找到矩阵(d_{1d})中的最大值,并将对应的点添加到(P_{init})中。重复步骤2-4,直到(P_{init})中的元素数量等于(S_{max})。
- 点特征插值:使用在ShapeNet数据集上预训练的点变换器(PointMAE)作为3D特征提取器。对于每个点云,使用坐标采样阶段的坐标作为分组的中心点。每个中心点形成一个记忆元素,该元素与坐标和PointMAE特征绑定。这些元素构成了图2中的记忆库。为了降低推理时PointMAE特征计算的复杂度,需要对记忆库中的点云坐标进行下采样。因此,进一步执行点特征插值,为记忆库中的每个坐标分配一个PointMAE特征值。特征插值方法如下图所示:
给定一个包含所有中心点坐标的点集PcentralP_{central}Pcentral,相应的PointMAE特征集为MinitM_{init}Minit。以一个非中心点PeP_ePe为例,使用k近邻算法在点集PcentralP_{central}Pcentral中找到三个最近邻[Pk1,Pk2,Pk3][P_{k1}, P_{k2}, P_{k3}][Pk1,Pk2,Pk3],相应的欧几里得距离和PointMAE特征值分别为[Dk1,Dk2,Dk3][D_{k1}, D_{k2}, D_{k3}][Dk1,Dk2,Dk3]和[Mk1,Mk2,Mk3][M_{k1}, M_{k2}, M_{k3}][Mk1,Mk2,Mk3]。得到PeP_ePe的PointMAE特征MeM_eMe。重复此过程,直到所有非中心点都获得相应的PointMAE特征。MeM_eMe的计算方法为:Me=Dk1Dk2Mk3+Dk1Dk3Mk2+Dk2Dk3Mk1Dk1Dk2+Dk1Dk3+Dk2Dk3M_e=\frac{D_{k1}D_{k2}M_{k3}+D_{k1}D_{k3}M_{k2}+D_{k2}D_{k3}M_{k1}}{D_{k1}D_{k2}+D_{k1}D_{k3}+D_{k2}D_{k3}}Me=Dk1Dk2+Dk1Dk3+Dk2Dk3Dk1Dk2Mk3+Dk1Dk3Mk2+Dk2Dk3Mk1
3.3推理模块
- 多特征异常分数计算:记忆库由元素集组成,即:
Mtrain={(M1c,M1p),(M2c,M2p),⋯ ,(Mnc,Mnp)}M_{train}=\{(M_{1_c}, M_{1_p}), (M_{2_c}, M_{2_p}), \cdots, (M_{n_c}, M_{n_p})\}Mtrain={(M1c,M1p),(M2c,M2p),⋯,(Mnc,Mnp)},其中MicM_{i_c}Mic表示第(i)个点的坐标,MipM_{i_p}Mip表示第iii个点的PointMAE特征。测试特征库定义为:
Ftest={(F1c,F1p),(F2c,F2p),⋯ ,(Fmc,Fmp)}F_{test}=\{(F_{1_c}, F_{1_p}), (F_{2_c}, F_{2_p}), \cdots, (F_{m_c}, F_{m_p})\}Ftest={(F1c,F1p),(F2c,F2p),⋯,(Fmc,Fmp)}
其中FjcF_{j_c}Fjc是第jjj个点的坐标,FjpF_{j_p}Fjp是第jjj个点的PointMAE特征。对于FtestF_{test}Ftest中的元素(Fjc,Fjp)(F_{j_c}, F_{j_p})(Fjc,Fjp),我们使用其坐标信息FjcF_{j_c}Fjc在MtrainM_{train}Mtrain中找到三个最近邻,表示为(Mic,Mip)(M_{i_c}, M_{i_p})(Mic,Mip)、(Moc,Mop)(M_{o_c}, M_{o_p})(Moc,Mop)、(Muc,Mup)(M_{u_c}, M_{u_p})(Muc,Mup)。使用欧几里得距离,得到它们的坐标距离{DC1,DC2,DC3}\{DC_1, DC_2, DC_3\}{DC1,DC2,DC3}和特征距离{DP1,DP2,DP3}\{DP_1, DP_2, DP_3\}{DP1,DP2,DP3}。最终的坐标异常分数为Sc=mean{DC1,DC2,DC3}S_c = mean\{DC_1, DC_2, DC_3\}Sc=mean{DC1,DC2,DC3},PointMAE异常分数为:
Sp=min{DP1,DP2,DP3}S_p = min\{DP_1, DP_2, DP_3\}Sp=min{DP1,DP2,DP3} - 排序模块:由于两种异常分数在尺度和分布上存在差异,因此需要对它们进行归一化。传统的归一化通常采用区间缩放方法。对于一组数据SlistS_{list}Slist,区间缩放过程为:
Snorm=Slist−min(Slist)max(Slist)−min(Slist)S_{norm}=\frac{S_{list}-min(S_{list})}{max(S_{list})-min(S_{list})}Snorm=max(Slist)−min(Slist)Slist−min(Slist)
区间缩放方法将消除两种异常分数之间的尺度差异,但无法解决分布差异。当坐标异常分数有两个异常值时,最终的异常分数将远小于PointMAE异常分数。这对基于算术运算的集成策略有重大影响。为了解决这个问题,设计了一种基于排序的归一化方法,其中Sortrank(Slist)Sort_rank(S_{list})Sortrank(Slist)获得SlistS_{list}Slist中每个值的排名,len(Slist)len(S_{list})len(Slist)是SlistS_{list}Slist的长度。即:
Snorm=Sortrank(Slist)len(Slist)S_{norm}=\frac{Sort_rank(S_{list})}{len(S_{list})}Snorm=len(Slist)Sortrank(Slist)