Làm cách nào để chuyển các tính năng được trích xuất bằng CNN vào RNN?


6

Tôi có hình ảnh từ như dưới đây:
Hình ảnh từ

Hãy nói đó là một 256x64hình ảnh. Mục đích của tôi là trích xuất văn bản từ hình ảnh 73791096754314441539về cơ bản là những gì OCR làm.
Tôi đang cố gắng xây dựng mô hình có thể nhận ra từ từ hình ảnh.
Khi tôi đang nói từ đó có thể là bất kỳ từ nào trong số các follwing:

  1. Bất kỳ từ điển, từ không từ điển
  2. az, AZ, các ký tự đặc biệt bao gồm spaces

Tôi đã xây dựng một mô hình (đoạn trích vì chính sách của công ty) theo dòng chảy như sau:

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)

Cách tiếp cận hiện tại của tôi là sử dụng đầu vào một hình ảnh từ thông qua một CNNtính năng hình ảnh mức cao trích xuất, chuyển đổi các tính năng hình ảnh thành dữ liệu tuần tự như
[[a1,b1,c1],[a2,b2,c2],[a3,b3,c3]] -> [[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]]
sau, sau đó chuyển nó qua RNN (LSTM hoặc BiLSTM), sau đó sử dụng CTC(Mất kết nối tạm thời) tìm sự mất mát và mạng lưới đào tạo.
Tôi không nhận được kết quả như mong đợi, tôi muốn biết nếu:

  1. Có một số cách khác tốt hơn để thực hiện nhiệm vụ này
  2. Nếu tôi chuyển đổi các tính năng thành chuỗi chính xác
  3. Bất kỳ bài nghiên cứu nơi mà một cái gì đó như thế này được thực hiện.

Câu trả lời:


3

1 và 2. Bạn đang đi đúng hướng, bạn cần trích xuất các tính năng bằng CNN, sau đó thay vì dự đoán lớp bạn muốn định hình lại lớp tính năng cuối cùng và đưa trực tiếp vào RNN.

Một vài điều cần chú ý:

  • Với một CNN khá nông, bạn không tận dụng lợi thế của việc trích xuất tính năng cấp cao hơn mà các kiến ​​trúc này có thể cung cấp. Nếu tất cả các hình ảnh của bạn đơn giản như ví dụ bạn đã thể hiện thì nó là đủ.
  • Nếu bạn đang xem xét một CNN lớn hơn, cùng với RNN, có một số lượng đáng kể các tham số sẽ được đào tạo. Đối với điều này, bạn cần rất nhiều dữ liệu và nhiều tài nguyên tính toán (GPU hoặc thời gian rất mạnh).
  • Để bạn có được thứ tốt nhất trong hai loại, tôi khuyên bạn nên kết hợp một CNN được đào tạo trước vào mô hình của bạn (và chỉ tinh chỉnh các lớp sau). Mô hình được đào tạo trước này thậm chí có thể được đào tạo về hình ảnh chung (ví dụ ImageNet) và sẽ tăng đáng kể hiệu suất của CNN mà không cần chi phí tính toán. Sau đó, bạn có thể huấn luyện các lớp sau của CNN này cùng với RNN.

3. Đây là một ví dụ tốt về những gì bạn đang cố gắng làm. Về cơ bản, họ cố gắng nhận ra văn bản từ các bức ảnh đường phố trong số những thứ khác với cùng một phương pháp mà bạn mô tả.

Các phương pháp tương tự có thể được tìm thấy trong các lĩnh vực nghiên cứu khác như phân loại hình ảnh đa nhãn , ghi nhãn theo trình tự , nhận dạng biểu hiện khuôn mặt , v.v.


Một vấn đề / nút thắt với cách tiếp cận mà tôi đang sử dụng là do các mô hình CNN có kích thước hình ảnh đầu vào cố định, trong trường hợp tôi có một từ dài hơn, tôi phải giảm font_sizehoặc image dimensionsẽ ảnh hưởng đến độ chính xác của tôi. Bạn nghĩ sao ? Nhưng nếu tôi chỉ sử dụng BiLSTM như trong ocropy, tôi có thể cung cấp hình ảnh ở nhiều chiều khác nhau (có thể, vẫn đang thử nghiệm), ý kiến ​​của bạn về điều này là gì?
chúa tể

2
Có, hình dạng đầu vào phải giữ nguyên, có nghĩa là bạn phải hạ độ phân giải của mình xuống, điều này có thể dẫn đến giảm độ chính xác. Có một cách tiếp cận khác mà bạn có thể xem xét, tôi không chắc liệu nó có hoạt động hay không: Nhận dạng đối tượng . Bạn có thể thử có một hệ thống đưa ra các đề xuất khu vực (mỗi số 1 số) và có một CNN đơn giản thứ hai được đào tạo trên MNIST cố gắng phân loại các đề xuất đó. Sau đó nối tất cả các đầu ra thành một số duy nhất.
Djib2011
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.