首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >背景移除手写字符/数字,并使用神经网络非常精确地对任何新图像进行自动处理。

背景移除手写字符/数字,并使用神经网络非常精确地对任何新图像进行自动处理。
EN

Stack Overflow用户
提问于 2020-05-06 10:01:42
回答 1查看 156关注 0票数 0

我知道可以通过使用OpenCV应用阈值和其他一些技术来实现这一点,但是在这种情况下,对于不同的图像可能需要不同的阈值。

我试着应用Encoder-Decoder神经网络。但我注意到的是,对于字符大小很大的图像,即每幅图像大约有4个字符,但当我增加数字或相应地缩小图像中每个字符的大小时,结果是非常糟糕的。

我需要一个非常准确的输出,以便进一步每个字符可以被输入到识别模型。

实际输入图像

灰度作为神经网络的输入图像

目标/地面真相(输出图像)

代码语言:javascript
复制
 def encoder_decoder(input_shape):
        return Sequential([
            Lambda(lambda x: x / 127.5 - 1.0, input_shape=input_shape),
            Convolution2D(8, 3, 3, activation='relu', border_mode='same'),
            Convolution2D(8, 3, 3, activation='relu', border_mode='same'),
            MaxPooling2D((2,2), strides=(2,2)),
            Dropout(0.2),
            Convolution2D(16, 3, 3, activation='relu', border_mode='same'),
            Convolution2D(16, 3, 3, activation='relu', border_mode='same'),
            MaxPooling2D((2,2), strides=(2,2)),
            Dropout(0.2),
            Convolution2D(32, 3, 3, activation='relu', border_mode='same'),
            Convolution2D(32, 3, 3, activation='relu', border_mode='same'),
            MaxPooling2D((2,2), strides=(2,2)),
            Dropout(0.2),
            Convolution2D(64, 3, 3, activation='relu', border_mode='same'),
            Convolution2D(64, 3, 3, activation='relu', border_mode='same'),
            MaxPooling2D((2,2), strides=(2,2)),
            Dropout(0.2),
            Convolution2D(128, 3, 3, activation='relu', border_mode='same'),
            Convolution2D(128, 3, 3, activation='relu', border_mode='same'),
            UpSampling2D(size=(2,2)),
            Dropout(0.2),
            Convolution2D(64, 3, 3, activation='relu', border_mode='same'),
            Convolution2D(64, 3, 3, activation='relu', border_mode='same'),
            UpSampling2D(size=(2,2)),
            Dropout(0.2),
            Convolution2D(32, 3, 3, activation='relu', border_mode='same'),
            Convolution2D(32, 3, 3, activation='relu', border_mode='same'),
            UpSampling2D(size=(2,2)),
            Dropout(0.2),
            Convolution2D(16, 3, 3, activation='relu', border_mode='same'),
            Convolution2D(16, 3, 3, activation='relu', border_mode='same'),
            UpSampling2D(size=(2,2)),
            Dropout(0.2),
            Convolution2D(8, 3, 3, activation='relu', border_mode='same'),
            Convolution2D(8, 3, 3, activation='relu', border_mode='same'),
            Convolution2D(1, 1, 1, activation='relu')
        ])

背景还包含行(也要删除),这些线条在不同的图像中并不完全相同。而且,它们并不完全平行于应用FFT。笔迹来自不同的人。

将神经网络训练成一组小的图像(从70到100)来测试,直到它被覆盖。首先将输入图像转换为灰度,即整个过程都是在灰度上进行的。图像的大小是(800X600),进一步我需要绘制轮廓和应用分类算法,我无法获得较小的输出。

早些时候,我对清晰的图像进行了培训(忽略这里的背景是'0‘,在下一个例子中是'255’,用于输出),在图像中包含较少的字符数:

输入图像(灰度)

获得输出

稍后,在这种图像上:

输入图像

输入图像到NN(灰度)

神经网络输出

有可能重建这么小的字符/数字吗?

我应该如何提高它的性能?如果体系结构、数据集的大小、分辨率或其他方面有所改进。

如果还有其他更好的方法,我会很高兴知道。

EN

回答 1

Stack Overflow用户

发布于 2020-05-06 11:25:21

您需要数据来训练您的网络,无论是在图像之前还是之后,这样就可以根据您的预期对网络进行培训。

这就是为什么您需要“使用OpenCV应用阈值和其他一些技术”。

一种方法是使用这里这里所描述的从图像中删除水印的技术。

删除背景,用图像训练网络。

另一种方法是创建合成图像来训练网络。这里的一个优点是您事先就有了生成的图像。

  • 取空背景
  • 使用一些字体在上面画(在合成图像之后)
  • 在白色背景上画同样的东西(之前)

用这些图像训练网络。使用这种方法的另一个优点是,您可以在不同的字体、字体大小和背景上培训您的网络。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61632376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档