1. 程式人生 > >利用JPEG製作更快,更準確的神經網路

利用JPEG製作更快,更準確的神經網路

Uber AI Labs介紹了一種製作神經網路的方法,該方法通過破解libjpeg並利用JPEG表示來更快,更準確的完成影象處理的任務。本文來自Uber Engineering部落格,LiveVideoStack進行了翻譯。


文 / Lionel Gueguen, Alex Sergeev, Rosanne Liu, & Jason Yosinski

譯 / 元寶

原文 https://eng.uber.com/neural-networks-jpeg/


640?wx_fmt=png


神經網路是處理各種行業資料的重要工具,在過去幾年裡從一個學術研究領域發展成為行業的基石。卷積神經網路(CNN)對於從影象中提取資訊特別有用,無論是對影象進行分類,識別人臉還是評估圍棋棋局的位置。


在Uber,我們將CNNs用於各種用途,從檢測物體和預測其運動到處理街道級別和衛星影象的千兆位元組,以改善我們的地圖。在使用CNN時,我們關心它完成任務的準確程度,在很多情況下,我們也關心它的速度。在這兩個示例中,一個是網速是原來的兩倍的網路可以實現實時檢測而不是離線檢測,或者能夠在一週的資料中心時間而不是兩週內處理龐大的資料集。


在本文中,我們描述了在NeurIPS 2018上提出的一種方法,通過破解libjpeg並利用JPEG(流行的影象格式)已經使用的內部影象表示,同時使CNNs更小、更快、更準確。這項工作的早期版本於2018年6月作為ICLR研討會海報提出。本文還將討論與網路架構設計相關的頻率空間和顏色資訊的驚人見解。


為了理解這種方法,首先讓我們看一下JPEG編解碼器的工作原理。一旦我們理解了JPEG,我們就可以很自然地應用CNN。

 

JPEG的工作原理


JPEG是一種舊格式,在2017年慶祝了它誕生25週年,並且它仍然是最廣泛使用的影象格式之一。在其常見配置中,JPEG編碼器執行圖1中的步驟,如下所示,從右到左:


640?wx_fmt=png


圖1. JPEG編碼過程包含幾個階段,此處從右到左顯示。


從影象的RGB表示開始(如右圖所示),影象被轉換為表示亮度(亮度)的YCbCr顏色空間-Y,以及表示色度(色調)的Cb和Cr通道。然後,通過預定因子(通常是兩個或三個)對Cb和Cr通道進行下采樣(在我們的工作中,我們使用兩個因子)。這種下采樣是壓縮的第一階段:資訊丟失的第一階段。然後,將該表示中的每個通道分成8×8塊並通過離散餘弦變換(DCT),變換到類似於傅立葉變換的頻率空間。DCT本身是無損且可逆的,將8×8空間塊轉換為64個通道。


然後量化係數,這是一個有損的過程,包含第二壓縮階段。量化由JPEG質量引數控制,質量設定越低,壓縮越嚴重,檔案越小。量化閾值是特定於每個空間頻率,並且經過精心設計的:對低頻的壓縮比高頻率更少,因為人眼對寬頻區域上的細微誤差比對高頻訊號幅度的變化更敏感。然後,通過霍夫曼編碼的變體無損地壓縮量化的DCT係數(整數)並將其儲存在JPEG檔案中,如上面圖1中所示的image.jpg。


JPEG解碼過程與JPEG編碼過程完全相反。所有可逆步驟都被精確地反轉,兩個有損步驟——量化和下采樣——近似反轉以產生RGB影象。對於上下文,此過程可能已執行十次,只是為了解碼和顯示此網頁上顯示的影象!


假設我們想在JPEG影象上訓練一個神經網路。我們可以將JPEG影象解壓為RGB,並將其輸入神經網路的第一層,如下圖2所示:


640?wx_fmt=png


 圖2.在典型的訓練過程中,JPEG影象被解壓為RGB,然後被送入神經網路。


