Я уже построил модель с использованием нейронной сети, которая использует набор данных MNIST для прогнозирования цифр.
Теперь я хочу предсказать изображение, которое я кормлю моделью.
Я использую этот код для преобразования изображения в изображение MNIST.
from PIL import Image, ImageFilter
from matplotlib import pyplot as plt
def imageprepare(argv):
"""
This function returns the pixel values.
The imput is a png file location.
"""
im = Image.open(argv).convert('L')
width = float(im.size[0])
height = float(im.size[1])
newImage = Image.new('L', (28, 28), (255)) # creates white canvas of 28x28 pixels
if width > height: # check which dimension is bigger
# Width is bigger. Width becomes 20 pixels.
nheight = int(round((20.0 / width * height), 0)) # resize height according to ratio width
if (nheight == 0): # rare case but minimum is 1 pixel
nheight = 1
# resize and sharpen
img = im.resize((20, nheight), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
wtop = int(round(((28 - nheight) / 2), 0)) # calculate horizontal position
newImage.paste(img, (4, wtop)) # paste resized image on white canvas
else:
# Height is bigger. Heigth becomes 20 pixels.
nwidth = int(round((20.0 / height * width), 0)) # resize width according to ratio height
if (nwidth == 0): # rare case but minimum is 1 pixel
nwidth = 1
# resize and sharpen
img = im.resize((nwidth, 20), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
wleft = int(round(((28 - nwidth) / 2), 0)) # caculate vertical pozition
newImage.paste(img, (wleft, 4)) # paste resized image on white canvas
# newImage.save("sample.png
tv = list(newImage.getdata()) # get pixel values
# normalize pixels to 0 and 1. 0 is pure white, 1 is pure black.
tva = [(255 - x) * 1.0 / 255.0 for x in tv]
print(tva)
return tva
x=[imageprepare('./zero.png')]#file path here
print(len(x))# mnist IMAGES are 28x28=784 pixels
print(x[0])
#Now we convert 784 sized 1d array to 24x24 sized 2d array so that we can visualize it
newArr=[[0 for d in range(28)] for y in range(28)]
k = 0
for i in range(28):
for j in range(28):
newArr[i][j]=x[0][k]
k=k+1
for i in range(28):
for j in range(28):
print(newArr[i][j])
# print(' , ')
print('\n')
plt.imshow(newArr, interpolation='nearest')
plt.savefig('MNIST_IMAGE2.png')#save MNIST image
plt.show()#Show / plot that image
И я использую следующий код для прогнозирования результатов:
image = cv2.imread("MNIST_IMAGE2.png")
image = cv2.resize(image,(28,28))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
data = asarray(gray)
data=data/255.0
predictions = model.predict(np.expand_dims(data, 0))
Но выходные данные, созданные с использованием вышеуказанных кодов, очень менее точны.
Что мне делать ??