Удаление фона рукописных символов / цифр и автоматизация этого процесса для любого нового изображения с помощью нейронной сети очень точно - PullRequest
0 голосов
/ 06 мая 2020

Я знаю, что это можно сделать, применив порог и некоторые другие методы с использованием 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

Можно ли восстановить символы / цифры такого маленького размера?

Как мне улучшить его производительность? Если будет улучшение архитектуры, размера набора данных, разрешения или чего-то еще.

И если есть какие-то другие лучшие подходы, я был бы рад узнать.

1 Ответ

0 голосов
/ 06 мая 2020

Вам нужны данные для обучения вашей сети, изображения до и после, чтобы обучить сеть тому, что вы ожидаете в результате.

Вот почему вам нужно «применить порог и некоторые другие методы с использованием OpenCV» .

Один из способов - использовать методы удаления водяных знаков с изображений, как описано [здесь] ( Удаление водяных знаков с изображения с помощью OpenCV ) или здесь .

Удалите фон и обучите сеть с помощью изображений.

Другой подход - создать синтетические c изображения для обучения сети. Одним из преимуществ здесь является то, что у вас есть готовое изображение заранее.

  • Возьмите пустой фон
  • Используйте какой-нибудь шрифт для рисования на нем (после, syntheti c image)
  • Нарисуйте то же самое на белом фоне (перед)

Обучите сеть с этими изображениями. Еще одно преимущество использования этого подхода заключается в том, что вы можете обучать свою сеть различным шрифтам, размерам шрифтов и фону.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...