深度學習的最新進展使得計算機視覺應用的飛躍:從我們的手機解鎖方式到更安全的自動駕駛汽車。
卷積神經網絡(CNN)是計算機視覺應用背後的架構。本文將闡述CNN和計算機視覺的基礎,例如卷積運算,填充,跨步卷積和池化層。然後,我們將使用TensorFlow構建用於圖像識別的CNN。
理解卷積
該卷積運算是卷積神經網絡的積木。
現在,在計算機視覺領域,圖像可以表示為RGB值的矩陣。這個概念實際上是在之前的文章中介紹。
要完成卷積操作,我們需要一個圖像和一個過濾器。
因此,讓我們將下面的6x6矩陣視為圖像的一部分:
6x6矩陣
過濾器將是以下矩陣:
3x3過濾器
然後,卷積涉及將濾波器疊加到圖像矩陣上,來自濾波器的值和來自圖像矩陣的的乘積,其將生成4×4的旋繞層。
這很難用文字表達,但這裡有一個很好的動畫來解釋卷積:
卷積操作
在上面的圖像矩陣上執行此操作並使用上面定義的過濾器,獲得以下結果矩陣:
4x4輸出層
你如何解釋輸出層?
好吧,考慮到每個值都表示顏色,或者像素有多暗(正值表示光,負值表示暗),那麼可以將輸出層解釋為:
輸出層解釋
因此,似乎這個特定的濾鏡負責檢測圖像中的垂直邊緣!
你如何選擇合適的過濾器?
這是一個自然的問題,因為你可能會發現可以應用於圖像的無限數量的過濾器。
事實證明,濾波器矩陣中的精確值可以是基於模型目標的可訓練參數。因此,可以選擇適用於特定應用程式的過濾器,也可以使用來確定過濾器的最佳值,從而產生最佳結果。
在計算機視覺中填充
以前,我們已經看到一個3x3濾波器與6x6圖像進行卷積,將產生4x4矩陣。這是因為濾波器有4x4個可能的位置以適合6x6圖像。
因此,在每個卷積步驟之後,圖像縮小,這意味著只能執行有限數量的卷積,直到圖像不再縮小為止。此外,位於圖像角落的像素僅使用一次,這導致神經網絡的信息丟失。
為了解決上述兩個問題,使用填充。填充包括在輸入圖像周圍添加邊框,如下所示:
填充為1的輸入圖像
正如你所看到的一樣,添加的邊框通常用零填充。現在,圖像的角點像素將被多次使用來計算輸出,從而有效地防止信息丟失。此外,它允許我們在輸出中保持輸入矩陣形狀。
考慮到我們的6x6輸入圖像,如果我們添加1的填充,我們得到一個8x8矩陣。應用3x3濾波器,這將產生6x6輸出。
一個簡單的等式可以幫助我們找出輸出的形狀:
其中n是輸入形狀,p是填充大小,f是濾波器形狀
重申一下,我們有:
6x6輸入 填充1 3x3過濾器因此,輸出形狀將是:6 + 2(1)-3 + 1 = 6.因此,輸出將是6x6矩陣,就像輸入圖像一樣!
填充並不總是必需的。但是,使用填充時,通常輸出的大小與輸入圖像的大小相同。這產生兩種類型的卷積。
當沒有應用填充時,這稱為" 有效卷積"。否則,它被稱為" 相同的卷積"。要確定保持輸入圖像尺寸所需的填充大小,只需將上面的公式等同於n即可。解決p後,你應該得到:
可能已經注意到f應該是奇數,以便填充為整數。因此,計算機視覺領域的慣例是具有奇數濾波器。
跨步卷積
以前,我們已經看到了一個步幅為1 的卷積。這意味著濾波器水平和垂直移動了1個像素。
一個跨步卷積是當步幅大於1.在下面的動畫中,步幅為2:
捲入2的步幅
現在,考慮到步幅,計算輸出矩陣形狀的公式是:
s是步幅
作為慣例,如果上面的公式不產生整數,那麼我們向下捨入到最接近的整數。
匯集層
池化層是減少圖像解釋大小以增加計算速度的另一種方法,它使檢測到的特徵更加健壯。
最好用圖像解釋池化。以下是最大池的示例:
使用2x2過濾器進行最大池化
我們選擇了一個步長為2的2x2濾波器。這相當於將輸入分成4個相同的方塊,然後我們取每個方塊的最大值,並在輸出中使用它。
也可以執行平均池化,但它不如最大池化。
您可以將池化視為防止過度擬合的一種方法,因為我們正在從輸入圖像中刪除某些功能。
為什麼要使用卷積神經網絡?
我們現在對卷積神經網絡有很強的基礎知識。但是,為什麼深度學習從業者會使用它們呢?
與完全連接的層不同,卷積層具有要學習的小得多的參數集。這是因為:
參數共享 連接稀疏參數共享指的是一個特徵檢測器,例如垂直邊緣檢測器,將在圖像的許多部分中有用。然後,連接的稀疏性指的是只有少數特徵與某個輸出值相關的事實。
考慮到上面的最大池化示例,輸出的左上角值僅取決於輸入圖像的左上角2x2平方。
因此,我們可以訓練較小的數據集並大大減少要學習的參數數量,使CNN成為計算機視覺任務的一個很好的工具。
使用TensorFlow構建CNN
足夠理論,讓我們編碼CNN進行手勢識別。我們重新審視之前的項目,看看CNN是否會表現更好。
與往常一樣,有完整的筆記本電腦。
第1步:預處理圖像
導入所需的庫和資源後,我們加載數據並預處理圖像:
第2步:創建佔位符
然後,我們為功能和目標創建佔位符:
第3步:初始化參數
然後我們使用Xavier初始化初始化我們的參數:
第4步:定義前向傳播
現在,我們定義前向傳播步驟,這實際上是我們CNN的架構。我們將使用具有2個卷積層和最終完全連接層的簡單3層網絡:
第5步:計算成本函數
最後,我們定義一個計算成本的函數:
第6步:將所有功能組合到一個模型中
現在,我們將上述所有功能合併到一個CNN網絡中。我們將使用小批量梯度下降進行訓練:
現在,我們可以運行我們的模型並查看它的執行情況:
_,_,parameters = model(X_train,Y_train,X_test,Y_test)
現在你對CNN和計算機視覺領域有很好的了解。雖然還有很多東西需要學習,但更高級的技術都是使用這裡介紹的概念作為基本構建塊。