曲线匹配 (二维) 的数学定义和工程实现

发布于:2025-03-20 ⋅ 阅读:(29) ⋅ 点赞:(0)

曲线匹配

在自动驾驶, 机器人导航和地理信息系统等领域, 曲线匹配是核心的基础技术. 典型应用场景包括:

  1. 高精地图匹配: 将车辆实时轨迹与高精度地图道路网进行匹配
  2. 多传感器融合: 对齐不同传感器采集的轨迹数据(如GPS IMU 视觉SLAM)
  3. 运动模式识别: 比较不同驾驶员的转向操作模式特征

本文以自动驾驶中的典型场景为例: 假设我们有两个曲线集合:

  • 集合A: 高精地图中的道路中心线(参考曲线)
  • 集合B: 车辆实时采集的行驶轨迹(查询曲线)

目标: 快速找到集合B中每条轨迹在集合A中对应的最优匹配道路

二 曲线相似度评价标准

以下是对点集曲线各种距离的数学形式化定义和程序

设曲线 P = { p 1 , p 2 , . . . , p m } P = \{p_1,p_2,...,p_m\} P={p1,p2,...,pm} Q = { q 1 , q 2 , . . . , q n } Q = \{q_1,q_2,...,q_n\} Q={q1,q2,...,qn}, 其中 p i , q j ∈ R d p_i, q_j \in \mathbb{R}^d pi,qjRd

2.1 逐点距离范数

2.1.1 欧氏距离 (L2范数)

要求 m = n m = n m=n, 对齐对应点:
D L 2 ( P , Q ) = ∑ k = 1 n ∥ p k − q k ∥ 2 2 D_{L2}(P,Q) = \sqrt{\sum_{k=1}^n \|p_k - q_k\|_2^2} DL2(P,Q)=k=1npkqk22

def euclidean_distance(curve1, curve2):
    min_len = min(len(curve1), len(curve2))
    return np.sqrt(np.sum((curve1[:min_len] - curve2[:min_len])**2))
2.1.2 曼哈顿距离 (L1范数)

D L 1 ( P , Q ) = ∑ k = 1 min ⁡ ( m , n ) ∥ p k − q k ∥ 1 D_{L1}(P,Q) = \sum_{k=1}^{\min(m,n)} \|p_k - q_k\|_1 DL1(P,Q)=k=1min(m,n)pkqk1

def manhattan_distance(curve1, curve2):
    min_len = min(len(curve1), len(curve2))
    return np.sum(np.abs(curve1[:min_len] - curve2[:min_len]))

2.2 动态时间规整 (DTW)

允许非线性对齐, 定义规整路径 π = ( π 1 , . . . , π K ) \pi = (\pi_1,...,\pi_K) π=(π1,...,πK), 其中 π k = ( i k , j k ) \pi_k = (i_k,j_k) πk=(ik,jk) 满足:

  • π 1 = ( 1 , 1 ) \pi_1 = (1,1) π1=(1,1)
  • π K = ( m , n ) \pi_K = (m,n) πK=(m,n)
  • i k + 1 − i k ≤ 1 i_{k+1} - i_k \leq 1 ik+1ik1
  • j k + 1 − j k ≤ 1 j_{k+1} - j_k \leq 1 jk+1jk1

DTW距离为:
D D T W ( P , Q ) = min ⁡ π ∑ ( i , j ) ∈ π ∥ p i − q j ∥ 2 D_{DTW}(P,Q) = \min_{\pi} \sqrt{\sum_{(i,j)\in\pi} \|p_i - q_j\|^2} DDTW(P,Q)=πmin(i,j)πpiqj2

from dtaidistance import dtw

def dtw_distance(curve1, curve2):
    return dtw.distance(curve1, curve2)

2.3 弗雷歇距离 (Frétchet Distance)

