Wie werden mit CNN extrahierte Features an RNN übergeben?

6

Ich habe Wortbilder wie folgt:
Wortbild

Nehmen wir an, es ist ein 256x64Bild. Mein Ziel ist es, den Text aus dem Bild zu extrahieren, 73791096754314441539wie es eine OCR im Grunde tut.
Ich versuche ein Modell zu bauen, das Wörter aus Bildern erkennen kann.
Wenn ich ein Wort sage, kann es eines der folgenden sein:

  1. Jedes Wörterbuchwort, kein Wörterbuchwort
  2. az, AZ, Sonderzeichen einschließlich spaces

Ich habe ein Modell (Snippet aufgrund von Unternehmensrichtlinien) in Tensorflow wie folgt erstellt:

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)

Mein aktueller Ansatz besteht darin, die Eingabe eines Wortbildes zu verwenden, es durch ein CNNExtrakt auf hoher Ebene zu übertragen, die Bildmerkmale wie unten beschrieben in sequentielle Daten umzuwandeln
[[a1,b1,c1],[a2,b2,c2],[a3,b3,c3]] -> [[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]]
, es dann über eine RNN (LSTM oder BiLSTM) zu übergeben und dann CTC(Connectionist Temporal Loss) zu verwenden Finden Sie das Verlust- und Zugnetz.
Ich erhalte nicht die erwarteten Ergebnisse. Ich wollte wissen, ob:

  1. Es gibt einen anderen besseren Weg, um diese Aufgabe zu erledigen
  2. Wenn ich Features in die richtige Reihenfolge konvertiere
  3. Jede Forschungsarbeit, in der so etwas gemacht wird.
Lordzuko
quelle

Antworten:

3

Sie befinden sich in der richtigen Richtung. Sie müssen die Features mithilfe eines CNN extrahieren. Statt die Klasse vorherzusagen, möchten Sie die letzte Feature-Ebene umformen und direkt in das RNN einspeisen.

Ein paar Dinge zu beachten:

  • Mit einem eher flachen CNN nutzen Sie nicht die übergeordnete Feature-Extraktion, die diese Architekturen bieten können. Wenn alle Ihre Bilder so einfach sind wie das Beispiel, das Sie gezeigt haben, ist dies ausreichend.
  • Wenn Sie ein größeres CNN in Betracht ziehen, muss neben dem RNN eine erhebliche Anzahl von Parametern trainiert werden. Dafür benötigen Sie viele Daten und viele Rechenressourcen (entweder sehr starke GPUs oder Zeit).
  • Damit Sie das Beste aus beiden herausholen können, würde ich vorschlagen, ein vorab trainiertes CNN in Ihr Modell aufzunehmen (und die letzteren Ebenen nur fein abzustimmen). Dieses vorab trainierte Modell kann sogar in generischen Bildern (dh ImageNet) trainiert werden und erhöht die Leistung des CNN ohne Rechenaufwand erheblich. Sie können dann die letzteren Schichten dieses CNN gemeinsam mit dem RNN trainieren.

3. Dies ist ein gutes Beispiel dafür, was Sie versuchen zu tun. Sie versuchen im Grunde, Text von Straßenfotos unter anderem mit derselben Methode zu erkennen, die Sie beschreiben.

Ähnliche Methoden finden sich in anderen Forschungsbereichen wie der Klassifizierung von Mehrfachetikettenbildern , der Sequenzmarkierung , der Gesichtsausdruckerkennung usw.

Djib2011
quelle
Ein Problem / Engpass bei dem von mir verwendeten Ansatz besteht darin, dass ich, da die CNN-Modelle eine feste Eingangsbildgröße haben, bei einem längeren Wort entweder verringern muss font_sizeoder image dimensionwas meine Genauigkeit beeinträchtigen wird. Was denken Sie ? Aber wenn ich nur ein BiLSTM wie in der Okropie verwende, kann ich Bilder verschiedener Dimensionen einspeisen (wahrscheinlich noch experimentieren). Wie ist Ihre Meinung dazu?
Lordzuko
2
Ja, die Eingabeform muss gleich bleiben, was bedeutet, dass Sie Ihre Auflösung verringern müssen, was zu einer Verringerung der Genauigkeit führen kann. Es gibt noch einen anderen Ansatz, den Sie in Betracht ziehen könnten. Ich bin mir jedoch nicht sicher, ob er funktionieren würde: Objekterkennung . Sie könnten versuchen, ein System zu haben, das Regionsvorschläge (mit jeweils 1 Nummer) macht, und ein zweites einfaches CNN, das auf MNIST geschult ist, versuchen, diese Vorschläge zu klassifizieren. Verketten Sie dann alle Ausgaben zu einer einzigen Zahl.
Djib2011