Bangun konvolusi dan lakukan penggabungan

1. Sebelum memulai

Dalam codelab ini, Anda akan mempelajari konvolusi dan mengapa konvolusi sangat kuat dalam skenario computer vision.

Di codelab sebelumnya, Anda membuat Jaringan Neural Dalam (DNN) sederhana untuk computer vision item mode. Ini terbatas karena item pakaian harus menjadi satu-satunya hal yang ada dalam gambar, dan harus dipusatkan.

Tentu saja, ini bukanlah skenario yang realistis. Anda ingin agar DNN Anda dapat mengidentifikasi item pakaian dalam gambar dengan objek lain, atau tempat yang tidak diposisikan di depan dan di tengah. Untuk melakukan ini, Anda harus menggunakan konvolusi.

Prasyarat

Codelab ini dibuat berdasarkan pekerjaan yang telah diselesaikan dalam dua cicilan sebelumnya, Perkenalkan salam terhadap "Hello, World" machine learning, dan Membuat model computer vision. Harap selesaikan codelab tersebut sebelum melanjutkan.

Yang akan Anda pelajari

  • Apa itu konvolusi
  • Cara membuat peta fitur
  • Apa itu penggabungan

Yang akan Anda build

  • Peta fitur gambar

Yang Anda butuhkan

Anda dapat menemukan kode untuk codelab lainnya yang berjalan di Colab.

Anda juga perlu menginstal TensorFlow, dan library yang Anda instal di codelab sebelumnya.

2. Apa itu konvolusi?

Konvolusi adalah filter yang melewati gambar, memprosesnya, dan mengekstrak fitur-fitur penting.

Katakanlah Anda memiliki gambar orang yang mengenakan sepatu kets. Bagaimana Anda mendeteksi bahwa sepatu kets tersebut ada di gambar? Agar program Anda dapat "melihat" gambar sebagai sepatu kets, Anda harus mengekstrak fitur penting, dan memburamkan fitur yang tidak penting. Ini disebut pemetaan fitur.

Proses pemetaan fitur secara teoretis sederhana. Anda akan memindai setiap piksel dalam gambar, lalu melihat piksel di dekatnya. Anda mengalikan nilai piksel tersebut dengan bobot yang setara dalam filter.

Misalnya:

Konvolusi pada gambar

Dalam hal ini, matriks konvolusi 3x3, atau kernel gambar, ditentukan.

Nilai piksel saat ini adalah 192. Anda dapat menghitung nilai piksel baru dengan melihat nilai di dekatnya, mengalikannya dengan nilai yang ditentukan di filter, dan menjadikan nilai piksel baru sebagai jumlah akhir.

Sekarang saatnya mempelajari cara kerja konvolusi dengan membuat konvolusi dasar pada gambar hitam putih 2D.

Anda akan menunjukkannya dengan gambar pendakian dari SciPy. Ini adalah foto bawaan yang bagus dengan banyak sudut dan garis.

3. Mulai coding

Mulai dengan mengimpor beberapa library Python dan gambar pendakian:

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

Selanjutnya, gunakan library Pyplot matplotlib untuk menggambar gambar sehingga Anda tahu seperti apa tampilannya:

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

edb460dd5397f7f4.png

Anda dapat melihat bahwa itu adalah gambar tangga. Ada banyak fitur yang dapat Anda coba untuk mengisolasi. Misalnya, ada garis vertikal yang kuat.

Gambar disimpan sebagai array NumPy, sehingga kita dapat membuat gambar yang ditransformasi hanya dengan menyalin array tersebut. Variabel size_x dan size_y akan menampung dimensi gambar sehingga Anda dapat mengulangnya nanti.

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

4. Membuat matriks konvolusi

Pertama, buat matriks konvolusi (atau kernel) sebagai array 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

Sekarang, hitung piksel output. Lakukan iterasi pada gambar, dengan margin 1 piksel, lalu kalikan setiap tetangga piksel saat ini dengan nilai yang ditentukan dalam filter.

Artinya tetangga piksel saat ini di atasnya dan di sebelah kirinya akan dikalikan dengan item kiri atas dalam filter. Lalu, kalikan hasilnya dengan bobot dan pastikan hasilnya berada dalam rentang 0 hingga 255.

Terakhir, muat nilai baru ke gambar yang diubah:

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. Memeriksa hasilnya

Sekarang, petakan gambar untuk melihat efek meneruskan filter ke atasnya:

# 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

Pertimbangkan nilai filter berikut dan dampaknya terhadap gambar.

Menggunakan [-1,0,1,-2,0,2,-1,0,1] memberi Anda seperangkat garis vertikal yang sangat kuat:

Mendeteksi filter garis vertikal

Menggunakan [-1,-2,-1,0,0,0,1,2,1] memberi Anda garis horizontal:

Mendeteksi garis horizontal

Jelajahi nilai yang berbeda! Selain itu, coba filter dengan ukuran yang berbeda, seperti 5x5 atau 7x7.

6. Memahami Penggabungan

Setelah Anda mengidentifikasi fitur penting pada gambar, apa yang akan Anda lakukan? Bagaimana Anda menggunakan peta fitur yang dihasilkan untuk mengklasifikasikan gambar?

Serupa dengan konvolusi, penggabungan sangat membantu dalam mendeteksi fitur. Menggabungkan lapisan mengurangi jumlah keseluruhan informasi dalam gambar sambil mempertahankan fitur yang dideteksi sebagai ada.

Terdapat berbagai jenis penggabungan, tetapi Anda akan menggunakan satu kumpulan yang disebut Penggabungan Maksimum (Maks).

Lakukan iterasi pada gambar, lalu pertimbangkan piksel dan tetangga terdekatnya di sebelah kanan, bawah, dan kanan di bawah gambar. Gunakan yang terbesar (dengan demikian, max pooling) dan muat ke dalam gambar baru. Jadi, gambar baru akan menjadi seperempat dari ukuran gambar lama. Kumpulan Maks.

7. Menulis kode untuk penggabungan

Kode berikut akan menampilkan gabungan (2, 2). Jalankan untuk melihat output.

Anda akan melihat bahwa meskipun gambarnya berukuran seperempat dari ukuran aslinya, gambar tersebut tetap memiliki semua fitur.

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

Perhatikan sumbu dari plot tersebut. Gambar tersebut sekarang berukuran 256x256, seperempat dari ukuran aslinya, dan fitur yang terdeteksi telah disempurnakan meskipun data yang ada sekarang lebih sedikit.

8 Selamat

Anda telah membuat model computer vision pertama Anda! Untuk mempelajari cara meningkatkan model computer vision lebih lanjut, lanjutkan ke Membangun jaringan neural konvolusional (CNN) untuk menyempurnakan computer vision.