速記AI課程-Convolutional Neural Networks for Computer Vision Applications(一)

CNN 原理簡介與代表性CNN模型

前來分享的是中研院林彥宇副研究員,他擅長利用機器學習打造各種如物件辨識、影像分割、臉部辨識、動作辨識、人數計算、影像比對等電腦視覺應用。從論文如數家珍的程度看來,林副研究員真的在此領域鑽研甚深,因此探討的深度會讓初學者有點難以招架…

在深度學習出現之前,傳統影像辨識是透過演算法找出特徵(Feature),再透過SVM把影像進行分類(如貓或狗)。良好的特徵擷取演算法(Feature Descriptor),可以凸顯出重要、有用的資訊,並過濾掉不相關的雜訊。

何謂重要、有用的資訊呢?在影像辨識領域中,假設我們想在照片中,辨識出「鈕扣」(圓形且中間有幾個洞),那麼「邊緣」(Edge)就會是很重要的資訊了,而良好的Descriptor應該要可以輕易地分辨出「鈕扣」與其他圓形物品(如硬幣)的不同。

HOG( Histogram of oriented gradient)即為一種特徵擷取演算法,極簡言之,在一影像中若某像素與鄰近像素差異(Gradient)很大,則會被視為「邊緣」而凸顯出來。下圖明確地展示出HOG辨識邊緣的能力。

