深度學習影像分析原理說明

一、深度學習影像辨識基本原理

 

本章節提到的只是深度學習的基本概念,與 AOI 的關聯不大,若您已經有深度學習相關的基礎知識,可以跳過本章節。

 

 

什麼是深度學習網路?

 

深度學習網路源自於類神經網路,類神經網路是指用電腦模擬神經元傳遞信號的架構,每個神經元都只是極為單純的小函式,單一神經元並沒有做複雜的運算。

 

類神經網路會把數百、數千個神經元(依網路設計不同,神經元的數量會有差異)連接起來,形成一個網路架構。神經元之間會互相串聯,一個神經元的輸出值,會串接到其他(一個或多個,通常是多個,依網路架構設計決定)神經元的輸入,這邊會產生[層]的概念,我們把原始輸入的資料(可能是圖像/語音/文字,但它們進入網路前,都會先轉化為浮點數陣列格式的數值資料,也就是對深度學習網路而言,無論餵什麼東西給它,都是當成一整串的數字來處理,輸入是數字,輸出也是數字)作為第0層,[所有以原始資料作為輸入值的神經元集合]稱為第1層,[所有以第1層的輸出作為自己的輸入值的神經元集合]則稱為第2層,依此類推。深度學習網路的[深度],就是指網路的層數疊得很深。

 

至於具體而言,類神經網路要疊多深才稱為深度學習網路,沒有明確的定義,對於影像辨識類型的網路,通常我們把 2012 年 AlexNet 以後的網路架構,稱之為深度學習網路。

 

而深度學習的[學習]是指什麼?其實一個剛規劃完的深度學習網路系統,相當於一顆空白的大腦,它並沒有辨識、分類的能力。我們必須透過一種稱為[訓練]的動作,把透過人工事先分類、標示好的訓練資料集,餵入網路讓它[學習],它才會有辨識、分類的能力。網路中每個神經元,有個稱之為[權重值]的可變數值,這個數值不是我們直接給定的(當然,要給個初始值也是可以),而是在這個訓練的過程中,一輪一輪的修正出來的。

 

這邊舉個例子來說明深度學習是怎麼訓練與修正權重,並與強化學習( Reinforcement learning )進行比較:

 

最近幾年深度學習很流行,我們想導入深度學習系統,用來做大樓進出人員管理,如果[有陌生人進入大樓],此系統需要發出警報。

 

但是預算有限,沒錢,怎麼辦?沒關係,我們來搞一個最便宜的[生物式深度學習系統]。首先,我們準備一根棍子,不用太粗,趁手的就行,重點是要結實。然後到街上走走,路上看到順眼的流浪狗,就一棍子敲下去,打暈牠。打暈時要注意牠的叫聲,如果是[嗷嗚!],那就沒錯,如果不是的話,繼續找。這隻狗我們就稱呼牠為 DL 狗。把 DL 狗綁在大樓門口,讓牠盯著門,然後我們開始訓練牠。

 

首先,找找隔壁大樓的人,請他進來我們的大樓,這時候,你的 DL 狗通常不會叫。不會叫沒關係,棍子就在手邊,我們打牠,讓牠叫。這個動作多重複幾次,也多找找不同的人,隔壁樓的大哥、大姊、大叔、大嬸,通通找,你的 DL 狗叫了就不打,不叫就打到牠叫!這個流程多做個幾次,我們就可以得到一隻[只要有人進門,牠就會叫]的 DL 狗了。接下來,我們找自己大樓的人進門。這時候 DL 狗大概會叫,沒關係,牠叫了我們就打牠,打到牠不叫。一直重複以上動作,自己大樓的人進門時  DL 狗叫了,我們就打牠,其他陌生人進門時 DL 狗沒叫,我們也打牠。大約一個月後,我們就得到一隻[如果有陌生人進入大樓,牠就會大叫]的 DL 狗了。這就是我們的[生物式深度學習門檢系統]。

 

圖 1. 生物式深度學習系統訓練示意圖.png

圖 1. 生物式深度學習系統訓練示意圖。

 

 

