(文科友善) AI(人工智慧)如何做影像辨識?

王柏鈞
8 min readMar 7, 2020

--

CNN的運作過程理解,以及2019年7月Google 在 BMVC 2019 提出的MixConv論文技術分享

參考:

  1. 台灣人工智慧學校官方 Medium
  2. Depthwise卷积与Pointwise卷积
  3. 論文原文 MixConv: Mixed Depthwise Convolutional Kernels

目錄

1. AI在做什麼-資訊儲存與理解(神經元)
2. 影像處理的精華:什麼是卷積層,以及為什麼我們要有卷積層
3. 卷積層與益智玩具(超直觀理解)
4. 2019年Google的論文:MixConv的改進

AI(Artificial Intelligence),也就是人工智慧,是我們為了讓機器以近似人類的思考來執行任務所發展的技術。

在幾十年前,圖書館學者們對電腦的所下的定義:「資訊的儲存、分類與傳播」。事實上也非常適合AI,因為AI中的DeepLearning,也就是深度學習的部分,其實就是一個龐大的資料庫,但他不是儲存完整資料,而是透過一個個神經元來儲存資料的特徵。

AI(人工智慧) -資訊儲存與理解(神經元)

剛才有提到的,深度學習中的神經元會儲存輸入資料的特徵,也就是一小部分資訊。

那為什麼只有少少的資訊呢?這是因為每一個神經元的複雜度有限,也就是神經元都是金魚腦。所以儘管他得到了一個完整的資料,他能保留下來的,也只有其中的一點點資訊。

所以每個神經元的作用,就是儲存一些小小的資訊。當我們把很多神經元組合起來,就會變成一個神經網路。於是我們就可以儲存很多小小的資訊,積少成多之下,就變得厲害了。

影像處理的精華:什麼是卷積層,以及為什麼我們要有卷積層

卷積層(Convolution Layer),是一種能夠萃取影像特徵的AI技術。那麼卷積層是在怎麼樣的背景被發展出來的呢?

首先,請先回想一下,神經元的功能是什麼?

沒錯,就是儲存資訊。對影像來說,我們想要的資訊就是線條或是輪廓之類,能夠用來辨別物件的特徵。

但只是單純的把影像丟進去,特徵是不會自己跑出來的。因為神經元在讀取圖片時,看的是每一個小小的像素本身,如下所示。

讓神經元能夠讀取圖片的操作有一個專有名詞:平坦化(flatten)

本來1號跟4號的像素是上下相連的,但神經元讀取時,卻只能看到他們分開存在的樣貌,所以這些關聯就不見了。

組成眼睛的像素,描述了眼睛應有的輪廓,

再舉個例子,眼睛這個特徵是由線條、輪廓和其他的重要特徵組合而成。但如果直接連接到神經元上,所有線條和輪廓或其他重要特徵,通通都會消失,只留下各自孤零零的像素們了。

所以我們非常希望,可以把這些特徵找出來,並且交由神經元來儲存。

既然要儲存這些特徵,我們就必須要先取得(萃取)這些特徵。為了這個目的, Yann LeCun這位AI大師在1989年發展出了卷積層的構想。

圖片來源連結

卷積層與益智玩具(超直觀理解)

各位有看過上面這種兒童用的形狀配對益智玩具嗎?其實卷積層在做的事情就跟上面的這個益智玩具一樣。他有兩個功能:

  1. 讓圖片中特定形狀的部分可以順利通過,並交由神經元儲存
  2. 形狀不匹配的部分就會被卡住,沒辦法被神經元儲存。

你仔細看這個益智玩具,他其實不是只能篩選一種形狀。卷積層也是一樣的,他能夠隨機的創造出許多不同形狀的專用篩網(Kernel),這樣我們就能得到各種不同的形狀各自出現在哪裡的訊息。

這些不同的形狀,也就是特徵。包括了線條、輪廓、形狀等等。

而這些專用的篩網,我們將其稱之為Kernel(卷積核 )。

所以卷積層會透過許多Kernel來萃取出這些特徵究竟是否出現,以及出現在哪裡的資訊,這樣我們那小小的神經元就不需要去儲存整個特徵長什麼樣子,而是只要儲存「喔,這裡有一個眼睛出現了」這樣的資訊。

而只要有神經元儲存到一個眼睛,我們就有很強的信心認為這張圖片其實包含了一個人。

2019年MixConv的改進

