NetVLAD:CNN architecture for weakly supervised place recognition

NetVLAD:CNN architecture for weakly supervised place recognition

写在前面:博主并不是做这个place recognition方向的,所以这篇paper我大概只看到netvlad层,后面的loss并不懂。因为近期做行为识别,想改进一下帧与帧之间的融合方案,所以过来学习一下vlad。

ps.github的netvlad用pytorch实现的代码并不多啊~好多都是tensorfow写的,可读性非常差....

abstract

本文的两点贡献:

1)提出NetVLAD,改进了原始的VLAD,该层可接在CNN结构后面

2)提出一种训练方案,based on a new weakly supervised ranking loss,使得VALD在CNN中的应用变成end-to-end

Method

1)给定一张图片Ii,函数f(放在网络中,就是一系列卷积+bn+激活+pooling等)产生一个固定size的向量,f(Ii)。如何优化产生的向量表征f(Ii)?通过改进的netvald。

2)place recognition的整体框架

        a)我们裁剪掉CNN的最后一个卷积层之后的其他层,并将它视为 a dense descriptor extractor。那么最后一个卷积层的输出为H*W*D的特征,对于每个空间点,都是一个D维度的向量。

        b)参考VLAD,设计新的pooling层,即NetVLAD,将得到的特征转化为固定大小的图像表征

3)NetVLAD

          回顾一下VLAD:captures information about the statistics of local descriptors aggregated over the image。给定N个D维度的图像描述符{xi}和k个聚类中心{ck},则VLAD的输出为V,V是K*D维向量,V中第(j,k)个元素的计算方式:

这里ak(xi)是权重,表示空间特征上第i个点和第k个聚类中心的关系。如果对于xi,如果ck是最近的类别,则权重为1,否则为0。

但这里权重ak(xi)只能为1或0,改进一下,使得权重变为0-1之间的小数。

其实我看的也不太懂(之后看懂了再过来补)。直接上代码吧(pytorch版本):

假设输入为2d图像,netvlad一般接在最后一个conv后面,那么输入到netvlad的特征,shape=[b,c,h,w]。一般c会很大,例如在resnet50中,c=2048。

1)如果normalize_input,则在dim=1进行归一化,也就是c的维度

2)求soft_assign,也就是上述的ak(xi),这里的conv是1*1卷积,将原channel维度降到k(聚类中心个数),然后view对特征x进行reshape,此时soft_assign的shape为[b,k,h*w]。再在dim=1,也就是k的维度进行softmax归一化

3)展开x,x_flatten的shape为[b,c,h*w]

计算x_flatten与聚类中心,self.centroids的残差,self.centroids的原始shape=[k,c],将x_flatten和self.centroids都扩展为适合减的维度。

4)残差与soft_assign相乘,后面就是参照公式的求和,归一化等等。

 

发布了56 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/karen17/article/details/96152376