然而,最近強化學習也很流行,如果我們要用強化學習建立這個系統,該怎麼做呢? 很簡單,我們還是準備一根棍子,上街走一走。看到流浪狗就一棍子打下去。這時候,注意牠的叫聲,如果是[嗷~~呼~~~],那就沒錯,如果不是的話,繼續找。這隻狗我們就稱呼牠為 RL 狗。 RL 狗比較少見,對牠而言,用棍子打牠是一種獎勵。把 RL 狗綁在大樓門口,讓牠盯著門,然後我們開始訓練牠。怎麼訓練?很簡單,其實跟訓練 DL 狗差不多,只不過當陌生人進來時,如果牠叫了,這時牠答對了,我們要[獎勵]牠(也就是打牠)。大樓的人進來,牠沒叫,我們也要[獎勵]牠(也就是打牠)。大約一個月後,我們就得到一隻[如果有陌生人進入大樓,牠會大叫]的 RL 狗了。這就是我們的[生物式強化學習門檢系統]。

 

深度學習進行訓練時,其實是一種懲罰機制,我們餵圖像給網路時,已經預設好[正確答案]了,如果深度學習答錯了(也就是說,答案與我們給它的預設答案不符合),這個[答錯]的結果,就會被用來修正它神經元中的權重,讓它[下一次遇到類似題目,答對的可能性上升]。

 

而強化學習是一種[獎勵]機制,強化學習系統與定義好的環境互動,如果得出了[我們希望它這麼做]的結果,則會給它一個獎勵( Reward ),讓它以後遇到類似的情況,進行該動作的可能性上升。

 

深度學習網路進行訓練,簡單描述就是[我們給網路一個輸入,讓網路中的神經元進行層層運算後,得到一個輸出,把這個輸出值與我們事先預設的答案相比,看它有多少差距,再用這個差距回來修正各神經元的權重值,讓網路輸出值的正確性提高]。

 

然而,一個網路中的神經元那麼多,我們怎麼得知每個神經元的權重值要修正多少?目前的深度學習架構中,並沒有辦法準確得出權重的修正值,但我們用一種稱為[倒傳遞]的方法,可以得出[各權重值是偏大還是偏小,該往正還是往負修正],經過重複多次的訓練與修正的動作,最後取得[對於訓練資料集可以得出最準確答案]的權重值。

 

至於我們如何得知各神經元的權重值是偏大偏小?在一開始的說明,我們有提到[每個神經元都只是極為單純的小函式,單一神經元並沒有做複雜的運算],它本質上是由乘法與加法構成的(同一層中有多個神經元,所以又會有矩陣乘法之類的運算,但對單一神經元來說,它還是單純的乘法加法),由於運算很單純,它是可以回推的。另外我們在前面也有提到[對深度學習網路而言,無論餵什麼東西給它,都是當成一整串的數字來處理,輸入是數字,輸出也是數字],既然是數字,就可以比大小,訓練時得到的輸出,我們可以和事先預設的答案比較(預設的答案我們也數值化了,以圖像分類而言,是用 one hot 格式的,代表各分類類別機率的浮點數陣列),得出[輸出值與正確答案的差值]。

 

差值有正有負,我們用這個正負值,得出[要對神經元之權重值修正的方向]。各神經元前後連接的順序是固定的,且[下一層的輸入,等於上一層的輸出],因此我們可以由最後一層,層層回推。回推的時候,會遇到一個神經元通常會有多個輸入,這些輸入值是由上一層多顆不同的神經元,分別輸出過來的。回推時我們需要把差值拆分給上一層的多顆神經元,在這裡我們用到數學中[偏微分]的概念,假設上一層的各神經元權重值,為不同的變數,對單獨一個變數進行微分,即可得到該變數的方向性(也就是它的導數),這樣每一個神經元的權重值修正方向就都可以確定了。

 

上面的說明可能稍微複雜,但它的原理其實和[猜數字小遊戲]是相同的:例如有一個[猜價格送獎品]節目,主持人展示了一個獎品,要來賓來猜價格,最多猜十次,每猜一次主持人會回答價格是猜高了還是猜低了,如果猜對了,獎品就可以帶回家。來賓猜10萬,主持人回答[低一點],來賓再猜5萬,主持人回答[高一點],來賓再猜7萬5,主持人回答[高一點]……。深度學習的訓練動作,簡單來說就是用這樣[答案不正確 -> 與正確答案相比,得到修正方向 -> 修正答案]的機制來訓練、學習的。

 

 

什麼是 CNN ?

 

CNN ( Convolutional Neural Network )是一種運用在圖像辨識/分類時,非常有效的網路結構。至於為何有效?在上面的說明中,我們提到了層( Layer )的概念,而 CNN  的 Layer 設計,結構上許多地方與我們用傳統演算法做圖像處理,是可以對應的。

 

