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

Jimmy Kao
Jimmy Kao
Sep 8, 2018 · 13 min read

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的模型參數量與效能。

驚人的進化

Jimmy Kao

Written by

Jimmy Kao

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

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade