1.2 边缘检测示例-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
| 1.1 計算機視覺 | 回到目錄 | 1.3 更多邊緣檢測內容 |
邊緣檢測示例 (Edge Detection Example)
卷積運算是卷積神經網絡最基本的組成部分,使用邊緣檢測作為入門樣例。在這個視頻中,你會看到卷積是如何進行運算的。
在之前的視頻中,我說過神經網絡的前幾層是如何檢測邊緣的,然后,后面的層有可能檢測到物體的部分區域,更靠后的一些層可能檢測到完整的物體,這個例子中就是人臉。在這個視頻中,你會看到如何在一張圖片中進行邊緣檢測。
讓我們舉個例子,給了這樣一張圖片,讓電腦去搞清楚這張照片里有什么物體,你可能做的第一件事是檢測圖片中的垂直邊緣。比如說,在這張圖片中的欄桿就對應垂直線,與此同時,這些行人的輪廓線某種程度上也是垂線,這些線是垂直邊緣檢測器的輸出。同樣,你可能也想檢測水平邊緣,比如說這些欄桿就是很明顯的水平線,它們也能被檢測到,結果在這。所以如何在圖像中檢測這些邊緣?
看一個例子,這是一個6×6的灰度圖像。因為是灰度圖像,所以它是6×6×1的矩陣,而不是6×6×3的,因為沒有RGB三通道。為了檢測圖像中的垂直邊緣,你可以構造一個3×3矩陣。在共用習慣中,在卷積神經網絡的術語中,它被稱為過濾器。我要構造一個3×3的過濾器,像這樣 [10?110?110?1]\left[\begin{matrix} 1 & 0 & -1\\ 1 & 0 & -1 \\ 1 & 0 & -1\end{matrix}\right]???111?000??1?1?1???? 。在論文它有時候會被稱為核,而不是過濾器,但在這個視頻中,我將使用過濾器這個術語。對這個6×6的圖像進行卷積運算,卷積運算用“?*?”來表示,用3×3的過濾器對其進行卷積。
關于符號表示,有一些問題,在數學中“?*?”就是卷積的標準標志,但是在Python中,這個標識常常被用來表示乘法或者元素乘法。所以這個“?*?”有多層含義,它是一個重載符號,在這個視頻中,當“?*?”表示卷積的時候我會特別說明。
這個卷積運算的輸出將會是一個4×4的矩陣,你可以將它看成一個4×4的圖像。下面來說明是如何計算得到這個4×4矩陣的。為了計算第一個元素,在4×4左上角的那個元素,使用3×3的過濾器,將其覆蓋在輸入圖像,如下圖所示。然后進行元素乘法(element-wise products)運算,所以 [3?10?01?(1)1?15?08?(?1)2?17?02?(?1)]=[30?110?820?2]\left[\begin{matrix} 3*1 & 0*0 & 1*(1) \\ 1*1 & 5*0 & 8*(-1) \\ 2*1 & 7*0 & 2*(-1)\end{matrix}\right]=\left[\begin{matrix} 3 & 0 & -1\\ 1 & 0 & -8 \\ 2 & 0 & -2 \end{matrix}\right]???3?11?12?1?0?05?07?0?1?(1)8?(?1)2?(?1)????=???312?000??1?8?2???? ,然后將該矩陣每個元素相加得到最左上角的元素,即 3+1+2+0+0+0+(?1)+(?8)+(?2)=?53+1+2+0+0+0+(-1)+(-8)+(-2)=-53+1+2+0+0+0+(?1)+(?8)+(?2)=?5 。
把這9個數加起來得到-5,當然,你可以把這9個數按任何順序相加,我只是先寫了第一列,然后第二列,第三列。
接下來,為了弄明白第二個元素是什么,你要把藍色的方塊,向右移動一步,像這樣,把這些綠色的標記去掉:
繼續做同樣的元素乘法,然后加起來,所以是 0?1+5?1+7?1+1?0+8?0+2?0+2?(?1)+9?(?1)+5?(?1)=?40*1+5*1+7*1+1*0+8*0+2*0+2*(-1)+9*(-1)+5*(-1)=-40?1+5?1+7?1+1?0+8?0+2?0+2?(?1)+9?(?1)+5?(?1)=?4 。
接下來也是一樣,繼續右移一步,把9個數的點積加起來得到0。
繼續移得到8,驗證一下: 2?1+9?1+5?1+7?0+3?0+1?0+4?(?1)+1?(?1)+3?(?1)=82*1+9*1+5*1+7*0+3*0+1*0+4*(-1)+1*(-1)+3*(-1)=82?1+9?1+5?1+7?0+3?0+1?0+4?(?1)+1?(?1)+3?(?1)=8 。
接下來為了得到下一行的元素,現在把藍色塊下移,現在藍色塊在這個位置:
重復進行元素乘法,然后加起來。通過這樣做得到-10。再將其右移得到-2,接著是2,3。以此類推,這樣計算完矩陣中的其他元素。
為了說得更清楚一點,這個-16是通過底部右下角的3×3區域得到的。
因此6×6矩陣和3×3矩陣進行卷積運算得到4×4矩陣。這些圖片和過濾器是不同維度的矩陣,但左邊矩陣容易被理解為一張圖片,中間的這個被理解為過濾器,右邊的圖片我們可以理解為另一張圖片。這個就是垂直邊緣檢測器,下一頁中你就會明白。
在往下講之前,多說一句,如果你要使用編程語言實現這個運算,不同的編程語言有不同的函數,而不是用“?*?”來表示卷積。所以在編程練習中,你會使用一個叫conv_forward的函數。如果在tensorflow下,這個函數叫tf.conv2d。在其他深度學習框架中,在后面的課程中,你將會看到Keras這個框架,在這個框架下用Conv2D實現卷積運算。所有的編程框架都有一些函數來實現卷積運算。
為什么這個可以做垂直邊緣檢測呢?讓我們來看另外一個例子。為了講清楚,我會用一個簡單的例子。這是一個簡單的6×6圖像,左邊的一半是10,右邊一般是0。如果你把它當成一個圖片,左邊那部分看起來是白色的,像素值10是比較亮的像素值,右邊像素值比較暗,我使用灰色來表示0,盡管它也可以被畫成黑的。圖片里,有一個特別明顯的垂直邊緣在圖像中間,這條垂直線是從黑到白的過渡線,或者從白色到深色。
所以,當你用一個3×3過濾器進行卷積運算的時候,這個3×3的過濾器可視化為下面這個樣子,在左邊有明亮的像素,然后有一個過渡,0在中間,然后右邊是深色的。卷積運算后,你得到的是右邊的矩陣。如果你愿意,可以通過數學運算去驗證。舉例來說,最左上角的元素0,就是由這個3×3塊(綠色方框標記)經過元素乘積運算再求和得到的,
10?1+10?1+10?1+10?0+10?0+10?0+10?(?1)+10?(?1)+10?(?1)=010*1+10*1+10*1+10*0+10*0+10*0+10*(-1)+10*(-1)+10*(-1)=010?1+10?1+10?1+10?0+10?0+10?0+10?(?1)+10?(?1)+10?(?1)=0 。相反這個30是由這個(紅色方框標記)得到的, 10?1+10?1+10?1+10?0+10?0+10?0+0?(?1)+0?(?1)+0?(?1)=3010*1+10*1+10*1+10*0+10*0+10*0+0*(-1)+0*(-1)+0*(-1)=3010?1+10?1+10?1+10?0+10?0+10?0+0?(?1)+0?(?1)+0?(?1)=30 。
如果把最右邊的矩陣當成圖像,它是這個樣子。在中間有段亮一點的區域,對應檢查到這個6×6圖像中間的垂直邊緣。這里的維數似乎有點不正確,檢測到的邊緣太粗了。因為在這個例子中,圖片太小了。如果你用一個1000×1000的圖像,而不是6×6的圖片,你會發現其會很好地檢測出圖像中的垂直邊緣。在這個例子中,在輸出圖像中間的亮處,表示在圖像中間有一個特別明顯的垂直邊緣。從垂直邊緣檢測中可以得到的啟發是,因為我們使用3×3的矩陣(過濾器),所以垂直邊緣是一個3×3的區域,左邊是明亮的像素,中間的并不需要考慮,右邊是深色像素。在這個6×6圖像的中間部分,明亮的像素在左邊,深色的像素在右邊,就被視為一個垂直邊緣,卷積運算提供了一個方便的方法來發現圖像中的垂直邊緣。
所以你已經了解卷積是怎么工作的,在下一個視頻中,你將會看到如何使用卷積運算作為卷積神經網絡的基本模塊的。
課程板書
| 1.1 計算機視覺 | 回到目錄 | 1.3 更多邊緣檢測內容 |
總結
以上是生活随笔為你收集整理的1.2 边缘检测示例-深度学习第四课《卷积神经网络》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.1 计算机视觉-深度学习第四课《卷积
- 下一篇: 1.3 更多边缘检测内容-深度学习第四课