用於視頻回歸任務的長期循環卷積網絡

2020-12-15 deephub

基本概念

通過深度學習進行視頻處理是一個非常複雜的領域,因為它需要處理空間和時間兩個方面。 為了總結現代比較流行的方法是什麼,在這篇文章中我們將對視頻回歸任務的深度學習方法進行一些研究。

處理視頻意味著處理圖像,所以這裡需要cnn。但是,有不同的方法來處理時態組件。我試著概括出主要的幾點:

現有的方法

1、只使用CNN的回歸

史丹福大學的一篇非常有趣的論文(http://vision.stanford.edu/pdf/karpathy14.pdf)討論了視頻分類任務中可能遇到的挑戰,並提供了處理這些挑戰的方法(這些方法也可以應用於有輕微變化的回歸問題)。簡而言之,作者嘗試了各種CNNs架構來跨時間組件融合信息,並學習時空特徵。

2、3d CNN

這種方法背後的邏輯非常直觀,因為卷積中的第三維可以對應於時間域,從而可以直接從一個網絡學習時空特徵。

3、長期循環卷積網絡(LRCN)

2016年,一組作者提出了用於視覺識別和描述的端到端可訓練類架構。其主要思想是使用CNNs從視頻幀學習視覺特徵,使用LSTMs將圖像嵌入序列轉換為類標籤、句子、概率或任何您需要的東西。因此,我們用CNN對原始的視覺輸入進行處理,CNN的輸出被輸入到一堆遞歸序列模型中。

在我看來,LRCN架構在實現方面似乎比其他架構更有吸引力,因為您必須同時練習卷積和循環網絡。

我是個電影迷,已經看了大約一千部電影。基於此,我決定對電影預告片進行深度學習,預測預告片的收視率。不幸的是,收集訓練數據集非常困難,因為除了下載視頻之外,我還需要對它們進行標記。為了擴展數據集,我們可以應用一些數據增強,對於視頻可以旋轉,添加不同種類的噪聲,改變速度等。然而,最初的相機角度、圖像質量和電影速度都是未來評級的一部分,所以保留分數而改變這些特徵似乎是錯誤的。我決定從一個視頻中取幾個不重疊的部分然後將每個部分分割成幀最終得到n個訓練樣本

def preprocess(movie_name, train=True, n_subclips=3, subclip_duration=30, frequency=45, verbose=False):""" Preprocesses a movie trailer making subclips and then extracting sequences of frames :param movie_name: movie name :train: boolean flag to determine whether preprocessing is performed for training videos or not :param n_subclips: number of subclips to make from the trailer :param subclip_duration: duration of a subclip :param frequency: frequency of extracting frames from subclips :param verbose: increase verbosity if True """ name = '.'.join(movie_name.split('.')[:-1]) format_ = movie_name.split('.')[-1] if not format_ok(format_): print('Skipping file, which is not a video...') return if train == True: if not os.path.isdir(TRAINING_PATH): os.mkdir(TRAINING_PATH) DEST = TRAINING_PATH else: if not os.path.isdir(PREDICTION_PATH): os.mkdir(PREDICTION_PATH) DEST = PREDICTION_PATH if format_ == 'flv': #Decord does not work with flv format format_ = 'mov' #Extracting subclip from trailer base = 10 os.makedirs(f"{FPATH}/{name}", exist_ok=True) for i in range(n_subclips): if verbose: print(f"{i} iteration...") print("....Making subclip....") try: ffmpeg_extract_subclip(f"{FPATH}/{movie_name}", base, base+subclip_duration, targetname=f"{FPATH}/{name}/{i}.{format_}") base = base + subclip_duration except BaseException: print(f"Some error occured during {i+1} extraction") continue #Check if all subclips were correctly created try: video = moviepy.editor.VideoFileClip(f"{FPATH}/{name}/{i}.{format_}") if int(video.duration) <= subclip_duration//2: raise DurationError except: print(f"The {i} subclip was not correctly created, deleting...") os.remove(f"{FPATH}/{name}/{i}.{format_}") continue #Creating frames if verbose: print("....Extracting frames....") os.makedirs(f"{DEST}/{name+'_'+str(i)}", exist_ok=True) #Creating directory for Train dataset try: video_to_frames(f"{FPATH}/{name}/{i}.{format_}", f"{DEST}/{name+'_'+str(i)}", overwrite=False, every=frequency) except: print("Error occured while executing VIDEO_TO_FRAMES") os.rmdir(f"{DEST}/{name+'_'+str(i)}/{i}") os.rmdir(f"{DEST}/{name+'_'+str(i)}") continue #Delete directory with subclips if name in os.listdir(f"{FPATH}"): shutil.rmtree(f"{FPATH}/{name}")

現在我們可以開始構建網絡架構並訓練模型。原論文中的CNN base是對CaffeNet的修改,但為了簡單和更快的訓練,我只創建了兩個卷積層(batch normalization) dropout和max pooling作為編碼器,兩個稠密層作為解碼器。雖然該技術通過平均LSTM輸出用於視覺識別,但我們只要將結果使用softmax函數去掉就可以使用相同的方法進行視頻回歸,。

class CNN(torch.nn.Module):def __init__(self, channels1=10, channels2=20, embedding_size=15, activation='relu'): super(CNN, self).__init__() self.layer1 = torch.nn.Sequential(torch.nn.Conv2d(3, channels1, kernel_size=5, padding=2), activation_func(activation), torch.nn.BatchNorm2d(num_features=channels1), torch.nn.MaxPool2d(2, 2)) self.layer2 = torch.nn.Sequential(torch.nn.Conv2d(channels1, channels2, kernel_size=3, padding=1), torch.nn.Dropout2d(p=0.2), activation_func(activation), torch.nn.BatchNorm2d(num_features=channels2), torch.nn.MaxPool2d(2, 2)) self.encoder = torch.nn.Sequential(self.layer1, self.layer2) self.decoder = torch.nn.Sequential(torch.nn.Linear(56*56*channels2, 6000), activation_func(activation), torch.nn.Linear(6000, 500), activation_func(activation), torch.nn.Linear(500, embedding_size)) def forward(self, x): x = self.encoder(x) #flatten heatmap before utilizing dense layers x = x.view(x.size(0), x.size(1) * x.size(2) * x.size(3)) out = self.decoder(x) return outclass LRCN(torch.nn.Module): def __init__(self, channels1=10, channels2=20, embedding_size=15, LSTM_size=64, LSTM_layers=1, activation='relu'): super(LRCN, self).__init__() self.cnn = CNN(channels1, channels2, embedding_size, activation) #batch first: data formatted in (batch, seq, feature) self.rnn = torch.nn.LSTM(input_size=embedding_size, hidden_size=LSTM_size, num_layers=LSTM_layers, batch_first=True) self.linear = torch.nn.Linear(LSTM_size, 1) def forward(self, x): heatmaps = [] for seq in x: heatmaps.append(self.cnn.forward(seq)) heatmaps = torch.stack(heatmaps) out, (_, _) = self.rnn(heatmaps) out = self.linear(out) return out[:,-1,:]

一旦我們準備好了數據和模型,就該開始訓練了。我選擇的默認參數不會導致高質量但快速的訓練。

def fit(self, dir_names, X_test, y_test, lr=3e-4, loss_name='mse', n_epoch=5, batch_size=10, device='cpu', saving_results=False, use_tensorb=False, verbose=False):optimizer = torch.optim.Adam(self.parameters(), lr=lr) loss = loss_choice(loss_name) #Specifying loss function dir_names = list(filter(lambda x: os.path.isdir(f"{TRAINING_PATH}/{x}"), dir_names)) #Filtering waste files random.shuffle(dir_names) train_loss_history = [] test_loss_history = [] learning_dir_names = dir_names.copy() #Training model print('---------------TRAINING----------------') for epoch in range(n_epoch): dir_names = learning_dir_names.copy() train_loss = 0 for i in range(0, len(learning_dir_names), batch_size): optimizer.zero_grad() print(dir_names) X_batch, y_batch, dir_names = load_data(dir_names, train=True, verbose=verbose, batch_size=batch_size) X_batch = X_batch.to(device).float() y_batch = y_batch.to(device).float() preds = self.forward(X_batch).view(y_batch.size()[0]) loss_value = loss(preds, y_batch) loss_value.backward() train_loss += loss_value.data.cpu() optimizer.step() train_loss_history.append(train_loss) with torch.no_grad(): test_preds = self.forward(X_test).view(y_test.size()[0]) test_loss_history.append(loss(test_preds, y_test).data.cpu()) print(f"{epoch+1}: {loss_name} = {test_loss_history[-1]}") if saving_results==True: torch.save(self.state_dict(), MODEL_WEIGHTS) print('---------------------------------------') return [train_loss_history, test_loss_history]

即使訓練一個簡單的端到端LRCN模型也需要大量的計算能力和時間,因為我們的任務包括圖像和序列。此外,訓練數據集必須相當大,z這樣模型可以很好地推廣。從下圖可以看出,經過訓練後的模型存在明顯的擬合不足。

總結

LRCN是一種用於處理視覺和時間輸入的模型,它提供了很大的靈活性,可應用於計算機視覺的各種任務,並可合併到CV處理管道中。然後這種方法可用於各種時變視覺輸入或序列輸出的問題。LRCN提供了一個易於實現和訓練的端到端模型體系結構。

本文代碼: github/DJAlexJ/LRCN-for-Video-Regression

作者:Alexander Golubev

deephub翻譯組

相關焦點

  • 今日Paper | CausalML;隱式函數;慢動作視頻重建;交叉圖卷積網絡等
    :用於因果機器學習的Python包用於3D重建和形狀補全的特徵空間中的隱式函數基於混合成像系統的慢動作視頻重建交叉圖卷積網絡(Cross-GCN):使用k順序特徵交互來增強圖卷積網絡選擇核網絡from=leiphonecolumn_paperreview0318推薦原因本文主要內容:本文提出了一種新的機器學習算法包——CausalML,這是一種採用ython語言編寫而成用於解決因果推理(causalinference)與機器學習(machine learning)任務的算法,並且已經封裝成型
  • 從圖(Graph)到圖卷積(Graph Convolution):漫談圖神經網絡 (二)
    在從圖(Graph)到圖卷積(Graph Convolution): 漫談圖神經網絡 (一)中,我們簡單介紹了基於循環圖神經網絡的兩種重要模型,在本篇中,我們將著大量筆墨介紹圖卷積神經網絡中的卷積操作。接下來,我們將首先介紹一下圖卷積神經網絡的大概框架,藉此說明它與基於循環的圖神經網絡的區別。
  • NeurIPS 2020最佳論文;全卷積網絡實現E2E目標檢測
    推薦:原來,丟棄 Transformer,全卷積網絡也可以實現 E2E 檢測。儘管卷積神經網絡只要有大量已標記的訓練樣本就能夠執行,但是由於物體的變形與移動、場景照明變化以及視頻序列中攝像頭位置的變化,卷積神經網絡在視頻幀合成方面的表現並不出色。近日,來自東南大學的研究者提出了一種新型的端到端架構,稱為卷積 Transformer(ConvTransformer),用於視頻幀序列學習和視頻幀合成。
  • 德克薩斯A&M大學在讀博士遊宇寧:自監督學習在圖卷積網絡中的研究...
    為了有效利用大量的無標籤數據,自監督學習通過設置合理的學習目標和定義前置任務,從數據本身中得到了監督信號。當前自監督學習已經被廣泛用於訓練卷積神經網絡(CNNs),有效地提高了圖像表示學習可傳遞性、泛化能力和魯棒性,並且已在語義分割、目標檢測、圖像分類、人體動作識別等實戰場景中展現出卓越效果。現在更多無需人工標註的前置任務訓練也被提出,如前景對象分割、圖像修補、圖像著色等。
  • 混合時空圖卷積網絡:更精準的時空預測模型
    為了利用這一轉換關係,我們設計了將流量轉化為通行時間的轉換器,該轉換器由兩層網絡構成,分別用於提取全局共享信息和學習不同路段的精細化信息。 ,並設計了一種新的鄰接矩陣用於更好地體現路段間的交通鄰近性。
  • 卷積神經網絡與Transformer結合,東南大學提出視頻幀合成新架構
    Transformer 首度結合用於視頻幀合成。深度卷積神經網絡(CNN)是功能非常強大的模型,在一些困難的計算機視覺任務上性能也很卓越。儘管卷積神經網絡只要有大量已標記的訓練樣本就能夠執行,但是由於物體的變形與移動、場景照明變化以及視頻序列中攝像頭位置的變化,卷積神經網絡在視頻幀合成方面的表現並不出色。
  • ​卷積神經網絡與Transformer結合,東南大學提視頻幀合成新架構
    選自arXiv作者:Zhouyong Liu 等機器之心編譯機器之心編輯部研究者表示,這是卷積神經網絡與 Transformer 首度結合用於視頻幀合成。深度卷積神經網絡(CNN)是功能非常強大的模型,在一些困難的計算機視覺任務上性能也很卓越。儘管卷積神經網絡只要有大量已標記的訓練樣本就能夠執行,但是由於物體的變形與移動、場景照明變化以及視頻序列中攝像頭位置的變化,卷積神經網絡在視頻幀合成方面的表現並不出色。
  • ​卷積神經網絡與Transformer結合,東南大學提出視頻幀合成新架構
    首度結合用於視頻幀合成。深度卷積神經網絡(CNN)是功能非常強大的模型,在一些困難的計算機視覺任務上性能也很卓越。儘管卷積神經網絡只要有大量已標記的訓練樣本就能夠執行,但是由於物體的變形與移動、場景照明變化以及視頻序列中攝像頭位置的變化,卷積神經網絡在視頻幀合成方面的表現並不出色。
  • 丟棄Transformer,全卷積網絡也可以實現E2E檢測
    機器之心轉載作者:王劍鋒在近來研究人員熱衷於探索 Transformer 用於目標檢測的嘗試時,這篇論文提出了一種全新的觀點,即利用全卷積網絡也可以實現良好的端到端目標檢測效果。之後,Facebook AI 研究者提出的 DETR 將 Transformer 用到了目標檢測任務中,還取得了可以媲美 Faster R-CNN 的效果。但是,DETR 的訓練時間卻大大延長,在小目標上的性能也相對較低。所以,在本文中,來自曠視科技和西安交通大學的研究者提出了一個新穎問題:全卷積網絡是否可以實現良好的端到端目標檢測效果?
  • 用於圖像分割的卷積神經網絡:從R-CNN到Mask R-CNN
    選自Athelas作者:Dhruv Parthasarathy機器之心編譯參與:王宇欣、hustcxy、黃小天卷積神經網絡(CNN)的作用遠不止分類那麼簡單!在本文中,我們將看到卷積神經網絡(CNN)如何在圖像實例分割任務中提升其結果。
  • 變形卷積核、可分離卷積?卷積神經網絡中十大拍案叫絕的操作。
    1×1卷積核也被認為是影響深遠的操作,往後大型的網絡為了降低參數量都會應用上1×1卷積核。五、越深的網絡就越難訓練嗎?-- Resnet殘差網絡>傳統的卷積層層疊網絡會遇到一個問題,當層數加深時,網絡的表現越來越差,很大程度上的原因是因為當層數加深時,梯度消散得越來越嚴重,以至於反向傳播很難訓練到淺層的網絡。
  • 今天的卷積網絡,Yann LeCun在93年就已經玩得很溜了
    手寫數字識別是很多人入門神經網絡時用來練手的一個項目,但就是這麼簡單的一個項目,最近在 reddit 上又火了一把,因為在 MIT 計算機科學和人工智慧實驗室,有人挖到了一個「祖師爺」級別的視頻……這段視頻錄製於 1993 年,主人公是圖靈獎得主 Yann LeCun(楊立昆)。
  • 曠視出品:丟棄Transformer,全卷積網絡也可以實現端到端的目標檢測
    來源 | 知乎專欄作者 | 王劍鋒編輯 | 青暮目前主流的基於全卷積網絡的目標檢測器儘管性能優越為此,對於全卷積檢測器,研究者引入了預測感知的一對一(POTO)標籤分配進行分類,以實現端到端檢測,並獲得了與NMS相當的性能。此外,他們還提出了一種簡單的3D最大濾波(3DMF),以利用多尺度特徵並提高局部區域卷積的可分辨性。藉助這些技術,其端到端框架在COCO和CrowdHuman數據集上可以與許多最先進的使用NMS的檢測器相媲美。
  • 圖神經網絡的「前世今生」
    深度學習通過端到端的訓練徹底改變了很多機器學習任務. 但是這些任務的數據都是歐式空間上的規則數據. 而現實中很多數據之間都有著相當複雜的關係, 一般表現為非歐空間之上的圖結構.為處理圖數據之上的任務, 圖神經網絡就應運而生了.
  • 再見卷積神經網絡,使用Transformers創建計算機視覺模型
    用Transformers完成計算機視覺任務。長期依賴和效率權衡在NLP中,神經語言模型的目標是創建對文本中的單詞語義儘可能多的信息進行編碼的嵌入。CNN的問題卷積在NLP任務中也很流行,這是由於使用gpu訓練時的效率和可伸縮性。就像2D卷積可以從圖像中提取特徵一樣,這些模型使用1D過濾器從文本中提取信息,文本以1D序列表示。這類神經網絡的感受域取決於過濾器的大小和使用的卷積層的數量。
  • 深蘭科技動作識別-人體骨架時空圖卷積網絡的可學習邊與權
    本文將重點介紹論文中關於動作識別的時空圖卷積的可學習邊與權重,及其劃分策略。一、空間圖卷積神經網絡在深入研究成熟的ST-GCN之前,團隊首先要在一個幀內查看Graph CNN模型。圖二Spatial Temporal Modeling:制定了空間圖CNN之後,團隊現在進入在骨架序列內對空間時間動態建模的任務。回想一下在圖的構造中,圖的時間方面是通過在連續的幀之間連接相同的關節來構造的【圖二】。這使團隊能夠定義一個非常簡單的策略來將空間圖CNN擴展到空間時間域。
  • ...Facebook提出DensePose數據集和網絡架構:可實現實時的人體姿態...
    圖 4:標註的可視化:圖像(左)、收集到的點的 U 值(中)和 V 值(右)學習密集人體姿態估計圖 7:DensePose-RCNN 架構:我們使用了區域提議生成和特徵池化的級聯,之後跟著一個全卷積網絡,用於密集地預測離散部位標籤和連續表面坐標。
  • 通俗的解釋卷積神經網絡
    這引發了堆疊的卷積層,它包含將每個神經元的視線限定在輸入圖像的一小塊地區。接管域的大小由過濾器的大小給出,也稱為內核大小。當濾波器在圖像中滑動時,它的兼職道理就像燈號處分中的卷積,所以它容許特性檢驗。卷積是一個積分,顯露一個函數(核函數或濾波器)在另一個函數(輸入)上移位時的重疊量。
  • 2020最佳博士論文;南開等提出新型自校準卷積
    機器之心 & ArXiv Weekly Radiostation參與:杜偉、楚航、羅若天本周的重要論文包括 SIGGRAPH 2020 最佳博士論文,以及南開大學等提出的自校準卷積和相應網絡。