Как я могу использовать пример Keras OCR?

Я нашел examples/image_ocr.py которые, как представляется, для OCR. Следовательно, должно быть возможно предоставить модели изображение и получить текст. Однако я понятия не имею, как это сделать. Как мне подать модель с новым изображением? Какая предварительная обработка необходима?

Что я сделал

Установка зависимостей:

  • Установить cairocffi : sudo apt-get install python-cairocffi
  • Установите editdistance : sudo -H pip install editdistance
  • Измените train чтобы вернуть модель и сохранить подготовленную модель.
  • Запустите сценарий для обучения модели.

Теперь у меня есть model.h5 . Что дальше?

См. Https://github.com/MartinThoma/algorithms/tree/master/ML/ocr/keras для моего текущего кода. Я знаю, как загрузить модель (см. Ниже), и это, похоже, работает. Проблема в том, что я не знаю, как подавать новые версии изображений с текстом в модель.

Связанные вопросы

  • Что такое CTC? Связанная временная классификация ?
  • Существуют ли алгоритмы, которые надежно обнаруживают вращение документа?
  • Существуют ли алгоритмы, которые надежно обнаруживают строки / текстовые блоки / таблицы / изображения (следовательно, делают разумную сегментацию)? Я думаю, что обнаружение края с помощью сглаживания и линейных гистограмм уже хорошо работает для этого?

Что я пробовал

 #!/usr/bin/env python from keras import backend as K import keras from keras.models import load_model import os from image_ocr import ctc_lambda_func, create_model, TextImageGenerator from keras.layers import Lambda from keras.utils.data_utils import get_file import scipy.ndimage import numpy img_h = 64 img_w = 512 pool_size = 2 words_per_epoch = 16000 val_split = 0.2 val_words = int(words_per_epoch * (val_split)) if K.image_data_format() == 'channels_first': input_shape = (1, img_w, img_h) else: input_shape = (img_w, img_h, 1) fdir = os.path.dirname(get_file('wordlists.tgz', origin='http://www.mythic-ai.com/datasets/wordlists.tgz', untar=True)) img_gen = TextImageGenerator(monogram_file=os.path.join(fdir, 'wordlist_mono_clean.txt'), bigram_file=os.path.join(fdir, 'wordlist_bi_clean.txt'), minibatch_size=32, img_w=img_w, img_h=img_h, downsample_factor=(pool_size ** 2), val_split=words_per_epoch - val_words ) print("Input shape: {}".format(input_shape)) model, _, _ = create_model(input_shape, img_gen, pool_size, img_w, img_h) model.load_weights("my_model.h5") x = scipy.ndimage.imread('example.png', mode='L').transpose() x = x.reshape(x.shape + (1,)) # Does not work print(model.predict(x)) 

это дает

 2017-07-05 22:07:58.695665: I tensorflow/core/common_runtime/gpu/gpu_device.cc:996] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN Black, pci bus id: 0000:01:00.0) Traceback (most recent call last): File "eval_example.py", line 45, in <module> print(model.predict(x)) File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1567, in predict check_batch_axis=False) File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 106, in _standardize_input_data 'Found: array with shape ' + str(data.shape)) ValueError: The model expects 4 arrays, but only received one array. Found: array with shape (512, 64, 1) 

2 Solutions collect form web for “Как я могу использовать пример Keras OCR?”

Здесь вы создали модель, которая нуждается в 4 входах:

 model = Model(inputs=[input_data, labels, input_length, label_length], outputs=loss_out) 

С другой стороны, ваша попытка прогноза загружает только изображение.
Отсюда сообщение: модель ожидает 4 массива, но получает только один массив

Из вашего кода необходимые входные данные:

 input_data = Input(name='the_input', shape=input_shape, dtype='float32') labels = Input(name='the_labels', shape=[img_gen.absolute_max_string_len],dtype='float32') input_length = Input(name='input_length', shape=[1], dtype='int64') label_length = Input(name='label_length', shape=[1], dtype='int64') 

Исходный код и ваша учебная работа, потому что они используют TextImageGenerator . Этот генератор должен предоставить вам четыре необходимых входа для модели.

Итак, вам нужно предсказать использование генератора. Поскольку у вас есть метод fit_generator() для обучения с генератором, у вас также есть метод pred_generator () для прогнозирования с генератором.


Теперь, для полного ответа и решения, я должен изучить ваш генератор и посмотреть, как он работает (что займет у меня некоторое время). Но теперь вы знаете, что нужно сделать, вы, вероятно, можете это понять.

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

