FGVC---Bilinear Pooling (双线性池化)及其发展

基本的Bilinear CNN

原文:Bilinear CNNs for Fine-grained Visual Recognition
pytorch代码:https://github.com/HaoMood/bilinear-cnn
在这里插入图片描述
双线性池化包括四个部分: B = ( f A , f B , P , C ) B=(f_A,f_B,P,C) B=(fA,fB,P,C)
其中 f A f_A fA f B f_B fB是特征提取函数,通常基于CNN。 P P P是池化函数, C C C是分类函数。

  • 特征提取
    特征提取一般采用CNN,根据是否共享,可以由如下三种方式:
    在这里插入图片描述

  • 双线性combination
    主要就是用外积(matrix outer product)来组合两个CNN(A和B)的feature map (当然也可以不用CNN)
    对于图片 I I I和位置 l l l,其双线性combination为:
    在这里插入图片描述
    其中位置 l l l 涵盖了位置和尺度, I I I 是图像。 f f f 的维度是(K,D),D是指channel。如果A和B输出的特征维度分别是(K,M)和(K,N),经过bilinear后维度变为(M,N)。外积导致特征的维度D 增大为原来的平方。

  • pooling函数
    pooling函数整合所有位置的bilinear combination,来得到图片的全局信息:
    在这里插入图片描述
    由于特征的位置维度被求和运算消除掉了,得到的bilinear特征与位置、顺序无关,是orderless的。
    最后将bilinear特征经过符号平方根变换,并增加l2标准化(elementwise normalization layer)
    在这里插入图片描述

  • 分类
    原文分类采用了SVM

降低维度

Compact Bilinear Pooling-CVPR2016

由于上述模型的得到的特征维度较高,那么得到的参数数目较多,计算量较大,存储和读取开销较大。这篇文章就采用了一种映射的方法,希望能够达到Bilinear model的performance情况,能够尽量的减少特征的维数。
首先,论文将bilinear model 看做是一种核方法的形式,对于不同的 x的不同特征,x,y,可以进行如下的核方法转化。
在这里插入图片描述
然后论文希望找到一种映射ϕ(x),使得<ϕ(x),ϕ(y)>≈k(x,y)这很像是核方法反着用的形式。
在这里插入图片描述
论文采用了两种方法的映射,Random Maclaurin(RM)和Tensor Sketch(TS),这两个映射的期望都是<x,y>2,方差为1/d。
在这里插入图片描述
如上图,FB代表原始的full bilinear pooling方法。
通过对比,可以发现,当d为较小维度的时候,就可以得到与bilinear model 相同的精度。其中,蓝色线为full bilinear pooling 方法的误差。(但总体比full bilinear方法要差一点)

Low-rank Bilinear Pooling for Fine-Grained Classification-CVPR2017

这篇文章的目的也是要降低参数维度。同时,提高模型的精度。论文与原始论文模型不同的是,这篇论文采用对称的网络模型,也就是两个steam是相同的,那么只需要训练一个CNN过程就好,大大的减少了计算的开支。同时特征的意义就变为在位置i上特征的相关性矩阵。最后论文采用了一个低秩的分类器进行分类。
在这里插入图片描述

跨层双线性池化

Hierarchical Bilinear Pooling for Fine-Grained Visual Recognition-ECCV2018

Hierarchical Bilinear Pooling for Fine-Grained Visual Recognition论文笔记
作者源码—caffe
pytorch实现1 —acc=80.42
pytorch实现2—骨干网resnet

贡献:

  • 我们开发了一种简单但有效的跨层双线性池技术,它同时支持特性的层间交互,并以一种相互增强的方式学习细粒度表示。
  • .在跨层双线性池的基础上,提出了一种分层双线性池集成框架,对多个跨层双线性模块进行集成,从中间卷积层获取互补信息,提高性能。 2.在跨层双线性池的基础上,提出了一种分层双线性池集成框架,对多个跨层双线性模块进行集成,从中间卷积层获取互补信息,提高性能。
  • 我们对三个具有挑战性的数据集(幼鸟、斯坦福汽车、fgvc飞机)进行了综合实验,结果证明了我们方法的有效性。我们对三个具有挑战性的数据集(幼鸟、斯坦福汽车、fgvc飞机)进行了综合实验,结果证明了我们方法的有效性。

整体模型结构:
在这里插入图片描述

总的来说 Hierarchical Bilinear Pooling 比 Bilinear Pooling多的就是层之间的交互,具体是这样实现的:以最简单的结构举例,假设两个CNN都采用VGG-16结构,去掉VGG的全连接层,卷积层最后三层定义为relu5_1, relu5_2, relu5-3,Bilinear Pooling 就是将CNN1的relu5-3和CNN2的relu5-3做了Bilinear Pooling操作,得到的结果进行分类。而Hierarchical Bilinear Pooling是将CNN2的relu5-3分别和CNN1的relu5-1,relu5-2,relu5-3做Bilinear Pooling操作,得到三组特征,并将这些特征拼接在一起,最后进行分类。
在这里插入图片描述

结果对比:
FBP表示Factorized Bilinear Pooling(Hadamard product for low-rank bilinear pooling. arXiv preprint arXiv:1610.04325 (2016))
CBP表示Cross-layer Bilinear Pooling
HBP表示Hierarchical Bilinear Pooling
在这里插入图片描述
在这里插入图片描述

AAAI 2020 paper: “Revisiting Bilinear Pooling: A Coding Perspective”.

源代码
新角度看双线性池化,冗余、突发性问题本质源于哪里?

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
双线性池化是一种特殊的池化方式,它可以将两个不同的特征图进行组合,并生成一个新的特征图。在计算机视觉领域,双线性池化被广泛应用于图像分类、目标检测和姿态估计等任务中。 双线性池化的思想是将两个特征图进行外积,然后对外积结果进行池化。具体来说,假设我们有两个特征图A和B,它们的大小分别为m×n×p和m×n×q。那么我们可以将它们进行外积得到一个m×n×p×q的四维张量C,其中C(i,j,k,l)=A(i,j,k)×B(i,j,l)。然后我们可以对C在第3和第4个维度上进行池化,得到一个新的特征图D,其大小为m×n×r,其中r为池化后的特征图的通道数。 双线性池化的一个优点是可以捕捉特征之间的相互作用。由于双线性池化将两个特征图进行外积,因此它可以捕捉到它们之间的相关性。这使得双线性池化在某些任务中表现得比传统的池化方式更好。 然而,双线性池化也存在一些问题。首先,它需要大量的计算资源。由于外积操作需要计算m×n×p×q个元素,因此它的计算复杂度很高。其次,双线性池化在处理高维特征图时容易出现维度灾难问题。由于外积操作会使特征图的维度增加,因此它在处理高维特征图时会变得非常困难。 为了解决这些问题,研究人员提出了许多改进的双线性池化方法。例如,一些方法使用矩阵分解技术来降低计算复杂度;另一些方法则使用注意力机制来提高双线性池化的效果。这些方法在实际应用中都取得了很好的效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值