Я знаю, что это можно сделать, применив порог и некоторые другие методы с использованием 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')
])
Фон содержит также линии (также подлежащие удалению), которые не совсем одинаковы на разных изображениях. Также они не совсем параллельны для применения БПФ. Почерк получен от другого человека.
Обучил нейронную сеть на небольшом наборе изображений (от 70 до 100), чтобы протестировать его до тех пор, пока он не перейдет. Входные изображения сначала преобразуются в шкалу серого, т.е. весь процесс происходит в шкале серого. Размер изображения (800X600), так как дальше мне нужно нарисовать контуры и применить алгоритм классификации, я не могу получить меньший результат.
Раньше я тренировался (игнорируйте фон, который здесь равен «0», а в следующем примере - «255») для вывода) на четких изображениях, содержащих меньшее количество символов в изображении:
Входное изображение (шкала серого)
Полученный результат
Позже, в этом виде изображения:
ВВОД ИЗОБРАЖЕНИЯ
ВВОД ИЗОБРАЖЕНИЯ в NN (шкала серого)
ВЫХОД NN
Можно ли восстановить символы / цифры такого маленького размера?
Как мне улучшить его производительность? Если будет улучшение архитектуры, размера набора данных, разрешения или чего-то еще.
И если есть какие-то другие лучшие подходы, я был бы рад узнать.