深度滤波器推导

本文详细探讨了深度滤波器的原理,包括如何处理测量不确定性,以及采用高斯分布与均匀分布叠加的概率密度函数来表达深度信息分布。通过推导迭代更新过程,展示了如何更新概率分布参数,并提供了相应的代码实现。深度滤波器能够提高算法对错误匹配的鲁棒性,但计算过程较为复杂。
摘要由CSDN通过智能技术生成

深度滤波器推导

测量不确定性

在这里插入图片描述

图像 I r I_r Ir I k I_k Ik对应的相机中心分别为 C r , C k C_r,C_k Cr,Ck。二者的转换关系为 T k , r T_{k,r} Tk,r,并且平移距离为 t t t, 估计场景中的3d点为 r P rP rP.假设匹配误差为一个像素,得到的误差距离为 τ k 2 = ( ∥ r P ∥ − ∥ r P + ∥ ) 2 \tau_k^2=(\|rP\|-\|rP^{+}\|)^2 τk2=(rPrP+)2

因此有:
a = r P − t a = rP - t a=rPt

角度
α = arccos ⁡ ( f ⋅ t ∥ t ∥ ) \alpha = \arccos (\frac{f \cdot t}{\|t\|}) α=arccos(tft)

β = arccos ⁡ ( − a ⋅ t ∥ a ∥ ⋅ ∥ t ∥ ) \beta = \arccos (-\frac{a \cdot t}{\|a\| \cdot \|t\|}) β=arccos(atat)

β + = β + 2 tan ⁡ − 1 ( 1 2 f ) \beta^{+}=\beta + 2 \tan^{-1}(\frac{1}{2f}) β+=β+2tan1(2f1)

γ = π − α − β + \gamma=\pi - \alpha - \beta^{+} γ=παβ+

因此得到,
∥ r P + ∥ = ∥ t ∥ sin ⁡ β + sin ⁡ γ \|rP^{+}\|=\|t\| \frac{\sin \beta^{+}}{ \sin \gamma} rP+=tsinγsinβ+

最终得到测量不确定度为

τ k 2 = ( ∥ r P ∥ − ∥ r P + ∥ ) 2 \tau_k^2=(\|rP\|-\|rP^{+}\|)^2 τk2=(rPrP+)2

代码分析

基本就是一条条公式对应过来

double DepthFilter::computeTau(
      const SE3& T_ref_cur,
      const Vector3d& f,
      const double z,
      const double px_error_angle)
{
  Vector3d t(T_ref_cur.translation());
  Vector3d a = f*z-t;
  double t_norm = t.norm();
  double a_norm = a.norm();
  double alpha = acos(f.dot(t)/t_norm); // dot product
  double beta = acos(a.dot(-t)/(t_norm*a_norm)); // dot product
  double beta_plus = beta + px_error_angle;
  double gamma_plus = PI-alpha-beta_plus; // triangle angles sum to PI
  double z_plus = t_norm*sin(beta_plus)/sin(gamma_plus); // law of sines
  return (z_plus - z); // tau
}

深度滤波器

采用高斯分布与均匀分布叠加的概率密度函数表达深度信息的分布。

  • 好处:提高算法对于错误匹配的鲁棒性
  • 坏处:公式推导过程复杂,实现计算量稍大

在这里插入图片描述

包含四个参数分别为高斯分布的 μ , σ 2 \mu,\sigma^2 μ,σ2与均匀分布的 a , b a,b a,b

p ( x ∣ Z , π ) = π N ( x ∣ μ , σ 2 ) + ( 1 − π ) U ( x ∣ a , b ) p(x|Z,\pi)=\pi N(x|\mu,\sigma^2) + (1-\pi)U(x|a,b) p(xZ,π)=πN(xμ,σ2)+(1π)U(xa,b)

迭代更新过程

已知:
上一次的概率分布 a k , b k , μ k , σ k a_k, b_k, \mu_k, \sigma_k ak,bk,μk,σk
当前的测量值 x , τ x, \tau x,τ

