1. 程式人生 > >卷積神經網路進行影象處理的工作原理

卷積神經網路進行影象處理的工作原理

對人類來說,描述我們眼睛所看到的事物,即“視覺世界”,看起來太微不足道了,以至於我們根本沒有意識到那正是我們時時刻刻在做的事情。在看到某件事物時,不管是汽車、大樹,還是一個人,我們通常都不需要過多的思考就能立刻叫出名字。然而對於一臺計算機來說,區分識別“人類物件”(比如:在小狗、椅子或是鬧鐘這些“非人類物件”中識別出奶奶這一“人類物件”)卻是相當困難的。

能解決這一問題可以帶來非常高的收益。“影象識別”技術,更寬泛地說是“計算機視覺”技術,是許多新興技術的基礎。從無人駕駛汽車和麵部識別軟體到那些看似簡單但十分重要的發展成果——能夠監測流水線缺陷和違規的“智慧工廠”,以及保險公司用來處理和分類索賠照片的自動化軟體。這些新興科技是離不開“影象識別”的。

在接下來的內容裡,我們將要探究“影象識別”所面臨的問題和挑戰,並分析科學家是如何用一種特殊的神經網路來解決這一挑戰的。

學會“看”是一項高難度、高成本的任務

著手解決這個難題,我們可以首先將元資料應用於非結構化資料。在之前的文章裡,我們曾描述過在元資料稀缺或元資料不存在的情況下,進行文字內容分類和搜尋遇到的一些問題和挑戰。讓專人來對電影和音樂進行人工分類和標記,確實是一項艱鉅的任務。但有些任務不僅艱鉅,甚至是幾乎不可能完成的。比如訓練無人駕駛汽車裡的導航系統,讓其能夠將其他車輛與正在過馬路的行人區分開來;或者是每天對社交網站上使用者上傳的千千萬萬張的照片和視訊進行標記、分類和篩查。

唯一能夠解決這一難題的方法就是神經網路。理論上我們可以用常規的神經網路來進行影象分析,但在實際操作中,從計算角度看,使用這種方法的成本非常高。舉例來說,一個常規的神經網路,就算是處理一個非常小的影象,假設是30*30畫素影象,仍需要900個數據輸入和五十多萬個引數。這樣的處理加工對一個相對強大的機器來說還是可行的;但是,如果需要處理更大的影象,假設是500*500畫素的影象,那麼機器所需的資料輸入和引數數量就會大大增加,增加到難以想象的地步。

除此之外,將神經網路用於“影象識別”還可能會導致另一個問題——過度擬合。簡單來說,過度擬合指的是系統訓練的資料過於接近定製的資料模型的現象。這不僅會在大體上導致引數數量的增加(也就是進一步計算支出的增加),還將削弱“影象識別”在面臨新資料時其他常規功能的正常發揮。

真正的解決方案——卷積

幸運的是,我們發現,只要在神經網路的結構方式上做一個小小的改變,就能使大影象的處理更具可操作性。改造後的神經網路被稱作“卷積神經網路”,也叫CNNs或ConvNets。

神經網路的優勢之一在於它的普遍適應性。但是,就像我們剛剛看到的,神經網路的這一優勢在影象處理上實際上是一種不利因素。而“卷積神經網路”能夠對此作出一種有意識的權衡——為了得到一個更可行的解決方案,我們犧牲了神經網路的其他普遍性功能,設計出了一個專門用於影象處理的網路。

在任何一張影象中,接近度與相似度的關聯性都是非常強的。準確地說,“卷積神經網路”就是利用了這一原理。具體而言就是,在一張影象中的兩個相鄰畫素,比影象中兩個分開的畫素更具有關聯性。但是,在一個常規的神經網路中,每個畫素都被連線到了單獨的神經元。這樣一來,計算負擔自然加重了,而加重的計算負擔實際上是在削弱網路的準確程度。

