Tạo lượt chuyển đổi và tập hợp

1. Trước khi bắt đầu

Trong lớp học lập trình này, bạn sẽ tìm hiểu về lượt chuyển đổi và lý do chuyển đổi mạnh mẽ trong các kịch bản thị giác máy tính.

Trong lớp học lập trình trước đây, bạn đã tạo một Mạng nơron sâu (DNN) đơn giản để quan sát máy tính các mặt hàng thời trang. Điều này bị hạn chế vì mục này yêu cầu mặt hàng quần áo là thứ duy nhất trong hình và mặt hàng đó phải được căn giữa.

Tất nhiên, đây không phải là tình huống thực tế. Bạn có thể muốn DNN của bạn có thể xác định mục quần áo trong các hình ảnh với các vật thể khác hoặc ở vị trí không được định vị. Để làm điều này, bạn cần phải sử dụng tính năng chuyển đổi.

Điều kiện tiên quyết

Lớp học lập trình này xây dựng dựa trên công việc đã hoàn thành trong hai phần trước, Làm quen với "Xin chào, World" của máy họcXây dựng mô hình thị giác máy tính. Vui lòng hoàn tất các lớp học lập trình đó trước khi tiếp tục.

Kiến thức bạn sẽ học được

  • Lượt chuyển đổi là gì
  • Cách tạo bản đồ tính năng
  • Tính năng gộp nhóm là gì

Sản phẩm bạn sẽ tạo ra

  • Một bản đồ tính năng của hình ảnh

Bạn cần có

Bạn có thể tìm thấy mã cho phần còn lại của lớp học lập trình chạy trong Colab.

Bạn cũng cần cài đặt TensorFlow và các thư viện bạn đã cài đặt trong lớp học lập trình trước đó.

2. Lượt chuyển đổi là gì?

Lượt chuyển đổi là một bộ lọc chuyển qua một hình ảnh, xử lý hình ảnh đó và trích xuất các tính năng quan trọng.

Giả sử bạn có hình ảnh một người đang đi giày thể thao. Làm sao bạn phát hiện ra giày thể thao có trong hình ảnh? Để chương trình của bạn & quot; See" hình ảnh với tư cách là một chiếc giày thể thao, bạn sẽ phải trích xuất các tính năng quan trọng và làm mờ các tính năng không cần thiết. Đây được gọi là tính năng ánh xạ tính năng.

Về mặt lý thuyết, quá trình ánh xạ tính năng rất đơn giản. Bạn sẽ quét mọi pixel trong hình ảnh rồi xem các pixel bên cạnh của hình ảnh đó. Bạn nhân giá trị của các pixel đó với các trọng số tương đương trong một bộ lọc.

Ví dụ:

Lượt chuyển đổi trên hình ảnh

Trong trường hợp này, ma trận chuyển đổi 3x3 hoặc hình ảnh kernel được chỉ định.

Giá trị pixel hiện tại là 192. Bạn có thể tính toán giá trị của pixel mới bằng cách xem xét các giá trị của vùng lân cận nhân với các giá trị được chỉ định trong bộ lọc và đặt giá trị pixel mới là số tiền cuối cùng.

Đã đến lúc khám phá cách hoạt động của lượt chuyển đổi bằng cách tạo một lượt chuyển đổi cơ bản trên hình ảnh 2D màu xám.

Bạn sẽ chứng minh điều đó bằng hình ảnh đi lên của SciPy. Đó là một bức ảnh tích hợp sẵn đẹp với nhiều góc và đường kẻ.

3. Bắt đầu lập trình

Bắt đầu bằng cách nhập một số thư viện Python và hình ảnh đi lên:

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

Tiếp theo, hãy sử dụng thư viện Pyplot matplotlib để vẽ hình ảnh sao cho hình ảnh của bạn trông như thế nào:

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

edb460dd5397f7f4.png

Bạn có thể thấy đó là hình ảnh cầu thang. Có nhiều tính năng mà bạn có thể thử và tách biệt. Ví dụ: có các đường dọc mạnh.

Hình ảnh được lưu trữ dưới dạng mảng NumPy, vì vậy chúng ta có thể tạo hình ảnh đã biến đổi bằng cách chỉ sao chép mảng đó. Biến size_x và size_y sẽ lưu giữ kích thước của hình ảnh để bạn có thể lặp lại sau này.

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

4. Tạo ma trận chuyển đổi

Trước tiên, hãy tạo ma trận chuyển đổi (hoặc hạt nhân) ở dạng mảng 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

Bây giờ, hãy tính pixel đầu ra. Lặp lại hình ảnh, để lại lề 1 pixel và nhân từng vùng lân cận của pixel hiện tại với giá trị được xác định trong bộ lọc.

Điều đó có nghĩa là vùng lân cận của pixel hiện tại phía trên nó và bên trái của pixel này sẽ được nhân với mục trên cùng bên trái trong bộ lọc. Sau đó, hãy nhân kết quả với trọng số và đảm bảo rằng kết quả nằm trong khoảng từ 0 đến 255.

Cuối cùng, hãy tải giá trị mới vào hình ảnh đã chuyển đổi:

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. Kiểm tra kết quả

Bây giờ, hãy vẽ biểu đồ để xem tác động của việc chuyển bộ lọc lên trên hình ảnh đó:

# 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.

Xem xét các giá trị bộ lọc sau đây và mức độ tác động của các giá trị đó đến hình ảnh.

Sử dụng [-1,0,1,-2,0,2,-1,0,1] sẽ giúp bạn có một tập hợp các dòng dọc rất mạnh:

Đang phát hiện bộ lọc đường dọc

Sử dụng [-1,-2,-1,0,0,0,1,2,1] cho bạn các đường kẻ ngang:

Phát hiện đường kẻ ngang

Hãy khám phá các giá trị khác nhau! Ngoài ra, hãy thử các bộ lọc có kích thước khác nhau, chẳng hạn như 5x5 hoặc 7x7.

6. Tìm hiểu về nhóm

Bây giờ, bạn đã xác định được các đặc điểm cần thiết của hình ảnh, bạn sẽ làm gì? Làm cách nào để bạn sử dụng bản đồ tính năng có được để phân loại hình ảnh?

Tương tự như các lượt chuyển đổi, tính năng gộp nhóm giúp ích nhiều trong việc phát hiện các tính năng. Các lớp gộp lại làm giảm lượng thông tin tổng thể trong hình ảnh trong khi vẫn duy trì các đối tượng được phát hiện như hiện tại.

Có một số loại nhóm, nhưng bạn sẽ sử dụng nhóm trong nhóm gọi là Nhóm tối đa (Tối đa).

Lặp lại hình ảnh và, tại mỗi thời điểm, hãy xem xét pixel và các vùng lân cận ngay bên phải, bên dưới và bên dưới. Lấy giá trị lớn nhất trong số đó (do đó gộp tối đa) và tải vào hình ảnh mới. Do đó, hình ảnh mới sẽ có kích thước bằng 1/4 kích thước cũ. Bể bơi tối đa

7. Viết mã để gộp

Đoạn mã sau sẽ hiển thị nhóm (2, 2). Hãy chạy ứng dụng này để xem kết quả.

Bạn sẽ thấy rằng mặc dù hình ảnh chỉ bằng 1/4 kích thước của hình ảnh gốc, nhưng hình ảnh vẫn được giữ lại tất cả các tính năng.

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

Lưu ý các trục của biểu đồ đó. Hình ảnh này hiện có kích thước 256x256, bằng 1/4 kích thước ban đầu và các tính năng phát hiện được đã được cải tiến mặc dù hiện đã có ít dữ liệu hơn trong hình ảnh.

8. Xin chúc mừng

Bạn đã xây dựng mô hình thị giác máy tính đầu tiên! Để tìm hiểu cách cải thiện thêm các mô hình thị giác máy tính, hãy tiến hành Xây dựng mạng nơ-ron chuyển đổi (CNN) để tăng cường thị lực máy tính.