HardNet
本文提供了相应的代码,是基于 pytorch。
主要思路
本文主要是提出了新的 loss 用于特征 metric 的学习。提出的 loss 可以最大化一个 training batch 中最近的正负样本之间的距离,而且对浅层以及深层的 CNN 网络都有作用。本文基于之前的 L2-Net 工作,把 loss 更换成本文提出的 loss,这里叫做 HardNet。
基本流程
采样和 loss
本文的目标函数模仿 SIFT 的匹配规则。采样过程如下图所示:
![Sampling](https://i-blog.csdnimg.cn/blog_migrate/2e976bf302d4eca5db563af6fcfdbb8e.png)
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−2aipj,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̸=id(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̸=id(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),然后根据情况生成相应三元组如下:
   β = { ( a i , p i , p j m i n ) d ( a i , p j m i n ) < 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 } }) & d \left( a _ { i } , p _ { j _ { m i n } } \right) < d \left( a _ { k _ { m i n } } , p _ { i } \right) \\ \left( p _ { i } , a _ { i } , a _ { k _ { m i n } } \right) & \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=n1i=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的网络结构,这里把它展开了,如下图所示:
![L2-Net](https://i-blog.csdnimg.cn/blog_migrate/2ccc2203b3d4186229908aaa459d852c.png)
其他关于网络结构更详细的内容,参考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),结果如下图所示:
![Brown compare](https://i-blog.csdnimg.cn/blog_migrate/6d6ba9607d2dba7027c052dc77745dd1.png)
其中也比较了 FDR((false discovery rate),主要是被比较的文中给出该指标,这里为了公平,在该基础上计算了 FPR 进行统一比较。
其中都是在一个子集上训练然后在另外两个子集上测试,后面试验比较的话都是在 Liberty 集合上训练。
HPatches
和其他传统特征和学习特征在 HPatches 基准测试集上进行了比较,结果如下图所示:
![Hpatches compare](https://i-blog.csdnimg.cn/blog_migrate/9d3bcc9a0cd67c9987517945129c54c9.png)
其中上面从左到右三个分别表示 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 的数目)变化性能的变化实验,结果如下图所示:
![Distractors compare](https://i-blog.csdnimg.cn/blog_migrate/ca4558ad34f5ff04190dddb46fe0a332.png)
上面测试用的训练集之前说明了都是在 Brown 的 Liberty 进行训练,下面更换训练集做了一些对比实验,结果如下图所示:
![Traindata compare](https://i-blog.csdnimg.cn/blog_migrate/adef5940a563692b82a27d9ef34f1e06.png)
Wide baseline stereo
在 wide baseline stereo 数据集 W1BS 上测试,结果如下图所示:
![Traindata compare](https://i-blog.csdnimg.cn/blog_migrate/965542bdd211bbcc77eacab908ed1d2f.png)
其中 A 表示 appearance 变化,可能由于天气、季节或者遮挡引起的; G 表示 viewpoint/geometry 变化,可能由于 scale,camera 位置或者物体位置变化引起的; L 表示 illumination 的变话;S 表示 sensor 传感器的变换;map2photo 表示 satellite 图像 和 map 图像。
其中主要比较 HPatches matching 任务的性能。
但是在 patches 级别上验证并不能代表在实际使用中效果最佳,在不同的 wide baseline stereo 数据集继续对比,结果如下图所示:
![Traindata compare](https://i-blog.csdnimg.cn/blog_migrate/38f2a8181d13b48327ae58c8050f4373.png)
其中对比的是匹配上的 image pairs 的数据和匹配上的 pairs 上平均 inliers 的数目。
关于这部分试验细节需要进一步看一下。
Image retrieval
在基于 local features 的 image retrieval 方法中验证提出的描述符的效果。
基于 Bow 方法 image retrieval 的结果如下图所示:
![Image retrieval compare](https://i-blog.csdnimg.cn/blog_migrate/7f23312b9bfa9a64536d8e88ea855cab.png)
其中 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 结果如下图所示:
![Image retrieval compare](https://i-blog.csdnimg.cn/blog_migrate/e8ed184375e7362cfdc65328131d295b.png)
关于这部分试验细节需要进一步看一下。
实用指南
Batch 大小的影响
这里探讨一下 batch 大小对最终描述符性能的影响,文中提测更小的 batch 大小会使训练更好收敛以及使模型泛化性能更高。不同 batch 大小下 FPR 性能对比结果如下图所示:
![Brown compare](https://i-blog.csdnimg.cn/blog_migrate/4341906eac59a0c67f80b832229aae92.png)
采样和 loss 作用
为了进一步验证本文提出的采样方法和 loss 函数的作用,进行了一些对比实验,结果如下图所示:
![Sampling strategy and the loss](https://i-blog.csdnimg.cn/blog_migrate/86719261dd547dec82b5c683972a79ba.png)
其中上面的结果是在 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 的导数也会变的很小。具体比较
![Loss compare](https://i-blog.csdnimg.cn/blog_migrate/c88f6334b27f8cf1c97d95f47cf53c2a.png)
这里给定一个 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 & = exp(2.0 - d(a, p)) \\ exp\_an & = exp(2.0 - d(a, n)) \\ exp\_all & = exp\_ap + exp\_an + eps \\ L_{softmin}(d(a, p), d(a, n)) & = - 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 更好理解了。