現在我們瞭解了JPEG演算法,難道我們不能輕易做得更好嗎?神經網路必須處理由RGB畫素陣列表示的影象。許多神經網路似乎學習了第一層中從畫素空間到頻率空間的轉換。因此,如下圖3所示,為什麼不直接將DCT表示輸入網路,跳過過程中的一些早期層呢?


640?wx_fmt=png


圖3.我們提出的過程:僅將JPEG影象解壓到DCT表示階段,然後將此表示直接提供給神經網路。正如我們所看到的,頻率表示允許我們跳過網路的第一部分,節省計算,並且與使用原始畫素相比,可以使網路具有更高的精度!


這正是我們在下面和在論文中詳細介紹的方法:我們修改libjpeg直接將DCT係數輸出到TensorFlow(如果您想自己嘗試,可以使用我們的程式碼),並根據此表示直接訓練網路。結果證明,只要有幾個細節是正確的,它就會非常有效!

 

基線


在我們的研究中,我們從JPEG表示中來訓練網路,希望生成的網路既準確又快速。我們考慮了幾個影象處理任務,但是現在我們選擇嘗試從ImageNet資料集中分類影象。我們使用的所有網路都基於殘餘網路ResNet-50,並且所有網路都經過了90個epoch的訓練,這可以通過使用Horovod在128個NVIDIA Pascal gpu上進行分散式訓練,只需兩到三個小時就可以在我們的設定中完成。


首先,我們以最標準的方式——從RGB畫素——訓練了一個普通的ResNet-50,並發現它達到了大約7.4%的前五個誤差,並且可以在NVIDIA Pascal GPU上每秒超過200個影象進行推斷。在下面的圖4中,我們將該網路描述為一個小的黑色方塊,它位於一個跟蹤錯誤率和速度之間關係的圖中:


640?wx_fmt=png


圖4.在此圖中,我們繪製了從畫素訓練的兩個網路中每秒影象的前五個誤差和速度之間的關係。


灰色虛線顯示了這個基線的準確度。相對於速度較慢且具有較少誤差的網路,我們更喜歡速度更快的網路,因此我們希望找到在圖中出現在右下方的網路。根據具體應用,我們可能願意在準確性和速度方面進行權衡。除了RGB畫素網路之外,我們還從YCbCr畫素(正方形下方的灰色菱形)訓練了一個網路,發現它的表現幾乎相同,表明色彩空間本身並沒有顯著影響效能。


由於我們的目標是快速準確的網路,我們首先嚐試使ResNet-50更短(從底部刪除塊)或更薄(每層使用更少的通道)。雖然這會使網路更快,但我們會失去多少精確度?在下面的圖5中,一些較短和較薄的網路顯示了仍然利用RGB畫素輸入的ResNet-50的簡單突變可用於我們的權衡曲線:


640?wx_fmt=png


圖5.使ResNet-50更短或更薄但仍使用RGB輸入時,可以使用不同的權衡曲線。


在圖5中,我們可以看到具有全寬度的較短網路比保持全深度的薄網路表現更好。淺灰色的“刪除N個ID塊”行形成了Pareto前端,顯示了一組“非主導”網路,或那些提供最佳速度與準確性權衡的網路。例如,簡單地刪除三個ID塊可以使我們的影象每秒近300張影象,但錯誤也會增加,在這種情況下會增加近8%。“刪除3個ID塊”網路位於Pareto前端,因為沒有其他網路具有比它更低的錯誤和更高的速度。(有關這些網路的更多詳細資訊,請參閱我們的完整研究論文。)


現在讓我們嘗試直接在JPEG解碼器中提供的DCT係數上訓練網路,看看是否可以將整個帕累託向前推進。

 

訓練DCT輸入網路


要從DCT輸入進行訓練,我們必須首先考慮不同輸入大小的問題。


