我的目标是在随机背景上检测0到9之间的数字。我写了一个具有以下功能的数据集生成器:
以下是我的数据集的1024个样本: 1024 testset samples
我调整了mnist专家模型来训练数据集,几乎100%在火车和验证集上。
在测试集上,我得到大约80%的正确率。 这是一个例子。绿色数字是预测的数字:
似乎我的模型有一些麻烦要区分
1和7
8和3
9和6
5和9
我需要检测任何背景上的数字,因为测试图像并不总是二进制图像。
现在我的问题:
对于testset生成器:
应用数字轮换有多大用处?当我旋转7然后我得到1为一些字体。当我旋转9时,我得到6(旋转> 90°)
卷积滤镜是否已经处理了图像旋转?
180'000图像样本是否足以训练模型?
对于模型:
当我将模糊滤镜应用到数据集时,是否应该将图像尺寸从28x28增加到56x56?
我应该使用哪种过滤器尺寸?
我是否必须增加隐藏图层的数量?
非常感谢任何指南。
答案 0 :(得分:0)
如果您遇到不同的图像背景,我建议您尝试图像过滤,这会将您的图像转换为相同的前景背景,假设您的图像具有良好的品质。
试试这个(scikit-image library):
将numpy导入为np
从skimage导入过滤器作为flt
filtered_image = np.array(original_image> flt.threshold_li(original_image))
然后,您可以将过滤后的图像用于训练和预测。
答案 1 :(得分:0)
我最终从现有图像中提取数据集补丁,而不是使用随机数字的随机背景。这使我们在测试集上的方差更小,准确度更高。
这是一个有效但不那么高效的实现,它允许我们定义形状和步幅:
def patchify(self, arr, shape, stride):
patches = []
arr_shape = arr.shape
(shape_h, shape_w) = shape
(stride_h, stride_w) = stride
num_patches = np.floor(np.array(arr_shape)/np.array(stride))
(num_patches_row, num_patches_col) = (int(num_patches[0]), int(num_patches[1]))
for row in range(num_patches_row):
row_from = row*stride_h
row_to = row_from+shape_h
for col in range(num_patches_col):
col_from = col * stride_w
col_to = col_from + shape_w
origin_information = (row_from,row_to, col_from,col_to)
roi = arr[row_from:row_to, col_from:col_to]
patches.append((roi, origin_information))
return patches
或者我们也可以使用scklearn,其中image是一个numpy数组
patches = image.extract_patches_2d(image, (patch_height, patch_width))