蓝色的点表示观测到的变量,就是像素值。粉色的点表示隐藏变量,就是disparity。通常隐藏变量叫做label。node之间的link表示dependency,比如中间粉色的点只跟周围四个点和上面的蓝色的点有关。这个某点只跟周围点有关的假设就是Markov假设。这个假设使我们能够高效的求解隐藏变量。
如果用MRF来表达stereo vision,它的energy function就是
Y表示观测变量,X表示隐藏变量。i是pixel的index,j是xi相邻的node。给定一个图像Y和一些label X,这个能量方程求得了每个link的cost的和。我们的目标是找到一个label X,比如disparity map,使得这个能量方程最小化。接下来我们分开来看data cost和smoothness cost。
Datacost主要指把label xi赋值给data yi造成的cost。对于正确的匹配,datacost很低。对错误的匹配datacost就很高。常用的衡量datacost的有差值绝对值的和,SSD等。
Smoothness cost确保相邻像素有相同的label。我们需要一个函数来惩罚相邻像素有不同label的情况。常用的函数有如下几种
Loopy Belief Propagation
因为图像中有很多像素,disparity value也有很多可能,所以很难找到MRF的精确解。LBP提供了一种方法来寻找近似解,类似的方法还有graph cut, ICM.不过LBP不保证convergence。
LBP是中用来传输信息的方法,当一个node收到了所有信息的时候,它就发给相邻node一个信息。下图展示了从x1传送到x2的过程。
x1首先需要从A,B,C,D接收到信息,然后才会给x2传输信息。x2不会返回给x1信息。准确来说信息的定义是
,表示从node i发送label l的信息给node j。换言之就是node i对node j属于label l的belief。这些信息只在隐藏变量之间传递。一个完整的信息包含所有可能的label。比如node i会给node j发送如下信息
hey node j,我认为你是label 0,概率是s0
hey node j,我认为你是label 1,概率是s1
。。。
Node i记载了所有关于node j的可能性。概率的计算取决于MRF。
LBP的第一步是初始化信息。因为node要等到所有相邻node都发送信息,这就变成了一个鸡生蛋蛋生鸡的问题,因为所有node都会等待其他node发送信息,实际上谁也没有发送任何东西。为了解决这个问题,我们把所有信息都初始化成一个常数,通常是0或1.
LBP主体算法是iterative的。如同其他iterative的算法,我们可以在一定循环次数后结束,或者到energy的变化小于一个阈值。在每个iteration,信息在MRF中传递。信息传递的次序是随机的。一旦这个过程结束,我们就可以根据每个node的belief计算这个node的label。
接下来我们一个个来看信息更新,初始化,和belief的步骤,和三个不同算法sum product,max product, min sum。
用于信息更新的sum product
![msg_{i \rightarrow j}\left( l \right) = \sum\limits_{l' \in \mbox{all labels}} \left[ \begin{array}{c} exp\left(-DataCost\left(y_i,l'\right)\right) exp\left(-SmoothnessCost\left(l,l'\right)\right) \times \\ \prod\limits_{k=\left( \begin{array}{c} \mbox{neighbours of i} \\ \mbox{except j} \end{array} \right)} msg_{k\rightarrow i}\left(l'\right) \end{array} \right] msg_{i \rightarrow j}\left( l \right) = \sum\limits_{l' \in \mbox{all labels}} \left[ \begin{array}{c} exp\left(-DataCost\left(y_i,l'\right)\right) exp\left(-SmoothnessCost\left(l,l'\right)\right) \times \\ \prod\limits_{k=\left( \begin{array}{c} \mbox{neighbours of i} \\ \mbox{except j} \end{array} \right)} msg_{k\rightarrow i}\left(l'\right) \end{array} \right]](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_uGBvUiV6hsvIH0lHhA6zR68Dsz3QHKxyk-oPmL93JaygtoXmjq0TSGBJWxDgIremUs-a2cHGARhfyrtneoGjJX151Hh9a9xE7ZhvPhBbF5-hlJvt8m47hcKclCjNvRPGc5hnFuD1ZHedaFCbKWWLu4H3FuM7gSwPcGnhZH9ktkJ0qW4nVFMi3d0PjAlSgP9mqTpaBmKtsqLpfgHJvK2wX3fMlrCWOepOYXvfeq15dxY4KUeY-5IKTokuq3emyjOTz2xXGB_YaighqAoZmMGoMsDbb44zgWV7FkvfAUIKyD9BXkkpTeJ3edU5VBun2CAb3jWkJzg4_-TP4pXLws-5JpR3TOo-iwgYj5twDQzQxhrYDKgORtJam1UEF1rjLgGur5E6d_hV6LWqcrADtIeXCognlFENDhIUMk_Vl6F2dDxEGw4JUBkq4k5JnEXjY0AKYhkfkWxI1oS2a6niS1b5ItZcsvaXBvI0AINL9OflCoJ0idGVhCsVMq4WWGwuPMe5LukCIjijUCrv4tO2cTGGe7Sa-dhXmRZFJ3F_e-PNwAtNVHaKv0KdDkqXMWfdZxgmRC_vZnRfrsiv408xhCAX9AT43kGNs7I-iM9WaVgF_3mdJ4U9gBHr2kCJcalkCo3UsDpZv_xxvINsZWnSIEOc5TR0Ab5CzqXCUeFN9xT_1ik0ni8Zy6GWPvHj9GUKr3x07g0QWWnO3s2HCP7FuYXRFIM08-6XouGarYPdxWm5l0BlL7Ad978fiSEXMrKoxiDLSWsYEHSlBmp9yh6nqv=s0-d)
等式左边表示从node i发到node j,关于label l的信息。右边的y表示图像像素。这里我们遍历所有的label,在disparity map中共有15种。因为有加和,内积的计算,所以叫sum product。这个算法用于概率的计算,所以要用exp函数把data cost, smoothness cost,转换到在0到1之间的概率,这个概率越大越好。在中括号里面的是data cost, smoothness cost对于label l的所有信息的joint probability. 中括号外面的加和是对概率在变量l上的marginalization.
一个完整的信息是一个矢量
![msg_{i \rightarrow j}=\left[ \begin{array}{c} msg_{i \rightarrow j}\left(0\right)\\ msg_{i \rightarrow j}\left(1\right)\\ msg_{i \rightarrow j}\left(2\right)\\{..} \end{array} \right] msg_{i \rightarrow j}=\left[ \begin{array}{c} msg_{i \rightarrow j}\left(0\right)\\ msg_{i \rightarrow j}\left(1\right)\\ msg_{i \rightarrow j}\left(2\right)\\{..} \end{array} \right]](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_u4kG6HPFO8okO_iHwNHGcPEkSz561R8ZT6dtl3Y30fGdCI1RY_RtMjFnkQqiWTKU8lDewR-W_bjeZze1hSo0YHfammIbHbIMlUCdmprq5OOlWE3WMZE2PoDUdMYtSqSmtlgwh7kPXXn8diYSV035935UEwNVPjnXvU_zQwcmR3Qos6Dj0h7RN3zi5eQXljQtlc7Hrnfygk35CAleWgp50r9ihBaOXVCy6A78lMu8zYKs3H-918xvUHmWYiZ5B2PicK5ZLlsorwelnwOIVKGZMyWH9YjV8hN19bdf4YOTACz2xrOtWzf4BLfS2VGxd-nFJcV6QvUH8zarDzjVEs8Tfm-MEhOB47hYnsSE783iMXwn7f7WYrO6tBCwu-X2ZSw8Q99EYeJd4qkJQyU6aLK_EMnJ2_sG3FUZOxBE9B7WL-Z_wU7DlNnwOuB-PwIgI6Ikw_yoykpfhNjCGafnfsc842Mcw=s0-d)
所以对于每个label都要遍历所有可能,复杂度就是O(L^2).
连续对概率做乘积的时候,很快就会接近0.为了避免这个情况,我们要把信息向量normalize