卷積網路通過削減許多不必要的連線來解決這一問題。運用科技術語來說就是,“卷積網路”按照關聯程度篩選不必要的連線,進而使影象處理過程在計算上更具有可操作性。“卷積網路”有意地限制了連線,讓一個神經元只接受來自之前圖層的小分段的輸入(假設是3×3或5×5畫素),避免了過重的計算負擔。因此,每一個神經元只需要負責處理影象的一小部分(這與我們人類大腦皮質層的工作原理十分相似——大腦中的每一個神經元只需要迴應整體視覺領域中的一小部分)。

“卷積神經網路”的內在祕密

“卷積神經網路”究竟是如何篩選出不必要的連線的呢?祕密就在於兩個新添的新型圖層——卷積層和匯聚層。我們接下來將會通過一個實操案例:讓網路判斷照片中是否有“奶奶”這一物件,把“卷積神經網路”的操作進行分解,逐一描述。

第一步,“卷積層”。“卷積層”本身實際上也包含了幾個步驟:

1.首先,我們會將奶奶的照片分解成一些3×3畫素的、重疊著的拼接圖塊。

2.然後,我們把每一個圖塊運行於一個簡單的、單層的神經網路,保持權衡不變。這一操作會使我們的拼接圖塊變成一個圖組。由於我們一開始就將原始影象分解成了小的影象(在這個案例中,我們是將其分解成了3×3畫素的影象),所以,用於影象處理的神經網路也是比較好操作的。

3.接下來,我們將會把這些輸出值排列在圖組中,用數字表示照片中各個區域的內容,數軸分別代表高度、寬度和顏色。那麼,我們就得到了每一個圖塊的三維數值表達。(如果我們討論的不是奶奶的照片,而是視訊,那麼我們就會得到一個四維的數值表達了。)

說完“卷積層”,下一步是“匯聚層”。

“匯聚層”是將這個三維(或是四維)圖組的空間維度與取樣函式結合起來,輸出一個僅包含了影象中相對重要的部分的聯合陣列。這一聯合陣列不僅能使計算負擔最小化,還能有效避免過度擬合的問題。

最後,我們會把從“匯聚層”中得出的取樣陣列作為常規的、全方位連線的神經網路來使用。通過卷積和匯聚,我們大幅度地縮減了輸入的數量,因此,我們這時候得到的陣列大小是一個正常普通網路完全能夠處理的,不僅如此,這一陣列還能保留原始資料中最重要的部分。這最後一步的輸出結果將最終顯示出系統有多少把握作出“照片中有奶奶”的判斷。

以上只是對“卷積神經網路”工作過程的簡單描述,現實中,其工作過程是更加複雜的。另外,跟我們這裡的案例不同,現實中的“卷積神經網路”處理的內容一般包含了上百個,甚至上千個標籤。

“卷積神經網路”的實施

重新開始建立一個“卷積神經網路”是一項非常耗時且昂貴的工作。不過,許多API最近已經實現了——讓組織在沒有內部計算機視覺或機器學習專家的幫助下,完成影象分析的收集工作。

  • “谷歌雲視覺”是谷歌的視覺識別API,它是以開源式TensorFlow框架為基礎的,採用了一個REST API。“谷歌雲視覺”包含了一組相當全面的標籤,能夠檢測單個的物件和人臉。除此之外,它還具備一些附加功能,包括OCR和“谷歌影象搜尋”。

  • “IBM沃森視覺識別”技術是“沃森雲開發者”的重要組成部分。它雖然涵蓋了大量的內建類集,但實際上,它是根據你所提供的影象來進行定製類集的訓練的。與“谷歌雲視覺”一樣,“IBM沃森視覺識別”也具備許多極好的功能,比如OCR和NSFW檢測功能。

  • Clarif.ai是影象識別服務的“後起之秀”,它採用了一個REST API。值得一提的是,Clarif.ai包含了大量的單元,能夠根據特定的情境定製不同的演算法。像婚禮、旅遊甚至食物。

上面的這些API更適用於一些普通的程式,但對於一些特殊的任務,可能還是需要“對症下藥”,制定專門的解決方案。不過值得慶幸的是,許多資料庫可以處理計算和優化方面的工作,這或多或少地減輕了資料科學家和開發人員的壓力,讓他們有更多精力關注於模型訓練。其中,大部分的資料庫,包括TensorFlow,深度學習4J和Theano,都已經得到了廣泛、成功的應用。