像剛才提到的,線條、形狀、輪廓這些特徵,其實是有順序性的。

假設我們的神經網路裡面有三個卷積層,第一個卷積層的Kernel會萃取出各式各樣的線條,而這些表示線條的資訊,會傳遞給第二個卷積層。

第二個卷積層在獲得這些線條的資訊後,會用他的Kernel來萃取這些線條所構成的特定形狀,也就是輪廓。

第三個卷積核在獲得這些輪廓的資訊後,會用他的Kernel來萃取這些輪廓中所構成的特定形狀,也許,就會代表了某個物件。例如眼睛、耳朵等等。

所以在從線條到物件的過度過程中,我們會將他們做區別:

  1. 低階特徵: 線條。 這是最容易萃取的特徵,但只憑線條的資訊我們無法判斷某個物件是否存在。
  2. 稍微高階一點的特徵:輪廓,這是中階特徵,藉由輪廓我們開始可以分辨出不同的物件了。
  3. 最高階的特徵: 物件,他可以代表一個明顯的器官,並且長的十分的獨特,能夠與其他物件做出區隔。

我們應該能夠發現到,這其實是慢慢組合而成的過程,集合許多線條會出現輪廓,集合許多輪廓則會出現物件。

但這會出現一個問題,Kernel是有Size上的區別的。

Kernel Size的區別,就像是放大鏡的概念。

  1. 越小的Kernel Size,會在圖片裡越小的範圍內,偵測特定形狀。就好像我們拿著放大鏡,非常近的觀察一張圖片一樣。
    很容易讓我們只看得到線條這種微小(較低階)的特徵。
  2. 越大的Kernel Size,會在圖片裡越大的範圍內,偵測特定形狀。就好像我們雖然拿著放大鏡,但卻離圖片很遠一樣。
    也許可以同時看到整張圖片,卻更難以找到特定的形狀。

所以在使用上,我們希望越前面(越淺層)的卷積層,使用越小的Kernel Size。越後面的卷積層,則使用越大的Kernel Size。而這些Kernel Size的大小,以及出現在哪一層,都是由使用者決定的。

而每一個物件因為大小不同,需要的Kernel Size也不一樣。

那麼問題來了:

哪一個卷積層應該要用哪一種 Kernel Size呢?

不知道,所以一般而言,我們只能由經驗決定。總之越靠後的卷積層,其Kernel Size應該要放大。但有時我們隨便設計的結果,會讓神經網路的準確性降低。而且太大的Kernel Size,反而可能什麼特徵都找不出來。

而MixConv這篇論文的方法,則為我們打開了一個新的局面。

既然不知道要用哪一個,那乾脆都用好了。

MixConv這篇論文所提出的解決方法,就是讓一張圖片分成更多通道(channel),如果我們假設一張圖片就是一片鬆餅。更多通道就是把鬆餅垂直疊起來的樣子。

圖片轉自這裡

從上圖應該可以比較好的理解到,分出更多的channels就像是把同一張圖片,一個個前後交疊的感覺。

接下來,我們把圖片分組,比如說前兩個一組,後兩個一組,並針對不同組別的圖片,使用不同的Kernel Size。

也就是說,MicConv可以在同一個卷積層內,使用許多不同Kernel Size的Kernel,這會讓我們同時萃取到低階特徵(線條)、和高階特徵(物件)。

不同組(Group)的channel會得到不同的Kernel Size

這有什麼好處呢?

  1. 高階特徵在淺層本來就不容易偵測到,所以不會讓神經元儲存到奇怪的資訊。
  2. 不論前後,每一個卷積層有能力偵測到高階特徵,這提高了物件被發現的可能性。

這篇論文也經歷了許多的測試,幾乎都能比傳統的卷積層創造更好的成績。下圖中的紅色點MixNet就是利用MixConv技術設計的神經網路。

結論:

今天的分享從比較基礎的部分開始,分享到了較為新穎的技術,希望可以為正在學習或想要知道人工智慧在做什麼的人,帶來一些資訊。

圖片來源:

  1. Icons made by <a href=”https://www.flaticon.com/authors/freepik" title=”Freepik”>Freepik</a> from <a href=”https://www.flaticon.com/" title=”Flaticon”> www.flaticon.com</a>
  2. https://peltarion.com/knowledge-center/documentation/modeling-view/build-an-ai-model/blocks/flatten

--

--