如何清理图像以用于 MNIST 训练模型?
How to clean images to use with a MNIST trained model?
我正在创建一个用于对数字图像进行分类的机器学习模型。我已经使用内置的 tf.keras.datasets.mnist
数据集使用 Tensorflow 和 Keras 训练了模型。该模型与 mnist
数据集本身的测试图像配合得很好,但我想为它提供我自己的图像。我为该模型提供的图像是从验证码中提取的,因此它们将遵循类似的模式。我在 this public google 驱动器文件夹中包含了一些图像示例。当我输入这些图像时,我注意到模型不是很准确,我对原因有一些猜测。
- 图片的背景在图片中产生了过多的噪点。
- 数字没有居中
- 图像在MNIST训练集(黑底白字)的颜色格式上不严格。
我想问一下如何去除背景并将其居中,以便减少图像中的噪点,从而实现更好的分类。
这是我使用的模型:
import tensorflow as tf
from tensorflow import keras
mnist = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
class Stopper(keras.callbacks.Callback):
def on_epoch_end(self, epoch, log={}):
if log.get('acc') >= 0.99:
self.model.stop_training = True
print('\nReached 99% Accuracy. Stopping Training...')
model = keras.Sequential([
keras.layers.Flatten(),
keras.layers.Dense(1024, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)])
model.compile(
optimizer=tf.train.AdamOptimizer(),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
x_train, x_test = x_train / 255, x_test / 255
model.fit(x_train, y_train, epochs=10, callbacks=[Stopper()])
这是我将图像导入 tensorflow 的方法:
from PIL import Image
img = Image.open("image_file_path").convert('L').resize((28, 28), Image.ANTIALIAS)
img = np.array(img)
model.predict(img[None,:,:])
我还包含了一些来自 MNIST 数据集的示例 here。我想要一个脚本来将我的图像尽可能接近 MNIST 数据集格式。另外,由于我必须对无限数量的图像执行此操作,如果您能为这种转换提供一种完全自动化的方法,我将不胜感激。非常感谢。
您需要使用与您正在测试的图像相似的数据集进行训练。 MNIST 数据是 hand-written 数字,这与计算机生成的验证码数据字体不同。
您需要做的是获得与您在 上预测的数据相似的验证码数据目录(最好来自您将输入到最终模型的同一来源) .捕获数据是一项艰巨的任务,在开始获得有用的东西之前,每个标签可能需要大约 300-400 张图像。
要点:您的模型的好坏取决于您提供给模型的训练数据。试图用糟糕的训练数据建立一个好的模型是一种纯粹的挫败感
解决您的一些想法:
[the model is not very accurate because] the background of the image creates too much noise in the picture.
这是事实。如果图像数据有噪声并且神经网络没有使用图像中的任何噪声进行训练,那么当它遇到这种类型的失真时将无法识别出强烈的模式。解决这个问题的一种可能方法是拍摄干净的图像并在发送图像进行训练之前以编程方式向图像添加噪声(类似于您在真实验证码中看到的噪声)。
[the model is not very accurate because] The number is not centered.
同理也是如此。如果所有的训练数据都居中,那么模型将为此 属性 过度调整并做出错误的猜测。如果您没有能力手动捕获和编目良好的数据样本,请遵循与上述类似的模式。
[the model is not very accurate because] The image is not striclty in the color format of MNIST training set (Black background white text).
您可以通过在处理之前对数据应用二进制阈值/在训练之前对颜色输入进行归一化来解决这个问题。根据验证码中的噪声量,您可能会得到更好的结果,允许数字和噪声保留其部分颜色信息(仍处于灰度和标准化状态,只是不应用阈值)。
此外,我建议使用卷积网络而不是线性网络,因为它更擅长区分边角等二维特征。即在使用 keras.layers.Flatten
展平之前使用 keras.layers.Conv2D
层
查看此处找到的最佳示例:Trains a simple convnet on the MNIST dataset.
model = tf.keras.models.Sequential(
[
tf.keras.layers.Conv2D(
32,
kernel_size=(3, 3),
activation=tf.nn.relu,
input_shape=input_shape,
),
tf.keras.layers.Conv2D(64, (3, 3), activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(
num_classes, activation=tf.nn.softmax
),
]
)
我已经使用此设置读取视频游戏画面中的字体,并且通过 10,000 张图像的测试集我达到了 99.98% 的准确度,在训练中使用一半数据集的随机抽样,并使用以下方法计算准确度总集。
我正在创建一个用于对数字图像进行分类的机器学习模型。我已经使用内置的 tf.keras.datasets.mnist
数据集使用 Tensorflow 和 Keras 训练了模型。该模型与 mnist
数据集本身的测试图像配合得很好,但我想为它提供我自己的图像。我为该模型提供的图像是从验证码中提取的,因此它们将遵循类似的模式。我在 this public google 驱动器文件夹中包含了一些图像示例。当我输入这些图像时,我注意到模型不是很准确,我对原因有一些猜测。
- 图片的背景在图片中产生了过多的噪点。
- 数字没有居中
- 图像在MNIST训练集(黑底白字)的颜色格式上不严格。
我想问一下如何去除背景并将其居中,以便减少图像中的噪点,从而实现更好的分类。
这是我使用的模型:
import tensorflow as tf
from tensorflow import keras
mnist = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
class Stopper(keras.callbacks.Callback):
def on_epoch_end(self, epoch, log={}):
if log.get('acc') >= 0.99:
self.model.stop_training = True
print('\nReached 99% Accuracy. Stopping Training...')
model = keras.Sequential([
keras.layers.Flatten(),
keras.layers.Dense(1024, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)])
model.compile(
optimizer=tf.train.AdamOptimizer(),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
x_train, x_test = x_train / 255, x_test / 255
model.fit(x_train, y_train, epochs=10, callbacks=[Stopper()])
这是我将图像导入 tensorflow 的方法:
from PIL import Image
img = Image.open("image_file_path").convert('L').resize((28, 28), Image.ANTIALIAS)
img = np.array(img)
model.predict(img[None,:,:])
我还包含了一些来自 MNIST 数据集的示例 here。我想要一个脚本来将我的图像尽可能接近 MNIST 数据集格式。另外,由于我必须对无限数量的图像执行此操作,如果您能为这种转换提供一种完全自动化的方法,我将不胜感激。非常感谢。
您需要使用与您正在测试的图像相似的数据集进行训练。 MNIST 数据是 hand-written 数字,这与计算机生成的验证码数据字体不同。
您需要做的是获得与您在 上预测的数据相似的验证码数据目录(最好来自您将输入到最终模型的同一来源) .捕获数据是一项艰巨的任务,在开始获得有用的东西之前,每个标签可能需要大约 300-400 张图像。
要点:您的模型的好坏取决于您提供给模型的训练数据。试图用糟糕的训练数据建立一个好的模型是一种纯粹的挫败感
解决您的一些想法:
[the model is not very accurate because] the background of the image creates too much noise in the picture.
这是事实。如果图像数据有噪声并且神经网络没有使用图像中的任何噪声进行训练,那么当它遇到这种类型的失真时将无法识别出强烈的模式。解决这个问题的一种可能方法是拍摄干净的图像并在发送图像进行训练之前以编程方式向图像添加噪声(类似于您在真实验证码中看到的噪声)。
[the model is not very accurate because] The number is not centered.
同理也是如此。如果所有的训练数据都居中,那么模型将为此 属性 过度调整并做出错误的猜测。如果您没有能力手动捕获和编目良好的数据样本,请遵循与上述类似的模式。
[the model is not very accurate because] The image is not striclty in the color format of MNIST training set (Black background white text).
您可以通过在处理之前对数据应用二进制阈值/在训练之前对颜色输入进行归一化来解决这个问题。根据验证码中的噪声量,您可能会得到更好的结果,允许数字和噪声保留其部分颜色信息(仍处于灰度和标准化状态,只是不应用阈值)。
此外,我建议使用卷积网络而不是线性网络,因为它更擅长区分边角等二维特征。即在使用 keras.layers.Flatten
keras.layers.Conv2D
层
查看此处找到的最佳示例:Trains a simple convnet on the MNIST dataset.
model = tf.keras.models.Sequential(
[
tf.keras.layers.Conv2D(
32,
kernel_size=(3, 3),
activation=tf.nn.relu,
input_shape=input_shape,
),
tf.keras.layers.Conv2D(64, (3, 3), activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(
num_classes, activation=tf.nn.softmax
),
]
)
我已经使用此设置读取视频游戏画面中的字体,并且通过 10,000 张图像的测试集我达到了 99.98% 的准确度,在训练中使用一半数据集的随机抽样,并使用以下方法计算准确度总集。