以下のような単語画像があります。
256x64
画像だとしましょう。私の目的は、画像からテキストを抽出することです73791096754314441539
。これは、基本的にOCRが行うことです。
画像から単語を認識できるモデルを作ろうとしています。
私が言葉を言っているとき、それは次のいずれかであることができます:
- 辞書の単語、非辞書の単語
- az、AZ、特殊文字を含む
spaces
以下のようにテンソルフローでモデル(会社のポリシーによりスニペット)を作成しました:
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)
私の現在のアプローチは、単語の入力を使用して画像をCNN
抽出して高レベルの画像機能を通過させ、画像機能を以下のようにシーケンシャルデータに変換し
[[a1,b1,c1],[a2,b2,c2],[a3,b3,c3]] -> [[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]]
てから、RNN(LSTMまたはBiLSTM)を通過させてからCTC
(Connectionist Temporal Loss)を使用することです損失を見つけてネットワークを訓練します。
期待どおりの結果が得られません。次の場合に知りたいです。
- このタスクを実行する他のより良い方法があります
- フィーチャをシーケンスに正しく変換している場合
- このような何かが行われた研究論文。
font_size
必要がimage dimension
あるか、精度に影響することです。どう思いますか ?しかし、私がオクロピーのようにBiLSTMだけを使用する場合、さまざまな次元の画像をフィードできます(おそらくまだ実験中です)。これについてのあなたの意見は何ですか?