我知道可以通过使用OpenCV应用阈值和其他一些技术来实现这一点,但是在这种情况下,对于不同的图像可能需要不同的阈值。
我试着应用Encoder-Decoder神经网络。但我注意到的是,对于字符大小很大的图像,即每幅图像大约有4个字符,但当我增加数字或相应地缩小图像中每个字符的大小时,结果是非常糟糕的。
我需要一个非常准确的输出,以便进一步每个字符可以被输入到识别模型。
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’,用于输出),在图像中包含较少的字符数:
稍后,在这种图像上:
有可能重建这么小的字符/数字吗?
我应该如何提高它的性能?如果体系结构、数据集的大小、分辨率或其他方面有所改进。
如果还有其他更好的方法,我会很高兴知道。
发布于 2020-05-06 11:25:21
您需要数据来训练您的网络,无论是在图像之前还是之后,这样就可以根据您的预期对网络进行培训。
这就是为什么您需要“使用OpenCV应用阈值和其他一些技术”。
一种方法是使用这里或这里所描述的从图像中删除水印的技术。
删除背景,用图像训练网络。
另一种方法是创建合成图像来训练网络。这里的一个优点是您事先就有了生成的图像。
用这些图像训练网络。使用这种方法的另一个优点是,您可以在不同的字体、字体大小和背景上培训您的网络。
https://stackoverflow.com/questions/61632376
复制相似问题