Tenho imagens de palavras como abaixo:
Digamos que é uma 256x64
imagem. Meu objetivo é extrair o texto da imagem, 73791096754314441539
que é basicamente o que um OCR faz.
Estou tentando construir um modelo que possa reconhecer palavras de imagens.
Quando estou dizendo palavra, pode ser uma das seguintes:
- Qualquer palavra do dicionário, palavra que não seja do dicionário
- az, AZ, caracteres especiais, incluindo
spaces
Criei um modelo (snippet por causa das políticas da empresa) no tensorflow, conforme abaixo:
inputs = tf.placeholder(tf.float32, [common.BATCH_SIZE, common.OUTPUT_SHAPE[1], common.OUTPUT_SHAPE[0], 1])
# Here we use sparse_placeholder that will generate a
# SparseTensor required by ctc_loss op.
targets = tf.sparse_placeholder(tf.int32)
# 1d array of size [batch_size]
seq_len = tf.placeholder(tf.int32, [common.BATCH_SIZE])
model = tf.layers.conv2d(inputs, 64, (3,3),strides=(1, 1), padding='same', name='c1')
model = tf.layers.max_pooling2d(model, (3,3), strides=(2,2), padding='same', name='m1')
model = tf.layers.conv2d(model, 128,(3,3), strides=(1, 1), padding='same', name='c2')
model = tf.layers.max_pooling2d(model, (3,3),strides=(2,2), padding='same', name='m2')
model = tf.transpose(model, [3,0,1,2])
shape = model.get_shape().as_list()
model = tf.reshape(model, [shape[0],-1,shape[2]*shape[3]])
cell = tf.nn.rnn_cell.LSTMCell(common.num_hidden, state_is_tuple=True)
cell = tf.nn.rnn_cell.DropoutWrapper(cell, input_keep_prob=0.5, output_keep_prob=0.5)
stack = tf.nn.rnn_cell.MultiRNNCell([cell]*common.num_layers, state_is_tuple=True)
outputs, _ = tf.nn.dynamic_rnn(cell, model, seq_len, dtype=tf.float32,time_major=True)
Minha abordagem atual é usar a entrada de entrada de uma imagem de palavra, passá-la por um CNN
recurso de extração de imagem de alto nível, converter os recursos de imagem em dados sequenciais, como abaixo, em
[[a1,b1,c1],[a2,b2,c2],[a3,b3,c3]] -> [[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]]
seguida, passá-lo através de um RNN (LSTM ou BiLSTM) e, em seguida, usar CTC
(Connectionist Temporal Loss) para encontre a rede de perda e trem.
Não estou obtendo resultados conforme o esperado, queria saber se:
- Existe outra maneira melhor de executar esta tarefa
- Se estiver convertendo recursos para sequenciar corretamente
- Qualquer trabalho de pesquisa onde algo assim seja feito.
font_size
ou oimage dimension
que afetará minha precisão. O que você acha ? Mas se eu só uso um BiLSTM como em ocropy, posso alimentar imagens de várias dimensões (provavelmente ainda em fase de experimentação). Qual a sua opinião sobre isso?