如何将使用 CNN 提取的特征传递给 RNN?

数据挖掘 神经网络 深度学习 张量流 rnn ocr
2021-10-07 20:44:27

我有如下文字图片:
文字图片

假设它是一个256x64图像。我的目标是从图像中提取文本,73791096754314441539这基本上是 OCR 所做的。
我正在尝试构建可以从图像中识别单词的模型。
当我说单词时,它可以是以下任何一种:

  1. 任何字典词,非字典词
  2. az,AZ, 特殊字符包括spaces

我在 tensorflow 中建立了一个模型(由于公司政策而产生的片段),如下所示:

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. 任何完成此类事情的研究论文。
1个回答

1 和 2。您的方向是正确的,您需要使用 CNN 提取特征,而不是预测要重塑最后一层特征的类别并将其直接输入 RNN。

有几点需要注意:

  • 使用相当浅的 CNN,您并没有利用这些架构可以提供的更高级别的特征提取。如果您的所有图像都像您展示的示例一样简单,那就足够了。
  • 如果您正在考虑使用更大的 CNN,那么除了 RNN 之外,还有大量参数需要训练。为此,您需要大量数据和大量计算资源(非常强大的 GPU 或时间)。
  • 为了让您充分利用两者,我建议将预训练的CNN 合并到您的模型中(并微调后面的层)。这种预训练模型甚至可以在通用图像(即 ImageNet)中进行训练,并且将在没有计算成本的情况下显着提高 CNN 的性能。然后,您可以与 RNN 联合训练该 CNN 的后几层。

3.是您尝试做的一个很好的例子。他们基本上尝试使用您描述的相同方法从街头照片中识别文本。

类似的方法可以在其他研究领域找到,例如多标签图像分类序列标注面部表情识别等。