考虑连续参数化 α : [ 0 , 1 ] → P \alpha:[0,1]\to P α:[0,1]P, β : [ 0 , 1 ] → Q \beta:[0,1]\to Q β:[0,1]Q, 定义:
D F r e ˊ t c h e t ( P , Q ) = inf ⁡ α , β max ⁡ t ∈ [ 0 , 1 ] ∥ α ( t ) − β ( t ) ∥ D_{Frétchet}(P,Q) = \inf_{\alpha,\beta} \max_{t\in[0,1]} \| \alpha(t) - \beta(t) \| DFreˊtchet(P,Q)=α,βinft[0,1]maxα(t)β(t)
离散形式近似为:
D d i s c F r e ˊ t c h e t = max ⁡ i min ⁡ j ∥ p i − q j ∥ + max ⁡ j min ⁡ i ∥ q j − p i ∥ D_{discFrétchet} = \max_{i} \min_{j} \|p_i - q_j\| + \max_{j} \min_{i} \|q_j - p_i\| DdiscFreˊtchet=imaxjminpiqj+jmaximinqjpi

def frechet_distance(P, Q):
    # 实现递归计算或使用矩阵加速
    # 详见论文 [Computing the Fréchet distance between two polygonal curves]

Computing the Fréchet distance between two polygonal curves


2.4 方向相似度

对于方向向量序列 V P = { p i + 1 − p i } i = 1 m − 1 V_P = \{p_{i+1}-p_i\}_{i=1}^{m-1} VP={pi+1pi}i=1m1, V Q = { q j + 1 − q j } j = 1 n − 1 V_Q = \{q_{j+1}-q_j\}_{j=1}^{n-1} VQ={qj+1qj}j=1n1

余弦相似度:
S c o s ( P , Q ) = 1 K ∑ k = 1 K v k P ⋅ v k Q ∥ v k P ∥ ∥ v k Q ∥ S_{cos}(P,Q) = \frac{1}{K}\sum_{k=1}^K \frac{v_k^P \cdot v_k^Q}{\|v_k^P\| \|v_k^Q\|} Scos(P,Q)=K1k=1KvkP∥∥vkQvkPvkQ
其中 K = min ⁡ ( m − 1 , n − 1 ) K = \min(m-1,n-1) K=min(m1,n1)

def cosine_similarity(curve1, curve2):
    vec1 = curve1[1:] - curve1[:-1]  # 计算方向向量
    vec2 = curve2[1:] - curve2[:-1]
    return np.dot(vec1, vec2.T)/(norm(vec1)*norm(vec2))

2.5 豪斯多夫距离 (Hausdorff Distance)

定义两个点集间的最大最小距离:
D H a u s d o r f f ( P , Q ) = max ⁡ ( sup ⁡ p ∈ P inf ⁡ q ∈ Q ∥ p − q ∥ , sup ⁡ q ∈ Q inf ⁡ p ∈ P ∥ q − p ∥ ) D_{Hausdorff}(P,Q) = \max\left( \sup_{p\in P} \inf_{q\in Q} \|p-q\|, \sup_{q\in Q} \inf_{p\in P} \|q-p\| \right) DHausdorff(P,Q)=max(pPsupqQinfpq,qQsuppPinfqp)


2.6 面积差异度量

对平面曲线 ( d = 2 d=2 d=2), 定义包围区域面积差:
D A r e a = ∣ ∬ Ω P d x d y − ∬ Ω Q d x d y ∣ D_{Area} = \left| \iint_{\Omega_P} dxdy - \iint_{\Omega_Q} dxdy \right| DArea= ΩPdxdyΩQdxdy
其中 Ω P \Omega_P ΩP 为曲线P的闭合区域


关键公式对比表

距离类型 计算特点 数学表达式
DTW 允许弹性对齐 min ⁡ π ∑ ∣ p i k − q j k ∣ \min_\pi \sum |p_{i_k}-q_{j_k}| minπpikqjk
Frétchet 考虑行进同步性 inf ⁡ α , β max ⁡ t ∣ α ( t ) − β ( t ) ∣ \inf_{\alpha,\beta} \max_t |\alpha(t)-\beta(t)| infα,βmaxtα(t)β(t)
Hausdorff 最坏情况匹配 max ⁡ ( sup ⁡ p inf ⁡ q ∣ p − q ∣ , sup ⁡ q inf ⁡ p ∣ q − p ∣ ) \max(\sup_p \inf_q |p-q|, \sup_q \inf_p |q-p|) max(suppinfqpq,supqinfpqp)
L2逐点匹配 严格点对点 ∑ ∣ p i − q i ∣ 2 \sqrt{\sum |p_i-q_i|^2} piqi2
方向相似度 关注走向一致性 1 K ∑ cos ⁡ θ k \frac{1}{K}\sum \cos\theta_k K1cosθk

工程应用中的变形公式

加权DTW

D W D T W ( P , Q ) = min ⁡ π ∑ k = 1 K w k ⋅ ∥ p i k − q j k ∥ D_{WDTW}(P,Q) = \min_\pi \sum_{k=1}^K w_k \cdot \|p_{i_k}-q_{j_k}\| DWDTW(P,Q)=πmink=1Kwkpikqjk
其中权重 w k w_k wk 可根据应用场景设计(如更关注起始段匹配)

多尺度距离

结合不同粒度的距离计算:
D M u l t i ( P , Q ) = α D D T W ( P d o w n , Q d o w n ) + β D F r e c h e t ( P , Q ) D_{Multi}(P,Q) = \alpha D_{DTW}(P_{down},Q_{down}) + \beta D_{Frechet}(P,Q) DMulti(P,Q)=αDDTW(Pdown,Qdown)+βDFrechet(P,Q)
其中 P d o w n P_{down} Pdown 为降采样后的曲线


这些数学形式为实际工程实现提供了理论基准, 实际编码时需根据计算资源 实时性要求进行适当近似(如使用快速DTW算法代替全矩阵计算).

三 工程化解决方案架构

3.1 预处理阶段

  1. 重采样: 统一曲线采样频率

    from scipy.interpolate import interp1d
    
    def resample_curve(curve, num_points=100):
        t = np.linspace(0, 1, len(curve))
        f = interp1d(t, curve, axis=0, kind='linear')
        return f(np.linspace(0, 1, num_points))
    
  2. 坐标归一化: 消除绝对位置差异

    def normalize_curve(curve):
        return (curve - np.mean(curve, axis=0)) / np.std(curve, axis=0)
    

3.2 多级匹配策略

候选集缩减
原始曲线
长度筛选
方向直方图匹配
DTW粗匹配
弗雷歇距离精匹配

3.3 实时匹配优化

  • 滑动窗口缓存: 保留最近N个匹配结果作为匹配起点
  • 并行计算: 利用CUDA加速矩阵运算
  • 早期终止: 设置距离阈值提前终止计算

3.2 混合匹配算法实现

from scipy.spatial.distance import cdist

def hybrid_matcher(query, candidates, weights=(0.4, 0.6)):
    """
    混合匹配算法: DTW + 方向相似度
    :param weights: (dtw_weight, cosine_weight)
    """
    scores = []
    for ref in candidates:
        # DTW距离
        dtw_dist = dtw.distance(query, ref)
        
        # 方向相似度
        cos_sim = cosine_similarity(query, ref)
        
        # 归一化组合得分
        score = weights[0]*dtw_dist + weights[1]*(1 - cos_sim)
        scores.append(score)
    
    return np.argmin(scores)

3.4 优化建议

  1. 降采样策略: 在粗匹配阶段使用1/4采样率
  2. 空间索引加速: 使用KD-Tree进行快速邻域搜索
    from sklearn.neighbors import KDTree
    
    tree = KDTree(ref_points)
    indices = tree.query_radius(query_points, r=5.0)
    
  3. 增量式计算: 对连续轨迹只计算最新窗口差异
  4. 非均匀采样: 处理不同采样率的曲线数据
  5. 部分匹配: 识别长曲线中的局部相似片段
  6. 深度学习: 使用CNN/LSTM学习曲线特征表示
    # 示例使用PyTorch构建轨迹特征提取器
    class TrajEncoder(nn.Module):
        def __init__(self):
            super().__init__()
            self.lstm = nn.LSTM(input_size=2, hidden_size=64)
            self.fc = nn.Linear(64, 32)
            
        def forward(self, x):
            _, (h_n, _) = self.lstm(x)
            return self.fc(h_n[-1])
    

: 实际工程中需考虑坐标系转换, 道路拓扑约束等额外因素, 建议结合具体业务场景调整算法参数.