香草ResNet-50設計用於具有形狀(224,224,3)的輸入——寬度和高度為224畫素和3個顏色通道(RGB)。我們的DCT係數具有非常不同的形狀:Y通道沿每個空間維度小8倍但具有64個頻率通道,從而產生輸入形狀(28,28,64)。Cb和Cr通道小16倍(由於額外的2倍下采樣),因此它們各自具有形狀(14,14,64)。我們該如何處理這些不尋常形狀的表示?


假設我們沒有完全忽略任何一個輸入,那麼任何提出的架構的基本要求是在它最終做出分類決策之前,組合Y和Cb/Cr。我們將考慮的所有體系結構都具有以下形式:將變換或子網路T1應用於Y,將另一個變換或子網路T2應用於Cb和Cr,將通道順序連線到結果,並將連線後的表示提供給一個ResNet-50頂部的ResNet映象,無論是否進行一些修改。總體架構如圖6所示:


640?wx_fmt=png


圖6.在用於進行DCT輸入的網路的一般形式中,T 1和T 2可以是任意學習或非學習變換。


在T2是子網路(學習變換)的情況下,權重在Cb和Cr路徑之間是不共享的。注意,為了按通道連線表示,它們必須共享相同的空間大小,因此,例如,T1和T2不可能同時是標識轉換。


我們考慮的兩個系列T1和T2的轉換:一個是通過最多使用單層轉換來儘早合併路徑,另一個是先進行更重要的處理、然後合併路徑。


DCT早期合併架構


使得Y和Cb/Cr的不同空間大小匹配的最簡單方法是對大表示(Y)進行下采樣,或對小表示(Cb/Cr)進行上取樣。我們嘗試兩者並將結果新增到我們的圖中,如藍色“DownSampling”和“UpSampling”圓圈,如下圖7所示:


640?wx_fmt=png


圖7.使用DCT表示並儘可能早地合併資料流 - 使用單個層 - 導致Pareto前移,同時具有更快和更準確的網路。


由於DownSampling模型減小了第一層輸入資料的空間大小,因此最終速度非常快——每秒約450幅影象,或者是ResNet-50速度的兩倍以上——但其誤差也要高得多。UpSampling模型更慢、更準確,因為它丟棄的資訊更少。


我們最初對UpSampling模型中的錯誤高於基線ResNet-50感到有些失望。我們假設這個問題的根源是一個微妙的問題:DownSampling和UpSampling模型中早期層的單元接收域太大。CNN中一個單元的感受域是它可以看到的輸入畫素的數量,或者可能影響其啟用的輸入畫素的數量。事實上,在研究了網路中每一層的步幅和接受域後,我們發現在普通ResNet-50的中途,單位的接受域約為70。就像通過我們幼稚地組裝起來的UpSampling模型一樣,接受域已經是110px ,因為我們的DCT輸入層的[步幅,接受域]是[8,8],而不是典型的典型[1,1]畫素輸入層。直觀上,我們要求網路瞭解110px寬的視覺概念,但沒有給它足夠的層數或計算能力來做到這一點。(更多討論請看論文的第3節和圖4。)


我們通過在網路早期新增額外的stride-1塊建立了一個新的感知域感知(RFA)模型UpSampling-RFA。通過這種新模型,接受域逐層增長更加平滑,與ResNet-50大致匹配,並且效能得到提高(見圖7)。如果通過學習的反捲積而不是畫素複製來完成上取樣,則誤差會進一步降低,從而產生最佳模型:解卷積-RFA。


通過對接受域的小心處理,我們現在發現了一種模型,它不僅更準確(6.98%的誤差與7.35%的誤差相比),而且比基線快1.29倍!沿著相同的DCT Early Merge系列的其他車型現在形成了新的Pareto前端,在他們提供的錯誤和速度權衡方面佔據了先前車型的主導地位。


接下來,我們嘗試更深入的學習T1和T2變換,看看我們是否可以進一步推動前沿。


DCT Late Merge架構


