论文笔记 Towards Diverse Paragraph Captioning for Untrimmed Videos

本文最后更新于:2023年6月7日 晚上

Towards Diverse Paragraph Captioning for Untrimmed Videos

论文链接:https://arxiv.org/abs/2105.14477

代码链接:syuqings/video-paragraph: Codes for paper “Towards Diverse Paragraph Captioning for Untrimmed Videos”. CVPR 2021 (github.com)

CVPR2021的一篇关于Paragraph Video Captioning的文章,由人民大学团队开发研究。

文章提出了一种适合长视频的一步段落视频描述方法。传统段落视频描述需要两步,先预测视频片段,再对每一个片段进行描述,这种方式受限于预测片段的准确程度,并且语言连贯性不高。若要一步实现,那么就会面临成百上千的帧数以及长尾效应。

本文提出了一种一步段落描述的模型(One-stage Video Paragraphing model,OVP),该模型包含关键帧选择模块(Keyframe-aware Video Encoder)视频记忆模块(Attention with Dynamic Video Memories),能够从长视频中逐步选取关键片段进行段落描述。

该组后续文章Movie101: A New Movie Understanding Benchmark沿用这个backbone

模型架构

Keyframe-aware Video Encoder

用来提取视频的关键帧,下面三个公式表示一个编码块,和Transformer十分相似,只是在FFN的后面加了一个sigmoid函数,从而控制不同帧的激活程度。

输出的Xi\mathcal{X}^i将会根据激活值s\boldsymbol{s}的值,设置百分比超参数δ\delta来选择少部分帧作为这个模块的输出Venc\mathcal{V}^{enc}

这个模块使用两个损失进行约束,分别为重构损失(Reconstruction Loss)稀疏损失(Sparsity Loss)

重构损失需要使用hard negative triplet loss,预先学习一个GRU网络,能够获取一个长视频和其段落描述文本的embedding,然后重构损失:Lreconst=GRU(Xkey0)GRU(X0)2\mathcal{L}_{reconst}=||GRU(\mathcal{X}^0_{key})-GRU(\mathcal{X}^0)||_2,其中Xkey0=X0sN\mathcal{X}^0_{key}=\mathcal{X}^0 \cdot \boldsymbol{s}^N,是soft筛选后的关键帧,这个损失使选择出来的帧能够涵盖视频的关键语义。

但是预先学习的这个GRU网络性能不一定好啊

稀疏损失则惩罚高于阈值的关键帧数量:Lsparsity=1Kj=1L(sjNδ)1\mathcal{L}_{sparsity}=||\frac{1}{K}\sum^L_{j=1}(s^N_j - \delta)||_1

训练的时候soft选择,预测的时候则直接选择百分比的帧数。

视频要是很长,那这个模块的自注意力层恐怕承受不了……

### Attention with Dynamic Video Memories

这个模块有很多复杂的公式,在这里不详细介绍,只是说明大概思路。

总的来说,这个模块把Transformer的Decoder魔改了交叉注意力的输入,使其成为了每一步会发生变化的Mt\mathcal{M}_t矩阵。这个Mt\mathcal{M}_t就是模型的记忆,而这个记忆会根据以往的状态进行更新,更新操作又分为“增加”和“删除”两部分,前者使记忆大致根据时序逐渐关注视频的不同段落,后者则将已经描述过的部分降低注意力以免重复描述。

“增加”的部分如上,包含上一时刻的记忆mt,im_{t,i}和要增加的记忆。要增加的记忆中,gg控制记忆是否更新(当未输出一整句时,记忆无需更新);(1u)(1-u)表示当前对各片段的注意力,当前未施加注意力的帧的权重更大,并且也会随着记忆而更新,uu会初始化为对前几帧感兴趣;则是根据输出预测出来的下次预测所需要帧的概率,是输出不同句子的关键项;最后是vv,是之前提取的视频特征。

虽然u初始化是视频的开始,但是整体貌似无法保证按照时间顺序进行描述。

“删除”的部分如上,各个符号的意义大致相同,pp是根据输出来计算出的不需要某帧的概率。

这个模型整体来说恐怕有些过于复杂了,没有那种简洁的结构美,但是根据一个记忆模块来控制解码器的输入的思想是很不错的,在面临长序列的视频时,控制输入的量十分重要。

关键帧选择的模块中,一个长视频需要过自注意力来提取固定的关键帧比较低效,需要一个额外的GRU来监督(这一点可以使用目前更好的Backbone来优化),并且FFN参数量巨大却只被用来预测一个门控。除此以外,在以下情况可能有问题:视频的前后两帧,内容极其相似,对应嵌入语义也很相似,但是却是冗余的,可能一同被Selecting Layer选中。

记忆模块则十分复杂,并且记忆的大小还是覆盖了整个选择出来的关键帧,但是思想上却是要对选择出来的关键帧再进行选择,输出不同句子的时候关注不同的地方,假如这里能够再次精简就更理想了。

后续实验部分就不再分析。