天天看点

HardNet 论文详解

HardNet

本文提供了相应的代码,是基于 pytorch。

主要思路

本文主要是提出了新的 loss 用于特征 metric 的学习。提出的 loss 可以最大化一个 training batch 中最近的正负样本之间的距离,而且对浅层以及深层的 CNN 网络都有作用。本文基于之前的 L2-Net 工作,把 loss 更换成本文提出的 loss,这里叫做 HardNet。

基本流程

采样和 loss

本文的目标函数模仿 SIFT 的匹配规则。采样过程如下图所示:

HardNet 论文详解

X = ( A i , P i ) i = 1.. n \mathcal { X } = \left( A _ { i } , P _ { i } \right) _ { i = 1 . . n } X=(Ai​,Pi​)i=1..n​ 表示一个 training batch,其中有 2 n 2n 2n 个batches,有 n n n 个匹配 pair, A i A_i Ai​ 和 P i P_i Pi​ 代表匹配的 patch pair。

其中 L2 距离矩阵为

D = pdist ⁡ ( a , p ) d ( a i , p j ) = 2 − 2 a i p j , i = 1.. n , j = 1.. n D = \operatorname { pdist } ( a , p ) \\ d \left( a _ { i } , p _ { j } \right) = \sqrt { 2 - 2 a _ { i } p _ { j } } , i = 1 . . n , j = 1 . . n D=pdist(a,p)d(ai​,pj​)=2−2ai​pj​

​,i=1..n,j=1..n

对于匹配 patch pair 的描述符 a i a_i ai​ 和 p i p_i pi​,距离它们各自最近的非匹配描述符,如上图所示分别为为 p 4 p_4 p4​ 和 a 2 a_2 a2​,相关定义如下:

a i a_i ai​ 表示 anchor 描述符

p i p_i pi​ 表示 positive 描述符

p j m i n p _ { j _ { m i n } } pjmin​​ 表示距离 a i a_i ai​ 最近的非匹配描述符,其中 j min ⁡ = arg ⁡ min ⁡ j = 1.. n , j ≠ i d ( a i , p j ) j _ { \min } = \arg \min _ { j = 1 . . n , j \neq i } d \left( a _ { i } , p _ { j } \right) jmin​=argminj=1..n,j̸​=i​d(ai​,pj​)

a k m i n a _ { k _ { m i n } } akmin​​ 表示距离 p i p_i pi​ 最近的非匹配描述符,其中 k min ⁡ = arg ⁡ min ⁡ k = 1.. n , k ≠ i d ( a k , p i ) k _ { \min } = \arg \min _ { k = 1 . . n , k \neq i } d \left( a _ { k } , p _ { i } \right) kmin​=argmink=1..n,k̸​=i​d(ak​,pi​)

这样对于每个匹配的 patch pair 在都可以生成一个四元组 ( a i , p i , p j m i n , a k m i n ) ​ (a_i,p_i,p _ { j _ { m i n } },a _ { k _ { m i n } })​ (ai​,pi​,pjmin​​,akmin​​)​,然后根据情况生成相应三元组如下:

