論文地址:Video2GIF: Automatic Generation of Animated GIFs from Videopython
視頻的結構化分析是視頻理解相關工做的關鍵。雖然本文是生成gif圖,可是其中對場景RankNet思想值得研究。git
文中的視頻特徵表示也是一個視頻處理值得學習的點。之前作的視頻都是基於單frame,沒有考慮到時空域,文中的參考文獻也值得研讀一下。github
如下是對本文的研讀,英語水平有限,有些點不知道用漢語怎麼解釋,直接用的英語應該更容易理解一些。算法
從源視頻當中提取GIF小片斷,在大規模數據集檢測中,該方法取得了state-of-the-art。數據庫
gif介紹vim
Animated GIF is an image format that continuously displays multiple frames in a loop, with no sound.網絡
提出了RankNet來處理給一個視頻,得出一個片斷排列。架構
1首先用3D convolutional neural networks去represent每一個視頻。app
2而後用排名算法訓練去比較一對輸入中那個更適合做爲gif圖。而後用排名算法訓練去比較一對輸入中那個更適合做爲gif圖。python2.7
3爲了加強魯棒性,在排序中設計一個robust adaptive Huber loss function。
4最後,爲了解決用戶生成內容的不一樣程度的質量問題,咱們的損失考慮到流行度量進行編碼社會媒體上的GIF的影響。
數據集
收集了超過100K用戶生成動畫GIF與其對應的來自在線來源的視頻源。有數百個成千上萬的GIF在線可用,許多提供了連接到視頻源。
使用這個數據集訓練咱們的深層神經網絡比較超過500KGIF和非GIF對。實驗結果代表咱們的模型成功地學習了什麼內容是適合的GIF,咱們的模型很好地推廣到其餘任務,即視頻highlight detection。
三點貢獻
1提出瞭解決自動生成gif任務的方法。
2提出了Robust Deep RankNet with a novel adaptive Huber loss in the ranking formulation
3收集超過100k的用戶生成的gif及原視頻數據集。
整個流程如圖:
1美學和趣味性aesthetics and interestingness
趣味性方面 Fu et al. [7] propose anapproach accounting for this, by learning a ranking modeland removing outliers in a joint formulation.
提出經過學習排名模型來解決這個問題並以聯合方式取消異常值。
Khosla等人[20]分析圖像流行度的相關屬性。運用大量的Flickr圖像數據集,他們分析和預測什麼類型的圖像比其餘圖像更受歡迎,表面趨勢相似於有趣的趨勢[11]。
在相似的方向是Redi等人的工做[31],分析創造力。然而,不是分析圖像,他們專一於視頻,其長度受限於6秒。
2視頻摘要Video summarization
[37]有詳細的介紹,這裏只討論圖像先驗和監督學習方法。
使用網絡圖像的先驗是基於的觀察特定主題或查詢的網絡圖像一般是規範的主題的視覺示例。這樣就能夠進行計算
幀分數做爲幀與一組其餘幀之間的類似性網頁圖像[21,20,33]。
基於學習的方法,使用監督模型來得到對於幀[25,8,27]或段[13]評分功能。
3視頻亮點 Video highlights
亮點的定義既是主觀的和上下文相關[37]。舉例人物特寫,體育罰球等。
Sun et al. [35]and Potapov et al. [30]提出了更通常的方法。基於針對特定主題(例如衝浪)的註釋視頻,他們使用機器學習方法中通用特徵來預測兩點。爲了訓練手工大量標記視頻註釋,進行動做識別。
獲取大型視頻突出顯示數據集很困難。 所以,Yang et al。 [40]提出了一種無監督的方法來尋找亮點。 依靠一個假設事件類別的亮點在短視頻中比非亮點更頻繁地捕獲,他們訓練自動編碼器。
4學習使用深層神經網絡進行排名 Learning to rank with deep neural networks
一些工做使用CNN從排名標籤中學習。損失函數一般用pairs 配對[27,9]或三聯體triplets [38,39,14,23]。 成對方法一般使用一個CNN,而損失是相對定義的輸出。 Gong et al。 學習網絡預測圖像標籤,並要求得分正確的標籤要高於不正確標籤的分數。 Triplet方法,使用Siamese 網絡。特定一個圖像triple (查詢,正,負),一個損失函數須要查詢圖像的學習表示更接近正面的,而不是負面的形象,根據一些度量[38,39,14,23]。
5噪聲標籤的有監督深度學習
幾個之前工做已經成功地從弱勢學習了模型標籤[18,38,27]。 Liu et al。 [27]考慮視頻搜索
場景。 給定Bing的點擊數據,他們學習聯合嵌入查詢文本和視頻縮略圖以查找語義相關的視頻幀。相比之下,[18,38]使用經過自動得到的標籤訓練神經網絡的方法。Karpathy等訓練用於動做分類的卷積神經網絡視頻。他們的培訓數據來自YouTube經過分析相關的元數據自動標記與視頻。王等人 [38]學習特徵表示對於細粒度的圖像排名。基於現有的圖像功能他們生成用於訓練的標籤神經網絡。 這兩種方法都得到了最早進的技術表現,顯示出強大的弱標籤數據集與深度學習相結合。
受到近期成功應用與深層學習結合使用的大量弱標籤數據集的啓發,咱們收集了具備嘈雜,人爲生成註釋的社交媒體數據。
將GIF與源視頻對齊是相當重要的,由於它可讓咱們找到非選擇的片斷,這些細分做爲訓練的負面樣本。 此外,視頻提供更高的幀速率和更少的壓縮僞影,是得到高質量特徵表徵的理想選擇。
數據庫包含120K animated GIFs and more than80K videos, with a total duration of 7,379 hours.
Alignment對準
咱們將GIF與對應的對齊視頻使用幀匹配。爲了有效地作到這一點,咱們基於 perceptual hash感知散列對每一個幀進行編碼discrete cosine transform 離散餘弦變換[41]。
感知散列perceptual hash是快速計算的,而且因爲其二進制表示,能夠是使用漢明距離Hamming distance很是有效地匹配。 咱們將GIF幀的集合與其對應視頻的幀進行匹配。 這種方法須要O(nk)距離計算,其中n,k分別是視頻和GIF中的幀數。 因爲GIF的長度受限制而且具備較低的幀速率,所以它們一般僅包含幾幀(k <50)。 所以,該方法在計算上保持有效,同時容許對準準確。
由於這個方法想要創建的是數據庫,那麼結果準確度是十分重要的。在以前的工做中,其餘方法都是用一個大團塊blocks of 50
frames,好比50幀一塊兒檢測,結果會比較粗糙,並不適用於當前這種狀況。
Dataset Analysis.數據集分析
咱們分析什麼類型的視頻常常用於建立動畫GIF。 圖3顯示最多咱們的數據集中的視頻頻繁標籤,圖4顯示視頻的類別分佈。 幾個標籤給了感受視頻中存在什麼,這多是潛在的幫助GIF建立,例如 可愛和足球。 其餘的不是視覺信息,例如2014或YouTube。 圖2顯示視頻長度的直方圖(中位數:2m51s,平均值:5m12s)。 能夠看出,大多數源視頻都很短,中位持續時間少於3分鐘。
Splits.拆分
training and validation sets about 65K and5K videos
test set 357 videos Creative Commons licence 表1顯示了咱們使用的數據集的統計信息。
本節介紹了咱們對Video2GIF任務的方法,在排名配方中引入了一種新穎的適應性Huber損失,使得學習過程對異常值更robust魯棒; 咱們稱之爲魯棒深度網絡。
4.1. Video Processing
將一段長視頻,切割成小片斷 採用boundary detection algorithm Song et al. [33]
結果的重合度達到66%以上,就認定爲是正例。沒有任何重合overlap的最爲負例。
4.2. Robust Deep RankNet
Architecture overview 結構總覽 圖五所示。
訓練過程當中輸入是GIFand non-GIF segments
模型學習一個maps a segment s to its GIF-suitability score h(s)
學習一個函數,經過比較訓練的片斷對,而後GIF segment gets a higher score than a nonGIFsegment
測試階段,採用帶個segment輸入,計算GIF-suitability score,而後計算出全部視頻全部片斷的得分,產生segments排名列表,選適合的做爲動畫gif。
Feature representation 特徵表徵
動畫GIF包含高度動態視覺內容,特徵表示相當重要。捕捉視頻段的空間和時間動態,咱們使用在Sport-1M數據集[18]上預先訓練的C3D [36]做爲咱們的特徵提取器。
C3D經過用時空卷積層代替傳統的2D卷積層,將AlexNet [22]的圖像中心網絡架構擴展到視頻域,並已被證實在多個視頻分類任務上表現良好[36]。 之前的方法使用類別具體模型[35,30],咱們能夠選擇爲段表示添加上下文功能。 這些能夠被認爲是元信息,補充視覺特徵。 他們有可能消除細分排名的歧義,並容許模型根據視頻的語義類別進行分數。 特徵包括類別標籤,視頻標籤的語義嵌入(在word2vec表示[28]上的意義))和位置特徵。 對於位置特徵,咱們使用片斷在視頻中的時間戳,秩和相對位置。
Problem formulation 問題公式
簡單的方式是能夠把這個問題歸結爲分類問題,可是不能完美的解決這個問題,由於由於那裏對於什麼是好的或壞的細分沒有明確的定義。
因此把這問題肯定爲排序問題。在數據集D上構建一個排序,是正樣本得分排名大於負樣本。
這個公式比較是兩個片斷,即便它們來自不一樣的視頻。 這是有問題的,由於兩個片斷的比較僅在視頻的上下文中是有意義的,例如,一個視頻中的GIF片斷可能不被選擇爲另外一個視頻中的GIF。 爲了看到這一點,一些視頻包含許多感興趣的部分(例如,編譯),而在其餘視頻中,甚至所選擇的部分質量低。 這個概念所以,GIF的適用性在單個視頻的上下文中是很是有意義的。
爲了解決這個問題,咱們將排名計算公式指定爲特定視頻。在同一視頻中gif的正樣本排名大於負樣本。
Loss function. 損失函數
其中p = 1 [17]和p = 2 [35,24]是最受歡迎的選擇。 lp損失強制排名約束,要求一個積極的分數比其負面對手的得分高於1.若是邊界被違反,損失的損失在l1損失的偏差中是線性的,而對於l2的損失 是二次的。 l2損失的一個缺點是相對於l2損失來講,是過分懲罰小額違約。 l2損失沒有這樣的問題,可是它會對邊際違規進行二次懲罰,所以受到異常值的影響更大(見圖6)。
由於數據包含線上製做的,有的質量低,因此提出了robust rank loss,來適應Huber loss formulation。對邊界違反小的樣本給更低的懲罰。公式如2.圖6中定義了三種不一樣形式的函數。
Objective function.目標函數
4.3. Implementation Details 實現細節
選擇了2個全鏈接隱層,每一個層後面RELU。第一層512個節點,第二層128個節點。輸出h(s)的最終預測層是一個簡單的單線性單位,預測非標準化標量得分。
網絡共2,327,681個參數。
反向傳播採用[32]採用mini-batch stochastic gradient descent。mini-batches=50 pairs
採用Nesterov’s Accelerated Momentum [2]加速權重更新。
momentum is set to 0.9
weight decay λ =0.001
learning rate = 0.001 10個epoch減小一次
應用dropout [34] regularization input =0.8 after the first hidden layer=0.25
用500k個訓練集對,每一個視頻中全部的正樣本和視頻中隨機抽取4個負樣本並把負樣本結合。對於具備固定δ的Huber損失,咱們根據驗證集的性能設置δ= 1.5。 對於自適應Huber損失,咱們設置δ= 1.5 + p,其中p是在[20]中提出的歸一化視圖計數。爲了進一步減小咱們的模型的方差,咱們使用模型平均,其中咱們從不一樣的初始化訓練多個模型, 平均預測分數。 模型使用Theano [3]與Lasagne [6]進行實施。
Evaluation metrics.
在video highlight detection中流行的評價指標是mean Average Precision(mAP)和p
由於上述方法對視頻長度敏感,本文使用的normalized version of MSD。
5.1. Compared Methods
5.2. Results and Discussions
5.3. Cross Dataset Performance
咱們介紹了從視頻自動生成動畫GIF的問題,並提出了一個強大的Deep RankNet,它預測了適合的GIF視頻片斷。
咱們的方法利用新的自適應Huber等級丟失來處理嘈雜的網絡數據,該優勢具備對異常值的魯棒,並可以將內容質量的概念直接編碼到損失中。
在咱們新的動畫GIF數據集咱們展現了咱們的方法成功地學習了細微差別的分級,優於現有的方法。
此外,它歸納了很好的亮點檢測。咱們的新穎的Video2GIF任務,以及咱們的新的大型數據集,爲將來的研究開闢了自動GIF建立方向。
例如,能夠應用更復雜的語言模型來利用視頻元數據,由於並非全部的標籤都是信息豐富的。所以,咱們認爲學習專門用於視頻標籤的嵌入能夠改善語境模型(我認爲就是利用視頻元數據能夠向NLP中word2vec那樣來處理)。
雖然這項工做集中在得到有意義的GIF排名,但咱們只考慮了單一片斷。因爲一些GIF範圍超過多個鏡頭,所以看看什麼時候組合片斷甚至連合分割和選擇也將是有趣的。
遇到的相關問題等
AttributeError: 'module' object has no attribute 'Conv3DLayer'
File "/data/vincent/code/video2gif_code-master/video2gif/__init__.py", line 42, in get_prediction_function
try:
from lasagne.layers import Conv3DLayer
except ImportError:
from lasagne.layers.dnn import Conv3DDNNLayer as Conv3DLayer
dnn not available
File "/usr/lib/python2.7/site-packages/lasagne/layers/dnn.py", line 13, in <module>
raise ImportError("dnn not available") # pragma: no cover
ImportError: dnn not available
升級
pip install --upgrade https://github.com/Theano/Theano/archive/master.zip
0.9
pip install --upgrade https://github.com/Lasagne/Lasagne/archive/master.zip
0.2
Traceback (most recent call last):
File "video2gif_demo.py", line 1, in <module>
import video2gif
File "/data/vincent/code/video2gif_code-master/video2gif/__init__.py", line 18, in <module>
import model
File "/data/vincent/code/video2gif_code-master/video2gif/model.py", line 8, in <module>
from lasagne.layers.shape import PadLayer
File "/usr/lib/python2.7/site-packages/lasagne/__init__.py", line 12, in <module>
import theano
File "/usr/lib/python2.7/site-packages/theano/__init__.py", line 68, in <module>
from theano.version import version as __version__
File "/usr/lib/python2.7/site-packages/theano/version.py", line 14, in <module>
int(short_version.split('.')[2])
IndexError: list index out of range
vim /usr/lib/python2.7/site-packages/theano/version.py
short_version.split('.')[0]
pip install -U theano
上步廢棄
Traceback (most recent call last):
File "video2gif_demo.py", line 15, in <module>
score_function = video2gif.get_prediction_function()
File "/data/vincent/code/video2gif_code-master/video2gif/__init__.py", line 42, in get_prediction_function
net= model.build_model(batch_size=2)
File "/data/vincent/code/video2gif_code-master/video2gif/model.py", line 58, in build_model
net['pool1'] = lasagne.layers.pool.Pool3Layer(net['conv1a'],pool_size=(1,2,2),stride=(1,2,2))
AttributeError: 'module' object has no attribute 'Pool3Layer'
/data/vincent/code/video2gif_code-master/video2gif/model.py
Pool3DLayer
cd ~/.keras/model
/usr/lib64/python2.7/site-packages/keras/applications/inception_v3.py
train.py:98: UserWarning: The semantics of the Keras 2 argument `steps_per_epoch` is not the same as the Keras 1 argument `samples_per_epoch`. `steps_per_epoch` is the number of batches to draw from the generator at each epoch. Basically steps_per_epoch = samples_per_epoch/batch_size. Similarly `nb_val_samples`->`validation_steps` and `val_samples`->`steps` arguments have changed. Update your method calls accordingly.