Создайте массив, подобный набору данных MNIST, из tinker draw Python - PullRequest
1 голос
/ 06 февраля 2020

Я создал базовую c тинкер-канву, где пользователь может рисовать, используя bru sh. Я сохраняю все координаты x и y нарисованных линий в массиве, а затем изменяю их размер до 28x28 пикселей (размер изображений набора данных); каким-то образом я могу преобразовать этот массив в массив numpy, такой как набор данных MNIST (набор данных tenorflow)?

Это пример этого набора данных (каждое число представляет цвет по шкале RGB):

[[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0  84 185 159 151  60  36   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0 222 254 254 254 254 241 198 198 198 198 198 198 198 198 170  52   0   0   0   0   0   0]
 [  0   0   0   0   0   0  67 114  72 114 163 227 254 225 254 254 254 250 229 254 254 140   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0  17  66  14  67  67  67  59  21 236 254 106   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  83 253 209  18   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  22 233 255  83   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 129 254 238  44   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  59 249 254  62   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 133 254 187   5   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   9 205 248  58   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 126 254 182   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  75 251 240  57   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0  19 221 254 166   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   3 203 254 219  35   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  38 254 254  77   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0  31 224 254 115   1   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0 133 254 254  52   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0  61 242 254 254  52   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0 121 254 254 219  40   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0 121 254 207  18   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]]

РЕДАКТИРОВАТЬ: Я обнаружил, что есть cv2 для преобразования изображения в этот конкретный c массив, который требуется тензорным потоком, img_to_array (image). Так что теперь я должен знать, как пользователь может «сфотографировать» нарисованную линию и затем преобразовать их в массив.

По сути, целью программы является использование классификационной нейронной сети, созданной с тензорным потоком. распознавать нарисованные пользователем цифры.

РЕШЕНИЕ:

1) сохранить изображение:

from win32 import win32gui
HWND = self.canvas.winfo_id()
rect = win32gui.GetWindowRect(HWND) 
img = ImageGrab.grab(rect)
img = img.resize((28, 28), PIL.Image.ANTIALIAS)

2) преобразовать изображение:

img = np.invert(img.convert('L')).ravel()
img = np.split(img, 28)
img = np.array(img)
print("Image:", img, img.shape)
img = img / 255
img = np.array(img)

3) предсказать результат:

prediction = self.model.predict(img.reshape(1,28,28))

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Это способ чтения и преобразования изображения в массив numpy с использованием PIL (Python Imaging Library или Pillow) -

from PIL import Image
import numpy as np
import sys

try:
    # Absolute path to image-
    # 'Image.open()' method reads the image file. Pillow can read
    # over 30 different file formats
    pic = Image.open("/aboslute_path/pic.jpeg")

except IOError:
    print("\nCannot open/load file.\n")
    sys.exit(1)

# Pillow allows us to get some basic information about the image-
print("\nImage basic information:")
print("Format = {0}, Size = {1}, Mode = {2}".format(
    pic.format, pic.size, pic.mode))


# Convert PIL image to numpy array-
pic_np = np.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)

Здесь 3 означает RGB или 3 канала. Если ваше изображение представляет собой один канал, замените 3 на 1.

0 голосов
/ 06 февраля 2020

Если ваш массив yourarray, и если я понял ваш вопрос, не достаточно ли
arr = np.array(yourarray)?

...