CNNを使用して抽出した特徴をRNNに渡す方法は?


6

以下のような単語画像があります。
ワードイメージ

256x64画像だとしましょう。私の目的は、画像からテキストを抽出することです73791096754314441539。これは、基本的にOCRが行うことです。
画像から単語を認識できるモデルを作ろうとしています。
私が言葉を言っているとき、それは次のいずれかであることができます:

  1. 辞書の単語、非辞書の単語
  2. 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)を使用することです損失を見つけてネットワークを訓練します。
期待どおりの結果が得られません。次の場合に知りたいです。

  1. このタスクを実行する他のより良い方法があります
  2. フィーチャをシーケンスに正しく変換している場合
  3. このような何かが行われた研究論文。

回答:


3

1と2。正しい方向に向かっています。CNNを使用して特徴を抽出する必要があります。次に、特徴の最後の層を再形成し、それをRNNに直接フィードするクラスを予測する代わりに。

次の点に注意してください。

  • かなり浅いCNNでは、これらのアーキテクチャーが提供できる高レベルの機能抽出を利用できません。すべての画像が、あなたが示した例のように単純であれば、それで十分です。
  • より大きなCNNとRNNを検討している場合は、トレーニングする必要のあるパラメーターがかなりあります。このためには、大量のデータと大量の計算リソース(非常に強力なGPUまたは時間)が必要です。
  • この2つを最大限に活用するために、モデルに事前トレーニング済みの CNNを組み込むことをお勧めします(そして、後者のレイヤーを微調整するだけです)。この事前トレーニング済みモデルは、一般的な画像(ImageNetなど)でトレーニングすることもでき、計算コストなしでCNNのパフォーマンスを大幅に向上させます。次に、このCNNの後半の層をRNNと一緒にトレーニングできます。

3. これは、実行しようとしていることの良い例です。彼らは基本的にあなたが説明するのと同じ方法で、とりわけストリート写真からテキストを認識しようとします。

同様の方法論は、次のような他の研究ドメインに見出すことができるマルチラベル画像分類配列の標識表情認識


私が使用しているアプローチの1つの問題/ボトルネックは、CNNモデルの入力画像サイズが固定されているため、長い単語がある場合、どちらかを減らすfont_size必要がimage dimensionあるか、精度に影響することです。どう思いますか ?しかし、私がオクロピーのようにBiLSTMだけを使用する場合、さまざまな次元の画像をフィードできます(おそらくまだ実験中です)。これについてのあなたの意見は何ですか?
lordzuko 2017

2
はい、入力形状は同じままである必要があります。つまり、解像度を下げる必要があり、精度が低下する可能性があります。あなたが検討できる別のアプローチがありますが、それがうまくいくかどうかはわかりません:オブジェクト認識。(それぞれ1つの数値の)地域提案を作成するシステムを用意し、MNISTでトレーニングされた2番目の単純なCNNでそれらの提案を分類してみることができます。次に、すべての出力を1つの数値に連結します。
Djib2011 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.