论文阅读《On Building an Accurate Stereo Matching System on Graphics Hardware》(AD Census-双目立体匹配)
论文地址:On Building an Accurate Stereo Matching System on Graphics Hardware
问题提出
基于SGM的方法速度快,但精度不高,基于PMS算法的精度高,但速度慢,为此提出一个在精度和速度取一个平衡的算法。AD-census算法将局部算法和版局部算法相结合,包含一下四个步骤:1、初始代价计算;2、代价聚合;3、扫描线优化;4、视差优化;
算法框架
1、初始代价计算
AD-Census结合了AD(Absolute Different)法和Census法来计算全图的初始匹配代价。
AD算法如式1所示:
CAD(p,d)=13∑i=R,G,B∣Iileft(p)−Iiright(pd)∣(1)C_{A D}(p, d)=\frac{1}{3} \sum_{i=R, G, B}\left|I_{i}^{left}(p)-I_{i}^{right}(p^{d})\right|\tag1CAD(p,d)=31i=R,G,B∑∣∣∣Iileft(p)−Iiright(pd)∣∣∣(1)
CAD(p,d)C_{A D}(p, d)CAD(p,d)表示左视图p点和视差为d时对应右视图pdp^{d}pd点之间三个颜色分量差的绝对值的平均值,若左右视图为灰度图像,则直接计算像素灰度值之差的绝对值。
Census算法是基于窗口计算局部特征的方法,分别计算左右窗口中邻域像素和中心像素的大小关系,展开为1维后使用汉明距离计算两个窗口之间的距离。窗口特征计算如式2所示:
Cs(x,y)=⨂i=−n′n′⨂j=−m′m′ξ(I(x,y),I(x+i,y+j))(2)C_{s}(x, y)=\bigotimes_{i=-n^{\prime}}^{n^{\prime}} \bigotimes_{j=-m^{\prime}}^{m^{\prime}} \xi(I(x, y), I(x+i, y+j))\tag2Cs(x,y)=i=−n′⨂n′j=−m′⨂m′ξ(I(x,y),I(x+i,y+j))(2)
上式表示计算(x,y)(x,y)(x,y)处,窗口大小为n′∗m′n^{\prime}*m^{\prime}n′∗m′的特征,其中,ξ(x,y)\xi(x, y)ξ(x,y)如式3所示:
ξ(x,y)={0if x≤y1if x>y(3)\xi(x, y)=\left\{\begin{array}{ll} 0 & \text { if } x \leq y \\ 1 & \text { if } x>y \end{array}\right.\tag3ξ(x,y)={01 if x≤y if x>y(3)
census算法基于汉明距离计算点(x,y)(x,y)(x,y)和视差为d的右视图点(x−d,y)(x-d, y)(x−d,y)的匹配代价如式4所示:
C(x,y,d)=Hamming(Csl(x,y),Csr(x−d,y))(4)\mathrm{C}(x, y, d)=\operatorname{Hamming}\left(C_{s l}(x, y), C_{s r}(x-d, y)\right)\tag4C(x,y,d)=Hamming(Csl(x,y),Csr(x−d,y))(4)
Census算法基于窗口内的相对亮度差计算匹配代价,对左右视图光照不一致和噪声具有较强的鲁棒性,对弱纹理区域也具有较好的效果,但Census算法对于重复的纹理区域会产生歧义,而AD算法是基于单像素邻域亮度来计算匹配代价,可以在一定程度上缓解重复纹理的歧义性问题。
AD-Census算法将AD算法和Census算法结合,为了解决尺度不一致问题(AD算法基于亮度差,范围为[0-255],Census算法基于汉明距离,范围为[0, N], N为窗口中心点的邻域元素个数),需要将两个代价归一化到同一个区间内,如式5所示:
C(p,d)=ρ(Ccensus(p,d),λcensus)+ρ(CAD(p,d),λAD)(5)\begin{aligned} C(\mathbf{p}, d)=& \rho\left(C_{c e n s u s}(\mathbf{p}, d), \lambda_{c e n s u s}\right)+ \rho\left(C_{A D}(\mathbf{p}, d), \lambda_{A D}\right) \end{aligned}\tag5C(p,d)=ρ(Ccensus(p,d),λcensus)+ρ(CAD(p,d),λAD)(5)
其中归一化函数ρ(c,λ)\rho(c, \lambda)ρ(c,λ)如式6所示,其中λ\lambdaλ为控制参数,将AD算法算出的结果和Census算法算出的结果都归一化到[0, 1]的范围内,C(p,d)C(p, d)C(p,d) 的范围为 [0, 2]。
ρ(c,λ)=1−exp(−cλ)(6)\rho(c, \lambda)=1-\exp \left(-\frac{c}{\lambda}\right)\tag6ρ(c,λ)=1−exp(−λc)(6)
AD-Census效果如图1:
2、十字交叉域代价聚合
十字交叉域代价聚合在论文《Cross-Based Local Stereo Matching Using Orthogonal Integral Images》中提出,这种代价聚合方式基于相邻颜色相近的像素视差值相似的假设,CBCA的目标是找到像素p周围和p像素颜色相近的像素集合,并使用像素集求p点的聚合代价。原始的十字交叉域代价聚合包含两个步骤:1、十字交叉域构造(cost construction)2、支撑区域代价聚合(cost aggregation)
(1)十字交叉域构造
十字交叉域表示每个像素都有一个十字臂,臂上的所有像素颜色(亮度)和该像素颜色(亮度)相近。基于p点构建十字交叉域时,确定上下左右四点的十字骨架,由像素相似性来确定骨架长度,骨架满足尽可能长,且骨架内的像素和p点的像素差值不超过设定的阈值。同理,由p沿着竖向骨架遍历q点产生横臂。其构造方式瞒住两个规则:
- 像素的十字臂以像素为中心往左右及上下延伸,碰到颜色(亮度)和该像素差别大于 τ\tauτ 时停止延伸。
- 臂长度小于设定的最大长度 LLL 。
其中颜色差异衡量如式7所示:
Dc(pl,p)=maxi=R,G,B∣Ii(pl)−Ii(p)∣(7)D_{c}\left(p_{l}, p\right)=\max _{i=R, G, B}\left|I_{i}\left(p_{l}\right)-I_{i}(p)\right|\tag7Dc(pl,p)=i=R,G,Bmax∣Ii(pl)−Ii(p)∣(7)
距离差异衡量如式8:
Ds(pl,p)=∣pl−p∣(8)D_{s}\left(p_{l}, p\right)=\left|p_{l}-p\right|\tag8Ds(pl,p)=∣pl−p∣(8)
当目标像素p的十字交叉臂构建完成后,基于十字交叉臂构建支撑区域:
遍历十字交叉臂的竖直臂上的点q,基于每个q构建横臂H(q)H(q)H(q),所有H(q)H(q)H(q)的并集的点记为p点的支撑区域(support region)。
(2)支撑区域代价聚合
当像素p的支撑区域构造完之后,对不同的视差d层,分两步进行代价聚合:
- 对十字臂上所有像素,将其水平臂上的像素代价值相加,存储为临时值;
- 对十字臂上所有像素,将其竖直臂上的像素在第一步存储的临时值相加,得到该像素最终的聚合代价值,为了消除支撑区域大小对聚合代价值的影响,将聚合代价除以支撑域的总像素数,一般迭代4次,得到较好的效果。
(3)AD-Census改进版十字交叉域构造
十字交叉域构建过程中,颜色差异阈值 τ\tauτ 和最长臂长阈值 LLL 起着决定性作用,在大的弱纹理区域,需要使用更大的 LLL 和 τ\tauτ 值来得到邻域中更多的信息的像素,让结果更稳健 ,但简单增大 LLL 和 τ\tauτ 会在视差非连续区域带来更多的噪声。基于此,AD-Census改进的规则如下(以左臂延伸为例):
- Dc(pl,p)<τ1and Dc(pl,p1+(1,0))<τ1D_{c}\left(p_{l}, p\right)<\tau_{1} \text { and } D_{c}\left(p_{l}, p_{1}+(1,0)\right)<\tau_{1}Dc(pl,p)<τ1 and Dc(pl,p1+(1,0))<τ1
- Ds(pl,p)<L1D_{s}\left(p_{l}, p\right)<L_{1}Ds(pl,p)<L1
- Dc(pl,p)<τ2,if L2<Ds(pl,p)<L1,S.T.τ2<τ1andL2<L1D_{c}\left(p_{l}, p\right)<\tau_{2}, \text { if } L_{2}<D_{s}\left(p_{l}, p\right)<L_{1},\quad S.T.\;\; \tau_{2}<\tau_{1}\quad and\quad L_{2}<L_{1}Dc(pl,p)<τ2, if L2<Ds(pl,p)<L1,S.T.τ2<τ1andL2<L1
规则1增加了前向扩展过程中,相邻像素的差异不能大于阈值 τ1\tau_{1}τ1避免扩展过程中穿过边缘像素。规则2中的 L1L_{1}L1 比原来的 L更大,使得在弱纹理区域可以包含很大的区域,但增加了规则3来限制,当阈值大于距离阈值 L2L_{2}L2 时小心地拓展,需要满足颜色差异小于更小的颜色阈值 τ2\tau_{2}τ2 时才能继续扩展臂长,但臂长要限定在 L1L_{1}L1内。改进后的规则可以避免臂的延伸穿过边缘像素,同时使弱纹理有更长的臂同时又不会让所有像素的臂过长。
(4)AD-Census改进版代价聚合
原来的代价聚合迭代4次,都是先对水平方向进行求和,再对竖直方向进行求和。而AD-Census中,在奇数迭代次数中先横向求和,再竖向求和;在偶数迭代次数中先竖向求和,再横向求和,如此交替进行,会得到更加鲁棒的聚合结果。
3、扫描线优化
AD-Census学习了SGM的代价聚合方式,想要进一步提高代价的准确性,减少匹配错误(在SGM中此步骤称为代价聚合),优化的方向为4个方向,左右上下。像素p沿着r方向的优化公式如式9所示:
Cr(p,d)=C1(p,d)+min[Cr(p−r,d)Cr(p−r,d−1)+P1Cr(p−r,d+1)+P1miniCr(p−r,i)+P2]−minkLr(p−r,k)(9)C_{r}(p, d)=C_{1}(p, d)+\min \left[\begin{array}{c} C_{r}(p-r, d) \\ C_{r}(p-r, d-1)+P_{1} \\ C_{r}(p-r, d+1)+P_{1} \\ \underset{i}{\min} C_{r}(p-r, i)+P_{2} \end{array}\right]-\min_{k} L_{r}(p-r, k)\tag9Cr(p,d)=C1(p,d)+min⎣⎢⎢⎡Cr(p−r,d)Cr(p−r,d−1)+P1Cr(p−r,d+1)+P1iminCr(p−r,i)+P2⎦⎥⎥⎤−kminLr(p−r,k)(9)
其中r表示路径聚合方向上单位步长,p−rp-rp−r 表示路径上前一个像素。第一项为匹配代价,属于数据项;第二项是平滑项,Cr(p−r,d)C_{r}(\mathrm{p}-\mathrm{r}, d)Cr(p−r,d) :表示如果路径上前一个像素的最优视差和当前像素的最优视差相同,则不加惩罚;Cr(p−r,d−1)+P1和Cr(p−r,d+1)+P1C_{r}(\mathrm{p}-\mathrm{r}, d-1)+P_{1}和C_{r}(\mathrm{p}-\mathrm{r}, d+1)+P_{1}Cr(p−r,d−1)+P1和Cr(p−r,d+1)+P1 :表示如果路径上前一个像素的最优视差和当前像素的最优视差相差1,则做P1P_{1}P1惩罚、miniCr(p−r,i)+P2\min _{i} C_{r}(\mathrm{p}-\mathrm{r}, i)+P_{2}miniCr(p−r,i)+P2:表示表示如果路径上前一个像素的最优视差和当前像素的最优视差相差大于1,则做P2P_{2}P2惩罚,取三者中的最小值;第三项是为了保证新的路径代价不超过数值上限。
AD-Census在 P1和P2′P_{1} 和 P^{\prime}_{2}P1和P2′ 的设定上进行改进,在SGM中,这两个值是预设的固定值,式9中所用的P2P_{2}P2是根据P2=P2′Ip−IqP_{2}=\frac{P^{\prime}_{2}}{I_{p}-I_{q}}P2=Ip−IqP2′自适应调整的。而在AD-Census中, P1和P2P_{1} 和 P_{2}P1和P2 不只与左视图的相邻像素点之间的颜色(灰度)差D1=Dc(p,p−r)D_{1}=D_{c}(p, p-r)D1=Dc(p,p−r)有关,还与右视图对应同名点 pdp_{d}pd 的相邻像素颜色(灰度)差D2=Dc(pd,pd−r)D_{2}=D_{c}(p_{d}, p_{d}-r)D2=Dc(pd,pd−r)有关。具体规则如下:
- P1=Π1,P2=Π2,ifD1<τSOandD2<τSOP_{1}=\Pi_{1}, \;\;\;\;\;P_{2}=\Pi_{2} ,\;\;\;\;\; \;if \;D_{1}<\tau_{S O} \;and\;D_{2}<\tau_{S O}P1=Π1,P2=Π2,ifD1<τSOandD2<τSO
- P1=Π1/4,P2=Π2/4,ifD1<τSOandD2>τSOP_{1}=\Pi_{1} / 4, \;\;P_{2}=\Pi_{2} / 4 ,\;\; if \;D_{1}<\tau_{S O}\;and\; D_{2}>\tau_{S O}P1=Π1/4,P2=Π2/4,ifD1<τSOandD2>τSO
- P1=Π1/4,P2=Π2/4,ifD1>τSOandD2<τSOP_{1}=\Pi_{1} / 4,\;\; P_{2}=\Pi_{2} / 4 ,\;\; if \;D_{1}>\tau_{S O}\;and\;D_{2}<\tau_{S O}P1=Π1/4,P2=Π2/4,ifD1>τSOandD2<τSO
- P1=Π1/10,P2=Π2/10,ifD1>τSOandD2>τSOP_{1}=\Pi_{1} / 10, P_{2}=\Pi_{2} / 10 ,\; if \;D_{1}>\tau_{S O}\;and\;D_{2}>\tau_{S O}P1=Π1/10,P2=Π2/10,ifD1>τSOandD2>τSO
其中,Π1、Π2\Pi_{1}、\Pi_{2}Π1、Π2为设定的固定阈值,τSO\tau_{S O}τSO为设定的颜色差阈值。四条规则分别代表什么意义?首先明确,P1和P2P_{1}和P_{2}P1和P2是在路径前一个点取最小代价的视差值和当前点的视差值相差1以上时才给于惩罚(相邻点视差值应该相似,但是现在路径上一个点和当前点的视差值不一致,所以要给予惩罚)。
- 规则1表示,该点在左右视图上和路径上前一个点的颜色差异都很小,理论上前一个点和当前点的应该处于同一个视差平面,视差应该一样。但是很违背常理,前一个点和当前点的视差相差1以上,所以 P1和P2P_{1}和P_{2}P1和P2 给个最大的惩罚。
- 规则2和3表示,该点在左右视图的同名点中有一个点和路径上前一个点的颜色差异很小,另一个点和前一个点的差异挺大,说明有一定的概率这个点可能是边缘点,所以视差有差异是可以原谅的,所以给的惩罚比规则1的小。
- 规则4表示,该点在左右视图上,都与路径上前一个像素点的颜色差异很大,说明大概率这个点是边缘点,所以大概率视差有差异的,是正常状况,所以给个较小的惩罚。
最后,四个方向的优化代价取平均值,赋给像素p,如式10所示:
C2(p,d)=14∑rCr(p,d)(10)C_{2}(\mathbf{p}, d)=\frac{1}{4} \sum_{\mathbf{r}} C_{\mathbf{r}}(\mathbf{p}, d)\tag{10}C2(p,d)=41r∑Cr(p,d)(10)
4、视差优化
(1)离群点检测(Outlier Dectection)
这里的离群点检测就是左右一致性检查,将不匹配点分为遮挡区域(occlusion region)和误匹配区域(mismatch region)。
(2)局部迭代投票(Iterative region Voting)
对于无效像素p的十字交叉支撑域内所有可靠像素,统计[0,dmax][0, d_{max}][0,dmax]范围视差分布直方图 HpH_{p}Hp(直方图高度为像素个数),数量最多的视差值记为 dp∗d^{*}_{p}dp∗,可靠像素数量记为 SpS_{p}Sp。如果可靠像素的数量足够多,且得票最多的视差值得票足够多,则把 dp∗d^{*}_{p}dp∗ 赋值给p像素。即如式11所示:
dp:=dp∗ifSp>τSandHp(dp∗)Sp>τH(11)d_{p} := d^{*}_{p}\;\;\;if\;S_{\mathbf{p}}>\tau_{S}\;and\; \frac{H_{\mathbf{p}}\left(d_{\mathbf{p}}^{*}\right)}{S_{\mathbf{p}}}>\tau_{H}\tag{11}dp:=dp∗ifSp>τSandSpHp(dp∗)>τH(11)
式中,τS和τH\tau_{S}和\tau_{H}τS和τH为预设的阈值,以上步骤迭代5次,每次迭代成功赋值的像素p设置为可靠像素,为下一轮迭代提供有效的视差值。
(3)Proper Interpolation(视差填充)
对于保留下来的无效像素p,在一定范围内沿周围16个方向搜索最近的可靠像素的视差值:对于遮挡区域像素p,选择所有搜索到的可靠像素的视差中最小的值(因为遮挡像素一般在背景,背景离相机远,也就是视差小)。对于误匹配像素p,在搜索到的可靠像素的集合中选择和p颜色最相近的像素的视差赋值给p;经过(2)和(3)的实验结果如下图所示:
(4)视差非连续区域调整(Depth Discontinuity Adjustment)
此步的目的是进一步优化视差非连续区域的视差值。
- 对视差图做边缘检测。
- 对于边缘上的像素p,其视差值为 DpD_{p}Dp,记录其左右两边像素 pl和prp_{l}和p_{r}pl和pr 的视差值 Dpl和DprD_{p_{l}}和D_{p_{r}}Dpl和Dpr ,如果该边缘点左右两点的视差对应的匹配代价比边缘点对应视差的匹配代价小,则用最小的匹配代价的点的视差来替代边缘点的视差。也就是对边缘上的像素值进行微调,选择左右两边使其代价更小的那个视差值。实验结果如下图所示:
(5)子像素优化(sub-pixel Enhancement)
子像素优化用一元二次拟合。如式11所示:
d∗=d−C2(p,d+)−C2(p,d−)2(C2(p,d+)+C2(p,d−)−2C2(p,d))(11)d^{*}=d-\frac{C_{2}\left(\mathbf{p}, d_{+}\right)-C_{2}\left(\mathbf{p}, d_{-}\right)}{2\left(C_{2}\left(\mathbf{p}, d_{+}\right)+C_{2}\left(\mathbf{p}, d_{-}\right)-2 C_{2}(\mathbf{p}, d)\right)}\tag{11}d∗=d−2(C2(p,d+)+C2(p,d−)−2C2(p,d))C2(p,d+)−C2(p,d−)(11)
式中d=DL(p),d+=d+1,d−=d−1d=D_{L}(p), d_{+}=d+1, d_{-}=d-1d=DL(p),d+=d+1,d−=d−1。
论文阅读《On Building an Accurate Stereo Matching System on Graphics Hardware》(AD Census-双目立体匹配)相关推荐
- 论文阅读笔记:《PatchMatch Stereo - Stereo Matching with Slanted Support Windows》
论文下载: PatchMatch Stereo - Stereo Matching with Slanted Support Windows 摘要 1.1 思路 像素区域可以用近似的平面来模拟. ( ...
- 【论文阅读记录】Real-Time Correlative Scan Matching
这篇文章是谷歌的Cartograph中实现real_time_correlative_scan_matcher的论文 Real-Time Correlative Scan Matching Edwin ...
- 论文阅读:Interpretable and Accurate Fine-grained Recognition via Region Grouping
Interpretable and Accurate Fine-grained Recognition via Region Grouping 通过区域分组实现可解释且准确的细粒度识别.根据,特征图获 ...
- 论文阅读 之 Person Search by Multi-Scale Matching
1. 论文研究的主要问题 文章认为多尺度匹配问题是行人搜索任务中的重要挑战.行人检索不同于行人重识别,行人检索是在一个没有限制的场景下检索行人,考虑到自动检索行人的需求,行人的检测框可能是包含错误结果 ...
- 论文阅读笔记《SuperGlue:Learning Feature Matching with Graph Neural Networks》
核心思想 本文提出一种基于图神经网络的特征点匹配方法,把图像中的特征点看作图的节点,通过注意力机制聚合特征信息,得到用于匹配的特征向量.然后把匹配问题看作一个可微的最优运输问题(different ...
- 论文阅读:How Does NLP Benefit Legal System:A Summary of LAI如何使用NLP技术帮助法律智能:关于法律智能的综述
How Does NLP Benefit Legal System:A Summary of Legal ArtificialIntelligence Intelligence 如何使用NLP技术帮助 ...
- 论文阅读:Fast-adapting and Privacy-preserving Federated Recommender System
论文名字 Fast-adapting and Privacy-preserving Federated Recommender System 来源 未发表 年份 2021.4.9 作者 Qinyong ...
- 论文阅读:SUPER: A Novel Lane Detection System
文章目录 1.全文翻译:SUPER:一种新型车道检测系统 一.介绍 A.动机和文献综述 B.贡献 二.分层场景理解 A.层次语义分割 B.多级分类器设计 C.训练策略 三.物理驱动的多车道拟合 A.车 ...
- 【DeepSketch2Face论文阅读】A Deep Learning Based Sketching System for 3D Face and Caricature Modeling
这篇文章是香港大学韩晓光老师等人在SIGGRAPH 2017的工作,创建了一个业余者也可以创建3D Face或漫画模型的系统. CV上目前存在许多场景,包含卡通角色,社交媒体上的虚拟形象,3D Fac ...
最新文章
- Python---常见问题
- Fibbonacci Number(杭电2070)
- linux 下的文件搜索、可执行文件搜索
- nginx: [emerg] mkdir() /var/temp/nginx/client failed (2: No such file or directory)
- 4.3.2深度定时任务(TimerTask in Depth)
- 了解Binder机制原理和底层实现
- sublime livereload插件
- 即拿即用-Android单线程断点下载
- 阿里云储存OSS(服务端签名后前端直传)
- teraterm 执行sql命令_捆绑你的操作(windows tera term高阶用法之并行处理)
- Java使用while循环计算调和数列的和并打印
- python开发面试自我介绍_面试中怎样做一个精彩的自我介绍
- MAC 下ifconfig看IP
- Power Pivot数据建模与数据汇总分析
- OTP单片机AD单片机FLASH开发之义隆应广九齐仿真器
- c语言放空一个数组,数组越界真可怕,莫名就闯到了别人家
- 创建一个Customer类,类中的属性有姓名(name)、年龄(age)、性别(gender),每一个属性分别有get/set方法。然后创建两个customer对象:张立、18、女和王猛、22、男。把
- 全国各省份名义GDP、实际GDP、GDP平减指数(以2008年为基期,2008-2018年)
- TypeError: 'str' object cannot be interpreted as an integer
- 你的春节放假通知邮件发送了吗?邮件自动回复设置
热门文章
- LIRA: Learnable, Imperceptible and Robust Backdoor Attacks 论文笔记
- make m mm mmm 的区别
- 我的 2019 年终总结
- 『LeetCode|每日一题』---->小行星碰撞
- 复旦大学白悦辰课题组诚聘博士后、科研助理
- 医用计算机基础超星答案,超星2017大学计算机基础答案(全)
- 「深度学习一遍过」必修17:基于Pytorch细粒度分类实战
- python 将函数标准输出存至变量问题
- Python中将True/False 转换成 1/0 的方法
- 带灯LED按钮开关接线方法