Video Caption Tutorial

Posted 爆米花好美啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Video Caption Tutorial相关的知识,希望对你有一定的参考价值。

欢迎star fork: video-caption.pytorch或者video-caption.pytorch

任务介绍

和image caption一样,不过是将图片换成了一段视频,根据视频内容给出一句文字描述。可用于后续的视频检索或者摘要生成,帮助智能体或者有视觉障碍的人理解现实情况。

Language model-based approach

语言模型为基础的,预测主谓宾然后补充其他组成一段话

Sequence learning-based approach

Translating Videos to Natural Language Using Deep Recurrent Neural Networks应该是第一篇直接从视频生成文字的文章,它利用cnn将视频中所有帧提取特征(fc7)然后进行mean pool之后送入后面的LSTM decoder进行文字的生成。

Sequence to Sequence – Video to Text是上一篇文章的作者Subhashini Venugopalan对自己模型的改进,之前直接进行mean pool,忽略了这些特征的顺序和时序关系。所以本文对每帧的特征都送到LSTM encoder中进行,然后再送到decoder中生成文字,这种模型简称成为S2VT

后续又把s2vt进行化简,s2vt中是两路LSTM,后续生成文字时上面的LSTM还要输出到下面的LSTM作为输入,后来的论文中对此进行化简,上面的LSTM encoding完后只把它的输出和隐状态送到后面decoder中,不再跟着decoder再跑一段序列。

上图有以下几点需要展开讲
1. feature的改进
2. decoder部分的改进,如Attention机制等
3. 其他如增强学习,Reconstruction network等

Video Feature

2d特征的发展主要得益于ImageNet,它是对图片分类。而3d特征主要是对视频分类或者视频中action、event、activity识别,有以下几种结构,本文主要介绍现在比较流行的3D-ConvNet

下图中b是将每个帧的图片在channel维度进行cat起来,c是3d卷积,在时间维度上也有一个步长Learning Spatiotemporal Features with 3D Convolutional Networks


但是c3d的模型参数太多了,它是类似与2d中的VGG,如果对c3d进行加深参数急剧增长。那么能不能把2d中的resnet迁移过来呢,当然可以!但是那个时候数据库还不行(一是有些数据库数量不够,二是sports-1M这种量虽然超级大但是噪声太多它是一整段视频才有一个label,有很多片段都和label action无关),直接把resnet套过去也是不好训练的微软出了个p3d来改,一是进一步减少3d resnet的参数,二是1*3*3的卷积可以利用2d resnet的参数来初始化Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks


i3d(Inflated 3D ConvNet)Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset该文提出了i3d的模型,更重要的是提出了一个Kinectics的数据库,数据量是240k段视频 clips,400类动作称为Kinectics-400,最近又推出了Kinectics-600,500K段视频 clips,600类动作称为Kinectics-600。这个数据库很重要的一点是它是只截取该action对应的视频片段(clips),基本不含无关帧,噪声较少。数据库地址

3D-ResNets是在Kinectics数据库推出后,从scratch开始训练完整的ResNets。
ResNet-18在各个视频数据库上训练的曲线图,发现在前3个库上已经overfiting了,但是Kinectics上并没有,所以作者开始加深网络在Kinectics上再次训练。

在Kinectics上从scratch开始训练,验证集上的结果,全部可作为pretrained model,且后续也证明了这些预训练模型用到UCf-101和HMDB-51上取得了很好的效果。

Audio Feature

在caption时也可以加入音频特征,不过我对音频方面不是特别了解,暂时就用的google tensorflow提供的Models for AudioSet: A Large Scale Dataset of Audio Events

Attention Mechanism