求解更新后的概率分布 a k + 1 , b k + 1 , μ k + 1 , σ k + 1 a_{k+1}, b_{k+1}, \mu_{k+1}, \sigma_{k+1} ak+1,bk+1,μk+1,σk+1

计算过程

1 s 2 = 1 σ k 2 + 1 τ 2 \frac{1}{s^2}=\frac{1}{\sigma_k^2} + \frac{1}{\tau^2} s21=σk21+τ21

m = s 2 ( μ k σ 2 k + x τ 2 ) m = s^2 (\frac{\mu_k}{\sigma_2^k} + \frac{x}{\tau^2}) m=s2(σ2kμk+τ2x)

C 1 = a k a k + b k ⋅ N ( x ∣ μ t , τ 2 + σ t 2 ) C_1 = \frac{a_k}{a_k+b_k} \cdot N(x|\mu_t, \tau^2+\sigma_t^2) C1=ak+bkakN(xμt,τ2+σt2)

C 2 = b k a k + b k ⋅ U ( x ) C_2 = \frac{b_k}{a_k+b_k} \cdot U(x) C2=ak+bkbkU(x)
这里的 N ( x ∣ μ t , τ 2 + σ t 2 ) N(x|\mu_t, \tau^2+\sigma_t^2) N(xμt,τ2+σt2)代表高斯分布 N ( μ t , τ 2 + σ t 2 ) N(\mu_t, \tau^2+\sigma_t^2) N(μt,τ2+σt2) x x x位置的概率分布,同理 U ( x ) U(x) U(x)为均匀分布在x位置处的概率。

C 1 ′ = C 1 C 1 + C 2 , C 2 ′ = C 2 C 1 + C 2 C_1^{'}=\frac{C_1}{C_1+C_2}, C_2^{'}=\frac{C_2}{C_1+C_2} C1=C1+C2C1,C2=C1+C2C2

更新概率分布
μ k + 1 = C 1 ′ m + C 2 ′ μ k \mu_{k+1}=C_1^{'}m + C_2^{'} \mu_k μk+1=C1m+C2μk

σ k + 1 2 = C 1 ′ ( s 2 + m 2 ) + C 2 ′ ( τ 2 + σ t 2 ) \sigma_{k+1}^2 = C^{'}_1 (s^2 + m^2) + C_2^{'}(\tau^2+\sigma_t^2) σk+12=C1(s2+m2)+C2(τ2+σt2)

更新均匀分布
f = C 1 ′ a k + 1 a k + b k + 1 + C 2 ′ a k a k + b k + 1 f = C_1^{'}\frac{a_k+1}{a_k+b_k+1} + C_2^{'}\frac{a_k}{a_k+b_k+1} f=C1ak+bk+1ak+1+C2ak+bk+1ak

e = C 1 ′ ( a k + 1 ) ( a k + 2 ) ( a k + b k + 1 ) ( a k + b k + 2 ) + C 2 ′ a k ( a k + 1 ) ( a k + b k + 1 ) ( a k + b k + 2 ) e = C_1^{'}\frac{(a_k+1)(a_k+2)}{(a_k+b_k+1)(a_k+b_k+2)} + C_2^{'}\frac{a_k(a_k+1)}{(a_k+b_k+1)(a_k+b_k+2)} e=C1(ak+bk+1)(ak+bk+2)(ak+1)(ak+2)+C2(ak+bk+1)(ak+bk+2)ak(ak+1)

a k + 1 = e − f f − e f a_{k+1} = \frac{e-f}{f - \frac{e}{f}} ak+1=ffeef

b k + 1 = 1 − f f a k + 1 b_{k+1} = \frac{1-f}{f} a_{k+1} bk+1=f1fak+1

代码分析

基本能和上面的公式对应起来

