CNN 是如何處理圖像中不同位置的對象的?
AI 研習社按:這篇博客來自 Jetpac(現被谷歌收購) CTO、蘋果畢業生、TensorFlow 團隊成員 Pete Warden。文中討論了當要識別的對象出現在圖像中的不同位置時,CNN 是如何應對、識別的。Pete Warden 給出的解釋也許算不上完善,而且也仍然無法保證能夠消除位置的影響,但這是一個不錯的開始。AI 研習社全文編譯如下。
一位正在學慣用卷積神經網路做圖像分類的工程師最近問了我一個有趣的問題:模型是如何學會辨別位於圖片中不同位置的物體的呢?由於解釋這個問題需要大費些周章,我決定在這裡把它們寫下來,以幫助其他有類似困惑的人理解這個問題。
上面這兩張示例圖就可以表示我的這位朋友的問題。
如果你想要識別出所有包含太陽形狀的圖像,你要怎麼保證不管這個太陽形狀在哪裡,模型都能把它識別出來呢?之所以這是一個有趣的問題,是因為在你完全理解這個問題之前,需要三個階段的啟蒙:
階段一:如果你未曾嘗試過計算機編程,這個問題看上去很簡單,因為辨別位置的差異對我們的眼睛和大腦來說沒有任何難度。
階段二:如果你嘗試過用傳統的編程方法解決過類似的問題,你可能會感到窒息,因為你不僅知道處理這種差異會有多難,也明白更艱難的是向你的客戶解釋它的技術含量。
階段三:作為一個得到認證的深度學習權威人士,你可能會摸摸鬍子然後微笑,很欣慰這些瑣碎的問題是由你建立的網路處理的而不是你本人。
我的朋友正處於啟蒙的第三階段,但也已經粗淺的了解了一些原理可以解釋為什麼 CNN 可以很好的處理這類問題。我並不會聲稱我對此有什麼新見解,但經過過去幾年在圖像模型領域的工作經驗我也有了一些自己的想法,結合學術圈子裡師生之間口口相傳的說法,我想將我所知道的分享給大家。歡迎大家補充與此相關的優秀文章連接,由於我的解釋僅僅是基於我作為一名成熟的工程師的直覺和經驗而來的,請大家幫助我更好的充實和提升這個解釋。
首先要知道的是,神經網路並不是天然地對位置識別的問題免疫的。我最開始遇到這個問題是我當用 ImageNet 中的圖片訓練神經網路時。ImageNet 歷史悠久,最初搜集者們利用谷歌圖片搜索通過搜索類名稱從公共網路中採集示例圖片,之後再人工從中剔除不正確的圖像。我的好朋友 Tom White 就熱衷於在這項剔除異常的工作中挖掘奇聞異事,比如許多女模特的照片出現在了垃圾車類別里(參見改進模型架構遇到了瓶頸?你該考慮改善自己的數據了!)。Andrej Karpathy 通過完成手動標記圖片的繁重工作,也對數據集的特點有了更深的理解。
說了剛才這麼多,我的意思是,訓練數據集中的所有圖片都是由人拍攝出來,然後發布在知名網站上的。這意味著訓練集中的圖像會比隨機截屏得來的要更專業,都有一個布局良好的實物主體,通常在靠近中間位置,平視視角拍攝,並佔據了畫面的大部分。相比之下,如果有人用手機攝像頭對準一個物體拍照想讓模型給它分類,這樣的照片就很有可能有著奇怪的角度。它可能是俯視拍攝的,也可能只拍到物體的一部分,這就意味著,如果讓模型識別手機拍攝的照片,它的表現就會比發表的論文里的準確率差的多,因為訓練模型用的數據和用戶想要識別的圖片差別太大。如果你的安卓設備上安裝了 TensorFlow 分類應用,你現在還能看到類似的問題。分類模型在手機上變得不好使還不是最糟糕的,因為至少手機用戶們拍照的時候還是有一定的取景的。機器人以及類似設備上的圖像識別就是一個嚴重得多的問題。由於這些設備的攝像頭的指向是完全隨機的,在 ImageNet 上訓練的模型表現可謂是非常糟糕。我經常建議開發這些 app 的開發者用和目標設備類似的設備拍的照片作為訓練數據集,畢竟除了取景之外,鏡頭等其他因素也有一些區別。
即便照片是人工選出的,ImageNet 中的圖像在物體位置上還是有很多差異,所以神經網路是如何處理它們的呢? 其中的一個秘訣是,訓練過程中通常會專門在輸入中加入人工的偏移,神經網路就需要學會處理這類差異。
在這圖片被輸入到模型之前,它們有可能會被隨機的裁剪。所有的輸入都會被縮小到一個標準尺寸(一般是 200×200 或 300×300),這就將每張圖片里物體出現的位置和大小隨機化了,還有可能會剪切掉物體的一部分。模型始終都會依據預測的準確性得到懲罰或是獎賞,所以為了獲得好的評分它必須在帶有這些不同的狀況下還能猜出圖片里的物體。這解釋了為什麼神經網路會學習如何處理位置差異。
但這還沒有結束。
為了繼續深入,我必須得插入一些公認說法和類比。我沒有可以支撐接下來的解釋的研究,但在我的實驗和與其他實踐者的討論中,這一理論是被廣泛接受的。
自從開創性的神經網路 AlexNet 開始,CNN 的工作方式就是基於一系列連續的層,依次接收輸入數據後最終形成分類操作。我們將初始層看作邊緣探測器,尋找最基礎的像素規律,之後的圖層將初始圖層得出的規律作為輸入,進行更高級別概念的預測,如此循序漸進。看看一個典型的神經網路第一層過濾器是如何工作的會幫助你更好的理解這個過程:
圖片來自 Evan Shelhamer 對 Caffenet 的可視化工作
這張圖展示的是每個過濾器所要查找的內容,有些是不同走向的邊,其他的是色彩或角。遺憾的是這裡無法用簡明的圖像將之後幾層的情況表達出來,如果你想更深入的了解這方面的內容,Jason Yosinki 還有他的研究夥伴提供了一些不錯的參考文獻(http://yosinski.com/deepvis)。
下面的概念圖可以幫助理解剛才說的內容。
第一層要尋找的是一些很簡單的特徵,比如水平邊、角、以及純色塊。這與之前 CaffeNet 可視化的那張圖要表達的類似。這些過濾器對輸入圖像進行地毯式的瀏覽,當找到所須內容時,就輸出一張突出了其所在位置的熱力圖。
理解第二層發生了什麼就有點難了。第一層過濾器輸出的熱力圖被逐個分配到激活層的通道中,因此第二層的輸入會有上百個通道,而不是像典型圖像那樣只有三到四個。第二層的任務是要在從這些熱力圖中找出更複雜的特徵。如果要在圖中識別出太陽的一瓣,這一瓣一端有一個角,另一端是一條垂直線,中間填上黃色。每個特徵由輸入激活層的通道表示,第二層中,「朝左的一瓣」過濾器就負責尋找同時符合這三個條件的通道組合。在僅有一個或兩個條件滿足的通道組合所在的位置,不會有輸出,只有當滿足所有條件的通道組合(只有在那些滿足全部三個條件的位置),輸出會呈現激活狀態。
與第一層一樣,第二層也有很多過濾器,它們表示的是更高一級的概念,像「朝上的一瓣」、「朝右的一瓣」等等。這很難用圖來表示,籠統來講就是會輸出一個有很多通道的層,每個通道都表徵著這一級別的概念。
隨著學習深度加深,層要表達的概念就越來越高級。例如,第三或第四層通過將輸入通道表徵的概念進行組合,如果有黃色的、被花瓣圍繞著的圓,就會顯示出激活。寫一個分類器把圖像中的太陽找到就這樣簡單地做到了。現實中分類器不會像我之前例子中那樣把概念切割的如此清楚,因為分類器會自己學習如何拆解問題,而不是以人類所能理解的分類方式來運行,但基本原理就是如此。
文章到現在還沒能解釋神經網路如何識別位置之間的差異。因此最後,你還需要了解另一種設計圖像分類 CNN 網路時候的常見做法。隨著網路的層次越來越深,通道的數量會顯著增加,圖像的尺寸則會縮小。縮小的過程由池化層完成,過去是利用平均池化但最近流行用最大池化來做。兩者的效果相近。
比如現在要將這張圖被縮小為原來的一半,對每一個輸出像素,我們以 2×2 的輸入塊為單位從中選出值最大的,因此這一過程被稱為最大池化。而在平均池化中,是將這四個值的平均值傳遞到下一層。
這一池化過程會不斷重複,把值在網路中傳遞下去。也就是說,最終,圖像尺寸可能會從 300×300 縮小到 13×13。這樣大的收縮量意味著位置變數的數量會大大縮減。就拿上面的例子來說,太陽只能在餘下的 13 行、13 列像素中出現。如此一來任何小的位置差異都被隱藏起來,因為彼此具有微小差異的輸出在最大池化過程都被融合在一起了。這使得最終分類器在位置差異問題的處理上會進行得更加有序順利,因為它處理的是將原圖信息精簡許多以後的圖像。
這就是我對分類器在處理位置變化問題上的解釋,但對類似的問題,比如不同時間位置上的音頻信號又是如何呢?最近我對一種可以替代池化,被稱為「擴張」或者又叫「空洞」卷積的方法很感興趣。與最大池化一樣,它產出的是一個更小的圖像,但工作原理是基於卷積方法本身的。不同於池化是採集相鄰的輸入像素,它對樣本的選取是跨越式的,因此採集範圍可以非常大。這使得擴張卷積可以很快的將非局部的信息整合到一起,成為一個更簡潔有序的形式,這是 DeepMind 的 WaveNet 論文中的神奇的方法的一部分,能夠用卷積而不是循環神經網路來解決基於時間的問題。
我對此感到很興奮,因為循環神經網路的速度是個痛點。如果你要處理批量大小為 1 的數據,這在即時應用中是個很典型的問題,大部分計算都是矩陣和向量之間的乘法,計算強度相當於全連接層。由於每個權重只會用到一次,這類計算受限於計算機的存儲能力而不是運算能力,而卷積卻恰恰相反。因此我非常希望這種方法可以廣泛應用於其他領域。
謝謝大家能看到這裡。我希望這能幫到大家,歡迎大家在評論區或 Twitter 上對此提出改善的建議。
via petewarden.com,AI 研習社編譯。
用 CNN 分 100,000 類圖像
※微軟發布的可視化圖像/視頻標記工具 VoTT
※一言不合就想斗圖?快用深度學習幫你生成表情包
TAG:AI研習社 |