Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 预测鼠标写入的数字_Python_Opencv_Tensorflow_Machine Learning_Image Processing - Fatal编程技术网

Python 预测鼠标写入的数字

Python 预测鼠标写入的数字,python,opencv,tensorflow,machine-learning,image-processing,Python,Opencv,Tensorflow,Machine Learning,Image Processing,我想预测鼠标写的数字。 我使用TensorFlow创建了一个模型,并训练了整个数据集 当我写一个数字并试图预测时,它给我的答案就不那么准确了 请提出一些克服这一问题的方法 源代码是: import cv2 import numpy as np import matplotlib.pyplot as plt from PIL import Image import tensorflow as tf def plot_digit(data): image = data.reshape(2

我想预测鼠标写的数字。 我使用TensorFlow创建了一个模型,并训练了整个数据集

当我写一个数字并试图预测时,它给我的答案就不那么准确了

请提出一些克服这一问题的方法

源代码是:

import cv2
import numpy as np 
import matplotlib.pyplot as plt
from PIL import Image
import tensorflow as tf

def plot_digit(data):
    image = data.reshape(28, 28)
    plt.imshow(image, interpolation='nearest')
    plt.axis('off')

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(10)
])

predictions = model(x_train[:1]).numpy()
tf.nn.softmax(predictions).numpy()

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss_fn(y_train[:1], predictions).numpy()

model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10)

model.evaluate(x_test,  y_test, verbose=2)

drawing = False # true if mouse is pressed
pt1_x , pt1_y = None , None

# mouse callback function
def line_drawing(event,x,y,flags,param):
    global pt1_x,pt1_y,drawing

    if event==cv2.EVENT_LBUTTONDOWN:
        drawing=True
        pt1_x,pt1_y=x,y

    elif event==cv2.EVENT_MOUSEMOVE:
        if drawing==True:
            cv2.line(img,(pt1_x,pt1_y),(x,y),color=(255,255,255),thickness=3)
            pt1_x,pt1_y=x,y
    elif event==cv2.EVENT_LBUTTONUP:
        drawing=False
        cv2.line(img,(pt1_x,pt1_y),(x,y),color=(255,255,255),thickness=3)        


img = np.zeros((200,200), np.uint8)
cv2.namedWindow('test draw')
cv2.setMouseCallback('test draw',line_drawing)

while(1):
    cv2.imshow('test draw',img)
    if cv2.waitKey(1) & 0xFF == 27:
        break
cv2.destroyAllWindows()

img = Image.fromarray(img)
foo = img.resize((28,28),Image.ANTIALIAS)
foo = np.array(foo)/255.0
plot_digit(foo)

np.argmax(model.predict(foo.reshape(1,28,28)))
当我写7时,它预测6。
但当我画出我画的图时,它显示了7

这可能是很多事情。一些想法:

1) 也许是调整尺寸的问题?对于
200200
上的
thickness=3
,在调整到
(28,28)
后,它变得更像
thickness=1
,不再表示MNIST数据集。尝试可视化一些MNIST数据和鼠标写入的数据,看看它们是否真的相似(在
(28,28)
)级别

2) 也许这个模型太适合手写数字了?考虑在模型中使用卷积层,我认为在这种情况下它会减轻这个问题。

3) 也许是视觉化?我看到您在可视化图像时同时使用了
反别名
最近的
。尝试删除最近的
。你还看到你的期望吗


如果你能发布一些你所绘制的图片,这会有所帮助。

这可能是很多事情。一些想法:

1) 也许是调整尺寸的问题?对于
200200
上的
thickness=3
,在调整到
(28,28)
后,它变得更像
thickness=1
,不再表示MNIST数据集。尝试可视化一些MNIST数据和鼠标写入的数据,看看它们是否真的相似(在
(28,28)
)级别

2) 也许这个模型太适合手写数字了?考虑在模型中使用卷积层,我认为在这种情况下它会减轻这个问题。

3) 也许是视觉化?我看到您在可视化图像时同时使用了
反别名
最近的
。尝试删除最近的
。你还看到你的期望吗


如果你能发布一些你所绘制的图像,这会有所帮助。

如果你绘制8,它预测7吗?如果是,那么你可能需要调整预测数字的索引。这与索引无关。当我写3的时候,它会打印8。然后用更多的样本来更好地训练3和8,这样它就能区分这两个。如果你画8,它能预测7吗?如果是,那么你可能需要调整预测数字的索引。这与索引无关。当我写3时,它会打印8。然后用更多的样本更好地训练3和8,例如,这样它就可以区分这两个