我在介绍daijifeng老师的 Relation Networks for Object Detection时简单提了一下Attention model。这里也一样,我们把所有视频特征和音频特征encoding后得到一个context,即encoder里每个时刻的输出output。在decoding阶段每个时刻输出单词时需要用不同的context。
下面介绍一种最简单的,decoding时,对于某个时刻的隐状态hidden_state,计算它与encoder_outputs的相似度(encoder_outputs是encoding时所有时刻的输出),然后进行softmax得到权重attn,然后用这个权重取乘以encoder_outputs,得到最终的context(encoder_outputs不同时刻输出的融合)
或者就是用一下其他的加一些全连接参数,或者对hidden_state和encoder_outputs降维后再进行相似度计算
Sundrops/video-caption.pytorch: Attention.py


## directly calculate the similarity of between encoder_outputs and hidden_state ###
# (batch, seq_len, dim) * (batch, dim, 1) -> (batch, seq_len, 1)-> (batch, seq_len)
attn = torch.bmm(encoder_outputs, hidden_state.unsqueeze(2)).squeeze(2)
# (batch, seq_len)-> (batch, 1, seq_len)
attn = F.softmax(attn, dim=1).unsqueeze(1)
# (batch, 1, seq_len) * (batch, seq_len, dim) -> (batch, 1, dim)
context = torch.bmm(attn, encoder_outputs).squeeze(1)
return context

其他

强化学习来做caption

由于我们训练时loss是定义在单个词上的交叉熵loss,而测试时是采用BLEU、CIDEr-D等指标,BLEU-4是4-gram看连词的,CIDEr-D采用df-idf不同的词有着不同的权重的,这些我们都无法去定义loss(不好反传,甚至不能反传),需要借助强化学习来弥补这个训练和测试的鸿沟用Reinforcement Learning来做image captioning

  • Deep Reinforcement Learning-based Image Captioning with Embedding Reward cvpr 2017 oral
  • Reinforced Video Captioning with Entailment Rewards EMNLP 2017

Reconstruction Network

Reconstruction Network for Video Captioning cvpr2018
将Decoder产生的输出送入Reconstructor(LSTM/GRU)中重构,得到向量后再和Encoder输出(Decoder输入)做L2 loss。即将video to sentence后再sentence to video, 即dual learning(中-英,英-中),使得中间的特征学习的更好。

Video Caption的比赛

MSR-VTT

MSR-VTT 2017 Leaderboard

RankTeamOrganizationBLEU@4MeteorCIDEr-DROUGE-L
1RUC+CMU_V2TRUC & CMU0.3900.2550.3150.542
2TJU_MediaTJU0.3590.2260.2490.515
3NIINational Institute of Informatics0.3590.2340.2310.514
video-captionmodelfeature
-s2vtvgg190.28640.20550.17480.4774
-s2vtresnet1010.31180.21300.20020.4926
-s2vtnasnet0.30030.21760.22130.4931
-s2vtnasnet+c3d_kinectics0.32370.22270.22990.5041
-s2vtnasnet+c3d_kinectics+beam search0.33490.22440.23400.5034
-s2vt+attnasnet+c3d_kinectics0.32260.22350.23990.5011
-s2vt+attnasnet+c3d_kinectics+beam search0.34190.22780.25030.5063

ActivityNet: Dense Caption

Dense-Captioning Events in Videos
一段视频给出很多句描述,而且描述之间在时间上可能有交叉,这就和之前的不太一样了,之前的每段都是单一事件事先截取好的,这里可能需要现在时间维度上提取proposal,将视频截成很多片段,这些片段可能有交叠。如果不想这样就简单的就是按照不同间隔将视频段进行平分,比如有10帧10帧的也有20帧20帧的,但效果可能不如别人用模型在维度提取proposal,这个比赛确实包含提取proposal这个子任务Temporal Action Proposals

以上是关于Video Caption Tutorial的主要内容,如果未能解决你的问题,请参考以下文章

如何在 videojs-caption 插件中添加字幕数据

关于 Image Caption 中测试时用到的 beam search算法

自适应注意力机制在Image Caption中的应用

Html5-Video标签和字幕

ffplayer之video

YouTube 字幕 API 返回不准确的数据