BEV地图评估尺度:Chamfer距离和Fréchet距离
参考自:VectorMapNet: End-to-end Vectorized HD Map Learning。
参考自:VectorMapNet: End-to-end Vectorized HD Map Learning
数据集
nuScenes 我们在 nuScenes (Caesar et al., 2020) 数据集上进行实验,该数据集包含 1000 个自动驾驶汽车采集的记录序列。每个片段都以 2Hz 的频率进行注释,包含 6 幅摄像头图像和激光雷达扫描图像。数据集设置和预处理步骤可与 HDMapNet (Li et al., 2021) 相同,后者包含来自 nuScenes 数据集的三类地图元素:人行横道、分隔线和道路边界。
Argoverse2 我们进一步在 Argoverse2 (Wilson et al., 2021) 数据集上进行实验。与 nuScenes 一样,它包含 1000 个日志(训练集、验证集和测试集分别为 700、150 和 150)。每个片段提供 15 秒的 20Hz 摄像头图像、10Hz 激光雷达扫描图像和矢量化地图。使用与 nuScenes 数据集相同的预处理设置。
指标
与现有生成栅格化结果的方法相比,我们的方法不需要在网格上栅格化曲线。因此,我们选择不使用交并比 (IoU) 作为指标。我们使用基于距离的指标来评估预测曲线与真实曲线之间的相似性。我们遵循 HDMapNet (Li et al., 2021) 提出的实例级评估指标,将我们模型的实例级检测性能与基线方法进行比较。该指标是平均精度 (AP),其中正/负样本基于几何相似性,更具体地说,是倒角距离 (Chamfer distance) 和 Fr´echet 距离。为清晰起见,我们将基于倒角距离和 Fr´echet 距离的 AP 分别称为倒角 AP 和 Fr´echet AP。
Chamfer距离(Chamfer Distance)和Fréchet距离(Fréchet Distance)是两种常用于评估曲线或多线段相似性的度量方法
1. Chamfer距离
- 定义:Chamfer距离用于量化两个无序点集之间的相似性。其计算公式为:
Dchamfer(S1,S2)=12∣S1∣∑p∈S1minq∈S2∥p−q∥2+12∣S2∣∑q∈S2minp∈S1∥q−p∥2D_{\text{chamfer}}(S_1, S_2) = \frac{1}{2|S_1|}\sum_{p \in S_1} \min_{q \in S_2} \|p - q\|^2 + \frac{1}{2|S_2|}\sum_{q \in S_2} \min_{p \in S_1} \|q - p\|^2Dchamfer(S1,S2)=2∣S1∣1p∈S1∑q∈S2min∥p−q∥2+2∣S2∣1q∈S2∑p∈S1min∥q−p∥2 - 特点:
- 仅考虑点之间的最近邻距离,忽略点的顺序。
- 适用于无序点集(如点云、多线段顶点集)的相似性比较。
- 计算效率较高,常用于3D重建、点云生成等任务中作为损失函数。
Chamfer距离计算(点云相似性)
import numpy as np
from sklearn.neighbors import NearestNeighbors
def chamfer_distance(x, y, metric='l2'):
"""计算两组点云之间的双向Chamfer距离"""
x_nn = NearestNeighbors(n_neighbors=1, algorithm='kd_tree', metric=metric).fit(x)
min_y_to_x = x_nn.kneighbors(y)[0] # y中每个点到x的最近距离
y_nn = NearestNeighbors(n_neighbors=1, algorithm='kd_tree', metric=metric).fit(y)
min_x_to_y = y_nn.kneighbors(x)[0] # x中每个点到y的最近距离
return np.mean(min_y_to_x) + np.mean(min_x_to_y)
# 示例
x = np.random.rand(100, 3) # 点云1 (100个3D点)
y = np.random.rand(100, 3) # 点云2
distance = chamfer_distance(x, y)
print(f"Chamfer距离: {distance:.4f}")
说明:
- 使用
sklearn.neighbors高效计算最近邻距离。 - 适用于3D点云重建、形状匹配等任务。
2. Fréchet距离
- 定义:Fréchet距离同时考虑曲线的空间位置和点的顺序。其离散版本定义为:
δdF(P,Q)=min{∥L∥∣L是P和Q之间的耦合序列}\delta_{dF}(P, Q) = \min \{\|L\| \mid L \text{是}P\text{和}Q\text{之间的耦合序列}\}δdF(P,Q)=min{∥L∥∣L是P和Q之间的耦合序列}
其中,∥L∥\|L\|∥L∥是耦合序列LLL中最长配对的距离。 - 特点:
- 需要保证曲线的顺序一致性(如轨迹、多线段的顶点顺序)。
- 直观理解为“遛狗问题”:主人和狗沿两条路径行走时所需的最短狗绳长度。
- 计算复杂度较高,通常用于需要严格对齐顺序的场景(如地图匹配、自动驾驶中的车道线检测)。
- 输出:
- Fréchet距离输出的是两条曲线的最优匹配下的最大局部距离,核心是寻找两条曲线在所有可能匹配方式中最大局部距离的最小值(即“最短狗绳长度”)
- “最大局部距离”:在两条曲线的匹配过程中,每一步的匹配点对 (pi,qj)(p_i, q_j)(pi,qj) 都有一个距离 d(pi,qj)d(p_i, q_j)d(pi,qj),所有匹配点对中的最大距离即为当前匹配方案的“最大局部距离”。
- “最小值”:通过调整匹配顺序(即参数化函数 α\alphaα 和 β\betaβ),寻找所有可能的匹配方案中最小的那个“最大局部距离”。
Fr´echet 距离。折线顶点的顺序无法通过倒角距离来衡量。因此,我们引入 Fr´echet 距离作为附加度量。Fr´echet 距离是一种曲线相似度度量,它同时考虑了曲线上点的位置和顺序。我们的实现基于离散 Fr´echet 距离 (Eiter & Mannila, 1994; Agarwal et al., 2014)。
我们使用离散版本的 Fr´echet 距离 (Eiter & Mannila, 1994; Agarwal et al., 2014) 来评估两条折线 P 和 Q 之间的几何相似性。我们将 σ§ 表示为 P 的线段端点序列。具体来说,σ(P)=(p1,…,pm)是从原始输入折线P均匀采样的具有m个顶点的序列,其中pi和pi + 1之间的P的每个位置都可以通过使用仿射变换来近似,即pi +λ=(1-λ)pi +λpi + 1,并且我们实验中的m设置为100。
该方程表明,离散Fr´echet距离是所有可能耦合的最小范数。为了找到具有最小范数的耦合似然L,我们使用了基于动态规划的算法,如算法1中所述。
Fréchet距离计算(曲线相似性)
import numpy as np
from scipy.spatial.distance import euclidean
def frechet_distance(p, q):
"""动态规划计算离散Fréchet距离"""
n, m = len(p), len(q)
ca = np.zeros((n, m))
ca[0, 0] = euclidean(p[0], q[0])
for i in range(1, n):
ca[i, 0] = max(ca[i-1, 0], euclidean(p[i], q[0]))
for j in range(1, m):
ca[0, j] = max(ca[0, j-1], euclidean(p[0], q[j]))
for i in range(1, n):
for j in range(1, m):
ca[i, j] = max(min(ca[i-1, j], ca[i-1, j-1], ca[i, j-1]), euclidean(p[i], q[j]))
return ca[-1, -1]
# 示例
p = np.array([(0, 0), (1, 1), (2, 2)]) # 曲线1
q = np.array([(0, 1), (1, 2), (2, 1)]) # 曲线2
distance = frechet_distance(p, q)
print(f"Fréchet距离: {distance:.4f}")
说明:
- 基于动态规划实现,考虑曲线顶点顺序。
- 适用于轨迹匹配、时间序列对齐等场景。
动态规划(Dynamic Programming,简称DP)是一种用于求解最优化问题的数学方法,其核心思想是通过分解问题为相互重叠的子问题,并存储子问题的解以避免重复计算,从而高效地得到全局最优解。
动态规划的核心思想
- 最优子结构:问题的最优解包含其子问题的最优解。例如,最短路径问题中,从A到B的最短路径必然包含路径上任意中间点到B的最短路径。
- 重叠子问题:在递归求解过程中,相同的子问题会被多次计算。动态规划通过存储子问题的解(如表格或数组)来避免重复计算。
- 无后效性:当前状态一旦确定,后续决策不受之前状态的影
经典应用场景
- 斐波那契数列(又称“兔子数列”):避免递归的重复计算。斐波那契数列是动态规划(DP)的经典入门问题,其状态转移方程直接反映了DP的核心思想。
- 背包问题:在容量限制下最大化物品价值。
- 最短路径问题:如Dijkstra算法的动态规划变体。
动态规划的步骤
- 定义状态
- 用变量(如dp[i])表示问题的子问题解。例如,dp[i]可表示“爬到第i阶楼梯的方法数”。
- 状态转移方程
- 建立子问题之间的关系。例如,斐波那契数列的转移方程为:
- dp[i]=dp[i−1]+dp[i−2]
- 初始化边界条件
- 设置最小子问题的解(如dp[0] = 0,dp[1] = 1)。
- 计算顺序
- 通常采用自底向上(递推)或自顶向下(记忆化搜索)的方式填充状态表
3. 核心区别
| 维度 | Chamfer距离 | Fréchet距离 |
|---|---|---|
| 顺序敏感性 | 不敏感(无序点集) | 敏感(需保持顶点顺序) |
| 计算效率 | 较高(基于最近邻搜索) | 较低(需动态规划或耦合序列) |
| 典型应用 | 点云重建、3D形状补全 | 轨迹匹配、车道线拓扑分析 |
4. 应用示例
- Chamfer距离:在自动驾驶中评估生成的车道线点云与真实数据的局部相似性。
- Fréchet距离:验证车道线的全局几何结构和拓扑关系(如OpenLane-V2数据集中的拓扑推理指标)。
两者常结合使用,Chamfer距离捕捉局部几何相似性,Fréchet距离确保全局结构一致性。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)