Evrimler oluşturun ve havuz oluşturun

1. Başlamadan önce

Bu codelab'de, evrimleri ve bilgisayar görüşü senaryolarında neden çok güçlü olduklarını öğreneceksiniz.

Önceki codelab'de, moda ürünlerinin bilgisayar görüşü için basit bir Derin Nesne Ağı (DNN) oluşturdunuz. Giyim öğesinin resimde yer alan tek şey olması ve merkezde olması gerektiğinden bu sınırlıydı.

Elbette bu gerçekçi bir durum değil. DNN'inizin, fotoğraflardaki giysileri başka nesnelerle birlikte veya ön ve merkeze yerleştirilmemiş şekilde tanımlamasını istersiniz. Bunun için evrimleri kullanman gerekir.

Ön koşullar

Bu codelab'de, önceki "Dünyanın makine öğrenimi dünyası" ile tanışın ve Bilgisayar görüşü modeli oluşturun adlı iki bölüm yer almaktadır. Devam etmeden önce lütfen bu codelab'leri tamamlayın.

Neler öğreneceksiniz?

  • Evrişim nedir?
  • Özellik eşlemesi nasıl oluşturulur?
  • Havuz havuzu nedir?

Geliştireceğiniz uygulama

  • Bir resmin özellik haritası

Gerekenler

Colab'da çalışan codelab'in geri kalanının kodunu bulabilirsiniz.

Ayrıca TensorFlow'un ve önceki codelab'de yüklediğiniz kitaplıkların bulunması gerekir.

2. Evrişler nedir?

Evrişim, bir resmi geçiren, işleyen ve önemli özellikleri ayıklayan bir filtredir.

Spor ayakkabı giyen bir kişinin resminin olduğunu varsayalım. Resimde bir spor ayakkabı olduğunu nasıl algılarsınız? Programınızın resmi spor ayakkabı olarak görmesi için önemli özellikleri çıkarmanız ve temel özellikleri bulanıklaştırmanız gerekir. Buna özellik eşlemesi denir.

Özellik eşleme işlemi teorik olarak basittir. Resimdeki her pikseli tarayıp komşu piksellerine bakmanız gerekir. Bu piksellerin değerlerini bir filtredeki eşdeğer ağırlıklarla çarparsınız.

Örneğin:

Resimde eğim

Bu durumda, 3x3 evirme matrisi veya resim çekirdeki belirtilir.

Geçerli piksel değeri 192'dir. Yeni pikselin değerini, komşu değerlere bakarak, filtrede belirtilen değerlerle çarparak ve yeni piksel değerini nihai tutar olarak hesaplayabilirsiniz.

Şimdi, 2D gri tonlamalı bir resimde temel bir evrim oluşturarak evrişlerin nasıl çalıştığını keşfetmenin zamanı geldi.

Bunu SciPy'den çıkış resmiyle gösterirsiniz. Pek çok farklı açı ve çizgiyle güzel bir yerleşik resimdir.

3. Kodlamaya başla

Bazı Python kitaplıklarını ve çıkış resmini içe aktararak başlayın:

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

Ardından, matplotlibPyplot kitaplığını kullanarak resmi çizerek nasıl göründüğünü öğrenin:

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

edb460dd5397f7f4.png

Gördüğünüz gibi, merdiven merdiveni resmi. İzole etmek istediğiniz birçok özellik vardır. Örneğin, güçlü dikey çizgiler vardır.

Resim, bir NumPy dizisi olarak depolanır. Böylece, dönüştürülen resmi yalnızca bu diziyi kopyalayarak oluşturabiliriz. Size_x ve size_y değişkenleri, resmin boyutlarını tutacaktır. Böylece daha sonra döngü yapabilirsiniz.

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

4. Evrişim matrisi oluşturma

Önce, 3x3 dizisi olarak bir evrişim matrisi (veya çekirdek) oluşturun:

# 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

Şimdi çıkış piksellerini hesaplayın. Resmin üzerine iterek 1 piksellik bir kenar boşluğu bırakın ve geçerli pikselin komşularının her birini filtrede tanımlanan değerle çarpın.

Bu, geçerli pikselin komşusunun üstünde ve solunda, filtredeki sol üst öğeyle çarpılacağı anlamına gelir. Ardından, sonucu ağırlıkla çarpıp sonucun 0 ile 255 aralığında olduğundan emin olun.

Son olarak, yeni değeri dönüştürülen resme yükleyin:

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. Sonuçları inceleme

Şimdi, filtreyi üzerinde taşımanın etkisini görmek için resmi çizin:

# 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

Aşağıdaki filtre değerlerini ve bunların resim üzerindeki etkisini düşünün.

[-1,0,1,-2,0,2,-1,0,1] kullanmak, çok güçlü bir dikey çizgi grubu sağlar:

Dikey çizgi filtresi algılanıyor

[-1,-2,-1,0,0,0,1,2,1] kullanmak size yatay satırlar verir:

Yatay çizgileri algılama

Farklı değerleri keşfedin. Ayrıca, 5x5 veya 7x7 gibi farklı boyutlardaki filtreleri deneyin.

6. Havuz Havuzunu Anlama

Artık resmin temel özelliklerini tanımladığınıza göre ne yaparsınız? Oluşturulan özellik haritasını resimleri sınıflandırmak için nasıl kullanıyorsunuz?

Evrişmelere benzer şekilde havuz oluşturmak, özelliklerin algılanmasına çok yardımcı olur. Havuz katmanları, bir resimdeki toplam bilgi miktarını azaltırken mevcut olduğu tespit edilen özellikleri korur.

Birçok farklı havuz türü vardır ancak Maksimum (Maks.) Havuzlama adlı bir yöntem kullanırsınız.

Resmin üzerine itin ve her noktada pikseli ve hemen yanındaki komşuları sağ, alt ve sağ alt kısmını düşünün. Bunların en büyüğünü (bu nedenle maks. havuz) alıp yeni resme yükleyin. Bu nedenle, yeni resim, eskisinin dörtte biri oranında olacaktır. Maks. Havuzlama

7. Havuz için kod yazın

Aşağıdaki kodda (2, 2) havuz havuzu gösterilir. Çıkışı görmek için kodu çalıştırın.

Gördüğünüz gibi, resim orijinal boyutun dördü dördündeyken tüm özellikleri korumuş olur.

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

Bu şemanın eksenlerine dikkat edin. Resmin boyutu artık 256x256, orijinal boyutunun dördü de olmuştur ve resimde artık daha az veri olmasına rağmen algılanan özellikler iyileştirilmiştir.

8. Tebrikler

İlk bilgisayar görüşü modelinizi oluşturdunuz. Bilgisayar görüşü modellerinizi nasıl daha da geliştireceğinizi öğrenmek için Bilgisayar görüşünü iyileştirmek üzere evrişimli nöral ağlar (CNN'ler) oluşturma bölümüne gidin.