论文笔记: FSA-Net:Learning Fine-Grained Structure Aggregation for Head Pose Estimation from a Single Image

简介

这篇工作目前看下来,给我的总体感觉就是hopenet的后续版,introduction和related work和hopenet论文里写的差不多。但由于改进了网络的结构,
原文《FSA-NET》。
原代码 https://github.com/shamangary/FSA-Net。

Attention机制

由于自己一开始做头部姿态的初衷就是出于人类注意力分析的工程目的,而且attention detection这一头部姿态的目的也在前面的introduction中出现过,因此在文中看到Attention下意识以为指的是头部姿态,细读才发现attention是作为一个CV的学术名词出现的。
由于自己读过的论文太少,Attention这个概念还是我第一次读到。
大体来说,是为了实现提取有用信息,除去无用信息的目的,类似于机器学习中的主成分分析。
叫做attention机制,正是因为它的思想就是模拟了人类注意力的生物特性。

注意力机制是人类视觉所特有的大脑信号处理机制。人类眼睛快速扫描全局图像的同时,会下意识地获得需要重点关注的目标区域,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。

因此当用神经网络来处理大量的输入信息时,也可以借鉴人脑的注意力机制,只选择一些关键的信息输入进行处理,来提高神经网络的效率。实际上这种方法在深度学习中也经常会使用,比如池化、卷积的局部连接,我觉得也算是一定程度上在实现注意力机制。

SSR-NET的结构

SSR本身指的是Soft Stagewise regression。SSR-NET是原文的作者在过去做的工作[2],做的是年龄估算的工作。受到DEX[3]的启发,SSR-NET把回归问题也把年龄估算看作是一个分类问题来处理。DEX是将一个年龄分成几个不同的阶段(bins),再把每一个阶段都当作是一个类别来看待,输出的概率即为年龄分布的概率,再将该阶段取代表性年龄μ。对于一个 s 类的分类模型,取其每一类的概率与当前类的代表年龄的加和作为最终的预测值:

而SSR-NET与DEX不同的是,SSR-NET选择分阶段执行DEX的预测操作,再对不同阶段的值进行融合。
简单来就是第一阶段(0,30)(30,60)(60,90),那么第二阶段就是(0,10)(10,20)(20,30)。

SSR-NET给出的预测结果的公式如下所示:

作者除了多阶段预测以外,在这里还使用了一个trick,年龄是连续的,而且有一定的不确定性,将年龄段划分为无交集的区域并不合适,因此引入了shift vector η和scale factor Δ,对预测结果进行调整。

a shift vector η(k) adjusts the center for each bin and a scale factor ∆ scales the widths of all bins at the k-th stage, thus modifying the representative ages μ(k).

同时scale factor、shift vector以及分布p都是可学习的,最终映射到连续结果,最终SSR-NET的结果在年龄预测这一问题的效果有提升。

虽然FSA-NET与SSR-NET有巨大的关联。但这里和年龄估算不同的是,FSA-Net是对姿态进行估算,他有3个数值,是一个矢量,而非一个像年龄一样的标量。作者将用SSR-NET预测多维结果的形式称为SSR-NET—MD,后续并将其结构略做修改。

尽管SSR-NET—MD已经能够取得不错的效果,但在特征融合方面依然有提升空间,也就是可以利用attention机制学习到更好的表达。

最终修改部分结构的SSR-NET以及添加了特征融合的网络也就是FSA-NET。

除了多段预测以外,SSR-NET还有一个特点,那就是使用了互补的Two Stream的结构。这部分是受到了参考文献[3]的启发,据说通过这种方式,可以探索不同的特征,他们的融合也可以提高性能。以后有空的话去专门了解一下。

FSA-NET的结构

下面就是本篇文章的重头戏了。论文看了很久,这部分也没能感觉特别清晰。但还是尽量把自己理解的东西记录下来吧。

首先,下图是FSA-NET的结构:

流程简单来说,Two Stream会先进行element-wise multiplication,再使用11卷积,后面再接池化,类似于SSR-NET,最终得到wh*c大小的特征图。特征图的每个网格都是c维度的空间向量,代表了一定的空间局部信息。然后把Uk送入到映射模块中,最终产生k个c’维度的特征向量,这k个c’维度的特征向量的向量用于姿态的预测。也就是利用他们去获得SSR所需要的p、η、μ和Δ等参数。

Two Stream

