建構卷積和執行集區作業

1. 事前準備

在這個程式碼研究室中,您將瞭解相關的運算,以及為什麼這些電腦對於電腦視覺情境的影響程度很高。

在先前的程式碼研究室中,您建立了一個簡單深層的類神經網路 (DNN),用於電腦時尚領域的時尚願景。這只是因為圖片中只能出現衣服中的物品,所以必須加以置中。

當然,這並非真實的情況。您會希望 DNN 能夠辨識圖片中的衣物,以及其他物體或物體的正中央位置。若要進行這項操作,您必須使用卷積。

事前準備

本程式碼研究室是以前兩期工作成果為基礎,也就是「對機器學習的問候!」和建構電腦視覺模型。請先完成這些程式碼研究室,再繼續操作。

您將會瞭解的內容

  • 什麼是卷積
  • 如何建立功能對應
  • 什麼是集區?

建構項目

  • 圖片的精選地圖

軟硬體需求

您可以找到在 Colab 中執行的其他程式碼研究室程式碼。

你也必須安裝 TensorFlow,以及先前在程式碼研究室安裝的程式庫。

2. 什麼是卷積?

卷積是一種篩選條件,會傳遞圖片、進行處理,並擷取重要特徵。

假設你有一位穿著運動鞋的人,如何偵測圖片中是否有運動鞋?為了讓程式「能夠」查看「運動鞋」的圖片,您必須擷取重要功能,並將不重要的功能模糊處理。這就是所謂的「功能對應」

功能對應程序理論上非常簡單。您會掃描圖片中的每個像素,然後查看相鄰的像素。這時您可以在篩選器中將這些像素的值乘以對等的權重。

例如:

圖片上的捲積

在這個範例中,我們指定了 3x3 卷積矩陣或圖片核心

目前的像素值是 192。如要計算新像素的價值,您可以查看相鄰的值、將這些值乘以篩選器中指定的值,然後把新的像素值設為最終金額。

現在是時間通過在 2D 灰度圖像上建立基本卷積的方式瞭解卷積的工作如何。

您會使用 SciPy 提供的展示圖片來展示這款手機內建精美的相片,可清楚呈現不同角度及線條。

3. 開始編寫程式碼

首先,請匯入部分 Python 程式庫和上下線圖片:

import cv2
import numpy as np
from scipy import misc
i = misc.ascent()

接著,使用 Pyplot 程式庫 matplotlib 繪製圖片,讓您瞭解其內容:

import matplotlib.pyplot as plt
plt.grid(False)
plt.gray()
plt.axis('off')
plt.imshow(i)
plt.show()

edb460dd5397f7f4.png

我們可以看到這個階梯的階梯。有許多功能可以嘗試和隔離。例如,直線較強。

此圖片將儲存為 NumPy 陣列,因此只要複製該陣列,就可以建立轉換後的圖片。size_x 和 size_y 變數可以存放圖片的尺寸,方便您之後循環播放。

i_transformed = np.copy(i)
size_x = i_transformed.shape[0]
size_y = i_transformed.shape[1]

4. 建立卷積矩陣

首先,將卷積矩陣 (或核心) 儲存為 3x3 陣列:

# This filter detects edges nicely
# It creates a filter that only passes through sharp edges and straight lines. 
# Experiment with different values for fun effects.
#filter = [ [0, 1, 0], [1, -4, 1], [0, 1, 0]] 
# A couple more filters to try for fun!
filter = [ [-1, -2, -1], [0, 0, 0], [1, 2, 1]]
#filter = [ [-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]
 # If all the digits in the filter don't add up to 0 or 1, you 
# should probably do a weight to get it to do so
# so, for example, if your weights are 1,1,1 1,2,1 1,1,1
# They add up to 10, so you would set a weight of .1 if you want to normalize them
weight  = 1

現在,請計算輸出像素。對圖片進行疊代,留下 1 像素的邊界,並將目前像素的每個相鄰節點乘以篩選器中定義的值。