&ThickSpace; β = { ( a i , p i , p j m i n ) d ( a i , p j m i n ) &lt; d ( a k m i n , p i ) ( p i , a i , a k m i n ) otherwise \; \beta = \begin{cases} (a_i,p_i,p _ { j _ { m i n } }) &amp; d \left( a _ { i } , p _ { j _ { m i n } } \right) &lt; d \left( a _ { k _ { m i n } } , p _ { i } \right) \\ \left( p _ { i } , a _ { i } , a _ { k _ { m i n } } \right) &amp; \text{otherwise} \end{cases} β={(ai​,pi​,pjmin​​)(pi​,ai​,akmin​​)​d(ai​,pjmin​​)<d(akmin​​,pi​)otherwise​

所以每个 training batch 都生成了 n n n 个三元组用于计算最后的 loss 函数,具体如下:

L = 1 n ∑ i = 1 , n max ⁡ ( 0 , 1 + d ( a i , p i ) − min ⁡ ( d ( a i , p j m i n ) , d ( a k m i n , p i ) ) ) L = \frac { 1 } { n } \sum _ { i = 1 , n } \max \left( 0,1 + d \left( a _ { i } , p _ { i } \right) - \min \left( d \left( a _ { i } , p _ { j _ { m i n } } \right) , d \left( a _ { k _ { m i n } } , p _ { i } \right) \right) \right) L=n1​i=1,n∑​max(0,1+d(ai​,pi​)−min(d(ai​,pjmin​​),d(akmin​​,pi​)))

其中 min ⁡ ( d ( a i , p j m i n ) , d ( a k m i n , p i ) \min \left( d \left( a _ { i } , p _ { j _ { m i n } } \right) , d \left( a _ { k _ { m i n } } , p _ { i } \right)\right. min(d(ai​,pjmin​​),d(akmin​​,pi​) 在上面三元组构建中已经预先计算。

和 L2-Net 不同,本文没使用学习过程中间的 feature maps 进行额外的监督也没现在描述符各个维度直接的关联性,利用上面的 loss 函数没有导致 overfitting 情况。

网络架构

本文是直接采用的是L2-Net的网络结构,这里把它展开了,如下图所示:

HardNet 论文详解
其他关于网络结构更详细的内容,参考L2-Net

本文中实验发现使用 pooling 层降维会降低描述符性能。

输入是 32 × 32 32 \times 32 32×32 灰度图,利用每个 patch 的 mean 和 标准差去归一化。

关于其他的训练超参参考论文。

试验

Brown

本文使用 Brown 数据集训练和测试。Brown 数据集包含 Liberty,Notre Dame 和 Yosemite 三个子集,每个子集包含 400 k 400k 400k 个 64 × 64 64 \times 64 64×64 的 patches。每个子集包含 100 k 100k 100k 的匹配和非匹配 patch pairs 用于测试,然后在该测试集上比较 FPR95(false positive rate at 95% recall),结果如下图所示:

HardNet 论文详解

其中也比较了 FDR((false discovery rate),主要是被比较的文中给出该指标,这里为了公平,在该基础上计算了 FPR 进行统一比较。

其中都是在一个子集上训练然后在另外两个子集上测试,后面试验比较的话都是在 Liberty 集合上训练。

HPatches

和其他传统特征和学习特征在 HPatches 基准测试集上进行了比较,结果如下图所示:

HardNet 论文详解

其中上面从左到右三个分别表示 HPatches 提供的三个互补的测试任务,包括 patch verification,patch matching和patch retrieval。

其中 verification 任务分了 SAMESEQ 和 DIFFSEQ 两个子任务,表示负样本是不是来自于同一个 seq 图像序列。

其中 matching 任务分了 VIEW 和 ILLUM 两个子任务,表示视角和光线的变换因素,同时根据几何扰动的级别区分了 EASY,HARD 和 TOUGH 三个不同的 patch groups。

如果想深入了解 HPatches 基准测试集或者指标,可以参考 HPatches 工作。

还针对 patch retrieval 中的 distractors 数目(测试集中非匹配 patches 的数目)变化性能的变化实验,结果如下图所示:

HardNet 论文详解

上面测试用的训练集之前说明了都是在 Brown 的 Liberty 进行训练,下面更换训练集做了一些对比实验,结果如下图所示:

HardNet 论文详解

Wide baseline stereo

在 wide baseline stereo 数据集 W1BS 上测试,结果如下图所示:

HardNet 论文详解

其中 A 表示 appearance 变化,可能由于天气、季节或者遮挡引起的; G 表示 viewpoint/geometry 变化,可能由于 scale,camera 位置或者物体位置变化引起的; L 表示 illumination 的变话;S 表示 sensor 传感器的变换;map2photo 表示 satellite 图像 和 map 图像。

其中主要比较 HPatches matching 任务的性能。

但是在 patches 级别上验证并不能代表在实际使用中效果最佳,在不同的 wide baseline stereo 数据集继续对比,结果如下图所示:

HardNet 论文详解

其中对比的是匹配上的 image pairs 的数据和匹配上的 pairs 上平均 inliers 的数目。

关于这部分试验细节需要进一步看一下。

Image retrieval

在基于 local features 的 image retrieval 方法中验证提出的描述符的效果。

基于 Bow 方法 image retrieval 的结果如下图所示:

HardNet 论文详解

其中 Oxford5k 和 Paris6k 是标准 image retrieval 数据集,Oxford5k 包含 5062 张图像,Paris6k 包含 6300 张图像,两个数据集总共包含 11 个 landmarks(当然有一些负样本在),然后这 11 个 landmarks 每个包含 5 个不同的 query regions。

其中用 k-means 方法构建 1 million visual vocabulary,如果在 Oxford5k 数据集上测试,那么就在 Paris6k 数据集的描述符上学习这个 vocabulary。

其中比较的是 mAP 的精度,每个测试图像根据上面的 visual vocabulary 转成 BoW 进行 image retrieval,SV 表示空间验证,QE 表示 标注查询扩展,主要用于进一步优化 image retrieval 的查询结果。

其中 HardNet++ 版本是在所有的 Brown 和 HPatches 的数据集上进行训练,达到最优的效果。

同时还对比了基于其他方法的 image retrieval 结果如下图所示:

HardNet 论文详解
关于这部分试验细节需要进一步看一下。

实用指南

Batch 大小的影响

这里探讨一下 batch 大小对最终描述符性能的影响,文中提测更小的 batch 大小会使训练更好收敛以及使模型泛化性能更高。不同 batch 大小下 FPR 性能对比结果如下图所示:

HardNet 论文详解

采样和 loss 作用

为了进一步验证本文提出的采样方法和 loss 函数的作用,进行了一些对比实验,结果如下图所示:

HardNet 论文详解

其中上面的结果是在 HPatches matching 任务上测试的。

其中 Hard negative mining 在一个 epoch 上选择最近的那个非匹配负样本。

其中 CPR 表示描述符各个维度之间关联度的惩罚项。

对于 loss,从中可以看出 softmin 对所有的采用策略都能得到稳定的结果,但是在本文提出的采用策略上效果不如后面的两个 loss。主要是因为 triplet margin loss 和 contrastive loss with a large margin 在正样本和负样本上都有非零导数值。从下图可以看出 contrastive loss with a small margin,很多负样本对优化并没有起作用(导数为0,绿色区域块)。而正样本的距离小于负样本距离时,softmin 的导数也会变的很小。具体比较

HardNet 论文详解

具体的公式也在这里列一下,就比较好理解了:

这里给定一个 triplet ( a , p , n ) (a, p ,n ) (a,p,n), a a a 表示 anchor 描述符, p p p 表示 positive 描述符, n n n 表示 negative 描述符。以及它们之间的欧几里得距离 d ( a , p ) d(a, p) d(a,p) 和 d(a, n)。这里的描述符都是归一化过的,所以距离最小为 0 ,最大为 2.0。

那么 triplet margin loss 为:

L t r i p l e t _ m a r g i n ( d ( a , p ) , d ( a , n ) ) = m a x ( d ( a , p ) + m a r g i n − d ( a , n ) , 0.0 ) L_{triplet\_margin}(d(a, p), d(a, n)) = max(d(a, p) + margin - d(a, n), 0.0) Ltriplet_margin​(d(a,p),d(a,n))=max(d(a,p)+margin−d(a,n),0.0)

softmin loss 为:

e x p _ a p = e x p ( 2.0 − d ( a , p ) ) e x p _ a n = e x p ( 2.0 − d ( a , n ) ) e x p _ a l l = e x p _ a p + e x p _ a n + e p s L s o f t m i n ( d ( a , p ) , d ( a , n ) ) = − l o g ( e x p _ a p / e x p _ a l l ) \begin{aligned} exp\_ap &amp; = exp(2.0 - d(a, p)) \\ exp\_an &amp; = exp(2.0 - d(a, n)) \\ exp\_all &amp; = exp\_ap + exp\_an + eps \\ L_{softmin}(d(a, p), d(a, n)) &amp; = - log(exp\_ap / exp\_all) \end{aligned} exp_apexp_anexp_allLsoftmin​(d(a,p),d(a,n))​=exp(2.0−d(a,p))=exp(2.0−d(a,n))=exp_ap+exp_an+eps=−log(exp_ap/exp_all)​

contrastive loss 为:

L c o n t r a s t i v e ( d ( a , p ) , d ( a , n ) ) = m a x ( m a r g i n − d ( a , n ) , 0.0 ) + d ( a , p ) L_{contrastive}(d(a, p), d(a, n)) = max(margin - d(a, n), 0.0) + d(a, p) Lcontrastive​(d(a,p),d(a,n))=max(margin−d(a,n),0.0)+d(a,p)

有了上面的公式对于 metric loss 更好理解了。

继续阅读