[论文理解] FSA-Net: Learning Fine-Grained Structure Aggregation for Head Pose Estimation from a Single Image

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

简介

本文提出了一种新型的网络结构,借助attention机制,帮助实现更加有效的head pose 角度估计任务。并且在多个数据集上达到SOTA。本文的结构依赖于SSR-net,把任务转换为分类任务,预测任务分为多个bin,分类多个bin,通过预测的bin映射到离散的欧拉角度值作者通过设计旁路特征预测三个参数实现。之后作者提出了two-stream的ssr-net称之为FSA NET,并且吧预测结果提到了一个新高度。下面详细介绍文章内容。

SSR-Net-MD

这一部分作者提出了将SSR-Net应用于Head Pose Estimation,SSR-Net原本是用于年龄预测的网络,其本质是将原来的回归任务转换为分类任务,年龄因为是不连续的,所以可以直接采用回归来预测。而SSR-Net是将原来离散的年龄再进行一个bin分类,也就是说,比如要分类1-80岁的年龄,可以分为三个bin,儿童,青年,老年,这三个类别进行粗分类,然后在粗分类基础上进行细分类,这样学习的结果会更好,进行粗分类后的表征也更好。本文就是借鉴了这样的方案,将head pose角度规定在-99到+99范围内,然后划分为3个stage,也就是3个bin进行粗分类。

那么如何由粗分类的结果映射到连续的angle值呢?

作者提出了下面的公式:
\[ \widetilde{y} = \sum_{k=1}^{K} \vec{p}^{(k)} . \vec{u}^{(k)} \]
u代表第k个stage预测结果的表征向量,p是第k个stage的概率分布,那么可以根据这个公式映射到连续值上去。作者认为需要scale factor和shift vector对向量u作用,限定u的范围,当然scale factor、shift vector以及分布p都是可学习的,最终映射到连续结果。

FSA-Net

文章认为上面的SSR-Net虽然已经能够取得不错的结果了,但是在特征融合上作者认为还能有提升空间,并且提出了FSA-Net。就是说,向量u可以利用attention机制学到更好的表达。

网络结构图大致如下:

讲解一下我对这种结构的理解,感觉不是特别简单,还是看了好几天对这种结构有了一种粗浅的认识吧。

前面two streams不用说,和ssrnet一样,然后把两个stream提取的特征丢进Fine-grained structure aggregation Model里,就是这里的实现不是很好理解。

作者最终的目的是想设计一种结构更好的表征前面提取的feature,前面对应stage的feature应该对应相乘组成一个feature map了,所以一共得到了K个stage的feature map,shape为(c,h,w).

然后设计一种运算得到对Uk的打分,这个打分就是对整张Uk特征图的pixel打分,作者提出了三种scoring function

  1. 1x1卷积,输出channel为1
  2. 通道方差,在通道维度上求方差
  3. 直接给常值1

这样得到的score map Ak 的shape就是(h,w)

然后,需要设计一种结构将Uk换成另一种特征表达。

作者给出了下列公式
\[ \tilde{U}_k = S_k * U \]
这里的U = [U1,U2...Uk],shape为(K,c,h,w) 然后reshape为(n,c),这里n = K * h * w

然后作者打算用Ak和A来学习到Sk,于是另
\[ S_k = CM_k\\ M_k = \sigma(f_M(A_k))\\ C = \sigma(f_C(A)) \]
A跟上面一样是Ak的concat。Ak的shape是(h,w),A的shape是(K,h,w).

首先求Mk,先将Ak全连接到mK,shape变为(mK,h,w),然后reshape变为(m,n)

m为超参,n = K * h * w

然后求C,先将C reshape为(n,),然后全连接为(n`xm,)再reshape为(n`,m)

这样就可以直接乘上去,得到的
\[ \tilde{U}_k \in \Re^{n^\prime * c} \]
来表征feature,然后后面仍然是和SSR-Net一样的部分,利用Fusion模块来预测三个量。然后由公式(1)得到最后的输出结果。

理解下来创新点就是用了attention机制重新表征feature,而且在本任务中有精度提升。

本质上是先定义score function来评估feature,然后用评估的attention map来学习一种变换,对原来的feature作用这种变换,得到一种更好的特征表示。

后面实验作者也做的很良心。

其他

pytorch复现:TODO

论文原文:https://github.com/shamangary/FSA-Net/blob/master/0191.pdf

猜你喜欢

转载自www.cnblogs.com/aoru45/p/11531177.html