进行初始化的时候,所有信息的概率都设为1.每个node的belief是所有信息的乘积。

这是node i对于label l的belief。为了找到最合适的label,需要遍历所有label然后找到最高的belief。
用于信息更新的max product
sum product可以找到每个node的最佳label。但是总体来说并不一定是最优解。举例来说,假设有两个变量x,y
表格外边的是变量的marginal。如果用单独的marginal计算,我们会选择x=1, y = 0,得到P(x=1,y=0) = 0.4。但是最佳的解是p(x=0,y=0) = 0.5。我们最关心的是Joint probability。此类问题经常会在maximum a posteriori (MAP)求解中出现,因为这时我们想找到全局的最优解。max product在sum product的基础上做了一点点改变
![msg_{i \rightarrow j}\left( l \right) = \max\limits_{l' \in \mbox{all labels}} \left[ \begin{array}{c} exp\left(-DataCost\left(y_i,l'\right)\right) exp\left(-SmoothnessCost\left(l,l'\right)\right) \times \\ \prod\limits_{k=\left(\begin{array}{c} \mbox{neighours of i} \\ \mbox{except j} \end{array} \right)} msg_{k\rightarrow i}\left(l'\right) \end{array} \right] msg_{i \rightarrow j}\left( l \right) = \max\limits_{l' \in \mbox{all labels}} \left[ \begin{array}{c} exp\left(-DataCost\left(y_i,l'\right)\right) exp\left(-SmoothnessCost\left(l,l'\right)\right) \times \\ \prod\limits_{k=\left(\begin{array}{c} \mbox{neighours of i} \\ \mbox{except j} \end{array} \right)} msg_{k\rightarrow i}\left(l'\right) \end{array} \right]](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_tHdQlsQkXEMAwgi0w1c2x22UQcbq6Sj9BglGiUc5WNBzZ0VIvW5a-ady8YqTkb6v2qcOWugf-mMJhc23ytpvZHAHIgDbWpknOxCC-jdhWgxCl3aqIbaFMjjd0cfLTplwWM3eC8B6S4Lo-XiYnSZ6jmOD0LKdWn6Q2ULHF50s47lsm-G9KGOv_DNUZYK78Jp-siA4xJYAk-moIShhiVZVALUEewZWM9dN2ltaFEzXfAJ5qpmWeWNbCJhYzF9Ua951seO5in6w5LdWO8TgVYK1jWJsXmAJdjPTN9ZXo7SeHQuwV8AkHJusr-6rOmwMZUWsHlor3La-e7KFTPE0sL2Spo5GXnCkaGmeHXlj_ul4BYlFgaEOsl-oKpgIOs0oHs3A-Fl60qphEJ-3nf7387TkpwFNSGeyNFu4BJvOF73qwjzl5zC99G9c7Ck5OPIo0sUymY7b9oEIYz_dLnulKZBl-rN6HMxaogqRDVUyH_2BwMbD5BSz__YK5v5ICeZtY42o_y8Dzs2KUF25ZtB3-VMcfE5F9reh_buWao5TGyRjv19LZDkbqxhZI5XnUjZ3yqI8NM1tqCtkW9nen3q2CA3BMB5X_BRhMLWCYPY8mMDnaSPT5ai3tZ-dv_b6RQkHXYa2U11QPHaX-a65k1CKRR5-neGnf75toDRoI4mW7_isKEVgebJZXSjjOcCa3JjCGqUvJl0Z-qDlC3FC-7z38yFGAsizl_dc6nM8tuucqbTLm6pusiuELP6pfSvbdi7px3Mbpok4rhRR3QukwD=s0-d)
现在不再求和,而是计算marginal probability的最大值。
用来更新信息的min sum
和max sum相似,min sum也是计算每个node的max marginal,不过是在log space中。
![msg_{i \rightarrow j}\left( l \right) = \min\limits_{l' \in \mbox{all labels}} \left[ \begin{array}{c} DataCost\left(y_i,l'\right) + SmoothnessCost\left(l,l'\right) + \\ \sum\limits_{k=\mbox{neighours of i except j}} msg_{k\rightarrow i}\left(l'\right) \end{array} \right] msg_{i \rightarrow j}\left( l \right) = \min\limits_{l' \in \mbox{all labels}} \left[ \begin{array}{c} DataCost\left(y_i,l'\right) + SmoothnessCost\left(l,l'\right) + \\ \sum\limits_{k=\mbox{neighours of i except j}} msg_{k\rightarrow i}\left(l'\right) \end{array} \right]](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_vQm8iJOJeyTghfZ_XpeCmR8OdCE7Q1JcFECET-KgHa9bMWLjkpqyP2s1JOVJHn1zGEugAduDCHYxRKzaJ6RZHt-NZg7JyK50VelgjUw5RTGG3qO4tHJPKx5wHql2I9lmKF2CMnR9yOBQU8oxDjP9WK634wf3KETnuhg7wEbcUjYbKXyp0ceyMKnx7KDyIa8KNXsYVQ2_KVSMat3Sdzdh4zMDEnw--PldS2uYauzd-n1E7hgA_IdnkwTtfYy8Sncv5O5AxiaexkdgWrsDTOP3crohxpK9gbsAbVn3lpBLvWxiz4h16F6J0jMmhI4RZzRKtUtaFJE7KzBjEmiSVOVqf0qI-zge8DL4GDUIWBc0Xm5iSRUJsM97Y0e06Fbg_t3VSGpoO4-qFky-5gzkuzbGb5NFEWFHBPJ8GJZEOdIvblP4mM8RpS-VBgBcP3_Un-lTu3QqArMiBqX_jBTnGvZ6CYvs6dEumwsEIuRbx9N7hYVR_H17Uzdds8tsypPIYyArHUboBk5wMn5dSKJiwQ-eh5Hj7gDcIVE3W-qvJJk7Ckib2uLvYVMf544E0U-z1rk6QXdyVlhBrqd7g8WLfndyXAXMVi4GxR2Sr8vwZw=s0-d)
这是个求解最小值的问题。在初始化的时候所有的数值都是0. 这时的belief是
用于信息更新的sum product
等式左边表示从node i发到node j,关于label l的信息。右边的y表示图像像素。这里我们遍历所有的label,在disparity map中共有15种。因为有加和,内积的计算,所以叫sum product。这个算法用于概率的计算,所以要用exp函数把data cost, smoothness cost,转换到在0到1之间的概率,这个概率越大越好。在中括号里面的是data cost, smoothness cost对于label l的所有信息的joint probability. 中括号外面的加和是对概率在变量l上的marginalization.
一个完整的信息是一个矢量
所以对于每个label都要遍历所有可能,复杂度就是O(L^2).
连续对概率做乘积的时候,很快就会接近0.为了避免这个情况,我们要把信息向量normalize
进行初始化的时候,所有信息的概率都设为1.每个node的belief是所有信息的乘积。
这是node i对于label l的belief。为了找到最合适的label,需要遍历所有label然后找到最高的belief。
用于信息更新的max product
sum product可以找到每个node的最佳label。但是总体来说并不一定是最优解。举例来说,假设有两个变量x,y
| P(x,y) | x=0 | x=1 | |
| y=0 | 0.5 | 0.4 | P(y=0) = 0.9 |
| y=1 | 0.1 | 0.3 | P(y=1) = 0.4 |
| P(x=0) = 0.6 | P(x=1) = 0.7 |
现在不再求和,而是计算marginal probability的最大值。
用来更新信息的min sum
和max sum相似,min sum也是计算每个node的max marginal,不过是在log space中。
这是个求解最小值的问题。在初始化的时候所有的数值都是0. 这时的belief是
不过因为我们其实在找最小值,称它为cost更合适。
在这些方法中,min sum是最方便实现的,它没有exp函数,只有加和。如果用sum product的话,就要在exp里面加上scaling来避免underflow。eg. exp(-DataCost(…)*scaling) * exp(-SmoothnessCost(..)*scaling), scaling是 0 到1之间的数.
No comments:
Post a Comment