首先就是类似SSR-NET的Two Stream和多个stage的数据,但具体的网络结构相较于SSR-NET发生了变动,每条stream具体Building Block安排得不太一样。

Feature Aggregation

除此之外,就是Fine-grained structure feature aggregation的部分,也就是将Uk送入,最终产生k个c’维度的特征向量的模块。也就是这部分较为难懂,我觉得这部分的工作也是这篇文章能够被CVPR录用的原因,毕竟SSR-NET是过去的工作,换个皮的话,不会被别人认可的(其实我觉得hopenet就是resnet换了个皮…)。

aggregation 模型的的任务就是对前面得到的Uk进行提炼,也就是上图的右侧部分。

类似于pooling的操作,最终从Uk中提炼到更加有用的信息,最终获得更小的,K*c‘维度的向量。

目前存在的Aggregation的方法,主要有capsule和NetVLAD两种。但正如introduction讲到的,两种方法都忽略了特征图中的空间信息。因此在执行aggregation前,作者对特征进行了空间分组。作为aggression输入的带有空间信息的特征,相比于像素级特征,会更有效果。

为了有效地对Uk进行空间分组,作者使用了注意力机制。即后面介绍的scoring function。先通过scoring function先计算得到一个Ak,下一步把Ak和Uk一起送入到fine-grained structure mapping module中,从而得到最终K*c‘维度,从而对向量进行SSR的计算。

Scoring function

为了更好地对特征进行空间分组,需要去测量像素级特征的重要性,也就是前面提到的注意力机制。作者设计了一个评分的函数Φ(u)来评估特征的重要性从而更好地进行空间分组。每一个特征图Uk都有一个对应的Ak,Ak(i,j)=Φ(Uk(i,j))。
至于我们要采用什么作为Scoring function,此处作者提到了三种方法。
1)1*1卷积。Φ(u) = σ(w · u),σ是sigmoid函数。w是可学习的参数。
2)方差。 Φ(u)=∑i=1c(ui−μ)2,其中μ=1c∑i=1cui\Phi(u)=\sum_{i=1}^{c}(u_i-\mu)^2,其中 \mu=\frac{1}{c}\sum_{i=1}^{c}u_i Φ(u)=i=1∑c​(ui​−μ)2,其中μ=c1​i=1∑c​ui​,方差作为Scoring function的话并不能被学习。
3)全置为常数1。这种方法就相当于放弃使用Scoring function。
以上三种方法可以捕捉不同层面的信息,起到互补的作用,融合使用可增加模型的鲁棒性。
最后的实验结果显示,1)2)效果比3)好,而平均地融合三个Scoring function最终的效果是最好的。
这部分的比较结果如下:

这个地方关于Score的结果能够代表注意力的理解并没有特别清晰。目前的理解是1*1卷积再通过sigmoid方程,通过网络的学习,那些重要信息的Score会被提高,不重要的会被忽视,因此可代表注意力。

Fine-grained structure mapping

得到了特征图Uk和注意力图Ak以后,下一步就是进行fine-grained structure mapping了。最终会得到一组具有代表性的特征Ũ。

U到Ũ的映射关系满足U~=SkUŨ=S_kUU~=Sk​U,这里的U = [U1,U2…Uk],shape为(K,w,h,c) 然后reshape为(n,c),这里n = w * h * K,U是包含了所有阶段的所有特征映射中的c-d像素级特征的2D矩阵。而Sk的shape为(n’,n),Ũk的Shape为(n‘,c)。

在第k阶段,我们希望找到一个映射Sk,该映射Sk将U中的特征选择并分组成n‘个代表性特征Ũk,这个n‘个特征向量Ũk是由n个像素级别的特征转变而成的。Sk是一种线性变换,它通过对所有像素级特征进行加权平均来进行线性降维。

