美文网首页
《No frame left behind: Full Vide

《No frame left behind: Full Vide

作者: ce0b74704937 | 来源:发表于2021-05-15 16:14 被阅读0次

    文章地址:No frame left behind: Full Video Action Recognition

    代码地址:暂无

    现有算法都是通过类似于uniform sample对一个视频采样出部分帧,进而使用这部分帧对视频进行分类。文章认为将视频中所有的帧利用起来会对分类任务有所帮助,所以文章提出了一种既不占用大量显存也不增加太多计算时间的方式来利用所有的视频帧进行视频的分类任务。

    一、研究动机

    现有的算法对于将所有的帧计算,是不太可行的,一个是计算量,一个是显存问题。

    对于计算量的问题,虽然现在的算法大部分的计算都是在GPU上并行处理的,但是对于视频输入,一个视频可以拆分成大量的视频帧,视频处理就相当于在一个巨大的图像数据库上面进行计算,所以利用所有的帧,计算量会很大。

    对于显存问题,不同于图像算法loss函数计算可以只针对每一帧来的,视频算法是针对整个视频来求loss,这样就要求保存对应所有帧的梯度结果来更新网络,所有这样会要求使用到大量的显存。

    为了解决上述问题,文章提出将所有帧前向输出的激活(all frame activations)进行聚类和聚合,从而大大的减少了显存的占用。有因为聚类与聚合操作是在网络的早期,也就是对于所有帧的计算只在网络早期进行,而不是网络所有的层,这样可以减少大量的网络计算。

    二、聚合时间簇(Aggregated temporal clusters)

    2.1 近似梯度(Approximating gradients)

    文章给出一个假设,即视频中邻近的帧内容相似,那在网络中进行前向计算时可以得到相似的activations,从而在计算梯度时可以获取一致的梯度更新。

    拿激活函数为ReLU来说明。当activations符号一致是,ReLU激活函数是线性的,对于线性的激活函数,相似帧也几乎是线性的,对于这种线性关系,每一帧的梯度和等于所有帧的activations相加再求梯度,用公式表示如下:

    \sum_i\nabla_wL(h(x_iw))=\nabla_wL(\sum_ih(x_iw))

    其中x表示帧的activations,w表示网络的权重,h(\cdot)表示激活函数,L(\cdot)表示损失函数。

    上式在h是线性的且L也是线性的情况下成立。但是h和L都为线性的情况是不通用的,当存在非线性关系时,这种近似关系会引入一定的误差。为了减小引入的误差,文章提出了一种聚类的方式,具体看下一部分的介绍。

    2.2 近似方法引入的误差的边界(Error bound for the approximation)

    为了便于解释这部分内容,现在只考虑只有两帧的情况以及这两帧的activations用符号x=\lbrace x1, x2\rbrace表示。对于一个卷积参数为w的卷积操作用符号xw表示。又这两帧来自于同一个视频,所以这两帧具有相同的标签y。

    在loss计算时,网络采用的是交叉熵联合softmax计算(softmax操作采用q符号表示)。两帧样本的loss计算用公式表示为:

    L(x,y)=-\frac{1}{2}(log(q_y(x_1)+log(q_y(x_2))))

    其中q_c(x_i)=\frac{exp(h(x_iw_c))}{\sum^C_{j=1}exp(h(x_iw_j))},C\in \{1, ..., C\}表示视频的类别,h表示ReLU激活函数。

    对上述loss对w求导得:

    \nabla_wL(x,y)=\frac{x_1(q_c(x_1)-\delta_{yc})+x_2(q_c(x_2)-\delta_{yc})}{2}

    其中\delta_{yc}是狄利克雷函数,当c=y时取值为1.

    对于本文算法来说,本文是先将两个activations求平均然后经过ReLU操作,之所以可以这样操作,是因为当sign(x_1w)=sign(x_2w)时,\frac{h(x_1w)+h(x_2w)}{2}=h(\frac{x_1w+x_2w}{2})。那么对于本文来说交叉熵可以用下面公式表示:

    \hat L(x,y)=-logq_y(\frac{x_1 + x_2}{2})

    对于backward pass阶段,梯度计算用下面公式表示

    \nabla_x\hat L(x, y)=\frac{x_1+x_2}{2}(q_c(\frac{x_1+x_2}{2})-\delta_{yc})

    因为softmax函数是凸函数,所以利用Jensen不等式可以得到下面公式
    q_c(\frac{(x_1 + x_2)}{2})\leq \frac{q_c(x_1)+q_c(x_2)}{2}

    对于\frac{x_1+x_2}{2}>0的情况,将上述公式两边乘以\frac{x_1+x_2}{2}得到:

    \frac{x_1 + x_2}{2}q_c(\frac{(x_1 + x_2)}{2})\leq \frac{x_1q_c(x_1)+x_2q_c(x_2)}{2}-\frac{1}{4}(x_1-x_2)(q_c(x_1)-q_c(x_2))

    可以看出上式左边就是\nabla_x\hat L(x, y), 右边就是\nabla_wL(x,y)减去一个引入的误差项。(当c=y时,两边的狄利克雷项互相约去了)

    同理考虑\frac{x_1+x_2}{2}\leq 0时的情况,可以得到下面的式子

    |\nabla_wL(x,y)-\nabla_x\hat L(x, y)|\leq\frac{1}{4}|(x_1-x_2)(q_c(x_1)-q_c(x_2))|

    通过上式可以看出两种梯度之间的误差项与两帧的activations差值和它们差值的softmax结果有关。当两个activations的差值越接近0时,两个梯度越接近。

    注意:上式成立需要满足activations之间的符号是一致的这个条件,所以在将不同帧聚类时是基于activations的符号相似性来做的。

    2.3 时序聚类与聚合( Temporal clustering and aggregation)

    根据上述部分可以知道,为了尽可能少的引入误差,需要将activations符号一致的帧进行聚类。文章使用符号函数对activations中的每一个值进行二值化,然后通过汉明距离来判断是否将不同帧进行聚类。

    文章采用两种聚类方式,一种是cumulative clustering,一种是slope clustering。不管采用哪种方式,为了满足显存的限制,可以预定义需要聚类的类别数,这里用g来表示,即聚为g类。

    首先计算出cumulative Hamming distance,即每两个相邻帧的汉明距离,然后依次向后累加。对于最后一帧第N帧,该累加汉明值为:

    C_N(x)=\sum^{N-1}_{i=1}H(x_i, x_{i+1})

    其中x_i表示第i帧activation的二值化结果,H表示汉明距离,N表示总帧数

    cumulative clustering就是根据C_N(x)将所有帧等距离的聚类为g类,类别帧号为\lceil g\frac{C_i(x)}{C_N(x)}\rceil

    slope clustering就是选取汉明距离增加最快的前g个slopes。

    上述两种聚类方式如下图所示

    1.png

    为了提高计算效率,文章的聚类和聚合操作都是在网络的早期进行,后面的网络层的输入都为聚合后的activations。文章假设activations之间的符号与两帧之间的相似度有关,与网络的哪一层计算没有太大关系,下图验证了该假设。

    2.png

    最后文章采用TSM的结果来进行实验,文章的网络结构如下图所示。图中t表示输入t帧,n表示batch size,g表示聚类的类别数。

    3.png

    相关文章

      网友评论

          本文标题:《No frame left behind: Full Vide

          本文链接:https://www.haomeiwen.com/subject/pkjdlltx.html