HOG範例(From hypraptive

對HOG有興趣深入的同學,可參考以下連結文章,內含Python實作。

HOG詳細計算步驟

因此,在傳統影像辨識中,找出有用的特徵,是最關鍵的技術之一。除了前面提到的HOG外,還有其他如SIFT、SURF、ORB、LBP、Harr等,皆有其優缺點,沒有一個演算法能適用所有的電腦視覺應用。甚至有時候還需要人工找出好的特徵,如某些物件適合用形狀來辨識(腳踏車),某些用紋理比較好辨識(如豹)、有些用顏色比較容易(如夕陽),但怎麼樣都有不少限制。

而深度學習的出現,解決了「找出有用特徵」這個困難,因為它可以透過大量資料的訓練,「自己學習」到好的特徵,並決定好的分類器。因餵進大量圖片之後,就可以產生模型跟結果,人類專家的參與越來越少,因此又可以稱為End to End learning。(當然實務上還是需要人工智慧專家的調參)

以下圖為例,深度學習的類神經網路在辨識汽車時,淺層(靠左邊)通常都萃取較低階的特徵(如邊緣),接著開始辨識出如車輪、窗戶等比較中階的特徵,最後是整個車子的樣子。當然,實際上模型訓練時是反向的,要學好高層的特徵,中層會需要有什麼特徵,好的中層又需要怎麼樣的淺層。

From Nvidia

由於類神經網路是將所有的像素(pixel)都當作一個input,而深度學習又利用了大量的隱藏層來建構模型,因此若採用全連結網路(Fully Connected),所需要訓練的權重(參數)組合會非常恐怖。以解析度1000x1000的影像來看,一個隱藏層內100萬個節點的全連結網路,會有10¹²個參數,要找出最佳組合會非常困難,且由於影像像素各自獨立為一個輸入,且權重也獨立,沒有將影像內其他重要資訊(如像素排列)一併放入模型,因此影像辨識效果並不佳。

(深度學習基礎可參考之前筆記

CNN(Convolutional Neural Network, 卷積神經網絡)的出現,解決了上述的難題。Convolution是數學的一種計算方式(有興趣可詳此文章),應用在影像辨識領域,則是利用一個濾鏡(Kernel)針對原始影像,重新產生一個另一個簡化過的影像(Feature Map)來提取影像特徵,詳細運作如下圖。

CNN的卷積過程

Convolution的兩個重點概念是Local connectivity與Weight sharing。所謂Local connectivity是指在影像中,若某像素為藍色,則其周圍鄰居應該也很可能是藍色或接近的顏色,因此在網路設計上不需要細緻到每像素;Weight sharing是用來偵測影像不同區域的濾鏡,可以是相同的(或說並不用不同)。這兩個概念大幅縮減了所需要處理的變數,且提取出了影像中重要的特徵。

卷積前 vs 卷積後(From Nvidia)

卷積之後,通常還會經過Pooling(池化)的處理。Pooling的目的在於把卷積後Feature Map再縮小(但仍保持重要特徵),雖然因此變得更模糊,但具有更好的抗雜訊功能,避免Overfitting。最常見的方式為Max Pooling,即選擇矩陣中最大的數字做為代表,如下圖左。

不同Poolng方式的比較(From Mohit Deshpande)

以下比較卷積與池化後的影像差異。

Convolution vs Pooling(From DISHASHREE GUPTA

Pooling之後,等於做完的影像的預處理工作,擷取出最精華的特徵(濃縮再濃縮,提煉再提煉),接著再利用最純粹完整的Fully Connected Layer,來進行訓練。因此整個CNN的架構大概如下圖所示。

濃縮再濃縮,提煉再提煉(From ujjwalkarn

CNN源自於AI巨頭Yann LeCun於1998提出的LeNet,此模型可說是CNN的開山始祖,後續有非常多種致敬版本,以下介紹幾個重要的CNN實作模型。

AlexNet

AlexNet是AI巨頭Hinton學生Alex Krizhevsky(可以猜到)在2012提出,並且在有AI界世界盃之稱的 ILSVRC-2012(ImageNet舉辦)競賽中奪冠。在此之前,多半是由機器學習的SVM演算法領先,但AlexNet一舉將Top 5錯誤率(一張照片可以猜五個最有可能的分類,Top 5錯誤率即為五個答案都猜錯的比率)降至前所未有的15.3%(2011冠軍是25.8%),替深度學習與CNN揚眉吐氣!

AlexNet架構(From Charlotte77

由上圖AlexNet架構可知,它採用了五個Convolutional layer,三個Fully connected layer,十分標準的CNN,但為什麼AlexNet效果如此好,以致成為經典?

  1. Activation function改用非線性的ReLU 來取代線性的tanh或sigmoid,收斂速度較快,效率高。Activation function可想成是類神經網路經過複雜計算後,需要把Output的值在固定在特定區間的功能。
  2. 採用多顆GPU(兩個 GTX 580)同時運算。(其實是因為580記憶體只有3GB,沒辦法儲存120萬張訓練影像,所以用SLI把兩個GPU連起來)
  3. LRN(Local response normalization)正規化:每層經過Relu後,都會再接LRN,把Feature Map再做一次提煉跟濃縮,可把Top 5錯誤率再降個1.2%。不過,後來的CNN都放棄LRN,認為對於降低誤判沒有幫助。
LRN圖解(From Charlotte77

4. Overlapping Pooling:傳統的Pooling Kernel不重疊,但AlexNet允許Pooling重疊,以降低Overfitting的風險。

Overlapping Pooling(From Sukrit Shankar

5. Data augmentation:從現有的影像資料集中,透過水平翻轉、放大、色彩亮度微調等技巧,變化出更多的資料,以避免Overfitting。

巧婦難為無米之炊,給我一粒米就好(From Shreenidhi Sudhakar

6. Dropout : 在第一與第二個Fully connected layer中,AlexNet採用了Dropout的機制,讓每個節點在訓練時有50%機率失去作用(權重設為0),一樣也是為了避免Overfitting。

以下是AlexNet的辨識成果範例,十分不錯。

這櫻桃圖片也太難了吧…

VGGNet

VGGNet是英國牛津大學Visual Geometry Group於2014提出,架構上與AlexNet大同小異,常見的VGG16與VGG19分別由13/16層Conv搭配3層FC,最重要的差異在於其濾鏡(Kernel)的大小。

VGGNet架構

AlexNet第一層Conv使用了11x11的Kernel,而VGGNet全部使用3x3;AlexNet Pooling使用3x3的Kernel,而VGGNet改用2x2。採用較小的Kernel不僅可以提升計算的效能,也能夠提取更豐富的特徵,並培養更強的辨别能力(經過更多次的Activation Function),從VGGNet驚人的Top 5錯誤率7.3%就可以證明。

以下是對岸非常紮實的VGGNet介紹,十足「 干货」。

GoogLeNet

在Google工作的Christian Szegedy團隊於2014提出(L大寫是為了向CNN始祖LeNet致敬),其參賽的版本因採用Inception模組,故通常稱為Inception v1,目前已改良至v4。Inception v1雖然已經高達22層,不過參數量卻是 AlexNet的1/12,Top 5錯誤率只有直逼人類專家的6.7%,實在是小而美。

GoogLenet架構

Inception模組的核心概念是NIN(Network In Network,網中之網),資料輸入會經過四個分支處理,過程中分別利用了三種不同尺寸的Conv(1x1、3x3、5x5)和一個3x3的Max Pooling,增加對於不同大小特徵的擷取能力。(或是想成自動學習出比較好的Filter size跟Pooling)

Inception示意圖

GoogLenet另一個重點則是在訓練時加上Auxiliary classifier(輔助分類器)。深度學習容易遇到的問題之一,即為梯度消失(Vanishing Gradient),簡言之越深的網路,其訊息傳遞上越容易失真,因此透過類似擴音器的Auxiliary classifier,讓重要資訊可以持續傳遞。

梯度消失不得了

除了L大寫的致敬以外,Inception的命名也是有典故的!

Inception命名由來(論文真的講到這張圖)

ResNet

由微軟研究院於2015提出的ResNet(因使用 Residual模組而名),其層數已破百來到152,Top 5錯誤率來到超越越人類專家的3.5%,但參數量卻比VGGNet更少,非常令人驚艷。

「resnet residual」的圖片搜尋結果
ResNet架構(第一列)

前面提到,越深的網路越不容易訓練,僅僅增加層數,Traing與Testing Error反而會增加,而ResNet的做法是利用Residual block,把原始的輸入X,除了同前面模型一樣往下層遞送並計算外,還會自己跑到後兩層的輸出加入運算,代表這個Block在學的是輸入與輸出的差異F(x)(Residual),較傳統要學一個好的輸出(H(x))來得簡單很多。

跳島攻擊

一樣附上對岸「干货」供參考。

DenseNet

2017年提出的DenseNet,參考了ResNet的「抄捷徑」概念,利用不到ResNet一半的參數,就可以達到一樣的效果。

DenseNet架構範例

在一個Dense Block中,前一層除了接收上一層的資料外,還會拿取前面所有層的資料,並用合併(Concatenation)方式處理(ResNet是採用加法),解決資料在不同層傳遞時的失真以及梯度消失等問題。

Dense Block

講了這麼多經典模型,如果一樣要「抄捷徑」的話,下面這張圖說明了各種CNN的模型參數量與效能。

驚人的進化

商管 * 科技 | 顧問 + 稽核 | AI X Fraud | baubimedi@gmail.com

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store