如何为不固定输入图片尺寸的CNN-based image retrieval network生成固定长度的feature embedding

今天在看GeM pooling (generalized mean pooling)的代码的时候发现他们用的测试集(paris6k和oxford5k)的尺寸是不固定的。作为image retrieval net小白的我就很好奇他们是如何保证在用固定kernel size的CNN的情况下还能最终生成一样长度的feature embedding vector的。我之前知道spatial pyramid pooling可以做这件事情,也知道貌似不固定图片尺寸的训练会让模型不容易over-fitting且更容易收敛。但是当时没太看懂,这里先不讨论SPP先说GeM的方法。

他们的方法其实很简单,概括来说就是将torch自带的在ImageNet上预训练过的CNN网络部分的后面拼上这个pooling layer(还有其他的一些关于whiten的优化方法这里先不讲,有兴趣的可以自己去看)。这个pooling layer的kernel size为当前图片过了CNN部分输出的feature map的宽和高。也就是说把一个(变长,变宽,固定深度)的feature map转换为(1,1,固定深度)的tensor,以此来将不同size的image压缩为固定长度的embedding vector。

def gem(x, p=3, eps=1e-6):
    return F.avg_pool2d(x.clamp(min=eps).pow(p), (x.size(-2), x.size(-1))).pow(1./p)

补充:其实在torch中用torch.nn.functional.adaptive_avg_pool2d(input, output_size)就可以实现。

不管之前的特征图尺寸为多少,只要设置为(N,N),最终特征图的size都为(N,N) 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值