SVO是我接触的第一个视觉SLAM框架(按照高博的说法,这个是VO,算不上SLAM),当时和几个小伙伴一起读了源码相互交流下,但是当时没有及时总结,又忘得差不多了,这段时间正在复习,就借此机会一起总结下,复习的时候参看了几位SLAM大佬的笔记,觉得数学这个东西挖深了搞明白了真的很有意思,搞得我甚至有点想读个博…先放上几个SVO的参考博客:
svo: semi-direct visual odometry 论文解析
SVO原理解析
svo的Supplementary matterial 推导过程
能否具体解释下svo的运动估计与深度估计两方面?
下面就是我的总结,按照自问自答的形式总结,开始
所谓半直接指的是通过图像中的特征点图像块进行直接匹配来获取相机位姿,而不像直接法那样对整个图像(根据灰度梯度大小筛选需要匹配的点)使用直接匹配
优点:
(1)速度非常快,在PC上能达到300帧,这也是直接法高效的最佳例证;
(2)关键点分布均匀。
缺点:
(1)没有重定位功能,追踪丢失后整个系统无法恢复,而且由于前端是通过比较前后两帧确定初始位姿,因此受单帧影响较大,在有遮挡模糊的情况下容易丢失;
(2)由于直接法算法本身所导致的缺点是:模糊、大运动、光照变化大的情况下容易丢失;
(3)深度滤波器收敛比较慢,而且VO的结果严重依赖于准确的位姿估计。
如下图,SVO一共有两个线程,分别是追踪和建图:
追踪线程:
(1)Sparse Model-based Image Aligment:把当前帧和上一个追踪的帧进行稀疏直接法,获取粗略的位姿。
(2)Feature Aligment:把关键帧地图点投影到当前帧,并利用光流法来找到地图中特征块在new frame中应该出现的位置进行像素块的匹配。
(3)Pose & Structure Refinement:通过匹配好的像素块,计算当前帧和地图点对应的关键帧之间的光度误差,通过BA同时优化位姿和地图点坐标。
建图线程:
建图过程最主要的任务就是估计特征点深度,判断追踪线程传来的帧是否为关键帧,如果为关键帧就提取新的特征点,把这些点作为地图的种子点,放入优化线程。否则,不为关键帧的时候,就用此帧的信息更新地图中种子点的深度估计值。
区别:光流法是通过灰度不变假设跟踪特征点的运动,节省了计算特征描述子的时间,但是计算三维变换仍需要通过对极几何、PnP或者ICP,分为稀疏光流法和稠密光流法,而直接法是通过最小化光度误差直接计算三维变换,分为稀疏直接法(特征点),半稠密直接法(梯度大的点),稠密直接法(需要GPU)。
光流法:光流法是基于灰度不变假设(同一个空间点的像素灰度值,在各个图像中是固定不变的)进行泰勒展开,如下 I ( x + d x , y + d y , t + d t ) = I ( x , y , t ) \boldsymbol{I}(x+\mathrm{d} x, y+\mathrm{d} y, t+\mathrm{d} t)=\boldsymbol{I}(x, y, t) I(x+dx,y+dy,t+dt)=I(x,y,t)然后进行泰勒展开 I ( x + d x , y + d y , t + d t ) ≈ I ( x , y , t ) + ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t \boldsymbol{I}(x+\mathrm{d} x, y+\mathrm{d} y, t+\mathrm{d} t) \approx \boldsymbol{I}(x, y, t)+\frac{\partial \boldsymbol{I}}{\partial x} \mathrm{d} x+\frac{\partial \boldsymbol{I}}{\partial y} \mathrm{d} y+\frac{\partial \boldsymbol{I}}{\partial t} \mathrm{d} t I(x+dx,y+dy,t+dt)≈I(x,y,t)+∂x∂Idx+∂y∂Idy+∂t∂Idt灰度不变嘛,有 ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t = 0 \frac{\partial \boldsymbol{I}}{\partial x} \mathrm{d} x+\frac{\partial \boldsymbol{I}}{\partial y} \mathrm{d} y+\frac{\partial \boldsymbol{I}}{\partial t} \mathrm{d} t=0 ∂x∂Idx+∂y∂Idy+∂t∂Idt=0两边除以 d t dt dt,有 ∂ I ∂ x d x d t + ∂ I ∂ y d y d t = − ∂ I ∂ t \frac{\partial \boldsymbol{I}}{\partial x} \frac{\mathrm{d} x}{\mathrm{d} t}+\frac{\partial \boldsymbol{I}}{\partial y} \frac{\mathrm{d} y}{\mathrm{d} t}=-\frac{\partial \boldsymbol{I}}{\partial t} ∂x∂Idtdx+∂y∂Idtdy=−∂t∂I d x / d t \mathrm{d} x / \mathrm{d} t dx/dt和 d y / d t \mathrm{d} y / \mathrm{d} t dy/dt分别是像素在 x x x和 y y y方向上的速度 u , v u,v u,v而 ∂ I / ∂ x \partial \boldsymbol{I} / \partial x ∂I/∂x和 ∂ I / ∂ y \partial \boldsymbol{I} / \partial y ∂I/∂y分别是像素在 x x x和 y y y方向上的梯度 I x , I y \boldsymbol{I}_{x}, \boldsymbol{I}_{y} Ix,Iy,于是有 [ I x I y ] [ u v ] = − I t \left[\begin{array}{ll}{\boldsymbol{I}_{x}} & {\boldsymbol{I}_{y}}\end{array}\right]\left[\begin{array}{l}{u} \\ {v}\end{array}\right]=-\boldsymbol{I}_{t} [IxIy][uv]=−It我们已知的是 I x , I y \boldsymbol{I}_{x}, \boldsymbol{I}_{y} Ix,Iy,而要求的是 u , v u,v u,v,一个像素点当然求不了,因此,光流法考虑的是一个 w × w w \times w w×w大小的窗口,因此总共有 w 2 w^{2} w2个方程, [ I x I y ] k [ u v ] = − I t k , k = 1 , … , w 2 \left[\begin{array}{ll}{\boldsymbol{I}_{x}} & {\boldsymbol{I}_{y}}\end{array}\right]_{k}\left[\begin{array}{c}{u} \\ {v}\end{array}\right]=-\boldsymbol{I}_{t k}, \quad k=1, \ldots, w^{2} [IxIy]k[uv]=−Itk,k=1,…,w2记 A = [ [ I x , I y ] 1 ⋮ [ I x , I y ] k ] , b = [ I t 1 ⋮ I t k ] A=\left[\begin{array}{c}{\left[\boldsymbol{I}_{x}, \boldsymbol{I}_{y}\right]_{1}} \\ {\vdots} \\ {\left[\boldsymbol{I}_{x}, \boldsymbol{I}_{y}\right]_{k}}\end{array}\right], \boldsymbol{b}=\left[\begin{array}{c}{\boldsymbol{I}_{t 1}} \\ {\vdots} \\ {\boldsymbol{I}_{t k}}\end{array}\right] A=⎣⎢⎡[Ix,Iy]1⋮[Ix,Iy]k⎦⎥⎤,b=⎣⎢⎡It1⋮Itk⎦⎥⎤采用最小二乘法求解 [ u v ] ∗ = − ( A T A ) − 1 A T b \left[\begin{array}{c}{u} \\ {v}\end{array}\right]^{*}=-\left(\boldsymbol{A}^{T} \boldsymbol{A}\right)^{-1} \boldsymbol{A}^{T} \boldsymbol{b} [uv]∗=−(ATA)−1ATb 这样就求得了像素块在下一帧的位置
直接法:直接法是基于灰度不变假设建立一个优化问题,优化目标是最小化光度误差: min ξ J ( ξ ) = ∥ e ∥ 2 \min _{\xi} J(\xi)=\|e\|^{2} ξminJ(ξ)=∥e∥2其中 e = I 1 ( p 1 ) − I 2 ( p 2 ) e=\boldsymbol{I}_{1}\left(\boldsymbol{p}_{1}\right)-\boldsymbol{I}_{2}\left(\boldsymbol{p}_{2}\right) e=I1(p1)−I2(p2)而 p 1 = [ u v 1 ] 1 = 1 Z 1 K P p 2 = [ u v v 1 ] 2 = 1 Z 2 K ( R P + t ) = 1 Z 2 K ( exp ( ξ ∧ ) P ) 1 : 3 \begin{aligned} \boldsymbol{p}_{1} &=\left[\begin{array}{c}{u} \\ {v} \\ {1}\end{array}\right]_{1}=\frac{1}{Z_{1}} \boldsymbol{K} \boldsymbol{P} \\ \boldsymbol{p}_{2}=&\left[\begin{array}{c}{u} \\ {v} \\ {v} \\ {1}\end{array}\right]_{2}=\frac{1}{Z_{2}} \boldsymbol{K}(\boldsymbol{R} \boldsymbol{P}+\boldsymbol{t})=\frac{1}{Z_{2}} \boldsymbol{K}\left(\exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{P}\right)_{1 : 3} \end{aligned} p1p2==⎣⎡uv1⎦⎤1=Z11KP⎣⎢⎢⎡uvv1⎦⎥⎥⎤2=Z21K(RP+t)=Z21K(exp(ξ∧)P)1:3可以由下图直观理解
对于非线性的最优化问题,我们最关心的当然是,残差相对于位姿的导数,这里使用李代数上的扰动模型: e ( ξ ⊕ δ ξ ) = I 1 ( 1 Z 1 K P ) − I 2 ( 1 Z 2 K exp ( δ ξ ∧ ) exp ( ξ ∧ ) P ) ≈ I 1 ( 1 Z 1 K P ) − I 2 ( 1 Z 2 K ( 1 + δ ξ ∧ ) exp ( ξ ∧ ) P ) = I 1 ( 1 Z 1 K P ) − I 2 ( 1 Z 2 K exp ( ξ ∧ ) P + 1 Z 2 K δ ξ ∧ exp ( ξ ∧ ) P ) \begin{aligned} e(\boldsymbol{\xi} \oplus \delta \boldsymbol{\xi}) &=\boldsymbol{I}_{1}\left(\frac{1}{Z_{1}} \boldsymbol{K} \boldsymbol{P}\right)-\boldsymbol{I}_{2}\left(\frac{1}{Z_{2}} \boldsymbol{K} \exp \left(\delta \xi^{\wedge}\right) \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{P}\right) \\ & \approx \boldsymbol{I}_{1}\left(\frac{1}{Z_{1}} \boldsymbol{K} \boldsymbol{P}\right)-\boldsymbol{I}_{2}\left(\frac{1}{Z_{2}} \boldsymbol{K}\left(1+\delta \xi^{\wedge}\right) \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{P}\right) \\ &=\boldsymbol{I}_{1}\left(\frac{1}{Z_{1}} \boldsymbol{K} \boldsymbol{P}\right)-\boldsymbol{I}_{2}\left(\frac{1}{Z_{2}} \boldsymbol{K} \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{P}+\frac{1}{Z_{2}} \boldsymbol{K} \delta \boldsymbol{\xi}^{\wedge} \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{P}\right) \end{aligned} e(ξ⊕δξ)=I1(Z11KP)−I2(Z21Kexp(δξ∧)exp(ξ∧)P)≈I1(Z11KP)−I2(Z21K(1+δξ∧)exp(ξ∧)P)=I1(Z11KP)−I2(Z21Kexp(ξ∧)P+Z21Kδξ∧exp(ξ∧)P)记 q = δ ξ ∧ exp ( ξ ∧ ) P u = 1 Z 2 K q \begin{aligned} \boldsymbol{q} &=\delta \boldsymbol{\xi}^{\wedge} \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{P} \\ \boldsymbol{u} &=\frac{1}{Z_{2}} \boldsymbol{K} \boldsymbol{q} \end{aligned} qu=δξ∧exp(ξ∧)P=Z21Kq q q q为空间点在绕动后位于第二个相机坐标系下的坐标, u u u是它在第二个相机下的像素坐标,我们通过一阶泰勒展开获得其雅可比矩阵 e ( ξ ⊕ δ ξ ) = I 1 ( 1 Z 1 K P ) − I 2 ( 1 Z 2 K exp ( ξ ∧ ) P + u ) ≈ I 1 ( 1 Z 1 K P ) − I 2 ( 1 Z 2 K exp ( ξ ∧ ) P ) − ∂ I 2 ∂ u ∂ u ∂ q ∂ q ∂ δ ξ δ ξ = e ( ξ ) − ∂ I 2 ∂ u ∂ u ∂ q ∂ q ∂ δ ξ δ ξ \begin{aligned} e(\boldsymbol{\xi} \oplus \delta \boldsymbol{\xi}) &=\boldsymbol{I}_{1}\left(\frac{1}{Z_{1}} \boldsymbol{K} \boldsymbol{P}\right)-\boldsymbol{I}_{2}\left(\frac{1}{Z_{2}} \boldsymbol{K} \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{P}+\boldsymbol{u}\right) \\ & \approx \boldsymbol{I}_{1}\left(\frac{1}{Z_{1}} \boldsymbol{K} \boldsymbol{P}\right)-\boldsymbol{I}_{2}\left(\frac{1}{Z_{2}} \boldsymbol{K} \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{P}\right)-\frac{\partial \boldsymbol{I}_{2}}{\partial \boldsymbol{u}} \frac{\partial \boldsymbol{u}}{\partial \boldsymbol{q}} \frac{\partial \boldsymbol{q}}{\partial \delta \xi} \delta \boldsymbol{\xi} \\ &=e(\boldsymbol{\xi})-\frac{\partial \boldsymbol{I}_{2}}{\partial \boldsymbol{u}} \frac{\partial \boldsymbol{u}}{\partial \boldsymbol{q}} \frac{\partial \boldsymbol{q}}{\partial \delta \xi} \delta \boldsymbol{\xi} \end{aligned} e(ξ⊕δξ)=I1(Z11KP)−I2(Z21Kexp(ξ∧)P+u)≈I1(Z11KP)−I2(Z21Kexp(ξ∧)P)−∂u∂I2∂q∂u∂δξ∂qδξ=e(ξ)−∂u∂I2∂q∂u∂δξ∂qδξ其中 ∂ I 2 ∂ u ∂ u ∂ q ∂ q ∂ δ ξ \frac{\partial I_{2}}{\partial u} \frac{\partial u}{\partial \boldsymbol{q}} \frac{\partial \boldsymbol{q}}{\partial \delta \boldsymbol{\xi}} ∂u∂I2∂q∂u∂δξ∂q就是我们需要求得的雅可比矩阵 J \boldsymbol{J} J的链式求导形式,我们分别分析其中的没一项就可以获得其最终形式
(1) ∂ I 2 / ∂ u \partial I_{2} / \partial_{u} ∂I2/∂u为像素 u u u处的像素梯度;
(2) ∂ u / ∂ q \partial u / \partial q ∂u/∂q为投影方程关于相机坐标系下的三位点的导数 ∂ u ∂ q = [ ∂ u ∂ X ∂ u ∂ Y ∂ u ∂ Z ∂ v ∂ X ∂ v ∂ Y ∂ v ∂ Z ] = [ f x Z 0 − f x X Z 2 0 f y Z − f y Y Z 2 ] \frac{\partial \boldsymbol{u}}{\partial \boldsymbol{q}}=\left[\begin{array}{ccc}{\frac{\partial u}{\partial X}} & {\frac{\partial u}{\partial Y}} & {\frac{\partial u}{\partial Z}} \\ {\frac{\partial v}{\partial X}} & {\frac{\partial v}{\partial Y}} & {\frac{\partial v}{\partial Z}}\end{array}\right]=\left[\begin{array}{ccc}{\frac{f_{x}}{Z}} & {0} & {-\frac{f_{x} X}{Z^{2}}} \\ {0} & {\frac{f_{y}}{Z}} & {-\frac{f_{y} Y}{Z^{2}}}\end{array}\right] ∂q∂u=[∂X∂u∂X∂v∂Y∂u∂Y∂v∂Z∂u∂Z∂v]=[Zfx00Zfy−Z2fxX−Z2fyY](3) ∂ q / ∂ δ ξ \partial \boldsymbol{q} / \partial \delta \boldsymbol{\xi} ∂q/∂δξ为三维点对位姿变换的导数 ∂ P ′ ∂ δ ξ = [ I , − P ′ ′ ] = [ 1 0 0 0 Z ′ − Y ′ 0 1 0 Z ′ 0 X ′ 0 0 1 Y ′ − X ′ 0 ] \frac{\partial \boldsymbol{P}^{\prime}}{\partial \delta \boldsymbol{\xi}}=\left[\boldsymbol{I},-\boldsymbol{P}^{\prime \prime}\right]=\left[\begin{array}{cccccc}{1} & {0} & {0} & {0} & {Z^{\prime}} & {-Y^{\prime}} \\ {0} & {1} & {0} & {Z^{\prime}} & {0} & {X^{\prime}} \\ {0} & {0} & {1} & {Y^{\prime}} & {-X^{\prime}} & {0}\end{array}\right] ∂δξ∂P′=[I,−P′′]=⎣⎡1000100010Z′Y′Z′0−X′−Y′X′0⎦⎤因此有雅可比矩阵 J = − ∂ I 2 ∂ u ∂ u ∂ δ ξ \boldsymbol{J}=-\frac{\partial \boldsymbol{I}_{2}}{\partial \boldsymbol{u}} \frac{\partial \boldsymbol{u}}{\partial \delta \boldsymbol{\xi}} J=−∂u∂I2∂δξ∂u而 ∂ u ∂ δ ξ = [ f x Z 0 − f x X Z 2 − f x X Y Z 2 f x + f x X 2 Z 2 − f x Y Z 0 f y Z − f y Y Z 2 − f y − f y Y 2 Z 2 f y X Y Z 2 f y X Z ] \frac{\partial \boldsymbol{u}}{\partial \delta \boldsymbol{\xi}}=\left[\begin{array}{ccccc}{\frac{f_{x}}{Z}} & {0} & {-\frac{f_{x} X}{Z^{2}}} & {-\frac{f_{x} X Y}{Z^{2}}} & {f_{x}+\frac{f_{x} X^{2}}{Z^{2}}} & {-\frac{f_{x} Y}{Z}} \\ {0} & {\frac{f_{y}}{Z}} & {-\frac{f_{y} Y}{Z^{2}}} & {-f_{y}-\frac{f_{y} Y^{2}}{Z^{2}}} & {\frac{f_{y} X Y}{Z^{2}}} & {\frac{f_{y} X}{Z}}\end{array}\right] ∂δξ∂u=[Zfx00Zfy−Z2fxX−Z2fyY−Z2fxXY−fy−Z2fyY2fx+Z2fxX2Z2fyXY−ZfxYZfyX]然后用高斯牛顿或者列文伯格进行迭代求解就好
SVO的追踪线程中应用的是稀疏直接法(Sparse Model based Image Alignment)和光流法(Feature Alignment),还有BA优化(Pose & Structure Refinement),
(1)在Sparse Model based Image Alignment步骤中,假设相邻帧之间的位姿已知(初始化为上一帧位姿或者单位矩阵),通过直接法求得帧间变换矩阵
(2)在Feature Alignment步骤中,因为通过直接法估计的位姿是有误差的,因此会投影像素会存在下图误差
灰框表示真实匹配的像素块位置,而蓝框表示通过变换矩阵投影获得的像素快预测位置,两者之间是存在误差的,此步骤就是通过光流法将像素位置调整到真实皮匹配的像素块位置。注意这里和上面讲的光流法有一点不同的是,因为这里的像素块不是帧间的像素块,而是当前帧和地图点对应帧的像素块,在空间上他们可能距离很远,因此需要在这个光流法中考虑一个仿射变换,如下 u i ′ = arg min u i ′ 1 2 ∥ I k ( u i ′ ) − A i I r ( u i ) ∥ 2 ∀ i u_{i}^{\prime}=\arg \min _{u_{i}^{\prime}} \frac{1}{2}\left\|I_{k}\left(u_{i}^{\prime}\right)-A_{i} I_{r}\left(u_{i}\right)\right\|^{2} \quad \forall i ui′=argui′min21∥Ik(ui′)−AiIr(ui)∥2∀i其中 A i A_i Ai就是那个仿射变换
(3)在Pose & Structure Refinement步骤中,因为像素块位置被调整了,因此Bundle Adjustment可以进一步优化相机位姿和空间的三维坐标,这一步优化的效果是有限的,因此程序中是否运行这一部分是可选的。
SVO的关键帧判断标准现对于ORB SLAM2要薄弱很多,如果当前帧和它相关联的所有关键帧之间的相对平移都超多了场景平均深度的12%就判定为关键帧
有的!不过很简单,基本没什么用,其重定位功能如下:
启动重定位操作的条件是(参考视觉SLAM——SVO代码(1)主要流程):
(1)位姿变化过大,导致可用于跟踪的特征点数太少。
(2)重投影以后,利用多关键帧和当前帧的匹配点进行相机位姿优化的过程中,不断丢弃重投影误差大的点。优化完以后,如果inlier数目较少,跟踪失败,开启重定位。
重定位操作的实现很简单,就是在跟丢之后,仍然假设当前帧的位姿和前一帧一样,往这个位姿上投地图点,用光流法和BA`去优化计算,如果优化成功,就重定位回来,如果优化不成功,就继续下一帧。所以,在跟丢后,只能再回到跟丢时的位置,才能重定位回来。
图像刚进来的时候先获取其金字塔图像,然后对第一帧检测FAST特征点和边缘特征,如果图像中间的特征点数量超过50个,就把这张图像作为第一个关键帧,然后获取第一帧后面的连续图像,用于和第一帧进行三角初始化,规则是:如果后面帧中匹配点的数量大于阈值,并且视差的中位数大于阈值。如果视差的方差大的话,选择计算 E E E矩阵,如果视差的方差小的话,选择计算 H H H矩阵。如果计算完 H H H和 E E E矩阵之后,还有足够的内点,就认为这帧是合适三角化的帧,根据 H H H或 E E E矩阵恢复出来的位姿和种子点(深度还没有收敛的空间点),将这一帧作为关键帧并将种子点送入深度滤波器中,后面就开始执行正常的追踪线程。
单目最基本的估计深度的方法就是三角化,而基于三角化,我们通过概率的方式表示这个问题,就得到了深度滤波器,关于三角化和基本深度滤波器的总结可以参看我的博客多视图几何总结——三角形法,SVO中不太一样的是,其深度概率模型是一个高斯分布和一个均匀分布 p ( x ∣ Z , π ) = π N ( x ∣ Z , τ 2 ) + ( 1 − π ) U ( x ∣ Z min , Z max ) p(x | Z, \pi)=\pi N\left(x | Z, \tau^{2}\right)+(1-\pi) U\left(x | Z_{\min }, Z_{\max }\right) p(x∣Z,π)=πN(x∣Z,τ2)+(1−π)U(x∣Zmin,Zmax)这也就导致了其更新方法没有我三角形法里写的那么简单,下面我根据几篇参考博客(主要参考SVO原理解析)对SVO的深度滤波器做一个分析总结
在SVO运行的过程中,凡是没有被选作关键帧的图像帧都会用来对空间点的深度进行更新,因此对于同一个空间点我们可以得到一些列的观测 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,…,xn(这些观测可以理解为图像坐标),然后我们就需要根据这些观测估计我们深度概率模型的参数 arg max Z , π p ( Z , π ∣ x 1 , … , x N ) \arg \max _{Z, \pi} p\left(Z, \pi | x_{1}, \ldots, x_{N}\right) argZ,πmaxp(Z,π∣x1,…,xN)SVO中采用最大后验概率对求解上述问题(作者认为最大似然概率容易被极大值干扰) p ( Z , π ∣ x 1 , … , x N ) ∝ p ( Z , π ) ∏ n p ( x n ∣ Z , π ) p\left(Z, \pi | x_{1}, \ldots, x_{N}\right) \propto p(Z, \pi) \prod_{n} p\left(x_{n} | Z, \pi\right) p(Z,π∣x1,…,xN)∝p(Z,π)n∏p(xn∣Z,π)上式可以用Gaussian-Beta分布近似 q ( Z , π ∣ a n , b n , μ n , σ n ) ≜ Beta ( π ∣ a n , b n ) ⋅ N ( Z ∣ μ n , σ n ) q\left(Z, \pi | a_{n}, b_{n}, \mu_{n}, \sigma_{n}\right) \triangleq \operatorname{Beta}\left(\pi | a_{n}, b_{n}\right) \cdot N\left(Z | \mu_{n}, \sigma_{n}\right) q(Z,π∣an,bn,μn,σn)≜Beta(π∣an,bn)⋅N(Z∣μn,σn)其迭代公式为 q ( Z , π ∣ a n , b n , μ n , σ n ) ≈ p ( x n ∣ Z , π ) q ( Z , π ∣ a n − 1 , b n − 1 , μ n − 1 , σ n − 1 ) q\left(Z, \pi | a_{n}, b_{n}, \mu_{n}, \sigma_{n}\right) \approx p\left(x_{n} | Z, \pi\right) q\left(Z, \pi | a_{n-1}, b_{n-1}, \mu_{n-1}, \sigma_{n-1}\right) q(Z,π∣an,bn,μn,σn)≈p(xn∣Z,π)q(Z,π∣an−1,bn−1,μn−1,σn−1)这里会有两个问题,为嘛是Gaussian-Beta分布近似?迭代公式具体操作是怎么样?
关于第一个问题,我没去细究,可以参考Supplementary matterial Parametric approximation to posterior这篇文章,我这里主要研究了下第二个问题,给了这样一个分布迭代公式,我们具体怎么操作,代码怎么写(多公式预警!!!)
定义Gaussian-Beta分布如下: q ( Z , π ∣ a , b , μ , σ 2 ) = N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b ) q\left(Z, \pi | a, b, \mu, \sigma^{2}\right)=N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b) q(Z,π∣a,b,μ,σ2)=N(Z∣μ,σ2)Beta(π∣a,b)其中 N ( x ∣ μ , σ 2 ) = 1 ( 2 π σ 2 ) 1 / 2 exp { − 1 2 σ 2 ( x − μ ) 2 } {N}\left(x | \mu, \sigma^{2}\right)=\frac{1}{\left(2 \pi \sigma^{2}\right)^{1 / 2}} \exp \left\{-\frac{1}{2 \sigma^{2}}(x-\mu)^{2}\right\} N(x∣μ,σ2)=(2πσ2)1/21exp{−2σ21(x−μ)2} Beta ( π ∣ a , b ) = Γ ( a + b ) Γ ( a ) Γ ( b ) π a − 1 ( 1 − π ) b − 1 \operatorname{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)πa−1(1−π)b−1其中 Γ ( a ) = ( a − 1 ) ! \Gamma(a)=(a-1) ! Γ(a)=(a−1)!,这里我们需要先说明一下这两个分布的接下来推导要用到的两个性质:
关于Gaussian分布有: N ( x ∣ Z , τ 2 ) N ( Z ∣ μ , σ 2 ) = N ( x ∣ μ , σ 2 + τ 2 ) N ( Z ∣ m , s 2 ) N\left(x | Z, \tau^{2}\right) N\left(Z | \mu, \sigma^{2}\right)=N\left(x | \mu, \sigma^{2}+\tau^{2}\right) N\left(Z | m, s^{2}\right) N(x∣Z,τ2)N(Z∣μ,σ2)=N(x∣μ,σ2+τ2)N(Z∣m,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}} \quad m=s^{2}\left(\frac{\mu}{\sigma^{2}}+\frac{x}{\tau^{2}}\right) s21=σ21+τ21m=s2(σ2μ+τ2x)这个推到有点复杂,可以参考svo的Supplementary matterial 推导过程
关于Beta分布有: Beta ( π ∣ a , b ) = 1 π a a + b Beta ( π ∣ a + 1 , b ) = 1 1 − π b a + b Beta ( π ∣ a , b + 1 ) \operatorname{Beta}(\pi | a, b)=\frac{1}{\pi} \frac{a}{a+b}\operatorname{Beta}(\pi | a+1, b)=\frac{1}{1-\pi} \frac{b}{a+b} \operatorname{Beta}(\pi | a, b+1) Beta(π∣a,b)=π1a+baBeta(π∣a+1,b)=1−π1a+bbBeta(π∣a,b+1)这个可以由 Γ ( a ) \Gamma(a) Γ(a)的定义Beta分布的定义很容易推出(这里我和原本博客的公式不同,我觉得应该是这样)
--------我是华丽的分割线--------
上面说了各种分布的定义,下面我们来正式研究下递推过程是怎样的
由前文,我们的迭代公式如下 p ( x ∣ Z , π ) q ( Z , π ∣ a , b , μ , σ 2 ) p(x | Z, \pi) q\left(Z, \pi | a, b, \mu, \sigma^{2}\right) p(x∣Z,π)q(Z,π∣a,b,μ,σ2)其中 p ( x ∣ Z , π ) p(x | Z, \pi) p(x∣Z,π)是高斯分布和均匀分布的组合, q ( Z , π ∣ a , b , μ , σ 2 ) q\left(Z, \pi | a, b, \mu, \sigma^{2}\right) q(Z,π∣a,b,μ,σ2)是Gaussian-Beta分布,相乘之后不再是Gaussian-Beta分布,因此我们假定这样一个Gaussian-Beta分布 q ( Z , π ∣ a ′ , b ′ , μ ′ , σ ′ 2 ) q\left(Z, \pi | a^{\prime}, b^{\prime}, \mu^{\prime}, \sigma^{\prime 2}\right) q(Z,π∣a′,b′,μ′,σ′2),我们分别求已知分布和假定分布的一阶矩和二阶矩,使其相等求得 a ′ , b ′ , μ ′ , σ ′ 2 a^{\prime}, b^{\prime}, \mu^{\prime}, \sigma^{\prime 2} a′,b′,μ′,σ′2就获得了一个更新后的Gaussian-Beta分布,好,顺着这个思路开始吧!
将 p ( x ∣ Z , π ) p(x | Z, \pi) p(x∣Z,π)和 q ( Z , π ∣ a , b , μ , σ 2 ) q\left(Z, \pi | a, b, \mu, \sigma^{2}\right) q(Z,π∣a,b,μ,σ2)的公式带入得 ( π N ( x ∣ Z , τ 2 ) ) + ( 1 − π ) U ( x ) ) N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b ) = π N ( x ∣ Z , τ 2 ) N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b ) + ( 1 − π ) U ( x ) N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b ) = a a + b N ( Z ∣ μ , σ 2 ) N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a + 1 , b ) + b a + b U ( x ) N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b + 1 ) = a a + b N ( x ∣ μ , σ 2 + τ 2 ) N ( Z ∣ m , s 2 ) Beta ( π ∣ a + 1 , b ) + b a + b U ( x ) N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b + 1 ) \begin{aligned} &\left(\pi N\left(x | Z, \tau^{2}\right)\right)+(1-\pi) U(x) ) N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b) \\=& \pi N\left(x | Z, \tau^{2}\right) N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b)+(1-\pi) U(x) N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b) \\=& \frac{a}{a+b} N\left(Z | \mu, \sigma^{2}\right) N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a+1, b)+\frac{b}{a+b} U(x) N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b+1) \\=& \frac{a}{a+b} N\left(x | \mu, \sigma^{2}+\tau^{2}\right) N\left(Z | m, s^{2}\right) \operatorname{Beta}(\pi | a+1, b)+\frac{b}{a+b} U(x) N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b+1) \end{aligned} ===(πN(x∣Z,τ2))+(1−π)U(x))N(Z∣μ,σ2)Beta(π∣a,b)πN(x∣Z,τ2)N(Z∣μ,σ2)Beta(π∣a,b)+(1−π)U(x)N(Z∣μ,σ2)Beta(π∣a,b)a+baN(Z∣μ,σ2)N(Z∣μ,σ2)Beta(π∣a+1,b)+a+bbU(x)N(Z∣μ,σ2)Beta(π∣a,b+1)a+baN(x∣μ,σ2+τ2)N(Z∣m,s2)Beta(π∣a+1,b)+a+bbU(x)N(Z∣μ,σ2)Beta(π∣a,b+1)这里就用到了我们刚刚提到的关于Gaussian分布和Beta分布的两个性质。
现在我们等式左边(假定分布)是 q ( Z , π ∣ a ′ , b ′ , μ ′ , σ 2 ) q\left(Z, \pi | a^{\prime}, b^{\prime}, \mu^{\prime}, \sigma^{2}\right) q(Z,π∣a′,b′,μ′,σ2)等式右边(已知分布)是 C 1 N ( Z ∣ m , s 2 ) Beta ( π ∣ a + 1 , b ) + C 2 N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b + 1 ) C_{1} N\left(Z | m, s^{2}\right) \operatorname{Beta}(\pi | a+1, b)+C_{2} N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b+1) C1N(Z∣m,s2)Beta(π∣a+1,b)+C2N(Z∣μ,σ2)Beta(π∣a,b+1)其中 C 1 = a a + b N ( x ∣ μ , σ 2 + τ 2 ) C 2 = b a + b U ( x ) \begin{aligned} C_{1} &=\frac{a}{a+b} N\left(x | \mu, \sigma^{2}+\tau^{2}\right) \\ C_{2} &=\frac{b}{a+b} U(x) \end{aligned} C1C2=a+baN(x∣μ,σ2+τ2)=a+bbU(x)
现在我们先来求左边(假定分布)的一、二节矩:
(1)关于 Z Z Z的一阶矩: ∫ Z p ( Z , π ∣ a ′ , b ′ , μ ′ , σ ′ ) d Z d π = ∫ Z N ( Z ∣ μ ′ , σ ′ 2 ) Beta ( π ∣ a ′ , b ′ ) d Z d π = ∫ ZN ( Z ∣ μ ′ , σ ′ 2 ) d Z = μ ′ \begin{aligned} \int Z p\left(Z, \pi | a^{\prime}, b^{\prime}, \mu^{\prime}, \sigma^{\prime}\right) d Z d \pi &=\int Z N\left(Z | \mu^{\prime}, \sigma^{\prime 2}\right) \operatorname{Beta}\left(\pi | a^{\prime}, b^{\prime}\right) d Z d \pi \\ &=\int \operatorname{ZN}\left(Z | \mu^{\prime}, \sigma^{\prime 2}\right) d Z \\ &=\mu^{\prime} \end{aligned} ∫Zp(Z,π∣a′,b′,μ′,σ′)dZdπ=∫ZN(Z∣μ′,σ′2)Beta(π∣a′,b′)dZdπ=∫ZN(Z∣μ′,σ′2)dZ=μ′(2)关于 Z Z Z的二阶矩: ∫ Z 2 p ( Z , π ∣ a ′ , b ′ , b ′ , σ ′ ) d Z d π = ∫ Z 2 N ( Z ∣ μ ′ , σ ′ 2 ) Beta ( π ∣ a ′ , b ′ ) d Z d π = ∫ Z 2 N ( Z ∣ μ ′ , σ ′ 2 ) d Z = μ ′ 2 + σ ′ 2 \begin{aligned} \int Z^{2} p\left(Z, \pi | a^{\prime}, b^{\prime}, b^{\prime}, \sigma^{\prime}\right) d Z d \pi &=\int Z^{2} N\left(Z | \mu^{\prime}, \sigma^{\prime 2}\right) \operatorname{Beta}\left(\pi | a^{\prime}, b^{\prime}\right) d Z d \pi \\ &=\int Z^{2} N\left(Z | \mu^{\prime}, \sigma^{\prime 2}\right) d Z \\ &=\mu^{\prime 2}+\sigma^{\prime 2} \end{aligned} ∫Z2p(Z,π∣a′,b′,b′,σ′)dZdπ=∫Z2N(Z∣μ′,σ′2)Beta(π∣a′,b′)dZdπ=∫Z2N(Z∣μ′,σ′2)dZ=μ′2+σ′2(3)关于 π \pi π的一阶矩: ∫ π p ( Z , π ∣ a ′ , b ′ , μ ′ , σ ′ ) d Z d π = ∫ π N ( Z ∣ μ ′ , σ ′ 2 ) Beta ( π ∣ a ′ , b ′ ) d Z d π = ∫ π Beta ( π ∣ a ′ , b ′ ) d π = a ′ a ′ + b ′ \begin{aligned} \int \pi p\left(Z, \pi | a^{\prime}, b^{\prime}, \mu^{\prime}, \sigma^{\prime}\right) d Z d \pi &=\int \pi N\left(Z | \mu^{\prime}, \sigma^{\prime 2}\right) \operatorname{Beta}\left(\pi | a^{\prime}, b^{\prime}\right) d Z d \pi \\ &=\int \pi \operatorname{Beta}\left(\pi | a^{\prime}, b^{\prime}\right) d \pi \\ &=\frac{a^{\prime}}{a^{\prime}+b^{\prime}} \end{aligned} ∫πp(Z,π∣a′,b′,μ′,σ′)dZdπ=∫πN(Z∣μ′,σ′2)Beta(π∣a′,b′)dZdπ=∫πBeta(π∣a′,b′)dπ=a′+b′a′(4)关于 π \pi π的二阶矩: ∫ π 2 p ( Z , π ∣ a ′ , b ′ , μ ′ , σ ′ ) d Z d π = ∫ π 2 N ( Z ∣ μ ′ , σ ′ 2 ) Beta ( π ∣ a ′ , b ′ ) d Z d π = ∫ π 2 Beta ( π ∣ a ′ , b ′ ) d π = a ′ ( a ′ + 1 ) ( a ′ + b ′ ) ( a ′ + b ′ + 1 ) \begin{aligned} \int \pi^{2} p\left(Z, \pi | a^{\prime}, b^{\prime}, \mu^{\prime}, \sigma^{\prime}\right) d Z d \pi &=\int \pi^{2} N\left(Z | \mu^{\prime}, \sigma^{\prime 2}\right) \operatorname{Beta}\left(\pi | a^{\prime}, b^{\prime}\right) d Z d \pi \\ &=\int \pi^{2} \operatorname{Beta}\left(\pi | a^{\prime}, b^{\prime}\right) d \pi \\ &=\frac{a^{\prime}\left(a^{\prime}+1\right)}{\left(a^{\prime}+b^{\prime}\right)\left(a^{\prime}+b^{\prime}+1\right)} \end{aligned} ∫π2p(Z,π∣a′,b′,μ′,σ′)dZdπ=∫π2N(Z∣μ′,σ′2)Beta(π∣a′,b′)dZdπ=∫π2Beta(π∣a′,b′)dπ=(a′+b′)(a′+b′+1)a′(a′+1)
然后我们再来求右边(已知分布)的一、二节矩:
首先对自己的概率密度积分: C = ∫ a a + b N ( x ∣ μ , σ 2 + τ 2 ) N ( Z ∣ m , s 2 ) Beta ( π ∣ a + 1 , b ) + b a + b U ( x ) N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b + 1 ) d Z d π = ∫ C 1 N ( Z ∣ m , s 2 ) Bet a ( π ∣ a + 1 , b ) + C 2 N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b + 1 ) d Z d π = C 1 + C 2 \begin{aligned} C &=\int \frac{a}{a+b} N\left(x | \mu, \sigma^{2}+\tau^{2}\right) N\left(Z | m, s^{2}\right) \operatorname{Beta}(\pi | a+1, b)+\frac{b}{a+b} U(x) N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b+1) d Z d \pi \\ &=\int C_{1} N\left(Z | m, s^{2}\right) \operatorname{Bet} a(\pi | a+1, b)+C_{2} N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b+1) d Z d \pi \\ &=C_{1}+C_{2} \end{aligned} C=∫a+baN(x∣μ,σ2+τ2)N(Z∣m,s2)Beta(π∣a+1,b)+a+bbU(x)N(Z∣μ,σ2)Beta(π∣a,b+1)dZdπ=∫C1N(Z∣m,s2)Beta(π∣a+1,b)+C2N(Z∣μ,σ2)Beta(π∣a,b+1)dZdπ=C1+C2
(1)关于 Z Z Z的一阶矩: 1 C ∫ Z { C 1 N ( Z ∣ m , s 2 ) Beta ( π ∣ a + 1 , b ) + C 2 N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b + 1 ) } d Z d π = 1 C ∫ Z { C 1 N ( Z ∣ m , s 2 ) + C 2 N ( Z ∣ μ , σ 2 ) } d Z d π = 1 C { C 1 m + C 2 μ } \begin{aligned} & \frac{1}{C} \int Z\left\{C_{1} N\left(Z | m, s^{2}\right) \operatorname{Beta}(\pi | a+1, b)+C_{2} N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b+1)\right\} d Z d \pi \\=& \frac{1}{C} \int Z\left\{C_{1} N\left(Z | m, s^{2}\right)+C_{2} N\left(Z | \mu, \sigma^{2}\right)\right\} d Z d \pi \\=& \frac{1}{C}\left\{C_{1} m+C_{2} \mu\right\} \end{aligned} ==C1∫Z{C1N(Z∣m,s2)Beta(π∣a+1,b)+C2N(Z∣μ,σ2)Beta(π∣a,b+1)}dZdπC1∫Z{C1N(Z∣m,s2)+C2N(Z∣μ,σ2)}dZdπC1{C1m+C2μ}(2)关于 Z Z Z的二阶矩: 1 C ∫ Z 2 { C 1 N ( Z ∣ m , s 2 ) Beta ( π ∣ a + 1 , b ) + C 2 N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b + 1 ) } d Z d π = 1 C ∫ Z 2 { C 1 N ( Z ∣ m , s 2 ) + C 2 N ( Z ∣ μ , σ 2 ) } d Z d π = 1 C { C 1 ( m 2 + s 2 ) + C 2 ( μ 2 + σ 2 ) } \begin{aligned} & \frac{1}{C} \int Z^{2}\left\{C_{1} N\left(Z | m, s^{2}\right) \operatorname{Beta}(\pi | a+1, b)+C_{2} N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b+1)\right\} d Z d \pi \\=& \frac{1}{C} \int Z^{2}\left\{C_{1} N\left(Z | m, s^{2}\right)+C_{2} N\left(Z | \mu, \sigma^{2}\right)\right\} d Z d \pi \\=& \frac{1}{C}\left\{C_{1}\left(m^{2}+s^{2}\right)+C_{2}\left(\mu^{2}+\sigma^{2}\right)\right\} \end{aligned} ==C1∫Z2{C1N(Z∣m,s2)Beta(π∣a+1,b)+C2N(Z∣μ,σ2)Beta(π∣a,b+1)}dZdπC1∫Z2{C1N(Z∣m,s2)+C2N(Z∣μ,σ2)}dZdπC1{C1(m2+s2)+C2(μ2+σ2)}(3)关于 π \pi π的一阶矩: 1 C ∫ π { C 1 N ( Z ∣ m , s 2 ) Beta ( π ∣ a + 1 , b ) + C 2 N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b + 1 ) } d Z d π = 1 C ∫ π { C 1 Beta ( π ∣ a + 1 , b ) + C 2 Beta ( π ∣ a , b + 1 ) } d Z d π = 1 C { C 1 a + 1 a + b + 1 + C 2 a a + b + 1 } \begin{aligned} & \frac{1}{C} \int \pi\left\{C_{1} N\left(Z | m, s^{2}\right) \operatorname{Beta}(\pi | a+1, b)+C_{2} N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b+1)\right\} d Z d \pi \\=& \frac{1}{C} \int \pi\left\{C_{1} \operatorname{Beta}(\pi | a+1, b)+C_{2} \operatorname{Beta}(\pi | a, b+1)\right\} d Z d \pi \\=& \frac{1}{C}\left\{C_{1} \frac{a+1}{a+b+1}+C_{2} \frac{a}{a+b+1}\right\} \end{aligned} ==C1∫π{C1N(Z∣m,s2)Beta(π∣a+1,b)+C2N(Z∣μ,σ2)Beta(π∣a,b+1)}dZdπC1∫π{C1Beta(π∣a+1,b)+C2Beta(π∣a,b+1)}dZdπC1{C1a+b+1a+1+C2a+b+1a}(4)关于 π \pi π的二阶矩: 1 C ∫ π 2 { C 1 N ( Z ∣ m , s 2 ) Beta ( π ∣ a + 1 , b ) + C 2 N ( Z ∣ μ , σ 2 ) Beta ( π ∣ a , b + 1 ) } d Z d π = 1 C ∫ π 2 { C 1 Bet a ( π ∣ a + 1 , b ) + C 2 Beta ( π ∣ a , b + 1 ) } d Z d π = 1 C { C 1 ( a + 1 ) ( a + 2 ) ( a + b + 1 ) ( a + b + 2 ) + C 2 a ( a + 1 ) ( a + b + 1 ) ( a + b + 2 ) } \begin{aligned} & \frac{1}{C} \int \pi^{2}\left\{C_{1} N\left(Z | m, s^{2}\right) \operatorname{Beta}(\pi | a+1, b)+C_{2} N\left(Z | \mu, \sigma^{2}\right) \operatorname{Beta}(\pi | a, b+1)\right\} d Z d \pi \\=& \frac{1}{C} \int \pi^{2}\left\{C_{1} \operatorname{Bet} a(\pi | a+1, b)+C_{2} \operatorname{Beta}(\pi | a, b+1)\right\} d Z d \pi \\=& \frac{1}{C}\left\{C_{1} \frac{(a+1)(a+2)}{(a+b+1)(a+b+2)}+C_{2} \frac{a(a+1)}{(a+b+1)(a+b+2)}\right\} \end{aligned} ==C1∫π2{C1N(Z∣m,s2)Beta(π∣a+1,b)+C2N(Z∣μ,σ2)Beta(π∣a,b+1)}dZdπC1∫π2{C1Beta(π∣a+1,b)+C2Beta(π∣a,b+1)}dZdπC1{C1(a+b+1)(a+b+2)(a+1)(a+2)+C2(a+b+1)(a+b+2)a(a+1)}对 C 1 C_1 C1和 C 2 C_2 C2进行归一化: C 2 ′ = C 2 C C_{2}^{\prime}=\frac{C_{2}}{C} C2′=CC2 C 2 ′ = C 2 C C_{2}^{\prime}=\frac{C_{2}}{C} C2′=CC2让上面的一二阶矩相等(上面的(1)(2)(3)(4)分别相等)有 μ ′ = C 1 ′ m + C 2 ′ μ μ ′ 2 + σ ′ 2 = C 1 ′ ( m 2 + s 2 ) + C 2 ′ ( μ 2 + σ 2 ) a n ′ a n ′ + b n ′ = C 1 ′ a + 1 a + b + 1 + C 2 ′ a a + b + 1 a n ′ ( a n ′ + 1 ) ( a n ′ + b n ′ ) ( a n ′ + b n ′ + 1 ) = C 1 ′ ( a + 1 ) ( a + 2 ) ( a + b + 1 ) ( a + b + 2 ) + C 2 ′ a ( a + 1 ) ( a + b + 1 ) ( a + b + 2 ) \begin{aligned} \mu^{\prime} &=C_{1}^{\prime} m+C_{2}^{\prime} \mu \\ \mu^{\prime 2}+\sigma^{\prime 2} &=C_{1}^{\prime}\left(m^{2}+s^{2}\right)+C_{2}^{\prime}\left(\mu^{2}+\sigma^{2}\right) \\ \frac{a_{n}^{\prime}}{a_{n}^{\prime}+b_{n}^{\prime}} &=C_{1}^{\prime} \frac{a+1}{a+b+1}+C_{2}^{\prime} \frac{a}{a+b+1} \\ \frac{a_{n}^{\prime}\left(a_{n}^{\prime}+1\right)}{\left(a_{n}^{\prime}+b_{n}^{\prime}\right)\left(a_{n}^{\prime}+b_{n}^{\prime}+1\right)} &=C_{1}^{\prime} \frac{(a+1)(a+2)}{(a+b+1)(a+b+2)}+C_{2}^{\prime} \frac{a(a+1)}{(a+b+1)(a+b+2)} \end{aligned} μ′μ′2+σ′2an′+bn′an′(an′+bn′)(an′+bn′+1)an′(an′+1)=C1′m+C2′μ=C1′(m2+s2)+C2′(μ2+σ2)=C1′a+b+1a+1+C2′a+b+1a=C1′(a+b+1)(a+b+2)(a+1)(a+2)+C2′(a+b+1)(a+b+2)a(a+1)然后联立求解就好了,根据第一个等式我们可以直接获得 μ ′ \mu' μ′,然后带入第二个等式就可以解得 σ ′ \sigma' σ′,联立后面两个等式就可以求得 a ′ a' a′和 b ‘ b‘ b‘,如下:
令 e = C 1 a + 1 a + b + 1 + C 2 a a + b + 1 e =C_{1} \frac{a+1}{a+b+1}+C_{2} \frac{a}{a+b+1} e=C1a+b+1a+1+C2a+b+1a f = C 1 ′ ( a + 1 ) ( a + 2 ) ( a + b + 1 ) ( a + b + 2 ) + C 2 ′ a ( a + 1 ) ( a + b + 1 ) ( a + b + 2 ) f=C_{1}^{\prime} \frac{(a+1)(a+2)}{(a+b+1)(a+b+2)}+C_{2}^{\prime} \frac{a(a+1)}{(a+b+1)(a+b+2)} f=C1′(a+b+1)(a+b+2)(a+1)(a+2)+C2′(a+b+1)(a+b+2)a(a+1)那么 a ′ = e − f f − e / f b ′ = 1 − f f a ′ a^{\prime}=\frac{e-f}{f-e / f} \quad b^{\prime}=\frac{1-f}{f} a^{\prime} a′=f−e/fe−fb′=f1−fa′
在svo的Supplementary matterial 推导过程中还有这样一段源代码,我觉得看这个会更加促进对深度滤波器的理解,我就搬运至此了,需要看源码的最好还是回源博客看。
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 nd(seed->mu, norm_scale);
// 公式(19)
float s2 = 1./(1./seed->sigma2 + 1./tau2);
// 公式(20)计算m.
float m = s2*(seed->mu/seed->sigma2 + x/tau2);
// 公式(21)计算C1.
float C1 = seed->a/(seed->a+seed->b) * boost::math::pdf(nd, x);
// 公式(22)计算C2。
float C2 = seed->b/(seed->a+seed->b) * 1./seed->z_range;
// 概率密度函数归一化
float normalization_constant = C1 + C2;
C1 /= normalization_constant;
C2 /= normalization_constant;
// 公式(25)
float f = C1*(seed->a+1.)/(seed->a+seed->b+1.) + C2*seed->a/(seed->a+seed->b+1.);
// 公式(26)
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.
// 公式(23)
float mu_new = C1*m+C2*seed->mu;
// 公式(24)变形
seed->sigma2 = C1*(s2 + m*m) + C2*(seed->sigma2 + seed->mu*seed->mu) - mu_new*mu_new;
seed->mu = mu_new;
// 公式(25)(26)联立求a'
seed->a = (e-f)/(f-e/f);
// 公式(25)求b'
seed->b = seed->a*(1.0f-f)/f;
}
---------------------
作者:可爱的小蚂蚁
来源:CSDN
原文:https://blog.csdn.net/u013004597/article/details/52069741
版权声明:本文为博主原创文章,转载请附上博文链接!
以为到这里就结束啦?还没有完呢,深度滤波器的输入是什么?是 x x x和 τ \tau τ,其中 x x x指的是通过匹配的像素确定的深度的倒数(逆深度), τ \tau τ一个像素的偏差所导致的深度的偏差,如下图所示
这里的求解就是高中数学知识了,上图中这几个变量的关系是 a = p − t α = arccos ⟨ p , t ⟩ β = arccos ⟨ a , − t ⟩ \begin{aligned} \boldsymbol{a} &=\boldsymbol{p}-\boldsymbol{t} \\ \alpha &=\arccos \langle\boldsymbol{p}, \boldsymbol{t}\rangle \\ \beta &=\arccos \langle\boldsymbol{a},-\boldsymbol{t}\rangle \end{aligned} aαβ=p−t=arccos⟨p,t⟩=arccos⟨a,−t⟩对 p 2 p_2 p2进行一个像素的扰动有 δ β = arctan 1 f \delta \beta=\arctan \frac{1}{f} δβ=arctanf1因此有 β ′ = β + δ β γ = π − α − β ′ \begin{array}{l}{\beta^{\prime}=\beta+\delta \beta} \\ {\gamma=\pi-\alpha-\beta^{\prime}}\end{array} β′=β+δβγ=π−α−β′由正弦定理可以求得 p ’ \boldsymbol{p’} p’的大小有 ∥ p ′ ∥ = ∥ t ∥ sin β ′ sin γ \left\|\boldsymbol{p}^{\prime}\right\|=\|\boldsymbol{t}\| \frac{\sin \beta^{\prime}}{\sin \gamma} ∥p′∥=∥t∥sinγsinβ′所以有 τ = ∥ p ∥ − ∥ p ′ ∥ \tau=\|\boldsymbol{p}\|-\left\|\boldsymbol{p}^{\prime}\right\| τ=∥p∥−∥p′∥
到这里数学层面上的问题就都解决了,我们可以从整体上再来总结下,对于建图线程,工作逻辑如下:
(1)如果进来一个关键帧,就提取关键帧上的新特征点,作为种子点放进一个种子队列中。
(2)如果进来一个普通帧,就用普通帧的信息,更新所有种子点的概率分布。如果某个种子点的深度分布已经收敛,就把它放到地图中,供追踪线程使用。
而我们统购不同真的信息跟新种子点的概率分布用到的就是我们上面所推导的深度滤波器,注意哦,是一个点对应一个深度滤波器~。
如有错误,欢迎指出~
此外,对其他SLAM算法感兴趣的同学可以看考我的博客SLAM算法总结——经典SLAM算法框架总结