CNN 最主要的特點,就是它的卷積層( Convolution Layer )。我們在使用傳統演算法時,也常會使用到 Convolutional 方法,應用在影像的去雜訊、銳化、模糊化、抓邊緣等處理,它的運算概念,基本上和 Convolution Layer 是相同的。 Convolution Layer 就是一種 2D 的 filter 運算,和傳統演算法的差別,在於它的核( Kernel )是在訓練中產生的,而設計傳統演算法時,這個核是我們給定、在程式碼寫死的。也就是說,我們在訓練Convolutional Layer 時,其實就是在找出一個[對於訓練樣本,可以最有效提取特徵的 Kernel ]。

 

例如,我們想要從一張圖像中提取出某種紋理,用傳統演算法時,可能是用 OpenCV  (一個用來做影像處理的開源工具) 的 filter2D ,建立一個 N x N 的浮點數陣列做為 Kernel ,然後依程式碼撰寫者的經驗與知識,調整 Kernel 中的各浮點數數值,讓該紋理經過 filter2D 運算後變得明顯。而深度學習的 Convolution Layer 則是由訓練過程修正 Kernel 中的各個權重值,自行產生有效的 Kernel 。

 

深度學習中有個名詞叫做特徵圖( Feature Map ),是指輸入的圖像(或者說,二維陣列),經過某一層(例如, Convolution Layer )的運算後,輸出的結果圖像。在傳統影像演算法,會輸入一張圖像,進行某種運算(例如, filter2D ),然後輸出一張[轉換過的圖像],這個轉換過的圖像,與特徵圖的概念是對應的。

 

當然,我們要進行影像分類/辨識,只[取一種特徵]是不夠的,在傳統演算法,同一張輸入的影像,我們也會做多種不同的運算,不同的運算會產生[代表不同特徵]的輸出影像, CNN 中,有個叫做[厚度]的概念與此對應。 CNN 中,各 Layer 會有多個長寬相同、但內容不同的 Feature Map ,每個 Feature Map 會取到不同的特徵,一個 Layer 的[厚度]就是指它擁有的 Feature Map 數量。這個數量遠高於傳統演算法,我們用傳統演算法,定義特徵做影像分析,通常十個以內,最多做幾十個特徵取樣影像就結束了,而 CNN 網路以最單純的 AlexNet 為例,它第一層卷積層就已經厚度96了,最厚的卷積層達到厚度384。比較新的網路,例如 ResNet-101 ,它最厚的卷積層甚至達到厚度 2048 。這種數量,在傳統演算法很難實現,因此深度學習網路,對於圖像特徵的定義、採取的能力,會比傳統演算法高很多。

 

另外, CNN 的池化層( Pool Layer ),在傳統演算法中對應到 Resize (影像縮放)的概念。也許您有這樣的經驗:拍了一張照片,要傳給朋友,但影像太大張,要傳很久。於是您就打開 Windows 小畫家軟體,把照片的長寬縮成50%,存檔後再傳給朋友,這樣大約只要四分之一的時間照片就傳出去了。影像小的話,不光檔案變小,對於圖像處理時,運行速度也快,當然,縮小後的影像,細節就變少了,因此在 CNN 網路中,常用的 Pool 方法是 Max Pool ,它有何不同?傳統演算法縮小圖像,通常用內插法,把 2x2 的4個像素縮成1個,亮度會接近這4個像素的平均值。而 CNN 用的 Max Pool 方法,則是4個像素取出最大的一個數值做為輸出像素,優點除了速度比內插法快以外,這種方式也比較容易保留圖像縮小前的主要特徵值(主要特徵通常數值會大,所以Max Pool 方法保留數值最大的做為輸出)。

 

然後 CNN 的 ReLU 層,[把小於0的數值變0,大於0的數值保留原值],和傳統圖像演算法的 To Zero 方式 Threshold 完全相同,用 OpenCV 寫傳統演算法的話,寫 threshold(input, output, 0, DBL_MAX, THRESH_TOZERO) 可以得到和 ReLU 一模一樣的結果。這是一個閾值的概念,[把低於閾值的數值過濾掉]這種動作,在傳統圖像演算法找物體特徵時也頻繁得用到。

 

綜上所述, CNN 是一種[針對圖像處理這個領域的特色,應用圖像處理這個領域的既有知識,專門設計出來的網路結構],因此它在影像辨識/分類的效果會特別好。

 

 

深度學習用於影像分類,與用於物體偵測有何不同?

 

