点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达本文转自|深度学习这件小事

最近看了一系列bilinear pooling相关的文章,感觉有些文章写得比较抽象。费了不少功夫总算理顺了这些文章的关系,这里简单写个笔记记录一下~

一、简介

bilinear pooling在2015年于《Bilinear CNN Models for Fine-grained Visual Recognition》被提出来用于fine-grained分类后,又引发了一波关注。bilinear pooling主要用于特征融合,对于从同一个样本提取出来的特征x和特征y,通过bilinear pooling得到两个特征融合后的向量,进而用来分类。

如果特征x和特征y来自两个特征提取器,则被称为多模双线性池化(MBP,Multimodal Bilinear Pooling);如果特征x=特征y,则被称为同源双线性池化(HBP,Homogeneous Bilinear Pooling)或者二阶池化(Second-order Pooling)。此外,有些文章也把bilinear model称为bilinear pooling(这么做是有原因的,下文会分析)。

原始的Bilinear Pooling存在融合后的特征维数过高的问题,融合后的特征维数=特征x和特征y的维数之积。原作者尝试了PCA降维,但效果并不理想。基于降低bilinear pooling特征维数的思想,近年来的改进方案参见下表:

本文将包括以下内容:

  1. 对bilinear pooling进行详细介绍,便于读者理解原文;

  2. 建立bilinear pooling到bilinear model的联系,便于读者理解以MLB为核心的bilinear model相关文章。

  3. 快速介绍对bilinear pooling的各种改进形式。

二、bilinear pooling详解

这里参考《Bilinear CNN Models for Fine-grained Visual Recognition》,CVPR 2015一文,给出bilinear pooling的详细定义。

对于图像    在位置    的两个特征    和    , 进行如下操作:

直观上理解,所谓bilinear pooling,就是先把在同一位置上的两个特征双线性融合(相乘)后,得到矩阵    ,对所有位置的    进行sum pooling(也可以是max pooling,但一般采用sum pooling以方便进行矩阵运算)得到矩阵    ,最后把矩阵    张成一个向量,记为bilinear vector   。对  进行矩归一化操作和L2归一化操作后,就得到融合后的特征    。之后,就可以把特征   用于fine-grained分类了,如下图所示:

对于我们熟悉的图像特征,   ,而    和    分为别特征的通道数,把两个特征分别写成向量

和    ,

记    ,

即可用矩阵操作来表示生成    ,

作者使用bilinear pooling对两种特征提取器进行融合,再用于fine-grained分类,取得不错的效果。bilinear pooling的形式简单,便于梯度反向传播,进而实现端到端的训练。

三、Second-order Pooling

Second-order Pooling最早出自ECCV2012的文章《Semantic segmentation with second-order pooling》,原文对Second-order Pooling的定义如下:

由于Second-order Pooling用到了特征x的二阶信息,所以在一些任务下能比一阶信息表现更为优秀。

对比bilinear pooling的定义,不难发现,当    的时候,二者是等价的。也就是说,二阶池化(Second-order Pooling)=同源双线性池化(HBP,Homogeneous Bilinear Pooling)。

下面介绍bilinear pooling的各种改进。

四、CBP: Compact Bilinear Pooling

CBP出自CVPR 2016《Compact bilinear pooling》一文,作者观察到在分类问题中,提取的特征常常采用SVM或者logistic regression,而这两种形式都可以被看作是线性核机器(linear kernel machines),具有如下的形式:

注意到

如果我们能够找到满足 的低维投影函数 ,那么有

也就是说,当  时,有 。基于这个思想,作者提出了采用了两种方法 Random Maclaurin (RM)和Tensor Sketch (TS)对bilinear pooling进行降维。具体细节如下:

五、MCBP: Multimodal Compact Bilinear Pooling

《Multimodal compact bilinear pooling for visual question answering and visual grounding》是EMNLP2016的文章。本文在CBP的基础上提出了MCBP,并将其应用于看图答题(VQA,visual question answering)领域。

注意到CBP是针对HBP进行改进的,对CBP的TS算法稍加改动,使其适用于融合不同模态的特征,即可得到MCBP,如下图所示。

在得到MCBP模块后,作者提出用于VQA的网络结构如下:

这个结构相当容易理解,就是一共用到了两次MCBP模块,第一个MCBP融合了文本和图像的特征进而用来提取图像的attention,第二个MCBP则把图像的attention特征与文本特征再一次融合,最终结果送入softmax分类器得到答案。

六、LRBP:Low-rank Bilinear Pooling

LRBP出自CVPR2017的文章《Low-rank bilinear pooling for fine-grained classification》,与CBP一样,都是假定采用的分类器是SVM来对HBP进行简化。

考虑SVM问题

的最优解w*,以及问题

的最优解W*,作者证明了

并且W*是实对称矩阵。实对称矩阵的一大优点是可以进行特征值分解,即

如果用两个低秩矩阵U+和U_去近W*,则问题转换为:

这样就避免了原始bilinear pooling里面  的计算,降低了计算量。

七、Grassmann Pooling

Grassmann Pooling出自ECCV 2018的文章《Grassmann Pooling as Compact Homogeneous Bilinear Pooling for Fine-Grained Visual Classification》,也是针对HBP的改进。

考虑形式为

的bilinear pooling,有引理如下:

也就是说,对矩阵进行SVD分解,前k个左奇异向量组成的矩阵  是对矩阵的低秩最优逼近。

基于这个引理,作者提出了Grassmann pooling如下:

显然,Grassmann pooling也能够简化bilinear pooling计算量。

上面提到的三种改进形式CBP、LRBP、Grassmann Pooling都是针对HBP的改进。MCBP直接对CBP改动用于多模态特征的融合,但是考虑到CBP的出发点是核函数,MCBP的改动其实有点站不住脚的。对于MBP的改进工作,主要是以MLB为基础。MLB的核心是利用Hadamard积来简化bilinear model的操作。在介绍MLB之前,先介绍一篇承上启下的工作,把bilinear pooling和billinear model建立联系。

八、从bilinear pooling到billinear model

《Factorized bilinear models for image recognition》是ICCV2017的文章,虽然本文也是针对HBP的研究,但成功地把bilinear model与bilinear pooling联系起来。而后面的工作MLB正是从bilinear model的角度出发去改进MBP。

首先介绍bilinear model,对于特征向量x和特征向量y,bilinear model是指形如

的操作。

忽视bilinear pooling的归一化操作,记HBP的特征为  ,

在分类任务中,我们常常会把提取的特征送入全连接层再送入softmax层。作者发现,这个操作与bilinear model是等价的,即

其中    是全连接层的参数矩阵,而  是与其相对应的一个矩阵。既然  是需要通过学习得到的,那不如直接写成bilinear model的形式,对  进行学习。

也就是说,bilinear pooling与bilinear model是等价的。更令人欣喜的是,这个结论对于MBP也是适用的,所以后面MLB直接针对bilinear model进行改进。

基于这个发现,作者提出了Factorized bilinear model,把特征的一阶信息和二阶信息都利用起来,进而更好的fine-grained分类,其形式如下:

这里利用低秩矩阵    来替代  ,简化了计算量。

九、MLB:Multimodal Low-rank Bilinear Pooling

有了上篇工作的介绍,理解MLB就非常容易了,MLB出自ICLR2017的文章《 Hadamard product for low-rank bilinear pooling》。文章核心是用Hadamard积(就是按元素乘)来实现bilinear model,把

写成了

这样的好处是,利用低秩矩阵    及    来近似    ,并且简化了操作。

当希望bilinear model的输出是向量的时候,只需扩大矩阵    及   ,并采用矩阵    控制输出的长度即可,如下所示:

本文的写作相当严谨,各个矩阵的尺寸大小均有注明,有兴趣的读者自行翻阅。

十、MFB:Multi-modal factorized bilinear pooling

MFB出自ICCV2017《Multi-modal factorized bilinear pooling with co-attention learning for visual question answering》。本文的思路与MLB十分相似,不同点在于当希望bilinear model的输出是向量的时候,本文直接把U和V变成了三维张量,再通过sum pooling来进行通道融合得到最后的输出。

在MFB的基础上,作者于《Beyond bilinear: Generalized multimodal factorized high-order pooling for visual question answering》一文中提出了MFH(Multi-modal factorized high-order pooling )。把MFB操作分为两个阶段Expand Stage和Squeeze Stage,MFH就是把MFB堆叠起来以得到高阶信息,如下图所示

作者成功地把MFB/MFH应用于VQA,提出的网络结构如下:

这个结构与前文提到的《Multimodal compact bilinear pooling for visual question answering and visual grounding》相当类似,都是利用融合后的特征提取图像的attention特征,再进而第二次融合进而用来分类。不同之处在于,作者模拟了人类“审题”的思维模式,先建立了文本的attention特征,再去考虑与图像的特征融合。

前面介绍的工作,都是针对bilinear pooling的计算量过大而进行的改进。作为融合特征的有效方法,bilinear pooling在fine-grained分类和VQA都有不错的发挥。这里再简要介绍bilinear pooling的几篇应用。

十一、应用于VQA领域的《Bilinear attention networks》

本文是MLB的续作,发表于NIPS2018。本文借助bilinear model的思想提出了bilinear attention的思想。常规的attention map是对单个特征的attention,output=feature * attention map,而本文提出的bilinear attention map则对两个特征的attention, output=feature1 * bilinear attention map * feature2,表达式如下:

这个表达式与MLB十分相似,可以说是一脉相承。

本文提出的网络结构如下所示,左图通过MLB把图像特征和文本特征融合,进而得到bilinear attention map,右图则是把bilinear attention map用于进行图像特征和文本特征的attention融合。该网络较为复杂,有兴趣的读者自行翻阅原文。

  • 应用于分类领域的《Hierarchical Bilinear Pooling for Fine-Grained Visual Recognition》