void DepthFilter::updateSeed(const float x, const float tau2, Seed* seed)
{
  float norm_scale = sqrt(seed->sigma2 + tau2);
  if(std::isnan(norm_scale))
    return;
  boost::math::normal_distribution<float> nd(seed->mu, norm_scale);
  float s2 = 1./(1./seed->sigma2 + 1./tau2);
  float m = s2*(seed->mu/seed->sigma2 + x/tau2);
  float C1 = seed->a/(seed->a+seed->b) * boost::math::pdf(nd, x);
  float C2 = seed->b/(seed->a+seed->b) * 1./seed->z_range;
  float normalization_constant = C1 + C2;
  C1 /= normalization_constant;
  C2 /= normalization_constant;
  float f = C1*(seed->a+1.)/(seed->a+seed->b+1.) + C2*seed->a/(seed->a+seed->b+1.);
  float e = C1*(seed->a+1.)*(seed->a+2.)/((seed->a+seed->b+1.)*(seed->a+seed->b+2.))
          + C2*seed->a*(seed->a+1.0f)/((seed->a+seed->b+1.0f)*(seed->a+seed->b+2.0f));

  // update parameters
  float mu_new = C1*m+C2*seed->mu;
  seed->sigma2 = C1*(s2 + m*m) + C2*(seed->sigma2 + seed->mu*seed->mu) - mu_new*mu_new;
  seed->mu = mu_new;
  seed->a = (e-f)/(f-e/f);
  seed->b = seed->a*(1.0f-f)/f;
}

理论推导

深度滤波器的公式实现较为简单,但是具体的理论推导较为繁琐,因此放在最后没有特别高的需求的可以直接用上面的结论和代码,而不需要过分深究推导过程。

推导过程分为两步

  1. 证明分布后验分布的近似表达形式,即
    p ( x ∣ Z , π ) = π N ( x ∣ μ , σ 2 ) + ( 1 − π ) U ( x ∣ a , b ) ≈ N ( Z ∣ μ , σ 2 ) B e t a ( π ∣ a , b ) p(x|Z,\pi)=\pi N(x|\mu,\sigma^2) + (1-\pi)U(x|a,b) \approx N(Z|\mu, \sigma^2) Beta(\pi|a,b) p(xZ,π)=πN(xμ,σ2)+(1π)U(xa,b)N(Zμ,σ2)Beta(πa,b)
  2. 推导迭代公式
    ( π N ( x ∣ Z , τ 2 ) + ( 1 − π ) U ( x ) ) N ( Z ∣ μ , σ 2 ) B e t a ( π ∣ a , b ) → N ( Z ∣ μ ′ , σ ′ 2 ) B e t a ( π ∣ a ′ , b ′ ) (\pi N(x|Z, \tau^2) + (1-\pi)U(x)) N(Z|\mu, \sigma^2) Beta(\pi|a,b) \to N(Z|\mu^{'}, \sigma^{'2}) Beta(\pi|a^{'},b^{'}) (πN(xZ,τ2)+(1π)U(x))N(Zμ,σ2)Beta(πa,b)N(Zμ,σ2)Beta(πa,b)

后验分布的参数近似

参数更新公式

已知:

  1. 当前分布 N ( Z ∣ μ , σ 2 ) B e t a ( π ∣ a , b ) N(Z|\mu, \sigma^2) Beta(\pi|a,b) N(Zμ,σ2)Beta(πa,b)
  2. 新测量值 x , τ 2 x, \tau^2 x,τ2