最大的差別在於,影像分類時,[一張影像只需要輸出一個分類結果],物體偵測時,[除了要輸出分類,還要輸出物體的座標、長寬,如果影像中有多個物體,還需要多組輸出]。也就是說,[一張照片拍馬路,有車子],影像分類網路只要回答[車子]就好,而物件偵測網路要回答[在照片的 A 位置,有一台車子長度10、寬度3;在照片的B位置,有一台車子長度20、寬度8]這樣的答案。

 

物體偵測類型的網路,最早為 RCNN ( Regions with CNN ),對於如何做物體偵測,其實它的想法很簡單,要從一張圖片中找出特定物體以及它的位置,那我們就在圖片中取樣出數千個大小不同、互相重疊的框框,每個框框都是一塊[局部影像],之後再把這些框框全部都餵進 CNN 網路讓它分類。由於[框框裡面不一定有我們要偵測的物體],因此我們會再加一個類別叫做[背景]類,框框中沒有想要抓的物體,就把它分類為[背景]。然後我們把這數千個框框的分類結果整合出來,就可以得到[影像中什麼位置,有什麼物體]的資訊了。這是很簡單而且有效的方法,缺點是它跑了幾千次 CNN ,當然速度就慢了。

 

之後演化出來的物體偵測網路如 Faster-RCNN 、 YOLO 、 SSD 等,都是在[如何更有效的取出樣本框]進行改進, RCNN 是直接從原始輸入影像取出樣本框,各別餵給 CNN 網路做分類,會需要跑兩千次 CNN 才完成一張影像的物體偵測,而 SSD 演算法(這個網路架構是 Wei Liu 等人於2016 年提出的,詳細論文內容見 https://arxiv.org/abs/1512.02325 ),會從 CNN 網路各層的 Feature Map取出樣本框,只跑一次 CNN 網路就可以得出所有的樣本框(當然,這個 CNN 網路的後半段被接上了 SSD 的網路結構,整體速度還是會比純粹做影像分類的原始 CNN 網路慢),因此運行效能有很大的提升,原始 RCNN 對 227x227 的圖像,檢測一張需要47秒,而 SSD 對300x300 的圖像,檢測一張只需要 0.017 秒。

 

SSD 抽取樣本框時,不是通通從同一層的 Feature Map 抽出,而是會從不同層,取出長寬不同的 Feature Map ,小的Feature Map 用來產生偵測大範圍的樣本框、大的 Feature Map 用來產生偵測小範圍的樣本框。這種從各 Layer 取出不同長寬Feature Map的動作,在傳統影像演算法有沒有類似的概念呢?其實是有的,有一種稱為影像金字塔( Image Pyramid )的方法,會把原始影樣、縮一半的影像、縮四分之一的影像……疊成一個金字塔的結構,這個結構最早是應用在圖像預存取。例如,在我們看線上地圖時,會對地圖進行縮放,但地圖影像很大張,一次次縮放會浪費太多時間,所以就預先把縮放成不同尺寸的影像通通做出來,到時候直接切換影像就好。在傳統影像辨識時,影像金字塔會應用在[從不同尺度取出同類型的物體特徵],例如在影像中找一顆蘋果,但蘋果可能放得遠、可能放得進,距離不同在圖像上就會有不同的大小。比起[對原始影像,針對不同大小的蘋果進行特徵採樣],改為[把原始影像縮放成不同大小的多張影像,用同一種特徵採樣方式進行採樣]效率會提升很多。


延伸閱讀

1.
OpenR8 社群版 - 免費開源的人工智慧軟體 (下載)

2.
[OpenR8 解決方案] Image_PCB_DefectDetection_SSD512_Caffe (使用 Caffe 及 SSD512 進行PCB 深度學習影像瑕疵檢測)

3.
[ezAI 簡單學AI] 深度學習影像分析快速入門

4.
開源機器人俱樂部的 OpenR8 AI 軟體(開源大補帖),參加南部科學園區舉辦的國際 AI 大賽獲得首獎300萬元台幣的獎金

[CP 值最好的 AI 人工智慧電腦熱賣中]
硬體採用最新最快的 Titan RTX, RTX-2080Ti-11G, 及 TESLA V100!
視窗圖控介面,易學易用。
硬體優勢:針對深度學習最佳化設計,且經過客戶端 24H 運作驗證。
軟體優勢:事先安裝人工智慧軟體及優化設定,每週提供最新 AI 演算法下載。
公司優勢:專業人工智慧機器人設計公司,資本額一億。
歡迎企業、學校、及公家機關大量採購。
可租用,歡迎來信或來電洽詢。
詳細資料請參閱以下網址: https://tw.openrobot.club/ai_computer