Я нашел examples/image_ocr.py
, который, как представляется, для OCR. Следовательно, должно быть возможно предоставить модели изображение и получить текст. Однако я понятия не имею, как это сделать. Как мне подать модель с новым изображением? Какая предварительная обработка необходима?
Что я сделал
Установка зависимостей:
- Установите
cairocffi
:sudo apt-get install python-cairocffi
- Установить
editdistance
:sudo -H pip install editdistance
- Измените
train
, чтобы вернуть модель и сохранить подготовленную модель. - Запустите script для обучения модели.
Теперь у меня есть 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)