也就是說,目前的像素在其上方和左側,將與篩選器中的左上角項目相乘。然後,將結果乘以權重,並確定結果是介於 0 到 255 之間。

最後,將新值載入轉換後的圖片:

for x in range(1,size_x-1):
  for y in range(1,size_y-1):
      output_pixel = 0.0
      output_pixel = output_pixel + (i[x - 1, y-1] * filter[0][0])
      output_pixel = output_pixel + (i[x, y-1] * filter[0][1])
      output_pixel = output_pixel + (i[x + 1, y-1] * filter[0][2])
      output_pixel = output_pixel + (i[x-1, y] * filter[1][0])
      output_pixel = output_pixel + (i[x, y] * filter[1][1])
      output_pixel = output_pixel + (i[x+1, y] * filter[1][2])
      output_pixel = output_pixel + (i[x-1, y+1] * filter[2][0])
      output_pixel = output_pixel + (i[x, y+1] * filter[2][1])
      output_pixel = output_pixel + (i[x+1, y+1] * filter[2][2])
      output_pixel = output_pixel * weight
      if(output_pixel<0):
        output_pixel=0
      if(output_pixel>255):
        output_pixel=255
      i_transformed[x, y] = output_pixel

5. 檢查結果

現在,請繪製圖像,看看將濾鏡傳遞至圖片上會有什麼效果:

# Plot the image. Note the size of the axes -- they are 512 by 512
plt.gray()
plt.grid(False)
plt.imshow(i_transformed)
#plt.axis('off')
plt.show()   

48ff667b2df812ad.png

請思考以下的篩選值以及它們對圖片的影響。

使用 [-1,0,1,-2,0,2,-1,0,1] 為您提供了一個非常強的垂直線:

偵測垂直線濾鏡

使用 [-1,-2,-1,0,0,0,1,2,1] 為您提供水平線:

偵測水平線

探索不同的價值!此外,備分不同的尺寸的設計,例如 5x5 或 7x7。

6. 瞭解集區

現在您已經瞭解圖片的基本功能,接下來該怎麼做?如何使用產生的功能對應將圖片分類?

如同的捲積,集區也有助於偵測特徵。集區圖層可減少圖片中的資訊總量,同時保留目前偵測到的功能。

集區有許多種類型,但我們會使用「最大值 (最大值)」集區。

疊代在圖片上,在每個時間點考慮到像素、它的右方與右方、下方和右相等處。請選用最大的圖片 (因此是「最多」集區),再載入新圖片。也就是說,新圖片的尺寸將是原尺寸的四分之一。最大集區

7. 撰寫程式碼以在集區中執行

下列程式碼會顯示 (2, 2) 集區。執行這個指令以查看輸出結果。

您會發現圖片是原尺寸的四分之一,但仍然保留所有功能。

new_x = int(size_x/2)
new_y = int(size_y/2)
newImage = np.zeros((new_x, new_y))
for x in range(0, size_x, 2):
  for y in range(0, size_y, 2):
    pixels = []
    pixels.append(i_transformed[x, y])
    pixels.append(i_transformed[x+1, y])
    pixels.append(i_transformed[x, y+1])
    pixels.append(i_transformed[x+1, y+1])
    pixels.sort(reverse=True)
    newImage[int(x/2),int(y/2)] = pixels[0]
 
# Plot the image. Note the size of the axes -- now 256 pixels instead of 512
plt.gray()
plt.grid(False)
plt.imshow(newImage)
#plt.axis('off')
plt.show()

1f5ebdafd1db2595.png

記下該圖的軸線。該圖片現在是原始大小的 256x256,而且即使圖片中的資料較少,偵測到的功能也隨之強化。

8. 恭喜

您已建立第一個電腦視覺模型!要進一步瞭解如何強化電腦視覺模型,請參閱建構卷積類神經網路 (CNN) 以強化電腦視覺