Video Caption(跨模态视频摘要/字幕生成)
Video Caption
視頻摘要/視頻字母生成屬于多模態(tài)學(xué)習(xí)下的一個子任務(wù),大體目標(biāo)就是根據(jù)視頻內(nèi)容給出一句或多句文字描述。所生成的caption可用于后續(xù)的視頻檢索等等,也可以直接幫助智能體或者有視覺障礙的人理解現(xiàn)實情況。
典型的架構(gòu)如上圖(圖自[ICCV2015] Sequence to Sequence – Video to Text,從視頻幀到文本句子的端對端模型),該任務(wù)可以分解為兩個子任務(wù),一個是如何理解視頻/多模態(tài),并融合以得到更好的視覺表示,另一個是視頻描述生成,如何得到質(zhì)量高,甚至可控、穩(wěn)定、又多樣的句子。
主要涉及到3個問題:
- (1)輔助語義信息監(jiān)督,如何利用視覺語義概念來提高字幕質(zhì)量的輔助目標(biāo);
- (2)減輕客觀目標(biāo)失配問題的方法;
- (3)密集字幕,它需要在視頻中聯(lián)合定位和描述多個事件。
接下來整理一些比較重要的論文。
[MM2016] Describing Videos using Multi-modal Fusion
如何理解視頻,那么就把所有能得到的數(shù)據(jù)通通用上吧。模型架構(gòu)如上圖,encoder端用了video(全局)、image(局部)、aural(環(huán)境音)、speech(語音)和meta modality(種類),然后用一個融合網(wǎng)絡(luò)進(jìn)行多模態(tài)融合了之后,再輸入到后面的decoder端得到句子。
當(dāng)然這是16年的工作,現(xiàn)在在模態(tài)上還可以用更多的信息,如全局信息如光流,局部概念信息如action、event、activity,純局部信息如object,relation等等,甚至還可以學(xué)習(xí)視頻主題語義來增強。
[CVPR2017] Top-down Visual Saliency Guided by Captions
注意力從不會缺席,這篇文章通過計算“字幕引導(dǎo)的視覺顯著性”(即注意力),從而在視覺輸入中的對象與句子中的單詞之間建立對應(yīng)關(guān)系的程度 。具體的模型架構(gòu)如上圖,會分別在時間和空間上做兩個注意力,即如視覺注意力是對輸入的每個幀i和每個單詞t產(chǎn)生時間顯著性值,然后 通過從輸入序列中刪除除第i個描述符之外的所有描述符。最后的輸出會與與原始單詞概率分布進(jìn)行比較來計算loss。
code:https://github.com/VisionLearningGroup/caption-guided-saliency
[CVPR2018] End-to-end dense video captioning with masked transformer
注意力可十分方便的升級成為Transformer。這篇文章就是通過改裝Transformer,如上圖,以逐幀圖像的CNN特征到Transformer中,不然一樣的是ffn后面接的是TCN,然后再輸入到解碼器生成caption。
[MM2019] Aligning Linguistic Words and Visual Semantic Units for Image Captioning
這篇文章繼續(xù)細(xì)化圖像中的object,relation和attribute(分別用目標(biāo)檢測器,屬性分類器,關(guān)系檢測器得到)來增強對視覺的理解,具體來說作者一個提出基于圖卷積網(wǎng)絡(luò)(GCNs)分別在語義和幾何層面中顯式建模對象交互,并充分利用語言詞和視覺語義單元之間的對齊來進(jìn)行圖像caption生成。
模型圖上圖,其中三個概念分別代表:objects (“man”, “helmet”), their attributes (“helmet is red”), and relationships (“man hold bat”),即目標(biāo)是某些局部區(qū)域,屬性是目標(biāo)對象的屬性如red,而關(guān)系則是不同目標(biāo)對象之間的交互關(guān)系。
而語義圖(Semantic Graph)和幾何圖( Geometry Graph)的每個節(jié)點都對應(yīng)于一個視覺語義單元,即一個對象、一個屬性或兩個對象之間的語義/幾何上的交互。 然后用GCN去學(xué)習(xí)其上下文感知的嵌入,即首先決定當(dāng)前單詞大約是哪種類型的視覺語義單元(即對象、屬性或交互),然后在這種類型下找到最相關(guān)的視覺語義單元,從而將當(dāng)前單詞與這些單元分層對齊。
然后通過Gated Fusion來控制這三個特征的重要性程度,最后接一個文本生成器得到caption。
[CVPR2019] Object-aware Aggregation with Bidirectional Temporal Graph for Video Captioning
找關(guān)系的文章,這篇也比較突出。主要思路就是提取出視頻的關(guān)鍵object(空間上和時序上都統(tǒng)一),并且構(gòu)建雙向時序圖優(yōu)化特征,最后再融合使用整個視頻提取出的全局特征來生成描述句子。
模型圖上圖,主要分為三個部分,雙向時序圖,目標(biāo)感知聚合,和對caption解碼生成。
- 雙向時序圖。先使用目標(biāo)檢測處理視頻的關(guān)鍵object(即提取出N個object區(qū)域),然后再利用相似性構(gòu)建視頻中的時序圖,其中相似性有三個部分來衡量:區(qū)域的外觀特征相似度,區(qū)域的IoU相似度和區(qū)域的面積尺寸相似度s(i,j)=(sapp(i,j)+siou(i,j)+sarea(i,j))/3s(i,j)=(s_{app}(i,j)+s_{iou}(i,j)+s_{area}(i,j))/3s(i,j)=(sapp?(i,j)+siou?(i,j)+sarea?(i,j))/3雙向的意思是,視頻的正序和負(fù)序(逆幀)都會都會根據(jù)以上相似度來連接邊。
- 目標(biāo)感知。這個是對雙向時序圖做特征優(yōu)化的,使用的是C-GRU(CNN和GRU的結(jié)合,可以同時提時空信息)。
- caption。然后使用attention模型對上一步生成的區(qū)域序列特征和全局區(qū)域特征融合,再輸入到GRU得到最后的caption結(jié)果。
[CVPR2020] Object Relational Graph with Teacher-Recommended Learning for Video Captioning
當(dāng)然關(guān)于視頻目標(biāo)的挖掘還可以做的更加復(fù)雜!這篇文章作者認(rèn)為有兩個特征表示不足的地方:
- 視覺面缺乏物體的交互,從而缺乏足夠的視覺表示。
- 語言層面缺少與內(nèi)容相關(guān)單詞的充分訓(xùn)練問題。
所以提出基于關(guān)系目標(biāo)圖OEG的編碼器以豐富視覺表示(直接看圖就是用GCN捕捉物體交互后,再兩個Attention…),并且同時設(shè)計了一種蒸餾方法,這樣可以直接整合外部語言模型(teacher)將豐富的語義整合到字幕模型(student)中以解決詞長尾問題。最后Attention LSTM得到視頻描述的結(jié)果。
[IJCAI2020] Learning to Discretely Compose Reasoning Module Networks for Video Captioning
視頻字幕生成需要更復(fù)雜的視覺時空推理,例如要生成“一個人在打籃球”這句話,需要首先定位和描述主題“人”,然后解釋這個人是“投”,然后描述投的對象“籃球。所以作者提出推理模塊網(wǎng)絡(luò)(RMN)。為了進(jìn)行時空視覺推理,RMN采用三個基本的時空推理模塊:
- a)locate模塊,通過時空關(guān)注定位視頻的單一區(qū)域,從而生成的視覺詞,如圖中的“人”、“籃球”;
- b)relation模塊,先檢測視頻各幀對象,然后通過兩幀配對建模動作,生成動作詞;
- c)Func模塊根據(jù)語言上下文生成功能詞,如圖中的“a”、“is”這種。
其次,為了沿著生成過程組成推理結(jié)構(gòu),RMN使用了一個動態(tài)的和離散的模塊選擇器,然后采用Gumbel采樣使離散采樣過程可微,然后用詞性標(biāo)注的POS標(biāo)簽約束模塊選擇器。
code:https://github.com/tgc1997/RMN
[ACL2017] Multi-Task Video Captioning with Video and Entailment Generation
這篇文章用多任務(wù)學(xué)習(xí)的想法來優(yōu)化整個caption框架,整個框架共包括三個任務(wù):
- Unsupervised video prediction。無監(jiān)督的未來幀預(yù)測,出發(fā)在于單獨抽視頻特征不能很好的提取出時序動作特征,所以用自監(jiān)督的方法,使用video encoder 和video decoder,其中解碼器decoder部分使用特征來還原輸入視頻的順序;
- Entailment Generation:。同義句生成/句子含義生成,也就是給句子生成含義相似的新句子,使用language encoder和 language decoder,然后和video端一樣的功能,都是優(yōu)化兩邊encoder的能力。
- Video Captioning。我們要做的主任務(wù),直接使用video encoder和language decoder即可。
多任務(wù)比單任務(wù)單模型的好處在于可以擬合出順序推演的過程,從而可以增強缺乏時序表示和邏輯推演。
[MM2020] Learning Semantic Concepts and Temporal Alignment for Narrated Video Procedural Captioning
這篇同樣也是多任務(wù)的路線,Motivation在于引入轉(zhuǎn)錄文字可以克服視覺物體的遺漏+補充文本語義的細(xì)粒度概念。挑戰(zhàn)有三個
- 1視頻上下文很重要
- 2視頻和轉(zhuǎn)錄文字如何對齊
- 3轉(zhuǎn)錄文字無明確信息怎么處理
模型圖如上,框架上是全局文本特征+全局視頻特征+每個word進(jìn)如Transformer得到特征,然后用attention對齊全局文本和全局視頻對此時的特征,最后拼接這三者得到特征。
然后做兩個任務(wù):一是語義概念預(yù)測,這里直接算預(yù)測的概念與ground truth的KL。二是文本摘要,這里利用概念庫做是否copy的選擇以克服長尾問題。
[AAAI2019] Learning to Compose Topic-Aware Mixture of Experts for Zero-Shot Video Captioning
繼續(xù)補充外部知識,主要是為了將任務(wù)擴展到zero-shot,所以提出TAMoE)模型,模型架構(gòu)如上圖,主要由視頻編碼模塊、基于TFIDF的主題嵌入模塊和TAMOE摘要生成模塊組成。
- 視頻編碼。這個直接用C3D來做,并且預(yù)測動作標(biāo)簽。
- 主題嵌入模塊。通過動作標(biāo)簽可以從外部語料庫中獲取與主題相關(guān)的文檔,并用于計算基于TFIDF的主題嵌入,這代表了動作的語義意義。
- caption解碼。將視頻特征和主題嵌入作為輸入,并通過動態(tài)組成多個專家Mixture-of-Experts (MoE)來生成字幕。這里的專家可以學(xué)習(xí)不同的主題嵌入,方便隱式地將從看到的活動中學(xué)到的知識轉(zhuǎn)移到看不見的活動中。
code:https://github.com/eric-xw/Zero-Shot-Video-Captioning
[ECCV2020] Comprehensive image captioning via scene graph decomposition
這篇文章是相要同時平衡caption的diversity, grounding and controllability。特別是多樣性caption應(yīng)該怎么控制生成比較好?因為一個視頻中不同人會有不一樣的注重點,那么可以生成很多的描述。作者提出的做法是通過scene graph decomposition,關(guān)于scene graph博主有整理過就不做贅述,這里主要是通過把由從圖像得到的場景圖通過采樣多個子圖,之后由子圖完成句子生成即可。
模型圖如上,通過采樣可以得到很多種不一樣的sub-graph,可以通過給sub-graph打分來評判子圖是否合理(其中這里是有向圖),然后也是把得到的特征輸入到后面的帶attention的LSTM即可。
[CVPR2021] Towards Accurate Text-Based Image Captioning With Content Diversity Exploration
通過識別目標(biāo)對象的ocr來增強caption。作者認(rèn)為需要在意的問題是:
- 1如何確定圖像中哪部分是重要的,應(yīng)該對誰生成描述;
- 2捕捉圖像中多樣的文本及其關(guān)系是重要的;
- 3如何生成多樣性描述。
對應(yīng)的方法是先對文本目標(biāo)構(gòu)建錨點圖,然后對每個小子圖生成句子,就能又多樣又長的句子了,對應(yīng)模型架構(gòu)如上圖。分為三個模塊,第一個模塊是是為了融合visual和text。第二個模塊是生成錨點圖(先根據(jù)預(yù)測分?jǐn)?shù)選擇錨點,然后根據(jù)錨點構(gòu)建錨點圖)。第三個模塊是得到caption。
[CVPR2021] Open-book Video Captioning with Retrieve-Copy-Generate Network
首先作者提出關(guān)于Video Caption的現(xiàn)有技術(shù)缺點:
- 1輸入只是視頻,無法得到更通用的表達(dá)。
- 2知識是固定的,之后無法擴展。
這篇文章Open-book意思是不僅限于當(dāng)前視頻本身,而是視頻先檢索語料再動態(tài)復(fù)制再生成,會更加的全面靈活。模型結(jié)構(gòu)如上圖,最左上的是提取到video的motion和appearance特征,然后將其做一個video-to-text的檢索,這個組件在右上角(雙塔的檢索模型,算similarity取topk的檢索結(jié)果)。然后將視頻feature和檢索到的sentence進(jìn)行融合輸入到copy-mechanism generator里面,去生成每一個詞,這個組件在右下角(主要是對visual部分得到視覺詞做copy,而visual本身會跟sentence特征拼接去預(yù)測,兩者結(jié)合得到最后的預(yù)測結(jié)果即可)。
Semantic Grouping Network for Video Captioning
繼續(xù)補21年的文章,這篇文章主要的motivation是“Grouping”,即將每一幀作為一個獨立的信息單元來考慮并不是理解視頻的有效方法,人類通過根據(jù)語義將視頻分割成信息單元來理解視頻是很自然的。所以作者嘗試通過根據(jù)人、對象或動作等含義將信息分組,而不是逐幀分組來理解視頻。另一方面,作者同時強調(diào)了已經(jīng)輸出的句子也是十分的重要而一直不被重視,它的語義信息可以幫助來分組。所以作者提出SGN,模型圖,如上,它通過圍繞部分解碼標(biāo)題的短語對齊幀,將視頻編碼為語義組,并通過利用語義組作為信息單元來描述視頻。
首先作者列出了如上幾種caption的模式,以往對group的識別都是基于event的,如圖b。對于冗余幀是直接拋棄的,如圖c,而作者的做法是d,先分組,然后再結(jié)合部分解碼來生成句子。
然后模型部分還想提一下的就是作者提出Contrastive Attention (CA) loss,這里作者認(rèn)為語義組應(yīng)該只包含與其短語高度相關(guān)的框架,以確保一個語義組在其成員之間具有連貫的意義,所以會對輸入視頻的負(fù)視頻進(jìn)行采樣(故模型圖的輸入就有兩段video)。
RSTNet: Captioning with Adaptive Attention on Visual and Non-Visual Words
同CVPR2021的文章。作者的動機來自兩點:
- 處理特征。圖像的2D空間變成1D特征這一展平過程會造成的空間信息損失的問題。
- 生成架構(gòu)。對視覺詞和非視覺詞的處理不做區(qū)分,如man 和 with。
所以作者提出了一個視覺信息增強和多模態(tài)信息敏感的Transformer結(jié)構(gòu),Relationship-Sensitive Transformer (RSTNet),利用網(wǎng)格與網(wǎng)格之間相對位置的幾何關(guān)系解決了特征展平操作造成的空間信息損失的問題,并且利用一個額外的注意力層度量視覺特征與語義特征的貢獻(xiàn),從而充分引導(dǎo)圖像描述中視覺詞和非視覺詞的生成。模型圖如上,主要比較重要的點是2個:
- 網(wǎng)格特征。即最下面的黃色區(qū)域。會先切成網(wǎng)格,然后找網(wǎng)格之間的關(guān)系,最后生成特征。
- 視覺特征和語義特征的區(qū)別。動態(tài)地測量視覺信號(黃色)和語言信號(藍(lán)色)對預(yù)測每個單詞(紫色/粉色)的貢獻(xiàn),這里也是用多頭注意力來算。為什么能解決視覺詞和非視覺詞是因為,對于視覺詞那么視覺重要,對于非視覺詞是文本的上下文更重要,所以這里通過動態(tài)計算來做這一點。
Direction Relation Transformer for Image Captioning
博主繼續(xù)補文,今天補來自MM21的文章。比較有意思的是作者提出應(yīng)該挖掘?qū)ο髤^(qū)域間的方向性關(guān)系,比如“女人”和“馬”之間的相對方向可以指導(dǎo)模型生成“一個騎馬的女人”,而不是“一個站在馬前的女人”。方向可以更好的理解圖像中物體之間的相對位置,并有效地生成正確的caption。
所以作者提出Direction Relation Transformer去嵌入方向到attention中以實現(xiàn)定向感知。具體的做法框架如上圖,大結(jié)構(gòu)上還是Transformer-based的,主要在左上角的direction如何插入到attention的計算中。
關(guān)于方向的定義如上圖,在二維空間中預(yù)先定義了4k個單位的方向向量,其中每個向量代表一個方向類別。以矩形坐標(biāo)系的原點為中心,第i個單位方向向量可以表示為:
αi=(cos(i?2k),sin(i?2k))\alpha_i=(cos(\frac{i\phi}{2k}),sin(\frac{i\phi}{2k}))αi?=(cos(2ki??),sin(2ki??))然后其嵌入Relative Direction Embedding Matrix的計算為兩個box之間的角度vmn=(xm?xnZ,ym?ynZ)v_{mn}=(\frac{x_m-x_n}{Z},\frac{y_m-y_n}{Z})vmn?=(Zxm??xn??,Zym??yn??)rmn=argmaxvmn?αi∣∣vmn∣∣?∣∣αi∣∣r_{mn}=argmax \frac{v_{mn}\cdot \alpha_i}{||v_{mn}||\cdot||\alpha_i||}rmn?=argmax∣∣vmn?∣∣?∣∣αi?∣∣vmn??αi??得到這個向量之后可以自由插入到KVQ中來參與模型。就作者的實驗結(jié)果來看這三種都不差,最好的性能是融合到V中。
dataset
普通的數(shù)據(jù)集的話有如下幾種。
最近博主看文章發(fā)現(xiàn)大家都不止?jié)M足于做普通的caption了,開始轉(zhuǎn)于做各種稀奇古怪但又有一定實踐價值的新任務(wù),比如程序化caption、多樣化caption、獨特化caption、多視角caption、常識性caption、問題控制型caption。。。于是在下一篇博文,博主找了幾篇相關(guān)文章來整理一下這些豐富的任務(wù)變體們。
- Various Image/Video Caption(視覺字幕化新任務(wù))
最后看一個比較簡單的baseline,即開頭那張兩層LSTM的S2VT模型的架構(gòu)
#按照S2VT的結(jié)構(gòu)是2層LSTM,第一層是編碼幀序列 #第二層是接受第一層的隱層狀態(tài)+與0填充之后再編碼(很多對應(yīng)位置沒有值,直接pad為0來填充)class S2VTModel(nn.Module):def __init__(self, vocab_size, max_len, dim_hidden, dim_word, dim_vid=2048, sos_id=1, eos_id=0,n_layers=1, rnn_cell='gru', rnn_dropout_p=0.2):super(S2VTModel, self).__init__()#可選擇是LSTM或GRU兩種if rnn_cell.lower() == 'lstm':self.rnn_cell = nn.LSTMelif rnn_cell.lower() == 'gru':self.rnn_cell = nn.GRUself.rnn1 = self.rnn_cell(dim_vid, dim_hidden, n_layers,batch_first=True, dropout=rnn_dropout_p)self.rnn2 = self.rnn_cell(dim_hidden + dim_word, dim_hidden, n_layers,batch_first=True, dropout=rnn_dropout_p)self.dim_vid = dim_vid #視頻維度self.dim_output = vocab_size #詞表大小self.dim_hidden = dim_hidden #隱層維度self.dim_word = dim_word #詞維度self.max_length = max_len #最大長度self.sos_id = sos_id #開始符self.eos_id = eos_id #結(jié)束符self.embedding = nn.Embedding(self.dim_output, self.dim_word) #編碼詞表的詞,因為是one-hot所以直接是詞表大小self.out = nn.Linear(self.dim_hidden, self.dim_output) #用于輸出的fcdef forward(self, vid_feats, target_variable=None,mode='train', opt={}):batch_size, n_frames, _ = vid_feats.shape #視覺特征維度#兩種pad填充,frame和wordpadding_words = Variable(vid_feats.data.new(batch_size, n_frames, self.dim_word)).zero_()padding_frames = Variable(vid_feats.data.new(batch_size, 1, self.dim_vid)).zero_()#兩種開始狀態(tài),frame和word都為nonestate1 = Nonestate2 = None#self.rnn1.flatten_parameters()#self.rnn2.flatten_parameters()output1, state1 = self.rnn1(vid_feats, state1) #第一層LSTMinput2 = torch.cat((output1, padding_words), dim=2) #憑借輸出的隱層和0填充的padoutput2, state2 = self.rnn2(input2, state2) #然后輸?shù)降诙?/span>seq_probs = []seq_preds = []if mode == 'train': #訓(xùn)練模式for i in range(self.max_length - 1):# <eos> doesn't input to the networkcurrent_words = self.embedding(target_variable[:, i]) #嵌入當(dāng)前詞#重置參數(shù)的數(shù)據(jù)指針,使內(nèi)存更contiguous(連續(xù)性),利用率高self.rnn1.flatten_parameters()self.rnn2.flatten_parameters()#逐詞的輸出都要通過pad,過兩層LSTM得到結(jié)果output1, state1 = self.rnn1(padding_frames, state1) input2 = torch.cat((output1, current_words.unsqueeze(1)), dim=2)output2, state2 = self.rnn2(input2, state2)logits = self.out(output2.squeeze(1)) #預(yù)測概率logits = F.log_softmax(logits, dim=1)seq_probs.append(logits.unsqueeze(1))seq_probs = torch.cat(seq_probs, 1)else: #測試模式current_words = self.embedding(Variable(torch.LongTensor([self.sos_id] * batch_size)).cuda())#嵌入當(dāng)前詞for i in range(self.max_length - 1):#重置參數(shù)的數(shù)據(jù)指針,使內(nèi)存更contiguous(連續(xù)性),利用率高self.rnn1.flatten_parameters()self.rnn2.flatten_parameters()#逐詞的輸出都要通過pad,過兩層LSTM得到結(jié)果output1, state1 = self.rnn1(padding_frames, state1)input2 = torch.cat((output1, current_words.unsqueeze(1)), dim=2)output2, state2 = self.rnn2(input2, state2)logits = self.out(output2.squeeze(1))logits = F.log_softmax(logits, dim=1)seq_probs.append(logits.unsqueeze(1))_, preds = torch.max(logits, 1)current_words = self.embedding(preds) #得到結(jié)果詞seq_preds.append(preds.unsqueeze(1))seq_probs = torch.cat(seq_probs, 1)seq_preds = torch.cat(seq_preds, 1)return seq_probs, seq_preds完整的源碼閱讀筆記在:https://github.com/nakaizura/Source-Code-Notebook/tree/master/S2VT
另外有注釋一個更完備的框架Video-guided Machine Translation(VMT),即最近發(fā)布一個中英數(shù)據(jù)集VATEX的代碼,這個也可以改裝了之后做video caption。源碼解析筆記在同一個github:https://github.com/nakaizura/Source-Code-Notebook/tree/master/VMT 。
ClipCap: CLIP Prefix for Image Captioning
補文最新的2022年文章,CLIP做到image caption中,CLIP博主已經(jīng)整理過,不做贅述。作者提出ClipCap模型,其模型結(jié)構(gòu)如上,主要分為三部分:
- 圖像編碼器:采用CLIP模型,負(fù)責(zé)對輸入的圖像進(jìn)行編碼,得到一個圖片向量。
- Mapping Network:扮演圖像空間與文本空間之間的橋梁,負(fù)責(zé)將圖片向量映射到文本空間中,得到一個文本提示向量序列prefix embeddings。
- 文本解碼器:采用GPT2模型,根據(jù)提示向量序列,生成caption。
paper:https://arxiv.org/abs/2111.09734
github:https://github.com/yangjianxin1/ClipCap-Chinese
總結(jié)
以上是生活随笔為你收集整理的Video Caption(跨模态视频摘要/字幕生成)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机软件英文参考文献,软件工程英文参考
- 下一篇: 软件工程专业英语翻译句子