Sk被分解为两个矩阵参数去学习。Sk=CMk,C∈Rn′×m,Mk∈Rm×nS_k=CM_k,C\in R^{n'\times m},M_k\in R^{m\times n}Sk​=CMk​,C∈Rn′×m,Mk​∈Rm×nC参数对于所有K折处的特征都是共享的,但是对于Mk并非是共享的,也就是对于每个折处的特征向量,都有对应的一个Mk。这部分并不好理解。

fm和fc都是全连层,A=[A1,A2,…Ak]。这个公式可以看出这个工作确实是利用了注意力机制,下图为Mk经过可视化而形成的热力图。

文中也讲到了:把Sk分解成fM和fc这种方式,不仅减少了参数,还使训练更加的稳定。

每个Mk图都能折叠成K个w*h大小的特征图,Mk图的每一行都装载了代表性信息,因此Mk可以看作是突出头部姿态估计的细粒度结构。

最后链接来自Uk的所有特征形成Ũ作为最终进行计算的feature,后面和SSR-NET一样,进入fusion module得出计算最终角度的三个值p,Δ和η,最后产生最终的预测结果。

实验结果

作者进行的实验做的很细致,也很客观,不仅指出了自己在RGB-based数据集训练的各种方法中取得了SOTA(用300W-LP训练,用AFLW2000和BIWI测试),如下图所示,

而且还在BIWI数据集上做了测试(70%用于训练,30%用于测试),效果不如带有深度信息和带有时序信息的方法,但也没偏差太多。虽然带Depth或者Time相对来说准确一些,但数据要求苛刻,鲁棒性也不行,它们的学术和工程价值都有限。

后面还做了消融学习,证明它们使用的各种trick,比如aggregation、Scoring function在不同的数据集上也是能够经受住考验的。

总结

这个工作总体网络结构就是套用了SSR-Net,在最后进入Fusion Block之前,利用了注意力机制,映射出了更加有效的特征,再进行后面的SSR计算工作。

1.贡献

这篇工作使用极小的模型(最大的FSA-Caps-Fusion也只有5.1m)实现了现有头部姿态估计工作的SOTA,虽然相比于hopenet来说,模型小了很多,但只能说明hopenet的工作还是比较粗糙,直接套resnet来进行预测。头部姿态估计还有很多东西可以去做。

2.性能

虽然暂时并未复现这篇工作中记录的网络,但简单地用它的模型测试了一下我们的数据集。
配置:i7+1080ti,同一个数据集,1K画质,单帧平均20个人脸。

使用MTCNN+hopenet,单帧1.4秒左右,占用显存2g;使
使用MTCNN+FSANET,单帧0.9s,占用显存9g左右,暂时未统计准确率。

resnet作为15年的工作,FSA-NET虽然拥有了很小的模型(毕竟原创模型),但在运行的时间、显存性能上却并没有太大的改进,是否可以在这方面入手进行改进?我觉得值得调研一下。

3.创新点

创新点也就是用attention机制重新表征特征,在本任务中的精度取得了提升。

也就是先定义score function来评估feature的注意力得分,再用评估的attention map来学习一种变换,对原来的feature进行变换,能够获得更好的特征从而达到更好的效果。

我对于attention机制并不了解,但通过简单的资料查找,主观感觉大多数attention机制应该会比本文中叙述的复杂,或者会更有效果。或许可以采用更加优秀的Score function加强headpose estimation的效果,但毕竟注意力机制是本文中率先提出的,在这方面花功夫或许并不足以作为一个值得发论文的创新点,工作价值有限。而且也不知道是否有其他类似的创新点或者说是trick可以加强效果,后面可以深入调研一下。

参考资料

[1]Tsun-Yi Yang,Yi-Ting Chen,Yen-Yu Lin, et al. FSA-Net: Learning Fine-Grained Structure Aggregation for Head Pose Estimation From a Single Image[C]// 2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, 2019. 《FSA-NET》。
[2]Tsun-Yi Yang, Yi-Hsuan Huang, Yen-Yu Lin, Pi-Cheng Hsiu, and Yung-Yu Chuang. SSR-Net: A compact soft stage- wise regression network for age estimation. In Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI), 2018.SSR-NET。
[3][Yang et al., 2017] Tsun-Yi Yang, Jo-Han Hsu, Yen-Yu Lin, and Yung-Yu Chuang. DeepCD: Learning deep complementary descriptors for patch representations. In Proceedings of the IEEE Conference on International Conference on Computer Vision (ICCV), pages 3314–3322, 2017.