B e t a ( π ∣ a , b ) = Γ ( a + b ) Γ ( a ) Γ ( b ) π a − 1 ( 1 − π ) b − 1 Beta(\pi|a,b) = \frac{\Gamma(a+b)}{\Gamma(a) \Gamma(b)} \pi^{a-1} (1-\pi)^{b-1} Beta(πa,b)=Γ(a)Γ(b)Γ(a+b)πa1(1π)b1
E ( B e t a ( X ) ) = a a + b E ( B e t a ( X 2 ) ) = a ( a + 1 ) ( a + b + 1 ) ( a + b ) E(Beta(X)) = \frac{a}{a+b} \qquad E(Beta(X^2)) = \frac{a(a+1)}{(a+b+1)(a+b)} E(Beta(X))=a+baE(Beta(X2))=(a+b+1)(a+b)a(a+1)
其中 Γ ( n ) \Gamma(n) Γ(n)为gamma函数[1],存在如下性质
Γ ( n + 1 ) = n Γ ( n ) \Gamma(n+1) = n \Gamma(n) Γ(n+1)=nΓ(n)
因此得到性质如下
B e t a ( π ∣ a , b + 1 ) = Γ ( a + b + 1 ) Γ ( a ) Γ ( b + 1 ) π a − 1 ( 1 − π ) b = a + b a Γ ( a + b ) Γ ( a ) Γ ( b ) π a − 1 ( 1 − π ) b − 1 π = a + b a π B e t a ( π ∣ a , b ) Beta(\pi|a,b+1) = \frac{\Gamma(a+b+1)}{\Gamma(a) \Gamma(b+1)} \pi^{a-1} (1-\pi)^{b} \\ = \frac{a+b}{a} \frac{\Gamma(a+b)}{\Gamma(a) \Gamma(b)} \pi^{a-1} (1-\pi)^{b-1} \pi \\ = \frac{a+b}{a} \pi Beta(\pi|a,b) Beta(πa,b+1)=Γ(a)Γ(b+1)Γ(a+b+1)πa1(1π)b=aa+bΓ(a)Γ(b)Γ(a+b)πa1(1π)b1π=aa+bπBeta(πa,b)

B e t a ( π ∣ a + 1 , b ) = Γ ( a + b + 1 ) Γ ( a + 1 ) Γ ( b ) π a ( 1 − π ) b − 1 = a + b b Γ ( a + b ) Γ ( a ) Γ ( b ) π a − 1 ( 1 − π ) b − 1 ( 1 − π ) = a + b b ( 1 − π ) B e t a ( π ∣ a , b ) Beta(\pi|a+1,b) = \frac{\Gamma(a+b+1)}{\Gamma(a+1) \Gamma(b)} \pi^{a} (1-\pi)^{b-1} \\ = \frac{a+b}{b} \frac{\Gamma(a+b)}{\Gamma(a) \Gamma(b)} \pi^{a-1} (1-\pi)^{b-1} (1-\pi) \\ = \frac{a+b}{b} (1-\pi) Beta(\pi|a,b) Beta(πa+1,b)=Γ(a+1)Γ(b)Γ(a+b+1)πa(1π)b1=ba+bΓ(a)Γ(b)Γ(a+b)πa1(1π)b1(1π)=ba+b(1π)Beta(πa,b)

此外,推导过程中用到高斯分布乘积的性质如下[2]:
设有高斯分布 N ( x ∣ Z , τ 2 ) N(x|Z,\tau^2) N(xZ,τ2) N ( Z ∣ μ , σ 2 ) N(Z|\mu, \sigma^2) N(Zμ,σ2),则
N ( x ∣ Z , τ 2 ) N ( Z ∣ μ , σ 2 ) = N ( x ∣ μ , τ 2 + σ 2 ) N ( Z ∣ m , s 2 ) N(x|Z,\tau^2) N(Z|\mu, \sigma^2) = N(x|\mu, \tau^2+\sigma^2) N(Z|m,s^2) N(xZ,τ2)N(Zμ,σ2)=N(xμ,τ2+σ2)N(Zm,s2)
其中,
1 s 2 = 1 σ 2 + 1 τ 2 m = s 2 ( μ σ 2 + x τ 2 ) \frac{1}{s^2} = \frac{1}{\sigma^2} + \frac{1}{\tau^2} \\ m = s^2 (\frac{\mu}{\sigma^2} + \frac{x}{\tau^2}) s21=σ21+τ21m=s2(σ2μ+τ2x)

得到后验分布为:

( π N ( x ∣ Z , τ 2 ) + ( 1 − π ) U ( x ) ) N ( Z ∣ μ , σ 2 ) B e t a ( π ∣ a , b ) π N ( x ∣ Z , τ 2 ) N ( Z ∣ μ , σ 2 ) B e t a ( π ∣ a , b ) + ( 1 − π ) U ( x ) N ( Z ∣ μ , σ 2 ) B e t a ( π ∣ a , b ) a a + b N ( x ∣ μ , σ 2 + τ 2 ) N ( Z ∣ m , s 2 ) B e t a ( π ∣ a + 1 , b ) + b a + b U ( x ) N ( Z ∣ μ , σ 2 ) B e t a ( π ∣ a , b + 1 ) (\pi N(x|Z, \tau^2) + (1-\pi)U(x)) N(Z|\mu, \sigma^2) Beta(\pi|a,b) \\ \pi N(x|Z, \tau^2) N(Z|\mu, \sigma^2) Beta(\pi|a,b) + (1-\pi)U(x) N(Z|\mu, \sigma^2) Beta(\pi|a,b) \\ \frac{a}{a+b} N(x|\mu, \sigma^2 + \tau^2) N(Z|m,s^2) Beta(\pi|a+1,b) + \frac{b}{a+b} U(x) N(Z|\mu, \sigma^2) Beta(\pi|a,b+1) (πN(xZ,τ2)+(1π)U(x))N(Zμ,σ2)Beta(πa,b)πN(xZ,τ2)N(Zμ,σ2)Beta(πa,b)+(1π)U(x)N(Zμ,σ2)Beta(πa,b)a+baN(xμ,σ2+τ2)N(Zm,s2)Beta(πa+1,b)+a+bbU(x)N(Zμ,σ2)Beta(πa,b+1)

将常量替换成单一变量
C 1 = a a + b N ( x ∣ μ , σ 2 + τ 2 ) C 2 = b a + b U ( x ) C_1 = \frac{a}{a+b} N(x|\mu, \sigma^2 + \tau^2) \\ C_2 = \frac{b}{a+b} U(x) C1=a+baN(xμ,σ2+τ2)C2=a+bbU(x)

得到如下分布
C 1 N ( Z ∣ m , s 2 ) B e t a ( π ∣ a + 1 , b ) + C 2 N ( Z ∣ μ , σ 2 ) B e t a ( π ∣ a , b + 1 ) C_1 N(Z|m,s^2) Beta(\pi|a+1,b) + C_2 N(Z|\mu, \sigma^2) Beta(\pi|a,b+1) C1N(Zm,s2)Beta(πa+1,b)+C2N(Zμ,σ2)Beta(πa,b+1)

计算对变量 Z Z Z求一阶矩和二阶矩

μ ′ = E ( Z ) = C 1 m + C 2 μ \mu^{'} = E(Z) = C_1 m + C_2 \mu μ=E(Z)=C1m+C2μ

σ ′ 2 + μ ′ 2 = C 1 ( m 2 + s 2 ) + C 2 ( μ 2 + σ 2 ) \sigma^{'2} + \mu^{'2} = C_1 (m^2 + s^2) + C_2 (\mu^2 + \sigma^2) σ2+μ2=C1(m2+s2)+C2(μ2+σ2)
计算对变量 π \pi π求一阶矩和二阶矩

a ′ a ′ + b ′ = C 1 a + 1 a + b + 1 + C 2 a a + b + 1 \frac{a^{'}}{a^{'} + b^{'}} = C_1 \frac{a+1}{a+b+1} + C_2 \frac{a}{a+b+1} a+ba=C1a+b+1a+1+C2a+b+1a
a ′ ( a ′ + 1 ) ( a ′ + b ′ + 1 ) ( a ′ + b ′ ) = C 1 ( a + 1 ) ( a + 2 ) ( a + b + 2 ) ( a + b + 1 ) + C 2 a ( a + 1 ) ( a + b + 2 ) ( a + b + 1 ) \frac{a^{'}(a^{'}+1)}{(a^{'}+b^{'}+1)(a^{'}+b^{'})} = C_1 \frac{(a+1)(a+2)}{(a+b+2)(a+b+1)} + C_2 \frac{a(a+1)}{(a+b+2)(a+b+1)} (a+b+1)(a+b)a(a+1)=C1(a+b+2)(a+b+1)(a+1)(a+2)+C2(a+b+2)(a+b+1)a(a+1)

最后化简即得到更新公式。

参考资料

[1] Gamma 函数 https://zh.m.wikipedia.org/wiki/%CE%93%E5%87%BD%E6%95%B0

[2] 高斯分布的乘积推导 https://www.zhihu.com/question/46458824

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值