Или, если возможно, просто создайте 3 оставшихся массива вручную, но убедитесь, что они имеют одинаковые формы (за исключением первого, который является размером партии), когда выдает генератор.

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

Теперь у меня есть model.h5. Что дальше?

Сначала я должен прокомментировать, что model.h5 содержит веса вашей сети, если вы хотите сохранить архитектуру своей сети, а также сохранить ее как json как в этом примере:

 model_json = model_json = model.to_json() with open("model_arch.json", "w") as json_file: json_file.write(model_json) 

Теперь, когда у вас есть модель и ее вес, вы можете загрузить их по требованию, выполнив следующие действия:

 json_file = open('model_arch.json', 'r') loaded_model_json = json_file.read() json_file.close() loaded_model = model_from_json(loaded_model_json) # load weights into new model # if you already have a loaded model and dont need to save start from here loaded_model.load_weights("model.h5") # compile loaded model with certain specifications sgd = SGD(lr=0.01) loaded_model.compile(loss="binary_crossentropy", optimizer=sgd, metrics=["accuracy"]) 

Затем, с помощью этого loaded_module вы можете приступить к прогнозированию классификации определенных входных данных следующим образом:

 prediction = loaded_model.predict(some_input, batch_size=20, verbose=0) 

Это вернет классификацию этого ввода.

О боковых вопросах:

  1. КТК, похоже, является термином, который они определяют в документе, который вы указали, извлечение из него говорит:

В дальнейшем мы будем ссылаться на задачу маркировки несегментированных последовательностей данных как временной классификации (Kadous, 2002) и нашего использования RNN для этой цели как временная классификация соединений ( CTC ).

  1. Чтобы компенсировать поворот документа, изображений или аналогичных данных, вы можете либо генерировать больше данных из текущего, применяя такие преобразования (посмотрите на это сообщение в блоге, объясняющее способ сделать это), или вы можете использовать сверточный нейрон Сетевой подход, который также является тем, что делает тот пример Keras вы используете, как мы можем видеть из этого git :

В этом примере используется сверточный стек, за которым следует повторяющийся стек, и функция CTC logloss для выполнения оптического распознавания образов текстовых изображений.

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

  1. Ну, этот вопрос является широким вопросом, но для обнаружения линий, которые вы можете использовать для преобразования линии Hough Line , или также Canny Edge Detection может быть хорошим вариантом.

Изменить: ошибка, которую вы получаете, заключается в том, что ожидается больше параметров вместо 1, из документов keras, которые мы видим:

 predict(self, x, batch_size=32, verbose=0) 

Повышает значение ValueError: в случае несоответствия между предоставленными входными данными и ожиданиями модели или в случае, если модель состояния имеет несколько выборок, которые не кратно размеру партии.

  • Простое распознавание знаков OCR в OpenCV-Python
  • OCR текста с низким разрешением из скриншотов
  • Извлечение мер на каждой линии с ноты
  • Простой (рабочий) рукописный распознавание цифр: как его улучшить?
  • Признать простые цифры с помощью pytesser
  • Могу ли я сделать «string содержит X» с процентной точностью в python?
  • Обработка изображения таблицы для получения данных из нее
  • «Добавление» новых шрифтов в Tesseract eng.traineddata
  • Получение ограничивающей рамки распознанных слов с использованием python-tesseract
  • Очистка изображения перед приложением OCR
  • OCR для нот
  •  
    Interesting Posts for Van-Lav

    Почему изменение dict во время итерации не всегда вызывает исключение?

    Установка тензорного потока на Windows с помощью anaconda

    Выбор значения из раскрывающегося списка с использованием selenium python

    Попытка понять процедуру связывания для написания гибрида Python / C ++

    Получить имя текущего класса?

    Простой синтаксис для приведения элемента списка в начало в python?

    Проверка Python с использованием макетной библиотеки для ввода пользователем в цикл

    проверьте, существует ли ключ в ведре в s3 с помощью boto3

    GeoDjango в NE, SW box

    Невозможно использовать django-compress с Heroku

    Сценарий haystack elasticsearch RealtimeSignalProcessor обновляет только соединение по умолчанию

    В чем разница между функцией, несвязанным методом и связанным методом?

    Какую систему динамической интернационализации использовать в проектах Django?

    Нажатие данных на веб-браузер при обработке ввода из ffmpeg

    Могу ли я исправить декоратор Python, прежде чем он обернет функцию?

    Python - лучший язык программирования в мире.