本系列主要是講解卷積神經網絡 - Convolutional Neural Networks 的系列知識,本系列主要幫助大家入門,我相信這是所有入門深度學習的初學者都必須學習的知識,這里會用更加直接和用大白話的方式向大家來介紹CNN,如果感興趣的話就繼續看下去吧。
卷積網絡的基本結構
卷積神經網絡,簡稱CNN,是計算機視覺中的重要方法,可以用於計算機視覺中的圖像分類、人臉識別、語音處理、文本信息處理等,可以看下面的圖直觀感受一下卷積神經網絡的基本結構。

我們可以看到簡單的卷積神經網絡CNN結構主要由卷積層、降采樣層(也叫池化層)、全連接層以及最后的輸出層構成,通俗來說,就是把輸入的圖像首先進行卷積操作,然后進行池化操作,再進行卷積操作、池化操作,這些操作都是為了提取圖片的特征用於識別,最后把池化的結果拉平成一條長向量,傳入到全連接層中,最后輸出檢測結果。
圖片分類
圖片分類的實現也正是經過上述幾個步驟,最終識別出圖中是否存在要識別的對象以及識別的概率進行輸出顯示,如下圖:

所以大家如果想要弄懂圖像分類、人臉識別的具體實現過程,首先我們必須弄清楚卷積和池化、全連接層成到底是什么,那么接下來這個系列就為大家具體詳細來講解卷積神經網絡的基本結構和相應的方法,想要學習的就繼續追下去吧 ~
更多有關python、深度和計算機編程的精彩內容,可以關注我的微信公眾號:
出處:https://www.cnblogs.com/xiamuzi/p/13470947.html
=========================================================================
卷積神經網絡之卷積操作,使用卷積運算實現圖片邊緣特征檢測
上期我們講解了卷積神經網絡的基本結構,相信你們已經有一個大概的概念了,這期具體講解卷積神經網絡中最基本組成部分-卷積操作,使用邊緣檢測做為入門樣例,接下來讓你們看到卷積是如何進行運算的。
人臉檢測

神經網絡的前幾層只能檢測邊緣邊緣,比如:人臉的鼻子旁邊的垂直線,后面的幾層檢測目標物體的部分區域,比如:人臉的鼻子、眼睛等,更靠后面的層就可以檢測到完整的目標物體,比如:人臉。神經網絡正是這樣將一張圖中的人臉分部來檢測和提取特征從而識別出人臉,就像我們完成一項工作,將所有事情先分為一小步,完成這一步之后再進行下一步。
邊緣檢測
現在我們就以邊緣檢測來說明卷積運算是如何進行操作的

如上圖所示這樣的一張灰度圖像來說,當我們給我們的網絡模型輸入這樣一張圖片時,首先會檢測圖中的用紅色標出的垂直邊緣特征,比如:行人的輪廓線,而這些垂直線-特征,是由我們的垂直邊緣檢測器的輸出,也就是卷積之后的輸出。同樣的對於用綠色標記出的水平邊緣特征,圖中的欄桿,是由水平邊緣檢測器的輸出。
那么如何檢測在上圖圖像像中這些垂直、水平邊緣特征呢?這里就涉及到一個矩陣,這個矩陣就是我們線性代數中的矩陣,專門用來檢測這樣的邊緣和水平特征,也就是上面所說的邊緣檢測器,在卷積神經網絡中的術語叫做過濾器filter,也被叫做卷積核-kernel,過濾器是進行卷積運算的一個重要工具。
總結:邊緣檢測器叫做過濾器,也可以叫做卷積核,更常用的更加形象的叫法是卷邊緣檢測器和卷積核。
卷積操作
這里以垂直邊緣檢測器,為例來進行講解,中間的這個就是垂直邊緣過濾器,一個3*3的矩陣,用來檢測圖像中的垂直邊緣特征。

我們知道圖像是由一個個像素點構成,像素點的取值為0~255,0代表黑色,255代表白色,中間的是過渡的灰度級,這里我們把上面的輸入的灰度圖像具體為一個一個像素點來表示,也就是左邊的6*6的矩陣,假設大小為6*6,中間的是卷積核,最右邊的是卷積運算之后得到的結果,可以看到卷積之后得到的結果是4*4的矩陣,這說明圖像在計算機進行中是以矩陣的形式 - 也就是Python中的數組numpy的形式來進行運算的。
那么具體的運算過程是怎么樣的呢?為什么中間的這個3*3的矩陣,能夠檢測垂直邊緣特征呢?
卷積運算

我們可以看到,右邊卷積后的結果矩陣左上角元素 -5 = 3*1 + 1*1 + 2*1 + 0*0 + 5*0 + 7*0 +1*-1 + 8 *-1 + 2*-1 ,可以知道卷積操作的本質是:將這個3*3的邊緣過濾器覆蓋在輸入圖像上,然后進行對應元素相乘,將乘積之后的結果再相加,就得到了卷積結果矩陣的第一個元素,就這樣依次運算得到我們的最終卷積結果矩陣,也就是卷積之后的圖片。

