Измерение сходства документов по изображениям сложнее по сравнению с измерением документов по текстам по двум причинам.
- Изображения могут иметь сходство с точки зрения яркости, текстового контекста, диаграмм или символов.
- Часто бывает труднее найти представление документа по содержащимся в нем изображениям по сравнению с его текстовой информацией.
решение
Мое решение - использовать машинное обучение для поиска представлений документа и использовать это представление для классификации документа.Здесь я дам Keras реализацию предложенного мной решения.
Тип сети
Я предлагаю использовать сверточные слои для извлечения признаков, а затем повторяющиеся слои для классификации последовательностей.Я выбрал keras из-за моего знакомства, и у него есть простой API для определения сети с комбинацией сверточных слоев и повторяющихся слоев.Но код можно легко изменить на другие библиотеки, такие как Pytorch, Tensorflow и т. Д.
Предварительная обработка изображений
Существует множество способов предварительной обработки изображений документов для нейронных сетей.Я делаю предположения.
- Изображения содержат горизонтальный текст, а не вертикальный текст.
- Размер изображения документа фиксирован.Если размер изображений не фиксирован, его можно изменить с помощью opencv's resize метода.
Разделить изображения по вертикали, чтобы строки передавались в виде последовательностей (Это более эффективно, еслилиния разделения может быть сделана на пустой строке).Я покажу это, используя Numpy для одного документа.В следующей реализации я предполагаю, что форма изображения одного документа (100, 100, 3).Во-первых, давайте определим image_shape форму изображений документа как
import numpy as np
image_shape = (100, 100, 3)
split_size = 25 # this should be factor of the image_shape[0]
doc_images = [] #
doc_image = np.zeros(image_shape)
splitted_images = np.split(doc_image,[split_size], axis=0)
doc_images.extend(splitted_images)
doc_images = np.array(doc_images)
Сетевая реализация
Keras имеет слой ConvLSTM2D для работы с последовательными изображениями.Входные данные для сети представляют собой списки последовательности изображений, полученных путем разделения изображений документов.
from keras.models import Sequential
from keras.layers import ConvLSTM2D, Dense, Flatten
num_of_classes = 10
model = Sequential()
model.add(ConvLSTM2D(32,(3, 3),input_shape=(None, split_size, image_shape[1],image_shape[2]),
padding='same',
return_sequences=True))
model.add(ConvLSTM2D(32,(3, 3),padding='same',return_sequences=True))
model.add(ConvLSTM2D(32,(3, 3),padding='same',return_sequences=False))
model.add(Flatten())
model.add(Dense(1024, activation="relu"))
model.add(Dense(num_classes, activation="softmax"))
В идеале эта модель будет работать, поскольку модель может изучать иерархическое представление (символы, слова, предложения, контексты, символы).документа из его изображения.