it-roy-ru.com

Поиск аналогичного документа

Я работаю над проектом, в котором я обрабатываю и храню документы одностраничных медицинских отчетов с помеченными категориями. Пользователь введет один документ, и я должен определить, к какой категории он относится. 

Я преобразовал все документы в формат изображения в градациях серого и сохранил их для сравнения.

У меня есть набор данных изображений, имеющих следующие данные,

  • image_path: в этом столбце указан путь к изображению
  • histogram_value: в этом столбце есть гистограмма изображения, рассчитанная с использованием функции cv2.calcHist
  • np_avg: этот столбец имеет среднее значение для всех пикселей изображения. Рассчитано с использованием np.average
    • category: этот столбец является категорией изображения.

Я планирую использовать эти два метода,

  • Рассчитайте histogram_value для входного изображения, найдите ближайшие 10 подходящих изображений
    • Рассчитайте np_avg из входного изображения, найдите ближайшие 10 подходящих изображений
    • Пересечь оба набора результатов
    • Если найдено более одного изображения, выполните сопоставление с шаблоном, чтобы найти наиболее подходящее.

У меня очень мало знаний в области обработки изображений. Будет ли вышеуказанный механизм надежным для моей цели? 

Я проверяю ТАК, нашел несколько вопросов по одному, но у них совсем другая проблема и желаемый результат. Этот вопрос похож на мою ситуацию, но он очень общий, и я не уверен, что он будет работать в моем сценарии.

Ссылка на образцы отчетов

4
Gaurav Gandhi

Я бы порекомендовал несколько вещей:

Сравнение на основе текста:

OCR документы и извлекать текстовые функции с помощью Google Tesseract, который является одним из лучших пакетов OCR с открытым исходным кодом. Для этого есть также Python Wrapper, который называется PyTesseract . Скорее всего, вам придется поиграть с разрешением ваших изображений, чтобы оптическое распознавание текста работало на ваше усмотрение - это потребует проб и ошибок.

После того как вы извлекли слова, одним из общепринятых подходов является вычисление TF-IDF (термин частота - обратная частота документа), а затем любые подходы на основе расстояния (косинусное сходство является одним из распространенных), чтобы сравнить, какие документы "похожи" "(ближе) друг к другу.

Сравнение на основе изображений

Если у вас уже есть изображения в качестве вектора, тогда примените меру на основе расстояния, чтобы выяснить сходство. Обычно L1 или L2 норма будет работать. Эта статья предполагает, что Манхэттен (L1 Norm) может работать лучше для естественных изображений. Вы можете начать с этого и попробовать другие меры, основанные на расстоянии

Сравнение текстовых и графических ансамблей

Запустите оба подхода, а затем усредните оба подхода, чтобы получить документы, которые похожи друг на друга. 

Например,.

Подход, основанный на тексте, может ранжировать DocB и DocC как 2 ближайших к DocA документа на расстоянии 10 и 20 единиц соответственно.

Подход, основанный на изображениях, может ранжировать DocC и DocB как самые близкие два на расстоянии 5 и расстоянии 20 соответственно.

Тогда вы можете усреднить два расстояния. DocB будет (10 + 20)/2 = 15, а DocC будет (20 + 5)/2 = 12,5 единиц, кроме DocA. Таким образом, вы будете считать, что DocC ближе к A, чем к B, в ансамблевом подходе.

3
HakunaMaData

Измерение сходства документов по изображениям сложнее по сравнению с измерением документов по текстам по двум причинам. 

  1. Изображения могут иметь сходство с точки зрения яркости, текстового контекста, диаграмм или символов. 
  2. Часто бывает сложнее найти представление документа по содержащимся в нем изображениям по сравнению с его текстовой информацией. 

решение

Мое решение - использовать машинное обучение, чтобы найти представления документа и использовать это представление для классификации документа. Здесь я дам Керасу реализацию предложенного мной решения. 

Тип сети

Я предлагаю использовать сверточные слои для извлечения объектов, а затем повторяющиеся слои для классификации последовательностей. Я выбрал 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_images,[split_size], axis=0)
doc_images.append(doc_image)
doc_images = np.array(doc_images)

Внедрение сети

Керасы имеют 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"))

В идеале эта модель будет работать, потому что модель может выучить иерархическое представление (символы, слова, предложения, контексты, символы) документа из его изображения.

2
Mitiku

Образцы документов сильно различаются, невозможно сравнить их на уровне изображения (гистограмма, np_avg).

Содержимое отчетов состоит из нескольких числовых (минимальное, максимальное, рекомендуемое) или результатов по категориям (отрицательное/положительное).

Для каждого типа отчета , вам нужно выполнить предварительную обработку.

Если источником документов является цифровой (не отсканированный), вы извлекаете и сравниваете поля, строки. Каждый ряд отдельно.

  • извлечение в изображение части поля или строки и сравнение ее с NN
  • извлечение в текст и сравнение значений (OCR)

Если документы сканируются, вы должны иметь дело с поворотом изображения, качеством и артефактами - перед извлечением.

Каждый тип отчета является проблемой сам по себе. Выберите один тип отчета с несколькими образцами для начала.

Поскольку вы имеете дело с числами, только с извлечением из текста и чисел у вас будут хорошие результаты. Если в отчете указано, что значение равно 0,2, а допустимый диапазон составляет от 0,1 до 0,3, NN не является инструментом для этого. Вы должны сравнить цифры.

NN не лучший инструмент для этого, по крайней мере, не для сравнения значений. Возможно для части процесса извлечения.

Шаги к решению

  • автоматизировать категоризацию отчетов
  • для каждого типа отчета отметьте поля с данными
  • для каждого типа отчета автоматизировать извлечение значений
  • для каждого типа отчета интерпретировать значения в соответствии с бизнес-правилами
1
dario

Это кажется хорошим местом для использования машинного обучения для классификации документов.

Рассматривали ли вы использовать TensorFlow? (TensorFlow.org)

Вы тренируете свою нейронную сеть с кучей документов, а затем отключаете ее от остальных.

0
Chris Hubley