本文出自ECCV2018,核心思想是把不同层的特征通过bilinear pooling两两融合,最后concate后进行分类。

  • 应用于ReID领域的《Part-Aligned Bilinear Representations for Person Re-Identification》

本文出自ECCV2018,核心是把行人的全局特征与局部特征(通过openpose预训练得到)通过bilinear pooling融合,再进行检索。

  • 应用于三维物品识别领域的《Multi-View Harmonized Bilinear Network for 3D Object Recognition》

本文出自CVPR 2018,核心是利用HBP提取多视角特征。

  • 应用于动作识别领域的《Deep Bilinear Learning for RGB-D Action Recognition》

本文出自ECCV 2018,基于bilinear model提出了bilinear block,来更好地融合多模态信息。

—完—

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

双线性池化(Bilinear Pooling)详解、改进及应用相关推荐

  1. 双线性池化_卷积神经网络中的各种池化操作

    池化操作(Pooling)是CNN中非常常见的一种操作,Pooling层是模仿人的视觉系统对数据进行降维,池化操作通常也叫做子采样(Subsampling)或降采样(Downsampling),在构建 ...

  2. 双线性池化【BiLinear Pooling】

    1. 简介 bilinear pooling主要用于特征融合,对于从同一个样本中提取出来的特征x和y,通过bilinear pooling操作可以得到x和y融合后的特征(本质是向量相乘) ps:如果x ...

  3. 双线性池化(Bilinear Pooling)

    Awesome Fine-Grained Image Analysis – Papers, Codes and Datasets bilinear pooling主要用于特征融合,对于从同一个样本提取 ...

  4. 【文献阅读】MFB——结合协同注意力的多模态矩阵分解的双线性池化方法(Z. Yu等人,ICCV,2017,有代码)

    一.背景 文章题目:<Multi-modal Factorized Bilinear Pooling with Co-Attention Learning for Visual Question ...

  5. 一文搞懂线程池原理——Executor框架详解

    文章目录 1 使用线程池的好处 2 Executor 框架 2.1 Executor 框架结构 2.2 Executor 框架使用示意图 2.3 Executor 框架成员 2.3.1 Executo ...

  6. Tomcat 8熵池阻塞变慢详解

    Tomcat 8熵池阻塞变慢详解 Tomcat 8启动很慢,且日志上无任何错误,在日志中查看到如下信息: Log4j:[2015-10-29 15:47:11] INFO ReadProperty:1 ...

  7. php中对象怎么访问i属性_PHP--序列化与反序列化详解

    PHP--序列化与反序列化详解 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 学到网络安全的时候用到了序列化和反序列化的 ...

  8. java 重启线程_java 可重启线程及线程池类的设计(详解)

    了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的 ...

  9. future java 原理_Java线程池FutureTask实现原理详解

    前言 线程池可以并发执行多个任务,有些时候,我们可能想要跟踪任务的执行结果,甚至在一定时间内,如果任务没有执行完成,我们可能还想要取消任务的执行,为了支持这一特性,ThreadPoolExecutor ...

最新文章

  1. Boson_Netsim_6使用方法
  2. 趋势科技实习面试后感
  3. javascript继承的实现
  4. leetcode —— 面试题36. 二叉搜索树与双向链表
  5. iOS 开发----Xcode 因为证书问题经常报的那些错
  6. 两数据库Dblink数据抽取blob
  7. python删除指定日期前的备份文件
  8. CHKJ3000E错误解决
  9. 进销存excel_超实用Excel完整进销存管理系统,多功能实现,轻松套用赶GET
  10. 模拟爬虫下载QQ空间相册高清图片
  11. JavaScript在线手册
  12. 微信扫一扫中的js安全接口域名的配置
  13. 淘宝,1688,京东店铺所有商品接口分享
  14. NAND Flash 和 eMMC 的区别
  15. 实战讲述Flutter跨平台框架应用,帮你突破瓶颈
  16. modem与baseband
  17. CS5266设计TYPEC转HDMI带PD和USB3.1数据传输USB-C扩展坞方案
  18. shell 2:变量(variable)
  19. 方便的邮箱密码登录邮箱方式分享
  20. Ajax读音,了解一下?

热门文章

  1. solidworks批量图号分离_图号分离 - SOLIDWORKS - 机械社区 - 百万机械行业人士网络家园...
  2. 代码块(局部代码块、构造代码块、静态代码块)
  3. 视频教程-Three.js(webgl) webpack+es6 geojson 3d地图 项目实战视频教程-JavaScript
  4. swagger详细配置说明
  5. template的用法
  6. 各类数据库排名汇总(转载)
  7. flink sql 异常:INTEGER and VARCHAR(2147483647) does not have common type no
  8. 一篇入门数字图像处理
  9. python之异步编程
  10. 九款mac必装软件大放送~~