Chamfer Distance
倒角距离用于衡量点集、3D 表面或物体边界的匹配程度,可用于重建、分割和模型训练。
倒角距离用于衡量两组点的匹配程度,其计算依据是每个点与另一组中最近邻点之间的距离。值越低,表示匹配程度越高。在计算机视觉中,它用于比较 3D 点云(由采样空间坐标组成的集合)和 2D 物体边界。点的顺序无关紧要,而且两组点的数量可以不同。
倒角距离源自 倒角匹配,由 H. G. Barrow、J. M. Tenenbaum、R. C. Bolles 和 H. C. Wolf 于 1977 年提出,用于匹配由图像曲线表示的形状。在机械 CAD 中,倒角是带斜面的边,其尺寸描述了一个实体特征。
倒角距离的计算方法#
对于两个非空点集 A 和 B,常见的平方距离定义包含三个步骤:
- 对 A 中的每个点,找出它在 B 中的最近邻,计算欧氏距离的平方,并对这些值取平均。
- 再从 B 到 A 重复上述步骤。
- 将两个方向的平均值相加。
第一个方向会惩罚远离参考表面的预测点;反向计算则会惩罚预测结果中缺失的参考区域。这与近邻所用的最近邻操作相同,只是每次查询取一个邻居。PyTorch3D 的倒角距离实现支持双向和单向计算。
平方距离与非平方距离、求和与求平均等不同处理方式都会改变分数。另一种常见约定是对两个方向的均值取平均,因此结果是两者之和的一半。因此,距离约定、坐标单位和归一化都是实验中指标定义的一部分。
此 PyTorch 计算使用 torch.cdist 来计算成对欧氏距离:
import torch
a = torch.tensor([[0.0, 0.0], [2.0, 0.0]])
b = torch.tensor([[0.0, 0.0], [3.0, 0.0]])
# Reduce squared distances in each nearest-neighbor direction.
distances = torch.cdist(a, b, p=2)
squared_distances = distances.square()
a_to_b = squared_distances.min(dim=1).values.mean()
b_to_a = squared_distances.min(dim=0).values.mean()
chamfer = a_to_b + b_to_a
print(f"Squared Chamfer distance: {chamfer.item():.2f}")输出为 1.00:每个方向的平均值为 0.50。相同的点集会得到零。
模型训练中的倒角损失#
倒角损失是指用作损失函数的倒角距离。神经网络会预测点坐标,而反向传播会提供梯度,使这些点向参考点移动。最近邻选择使目标函数分段可微:在对应关系保持不变的区域内,平方距离会提供坐标梯度。
一项基础应用是 Haoqiang Fan、Hao Su 和 Leonidas J. Guibas 提出的点集生成网络 (PSGN),该研究发表于 CVPR 2017。该方法将倒角距离用作单张图像 3D 重建的训练目标,根据照片预测物体的点云。这种点集目标无需预先定义点对点对应关系,也能支持模型学习。
重建和分割中的应用#
在 3D 重建中,倒角距离用于比较采样得到的预测表面与参考几何形状。它也可用于网格拟合:通过优化顶点,使网格采样点接近目标采样点。在球体到海豚的网格拟合中,仅优化倒角损失会产生不均匀的表面;边、法线和拉普拉斯正则化则会约束网格的局部结构。
对于实例分割,倒角距离用于衡量采样得到的预测轮廓与标注轮廓之间的空间差异。Ultralytics YOLO26 分割模型通过 Masks.xy 提供多边形坐标,可生成点集,用于外部的基于倒角距离的边界评估。与基于面积的交并比不同,轮廓距离表示边界之间相隔多远。
相关度量与分数解读#
以下三个相关概念有助于理解分数所反映的内容:
- 豪斯多夫距离使用最大的最近邻差异,重点关注最严重的边界或表面不匹配。
- 推土机距离会在分布之间寻找成本最低且保持质量的传输方式,并在点集之间建立匹配关系。
- 密度感知倒角距离用于处理局部采样不均匀的问题。普通倒角匹配允许多个点共享同一个最近邻,因此即使采样均匀性很差,密集簇仍可能得到较小的误差。
因此,采样密度、对齐方式和数据预处理都会影响比较结果。非平方距离的单位与坐标相同;平方距离的单位则是坐标单位的平方。将两个点云的单位从米换算为厘米,会使非平方倒角距离扩大 100 倍,使平方倒角距离扩大 10,000 倍。










