L2-Net 论文详解

L2-Net

本文提供了相应的代码,是基于 matconvnet,论文的思路相对来说比较简单,可以使用 pytorch 或者 tersorflow 等框架复现。

主要思路

之前有 SIFT 等手工设计的 patch 特征,这里提出的 L2-Net 的方法,利用 CNN 方法在 Euclidean 空间学习 patch 特征。本文主要的工作包括:

  1. 提出递进的采样策略,可以保证网络在很少的 epochs 就可以访问到数十亿的训练样本。
  2. 重点关注 patch 特征之间的相对距离,就是匹配上的 patch pair 距离比未匹配上的 patch pair 距离更近。
  3. 对学习过程中间的 feature maps 进行额外的监督。
  4. 同时会考虑特征的 compactness(紧凑程度)。

利用网络输出特征向量后,用 L 2 L_{2} L2 距离当做在 Euclidean 空间的相似程度。而且这个和传统特征是完全一致的,这样在很多方法里面可以直接用 L2-Net 的特征进行替换。

本文的主要目的是输出 patch 对应的 128d 的特征向量,而不去关注 metric 的学习,有了特征向量后直接利用 L 2 L_{2} L2 来度量相似度,简单来说就是在特征空间里面进行 nearest neighbor search (NNS) 查找最近的 patch 作为匹配结果。本文的关注的只要 matching pairs 都互为最近邻即可,而实际距离的大小和量级不需要太过关心,也就是只关注相对距离。这算是本文的核心思路吧,后面 training batch 构建以及网络结构和 loss 涉及都和这个思路相关。

基本流程

网络架构

本文 L2-Net 整体的网络架构如下图所示:

L2-Net

左图是基本架构,其中利用的是全卷积网络,同时 feature map 降维是利用卷积层的 stride 设置为 2 实现的。每个卷积后面都跟着一个 BN 层,但是该 BN 层的参数不会在训练过程中去更新(w和b固定为1和0)。网络最后使用 Local Response Normalization (LRN) 层输出一个单位特征向量。

其中输入是 32 × 32 32 \times 32 32×32 大小的 patch,输出是 128d 的特征向量。

同时参考 DeepPatchMatchDeepCompare ,实现了 central-surround (CS) L2-Net,如上面右图,左边分支输入是原始的 patch,右边分支输入是在原始 patch 基础上中间 crop 然后 resize 到同样大小,然后经过同样的网络,把最后特征向量拼接在一起,得到最后的特征向量。

CS 这种操作的好处是为了处理特征 scale 不变性的问题,但是有个疑问就是 CNN 框架是也可以处理这种 scale 情况的,估计是效果不太好。

训练数据和预处理

本文训练数据使用的是 BrownHPatches,是在不同的场景下采集的。但是组织方式一致,如下:

  1. 每个 patch 都有独一无二的 3D 点的 index 属性,如果 patches 的该属性一致,则认为具有匹配关系;
  2. 当然对于每个 3D 点,至少有两个相关的匹配的 patches;

其中 Brown 数据集包含 Yosemite, Notredame, and Liberty 三个子集,通常情况都是一个子集用来 train,其他两个用于 test。

其中 HPatches 数据集被分成 train-hard (easy) -viewpoint 和 train-hard (easy) -illum 四个子集,表示不同的 view 和 光线的变化程度。HPatches 只当做 train 数据集。

其中 Brown 数据包含 500K (1.5M) 个 3D 点,HPatches 包含 190K (1.2M)个 3D 点。

实际训练时每个 patch 直接 resize 到 32 × 32 32 \times 32 32×32,同时对每个 pixel 做 mean 和 scale 的 norm 操作。

递进采样策略

首先在 patch matching 的问题上,负样本数量要远远高于正样本,一对匹配的 patch pair,除了互相匹配之外,其中每个 patch 和数据库中的除这两个之外的 patch 都可以组成负样本,这就导致很难在训练过程中遍历所有的负样本,所以需要一个好的采样策略。

之前的工作都是采样相同数目的正负样本,本文的递进采样策略则会采样更多的负样本。具体采样过程如下:

在训练数据集中有个 P P P 个 3D 点,首先选择其中的 p 1 p_{1} p1 个点,按照顺序遍历所有的 3D 点,然后从余下的 P − p 1 P- p{1} Pp1 个 3D 点随机选取 p 2 p_{2} p2 个点, p 2 p_{2} p2 3D 点的选取增加了数据的 random, p 1 + p 2 p_{1} + p_{2} p1+p2 当做每个 training batch 选择的 3D 点。

然后为了得到最终的 training batch,对 p = p 1 + p 2 p = p_{1} + p_{2} p=p1+p2 中的每个点,随机选取一对 matching patches(每个 3D 点可能对应更多的 patches),所以最终的 training batch为:

X = { x 1 1 , x 1 2 , ⋯   , x i 1 , x i 2 , ⋯   , x p 1 , x p 2 } 32 × 32 × 2 p \mathbf { X } = \left\{ \mathbf { x } _ { 1 } ^ { 1 } , \mathbf { x } _ { 1 } ^ { 2 } , \cdots , \mathbf { x } _ { i } ^ { 1 } , \mathbf { x } _ { i } ^ { 2 } , \cdots , \mathbf { x } _ { p } ^ { 1 } , \mathbf { x } _ { p } ^ { 2 } \right\} _ { 32 \times 32 \times 2 p } X={ x11,x12,,xi1,xi2,,xp1,xp2}32×32×2p

其中下标是 3D 点的 i n d e x index index,上标 2D patch 的 i n d e x index index x i 1 \mathbf { x } _ { i } ^ { 1 } xi1 x i 2 \mathbf { x } _ { i } ^ { 2 } xi2 表示 3D 点的对应的一对匹配的 patch pair。这 X \mathbf { X } X 是 L2-Net 的输入,输出是:

Y = [ y 1 1 , y 1 2 , ⋯   , y i 1 , y i 2 , ⋯   , y p 1 , y p 2 ] q × 2 p \mathbf { Y } = \left[ \mathbf { y } _ { 1 } ^ { 1 } , \mathbf { y } _ { 1 } ^ { 2 } , \cdots , \mathbf { y } _ { i } ^ { 1 } , \mathbf { y } _ { i } ^ { 2 } , \cdots , \mathbf { y } _ { p } ^ { 1 } , \mathbf { y } _ { p } ^ { 2 } \right] _ { q \times 2 p } Y=[y11,y12,,yi1,yi2,,yp1,yp2]q×2p

其中 Y \mathbf { Y } Y 为网络经过 LRN 层得到的结果, q = 128 ​ q=128​ q=128 为输出的特征向量维度。

定义距离矩阵为:

D = [ d i j ] p × p 其 中    d i j = ∥ y i 2 − y j 1 ∥ 2 ( ∥ ∥ 2  is  L 2  norm  ) \mathbf { D } = \left[ d _ { i j } \right] _ { p \times p } \\ 其中 \; d _ { i j } = \left\| \mathbf { y } _ { i } ^ { 2 } - \mathbf { y } _ { j } ^ { 1 } \right\| _ { 2 } \left( \| \| _ { 2 } \text { is } L _ { 2 } \text { norm } \right) D=[dij]p×pdij=yi2yj12(2 is L2 norm )

这个 D \mathbf { D } D 可以直接用一个矩阵乘法计算:

D = 2 ( 1 − Y 1 T Y 2 ) 其 中    Y s = [ y 1 s , ⋯   , y i s , ⋯   , y p s ] q × p , ( s = 1 , 2 ) \mathbf { D } = \sqrt { \mathbf { 2 } \left( \mathbf { 1 } - \mathbf { Y } _ { \mathbf { 1 } } ^ { \mathbf { T } } \mathbf { Y } _ { \mathbf { 2 } } \right) } \\ 其中 \; \mathbf { Y } _ { \mathbf { s } } = \left[ \mathbf { y } _ { 1 } ^ { s } , \cdots , \mathbf { y } _ { i } ^ { s } , \cdots , \mathbf { y } _ { p } ^ { s } \right] _ { q \times p } , ( s = 1,2 ) D=2(1Y1TY2) Ys=[y1s,,yis,,yps]q×p,(s=1,2)

其中 D \mathbf { D } D 包含 p 2 p ^ { 2 } p2 个 patch pairs 的距离,其中 p p p 个是正样本(矩阵对角线元素), p

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值