最后的這個-16是通過輸入圖像底部右下角的這個黃色的3*3進行過濾器卷積運算之后得到的結果。
垂直邊緣檢測器
為什么中間的這個3*3的矩陣可以做垂直邊緣檢測器呢?這里舉例一個更加簡單形象的例子。

左邊是一個簡單的6*6的圖像,右邊的一半是像素值為10,右邊一半像素值為0,這在圖片中的效果就是,圖片的左邊看起來是白色的,因為10更接近255,那么圖片的右邊看起來是灰色的,右邊像素值比較暗,我使用灰色來表示 0,盡管它也可以被畫成黑的,但是這里為了舉例,就畫灰色的。有一個特別明顯的垂直邊緣在圖像中間,藍色垂直分割線,從白色到深色的分割線,這也就是我們的垂直邊緣特征。

灰度級圖像的灰度級分布
那么對於我們的垂直邊緣檢測器而言,如上圖,左邊是明亮的像素,中間的是一個過渡,0是灰色,然后右邊是深色的,經過卷積運算之后,得到的結果則是一個4*4的矩陣,當做圖像來說就是,左邊是灰色,中間是白色,右邊是灰色,中間的這個白色就是亮一點的區域,可以看成是由亮向暗過渡,就是我們6*6的原圖中間的藍色垂直邊緣,這是一個十分明顯的垂直邊緣,也就是原圖中由亮到暗的過渡,這樣我們就把圖片的垂直邊緣特征提取出來了。
如果將圖片進行了翻轉,還能檢測出來嗎?

原圖它的顏色被翻轉了,變成了左邊比較暗,右邊比較亮。現 在亮度為 10 的點跑到了右邊,為 0 的點則跑到了左邊。我們用用相同的錘之邊緣過濾器進行卷積,最后得到的卷積結果矩陣圖中間元素會是-30,而不是 30。如果你將矩陣轉換為圖片,就會是該矩陣下面 圖片的樣子。現在中間的過渡部分被翻轉了,之前的 30 翻轉成了-30,表明是由暗向亮過渡, 而不是由亮向暗過渡。
那么如何檢測水平邊緣特征呢?水平邊緣過濾器又是什么樣子呢?
水平邊緣檢測器
我們看一個更加復雜的例子,假設原圖是像素點值不是那么絕對對稱那么是怎么,難想到我們的水平邊緣檢測器長下面中間的這個樣子,它的上邊相對較亮,下邊相對較暗比較暗,中間是過渡的灰色。可以看做將垂直邊緣檢測器,九十度向右翻轉得到。

對於左邊的這個原圖中的綠色區域,它的上部是相對比較亮,向上的箭頭,它的像素值為10,它的下部是相對較暗,像素值為0。卷積后的結果是右圖的綠色的30,可以看到它的上部是較暗的,較亮的,說明這是由暗到亮的過渡,中間是有一條水平分割線的,這條分割線就是我們的水平邊緣特征。
哪有的是呈現角度的邊緣特征呢?不一定都是水平和垂直特征,這又應該怎么進行檢測呢?
比如下面的這張美女圖片,帽子的邊緣特征呈現角度,對於這樣的復雜邊緣特征該如何進行檢測呢?

事實上,上面提到的3*3的過濾器,也就是3*3的矩陣中的9個元素,在神經網絡中事實上是9個參數,也就帶參數的過濾器,我們可以任意組合,直至能夠很好的檢測到邊緣特征。
下面是Sobel算子的過濾器參數,分別實現水平、垂直、45度、135度圖像邊緣檢測,可以看到參數都不一樣,這種就叫做sobel過濾器,還有許許多多的檢測器,也就是過濾器,其實還有180度邊緣檢測、270邊緣檢測等,只是卷積核,也就是過濾器參數的不同而已。

下圖和上圖是分別使用Sobel算子實現45度、135度角邊緣檢測效果

我們可以看到,45度和135度的邊緣檢測器效果更好。
最終總結
1.邊緣檢測器包括水平邊緣檢測、垂直邊緣檢測器等,檢測器可以看做是一個由參數構成的矩陣,參數值不同,過濾器就不同,所檢測到的效果就不同。
2.卷積運算操作其實就是將這種帶參數的過濾器在我們輸入的圖像上進行覆蓋,然后對應元素相乘,然后相加。
3.想要實現上述Sobel算子實現邊緣檢測、垂直邊緣檢測、45度、135度邊緣檢測的代碼同學,https://blog.csdn.net/hellozex/article/details/80854112

這期的卷積神經網絡的卷積運算操作、以及如何使用卷積運算檢測邊緣特征就到這里了,下期講解卷積神經網絡中的另外一個基本模塊,池化操作。
更多有關python、深度和計算機編程的精彩內容,可以關注我的微信公眾號: