基于tensorrt-python实现pvnet在自定义数据集上的关键点ransac投票异常记录

问题描述

代码版本基于clean-pvnet,平台:nvidia orin nano,编程实现并运行通过后,出现估计位姿不准确的情况。排查原因,发现,mask预测正常,但是基于向量场关键点预测,出现异常:
在这里插入图片描述

正常的关键点应该是几百,经过反复排查后,发现是最后一步优化求解的,求解器使用错误,应该使用QR 分解,而非LU求解。

LU分解

LU分解是将一个矩阵分解成下三角矩阵(L)和上三角矩阵(U)的乘积。具体步骤如下:

步骤1:LU分解的存在性

对于一个n×n的非奇异矩阵A,若A的主子式(leading principal minors)都非零,则A可以进行LU分解,即存在一个下三角矩阵L和一个上三角矩阵U,使得A = LU。

步骤2:分解过程

设矩阵A为:
A = ( a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ) A = \begin{pmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{pmatrix} A= a11a21a31a12a22a32a13a23a33

  1. 令L和U为:
    L = ( 1 0 0 l 21 1 0 l 31 l 32 1 ) , U = ( u 11 u 12 u 13 0 u 22 u 23 0 0 u 33 ) L = \begin{pmatrix} 1 & 0 & 0 \\ l_{21} & 1 & 0 \\ l_{31} & l_{32} & 1 \end{pmatrix}, \quad U = \begin{pmatrix} u_{11} & u_{12} & u_{13} \\ 0 & u_{22} & u_{23} \\ 0 & 0 & u_{33} \end{pmatrix} L= 1l21l3101l32001 ,U= u1100u12u220u13u23u33

  2. 通过A = LU展开,得到:
    ( a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ) = ( 1 0 0 l 21 1 0 l 31 l 32 1 ) ( u 11 u 12 u 13 0 u 22 u 23 0 0 u 33 ) \begin{pmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 \\ l_{21} & 1 & 0 \\ l_{31} & l_{32} & 1 \end{pmatrix} \begin{pmatrix} u_{11} & u_{12} & u_{13} \\ 0 & u_{22} & u_{23} \\ 0 & 0 & u_{33} \end{pmatrix} a11a21a31a12a22a32a13a23a33 = 1l21l3101l32001 u1100u12u220u13u23u33

  3. 解方程组得到L和U的元素:

    • u 11 = a 11 u_{11} = a_{11} u11=a11
    • u 12 = a 12 u_{12} = a_{12} u12=a12
    • u 13 = a 13 u_{13} = a_{13} u13=a13
    • l 21 = a 21 u 11 l_{21} = \frac{a_{21}}{u_{11}} l21=u11a21
    • l 31 = a 31 u 11 l_{31} = \frac{a_{31}}{u_{11}} l31=u11a31
    • u 22 = a 22 − l 21 u 12 u_{22} = a_{22} - l_{21}u_{12} u22=a22l21u12
    • u 23 = a 23 − l 21 u 13 u_{23} = a_{23} - l_{21}u_{13} u23=a23l21u13
    • l 32 = a 32 − l 31 u 12 u 22 l_{32} = \frac{a_{32} - l_{31}u_{12}}{u_{22}} l32=u22a32l31u12
    • u 33 = a 33 − l 31 u 13 − l 32 u 23 u_{33} = a_{33} - l_{31}u_{13} - l_{32}u_{23} u33=a33l31u13l32u23

QR分解

QR分解是将一个矩阵分解成一个正交矩阵(Q)和一个上三角矩阵(R)的乘积。具体步骤如下:

步骤1:QR分解的存在性

对于任何一个m×n矩阵A(m≥n),都存在一个m×n的正交矩阵Q和一个n×n的上三角矩阵R,使得A = QR。

步骤2:Gram-Schmidt正交化

假设A的列向量为 { a 1 , a 2 , … , a n } \{a_1, a_2, \ldots, a_n\} {a1,a2,,an},QR分解可以通过Gram-Schmidt正交化过程得到。

  1. 计算第一个正交向量:
    q 1 = a 1 ∥ a 1 ∥ q_1 = \frac{a_1}{\|a_1\|} q1=a1a1

  2. 对于k = 2, 3, …, n,计算:
    q k = a k − ∑ j = 1 k − 1 proj q j ( a k ) q_k = a_k - \sum_{j=1}^{k-1} \text{proj}_{q_j}(a_k) qk=akj=1k1projqj(ak)
    其中 proj q j ( a k ) = a k ⋅ q j q j ⋅ q j q j \text{proj}_{q_j}(a_k) = \frac{a_k \cdot q_j}{q_j \cdot q_j} q_j projqj(ak)=qjqjakqjqj

  3. 归一化q_k:
    q k = q k ∥ q k ∥ q_k = \frac{q_k}{\|q_k\|} qk=qkqk

  4. 得到正交矩阵Q:
    Q = ( q 1 q 2 … q n ) Q = \begin{pmatrix} q_1 & q_2 & \ldots & q_n \end{pmatrix} Q=(q1q2qn)

  5. 计算上三角矩阵R:
    R = ( q 1 ⋅ a 1 q 1 ⋅ a 2 … q 1 ⋅ a n 0 q 2 ⋅ a 2 … q 2 ⋅ a n ⋮ ⋮ ⋱ ⋮ 0 0 … q n ⋅ a n ) R = \begin{pmatrix} q_1 \cdot a_1 & q_1 \cdot a_2 & \ldots & q_1 \cdot a_n \\ 0 & q_2 \cdot a_2 & \ldots & q_2 \cdot a_n \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \ldots & q_n \cdot a_n \end{pmatrix} R= q1a100q1a2q2a20q1anq2anqnan

总结

  • LU分解: 将矩阵A分解成L和U,通过逐步消去法得到,适用于方阵。
  • QR分解: 将矩阵A分解成Q和R,通过Gram-Schmidt正交化得到,适用于任意矩阵,特别是正交矩阵Q在数值计算中具有较好的稳定性。
  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值