PatchMatch

一、前言

在计算机视觉领域图像或者像素的匹配是一个非常基础而又重要的问题,比如在目标检测,目标跟踪,SLAM(Simultaneous localization and mapping),图像修复,超分辨等中都有应用。以SLAM为例,传统视觉SLAM主要分成两个流派,一个是基于特征的点的,一个是基于像素灰度值。其中基于特征点的这一流派的主要框架是提取相邻图像的特征点(SIFT,ORB等),计算描述子,根据描述子的距离找到相邻两帧之间的匹配点,根据匹配点我们一般可以构造重投影误差,这个误差函数中待求解的变量就是相邻帧之间相机位姿的变换矩阵(一般为4×4的齐次矩阵)。当然一般SLAM还有后端优化,这里我们就不在赘述了。
可以看出特征点的匹配质量对SLAM目标函数的优化结果至关重要,而特征点的匹配质量又与特征点位置的选取和特征点描述子质量有关。特征点位置的选取一般根据图像的梯度选择,描述子一般是人工设计的计算过程,会根据特征点周围的像素计算得到一个特定长度的向量。随着深度学习席卷各个研究领域,有很多人开始考虑用深度学习技术替换传统人工设计计算描述的方法。
关于描述子的深度学习计算方法根据使用的数据可以分为两类,分别是3D数据Match方法和2D图像数据Match方法。这两类方法有一个共同点是都把目标点周围的邻域信息连同目标点一块输入网络训练和测试,这一小块信息我们可以把他称之为patch,又因为我们用这些patch主要去完成match的任务,所以我们可以将这里问题称之为PatchMatch问题。
本片文章主要介绍一下几篇文章:
3D数据Match方法:
Andy Zeng,3DMatch: Learning Local Geometric Descriptors from RGB-D Reconstructions, CVPR2017 (http://3dmatch.cs.princeton.edu)
2D数据Match方法:
1. Sergey Zagoruyko, Learning to Compare Image Patches via Convolutional Neural Networks,CVPR2015 (http://imagine.enpc.fr/~zagoruys/deepcompare.html
2. Edgar Simo-Serra, Discriminative Learning of Deep Convolutional Feature Point Descriptors,ICCV2015
3. Iaroslav Melekhov, Image Patch Matching Using Convolutional Descriptors with Euclidean Distance, ACCV2016

二、3DMatch(3DMatch: Learning Local Geometric Descriptors from RGB-D Reconstructions, CVPR2017)

这篇论文是CVPR2017的口头报告,主要的贡献是:1、提供了一个在3D数据上计算描述子的方法;2、提供了产生patch pair的方法,这里的patch有3D,也有2D;3、作者公开了这个数据库,而且允许大家提交自己的描述子计算方法,并比较。
首先我们先简述作者产生patch pair的方法,作者利用SFM(Structure from Motion)技术使用大量图片可以重建出场景模型,随机的在场景中找一些兴趣点,这些兴趣点肯定是被一些帧可以观测到的。从这些观测帧中我们过滤处一些帧,过滤的方法是:这些帧之间的baseline大于1米。然后再在这些观测帧中随机选择两个相机位姿,我们再以这个兴趣点为中心截取一小块点云,将这一小块点云向相机投影便可以得到深度图。以这个兴趣点所对应的图像上的点为中心可以提取一个小的patch,这样我们就可以得到一个match的patch pair。制作non-match patch pair的方式就是随机选择两个兴趣点,随机向他的观测帧投影,就可以得到深度图patch和彩色图patch了。
这篇论文中并没有使用深度图和彩色图,只使用了3Dpatch。原始的3Dpatch是一小块点云,作者将这一小块点云用TDF(Truncated Distance Function)表示。没有使用像KinectFusion那样的TSDF(Truncated Signed Distance Function),作者认为the TDF loses the distinction between free space and occluded space, but gains a new property that is crucial to the robustness of our descriptor on partial data: the largest gradients between voxel values are concentrated around the surfaces rather than in the shadow boundaries between free space and occluded space. Furthermore, the TDF representation reduces the ambiguity of determining what is occluded space on 3D data where camera view is unavailable.通过阅读源码发现,作者将surface表示为一,没有surface的地方根据与surface的距离由一向零递减,而且零是截断值,也就是小立方体内的值不会比零小。
作者设计的网络结构比较简单,如下图:
这里写图片描述
作者使用了两个结构相同的网络,每一个网络成为一个branch,并且共享权值,这种网络称之为siamese net。每一个branch输出一个512维的向量,作者使用L2范数作为网络的目标函数,当输入的是match pair时就使得L2范数小,当输入non-match pair时就使得L2范数大。
具体的训练过程我没读懂论文的那一部分,但是通过阅读源码,我发现作者在训练的时候,同时往网络里送入3个patch,分别记为A,B,C。A和B是match pair,A和C是non-match pair,也就是所在训练的时候同时存在3个branch。作者在论文中也说了,他使用的match和non-match比例为1:1.这篇论文的重点在于怎么计算描述子,而不是怎么选择特征点,所以在实验部分作者只是随机的选择一些点(3为点云中),然后提取3Dpatch,再计算描述子。根据描述子寻找匹配点,然后使用RANSAC方法计算两个点云之间的变换矩阵。比较神奇的是,相邻帧每一帧对应的点云中点的个数在10万这个数量级,源码中随机选择了500个,任然根据匹配结果可以计算出一个相对比较的变换。
作者在实验部分有两个讨论:
1、为什么使用3D数据,而没有使用2D的深度图。
原因有两个:TDF可以容易的从mesh和点云转换;this 3D representation allows reasoning over real-world spatial scale and occluded regions, which cannot be directly encoded in 2D depth patches。而且作者通过实验证明了TDF的效果要比直接使用深度图效果好
2、最后一层使用L2范数还是使用一个全连接的逻辑输出
作者实验表明使用全连接效果提高了两个百分点,但是当我们在测试的时候,就不能直接使用每个branch的得到的feature向量,进而不能使用kd-tree,这样就会导致特征向量查找效率低。因为如果使用全链接我们就需要所有patch两两计算,这样计算复杂度就为 O(n^2) 。经过权衡所以目标函数选择L2范数
我自己现在遇到的问题是:如果使用全连接,那么每个branch输出的特征向量应该怎么拼接?可选的方法有两个向量拼接,两个向量做差(欧氏距离,绝对值)。当两个特征向量做差时候,网络训不动(Loss不减小)。只用特征向量直接拼接的方法,训练效果也不好。

三、CompareImagePathes(Learning to Compare Image Patches via Convolutional Neural Networks,CVPR2015 )

这篇论文的主要贡献是对多种网络结构效果进行了比较,提出了一种多分辨率的网络。
首先,作者简述了三种基本的网络模型:siamese,pseudo-siamese,2-channel
这里写图片描述
siamese网络和3DMatch中的意思一样,一个网络中有两个branch网络,而且网络的结构相同。这里作者有将其分成了两类,当两个branch之间共享网路结构和参数时称为siamese,不共享是称为pseudo。将两个patch叠成2通道patch输入的网络为2-channel。
作者提出的多分辨网络结构(称为Central-surround two-stream network)如下图,两个patch,分别以patch的中心截取一个更小的patch(64->32),然后输入到网络中。这里的网络可以选择上面三种网络的任意一种。再将原始的patch下采样(64->32),之后再输入网络,一般网络的选择应和小patch的网络一样。这个网络的最后有一个二分类全连接,用于指示patch相似还是不相似。
这里写图片描述
下来就是网络的训练,目标函数为:
这里写图片描述
学习率:1.0,momentum:0.9,weight decay:0.0005,batch size:128. 最后作者通过实验证明了2ch-2stream效果是最好的,siamese类效果稍差的原因是太多人工干预

四、DeepConvlutionalFeature(Discriminative Learning of Deep Convolutional Feature Point Descriptors,ICCV2015)

作者直接使用L2范数最为目标函数训练网络,网络采用siamese net架构。
这里写图片描述
目标函数如下:
这里写图片描述
数据库是Multi-view Stereo Correspondence dataset (MVS),patch size为64*64.值得一提的是作者在训练网络的时候将正负样例分开,先用正样例训练网络,之后再用负样例训练网络

五、ImagePatchMatching( Image Patch Matching Using Convolutional Descriptors with Euclidean Distance, ACCV2016)

作者同样使用siamese net架构,如下图:
这里写图片描述
目标函数依然使用的是L2范数,只不过作者将L2范数和样本的标签结合到了一块,但是没有加入正则项。
这里写图片描述
将L2范数和样本的标签同时写入目标函数中就不用正负样例分开训练网络了。学习率:0.01,weight decay:0.001,mini-batch:100,优化方法:SGD。当然作者也使用了一些数据增强的方法。
作者用了一个挺有意思的特征向量距离的表现方式,如下图:
这里写图片描述
相应的解释在图中有,我自己觉得这种表现方式挺直观的。作者在论文中也提一下margin的大小选择,就是式子1中的m,m应该为特征向量平均欧式距离的两倍。

六、总结

这几种使用深度学习计算描述子的方法,从作者的实验来看,都比传统的描述子质量好。而且GPU越来约普及,神经网络在GPU上可以很快的完成计算,基本可以满足实时性的需求。但是这几种方法的思想都非常类似,都是使用CNN网络提取patch的特征,但是在CNN提取patch特征的过程没有任何联系(也许siamese的权值共享算一种联系)。另外,直接输入数据的这种端到端的训练,数据处理(某种新的表示方式)后再训练网络,到底哪一种更好一些?同时使用RGB和depth数据效果是不是会更好一些?