论文笔记: FSA-Net相关推荐

  1. ORB-SLAM3 论文笔记

    ORB-SLAM3 论文笔记 这篇博客 ORB-SLAM3系统 相机模型的抽象(Camera Model) 重定位的问题 图片矫正的问题 视觉惯性SLAM的工作原理 相关公式 IMU初始化 跟踪和建图 ...

  2. 【论文笔记】 LSTM-BASED DEEP LEARNING MODELS FOR NONFACTOID ANSWER SELECTION

    一.简介 这篇论文由IBM Watson发表在2016 ICLR,目前引用量92.这篇论文的研究主题是answer selection,作者在这篇论文基础上[Applying Deep Learnin ...

  3. 最新图神经网络论文笔记汇总(附pdf下载)

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 [导读]近年来,图神经网络变得非常火热,每年顶会在该领域内都会出现大量的研究论文,本文为大家提 ...

  4. [论文笔记] Fast Quality Driven Selection of Composite Web Services (ECOWS, 2006)

    Time: 4.0 hours Jae-Ho Jang, Dong-Hoon Shin, Kyong-Ho Lee, "Fast Quality Driven Selection of Co ...

  5. 论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning

    论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning  2017-06-06  21: ...

  6. 光流 速度_[论文笔记] FlowNet 光流估计

    [论文笔记] FlowNet: Learning Optical Flow with Convolutional Networks 说在前面 个人心得: 1. CNN的光流估计主要是速度上快,之后的v ...

  7. 论文笔记 《Maxout Networks》 《Network In Network》

    原文出处:http://zhangliliang.com/2014/09/22/paper-note-maxout-and-nin/ 论文笔记 <Maxout Networks> & ...

  8. 论文笔记:HKMF-T: Recover From Blackouts in TaggedTime Series With Hankel Matrix Factorization

    论文笔记:Hankel Matrix Factorization for Tagged Time Series to Recover Missing Values during Blackouts_U ...

  9. 论文笔记 A Spatial-Temporal Decomposition Based Deep Neural Network for TimeSeries Forecasting

    0 abstract 空间时间序列预测问题出现在广泛的应用中,如环境和交通问题.由于存在特定的空间.短期和长期模式,以及维度的诅咒,这些问题具有挑战性. 在本文中,我们提出了一个用于大规模空间时间序列 ...

  10. 论文笔记:Autoregressive Tensor Factorizationfor Spatio-temporal Predictions

    0 摘要 张量因子tensor factorization分解方法在时空数据分析领域很受欢迎,因为它们能够处理多种类型的时空数据,处理缺失值,并提供计算效率高的参数估计程序. 然而,现有的张量因子分解 ...

最新文章

  1. 如何使用Putty登录安装在VirtualBox里的ubuntu
  2. acrobat 下拉列表 逻辑_记一次 无限列表 滚动优化
  3. UniDBGrid增加显示记录数的label及隐藏refresh按钮
  4. oracle实验使用游标,Oracle数据库实验-PLSQL游标、过程、函数、包的使用
  5. 从51能不学编程只学c语言,51单片机C语言学习笔记8:单片机C51编程规范
  6. MATLAB 读取文件数据(txt)
  7. java 毕向东 笔记_毕向东Java基础部分笔记
  8. K Simple question (第十届山东理工大学ACM网络编程擂台赛 正式赛)
  9. 6张图教你搞定侧方停车----fwqlzz love is for ever
  10. 【运筹帷幄】关于阿里云服务器自己开启的6010端口
  11. 笑脸检测笑脸识别微笑识别大笑识别
  12. 魅族手机突然显示无服务器,魅族Flyme6是悟空请来的?Bug竟然有这么多?
  13. 根据一个下拉框改变另外一个下拉框内容
  14. STM32理论 —— DAC、DMA
  15. JVM堆内存释放不及时问题
  16. 汉高2019年第三季度销售额增长0.8%,达50.77亿欧元
  17. MATLAB中用fprintf函数实现矩阵原样输出
  18. 关于算法工程师,你想知道的都在这里!
  19. TIO-websoket-showcase 学习笔记
  20. go protoc 项目安装要点

热门文章

  1. 2019 大前端是什么,我们该学什么?
  2. 解决eNSP“错误代码40”及AR设备启动失败问题
  3. private的使用
  4. Chrome IE 中QQ快速登录失效
  5. 鼠标失灵,但鼠标和USB接口都是好的的情况。
  6. input内加小图标
  7. 李宏毅2022机器学习HW4解析
  8. 2021-6-8集成电路可靠性试验项目、方法及标准汇总
  9. Python爬虫实战一之使用Beautiful Soup抓取百度招聘信息并存储excel文件
  10. 二层交换配置完ping失败_在三层交换机和二层交换机做怎么配置使这两台主机ping通...