PointCore: Efficient Unsupervised Point Cloud
Anomaly Detector Using Local-Global Features
1、Background
当前的点云异常检测器可以分为两类:
(1)基于重建的方法,通过自动编码器重建输入点云数据,并通过比较原始数据和重建数据之间的偏差来识别异常。然而,这些方法对点云的分辨率敏感,导致推理速度慢和精度差。
(2)基于记忆库的方法,记忆库有助于存储代表性特征,隐式构建正常分布并寻找分布外的缺陷。与前者相比,直接使用预训练的特征提取器构建记忆库具有训练速度快且不受点云分辨率影响的优点。此外,现有的点云异常检测器通常采用多个特征记忆库来充分保留局部和全局表示,这导致了计算复杂度高和特征不匹配的问题。
为了解决上述问题,提出了一个基于联合局部-全局特征的无监督点云异常检测框架,称为PointCore。具体来说,总结如下:
(1)PointCore只需要一个记忆库来存储局部-全局表示,并为这些局部-全局特征分配不同的优先级,以减少推理过程中的计算成本和不匹配干扰。
(2)提出了一种基于排名的归一化方法,以消除各种异常分数之间的分布差异,并应用点对平面迭代最近点(point-plane ICP)算法对点云注册结果进行局部优化,以实现稳健的决策。
2、Method
PointCore 算法流程:
- 全局注册 :
将所有点云数据统一到一个共同的坐标系统中。
- 选择参考点云:首先选择一个点云作为参考,其他点云将与它进行对比。
- 计算旋转和平移:使用算法(如迭代最近点算法或特征匹配算法)计算出其他点云相对于参考点云的旋转矩阵和平移向量。
- 应用变换:将这些变换应用到其他点云上,使它们在空间中的位置和方向与参考点云一致。
- 局部优化 :
在全局注册的基础上进行,它对点云进行更精细的调整
,确保点云的局部特征能够精确对齐。- 选择局部特征点:在点云中选择一些具有明显特征的点,如角点、边缘点等。
- 计算局部变换:计算这些特征点之间的距离和方向,确定需要进行的微小旋转和平移,以使它们更好地对齐。
- 迭代优化:通过迭代过程不断调整这些局部特征点的位置,直到达到预定的精度。
- 特征提取
- 使用预训练的PointMAE(点自编码器)特征提取器,从点云中提取PointMAE特征。
- 构建记忆库
- 将点云的坐标和提取的PointMAE特征结合起来,形成记忆库。这个记忆库用来存储正常点云的特征,以便后续比较。
- 推理模块
- 当有新的点云数据需要检测时,我们同样提取这些点云的坐标和PointMAE特征。
- 然后,计算新点云中每个点与记忆库中存储的正常点云特征之间的差异。
- 计算异常分数:通过比较新点云与记忆库中的特征差异,计算每个点的异常分数。这个分数表示该点与正常点云的差异程度。
- 定位异常区域:根据计算出的异常分数,我们可以确定新点云中哪些区域可能是异常的。
pseudo-code
python
# 定义全局和局部注册函数
function register_point_clouds(point_clouds):
for each point_cloud in point_clouds:
global_registration(point_cloud)
local_optimization(point_cloud)
return registered_point_clouds
# 全局注册
function global_registration(point_cloud):
# 使用FPFH特征描述符和RANSAC算法进行全局注册
return transformed_point_cloud
# 局部优化
function local_optimization(point_cloud):
# 使用点-平面ICP算法进行局部优化
return optimized_point_cloud
# 定义特征提取函数
function extract_features(registered_point_clouds):
features = []
for point_cloud in registered_point_clouds:
coordinates = sample_coordinates(point_cloud)
pointMAE_features = pointMAE_extractor(coordinates)
features.append((coordinates, pointMAE_features))
return features
# 坐标采样
function sample_coordinates(point_cloud):
# 使用贪婪算法对点云进行下采样
return sampled_coordinates
# 使用PointMAE提取特征
function pointMAE_extractor(coordinates):
# 使用预训练的PointMAE模型提取特征
return extracted_features
# 定义推理和异常分数计算函数
function compute_anomaly_scores(features, test_point_cloud):
memory_bank = construct_memory_bank(features)
anomaly_scores = []
for point in test_point_cloud:
score = calculate_anomaly_score(memory_bank, point)
anomaly_scores.append(score)
return anomaly_scores
# 构建记忆库
function construct_memory_bank(features):
# 将坐标和PointMAE特征结合,形成记忆库
return memory_bank
# 计算异常分数
function calculate_anomaly_score(memory_bank, test_point):
# 使用记忆库中的数据计算测试点的异常分数
return anomaly_score
# 主流程
function main(train_point_clouds, test_point_cloud):
registered_train = register_point_clouds(train_point_clouds)
features = extract_features(registered_train)
memory_bank = construct_memory_bank(features)
anomaly_scores = compute_anomaly_scores(features, test_point_cloud)
return anomaly_scores
3、Experiments
🐂🐎。。。
4、Conclusion
提出了 基于单个记忆库的局部-全局特征来存储输入点云的多尺度信息
的无监督点云异常检测器 PointCore