早期合併Y和Cb / Cr通道遵循典型的、概念上簡單的深度學習範例:以某種方式將所有資料集合在一起,將其提供給模型,並讓模型學習如何處理它。這種方法簡單易用,但我們可以通過消除不必要的計算來生成更快的模型嗎?


經過一些實驗,我們發現,為了獲得較高的精度,需要允許亮度分支進行多層計算,但色度路徑可以提供較少的計算層,而不會造成損害。換句話說,將Y通道放入網路的底部,然後在中間注入Cb/Cr資訊,就像從底部的三個通道開始一樣,但是,當然,前者節省了計算量。


如下圖8所示,我們用紅色顯示了這個Late-Concat模型的結果速度和錯誤率,以及兩個相關網路:感知欄位感知版本,Late-Concat-RFA以及針對速度調整的版本使用較少的過濾器,Late-Concat-RFA-Thinner。我們可以看到,帕累託前沿再次向前移動!特別是,我們現在發現一個模型比香草ResNet快1.77倍,並且具有幾乎相同的誤差率。


640?wx_fmt=png


圖8. Late-Concat模型再次推動帕累託前沿。與Cb/Cr路徑相比,通過允許沿Y路徑顯著更深的T1比T2更多的計算,我們獲得了最佳的速度/精度權衡。Late-Concat-RFA-Thinner比香草ResNet-50快約1.77倍,精度大致相同。


有趣的是,顏色資訊直到後來才需要在網路中與從亮度中學到的更高層次的概念相結合。在這一點上,我們只能推測,但可能是學習中等層次的概念(例如:草或狗毛)需要多層處理精細亮度邊緣到紋理之前與空間上不太精確的顏色資訊組合(例如:綠色或棕色)。也許我們可以從ResNet-50從RGB畫素學到的更高頻率的黑白邊緣和更低頻率(或恆定)的顏色檢測器一直預期這個結果(圖9)。


640?wx_fmt=png


圖9. ResNet-50使用RGB畫素輸入學習的第一層功能。許多邊緣檢測器主要是黑色和白色,在亮度空間中操作。許多顏色特徵在空間或較低頻率上是恆定的,並且可以僅用於將粗糙的顏色資訊傳遞到需要它的更高層。自2012年以來,我們已經看過這樣的過濾器;我們是否應該一直期待在網路後期才能獲得顏色呢?


精確定位收益和未來方向


到目前為止,我們所展示的結果對於從業者來說是令人鼓舞和有用的——我們已經展示了什麼能夠產生快速準確的網路。為了使這一領域的科學貢獻有意義,我們還需要確定這些成果,並說明它們為什麼被實現。在我們的論文中,我們進行消融研究以確定收益來源。


綜上所述,我們發現速度的提高僅僅是由於輸入層和後續層上的資料量更小,這是可以預料的。精度的提高主要是由於DCT表示的具體使用,它在影象分類中工作得非常好。令人驚訝的是,簡單地用步幅8 DCT變換替換ResNet-50的第一個卷積層會產生更好的效能。它比完全相同形狀的學習變換更有效。換句話說,與傳統觀點相反,我們發現使用較大的接受域和步幅(每8個)比小的更好,並且第一層的硬編碼比學習它更好。2015年,當殘餘網路在ImageNet上的成為最新技術水平時,簡單地用凍結的DCT替換第一層將進一步改善現有技術水平。


上述結果表明的未來方向包括評估不同的頻率空間表示,不同大小的DCT,以及檢測、分割和其他影象處理任務的效能。


如果您使用神經網路處理任何影象處理,我們希望聽到切換到DCT表示是否能像這裡一樣對您的任務有利。如果您想要對這些結果的更詳細的描述,請參閱我們的論文(包括“補充資訊”部分中的架構細節),並使用我們的程式碼庫輕鬆地將DCT表示讀取到TensorFlow或PyTorch中。



精品文章推薦






技術乾貨:



人物專訪: