Поиск аналогичного документа - PullRequest
0 голосов
/ 24 декабря 2018

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

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

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

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

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

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

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

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

Ссылка на примеры отчетов

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

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

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

решение

Мое решение - использовать машинное обучение для поиска представлений документа и использовать это представление для классификации документа.Здесь я дам 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"))

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

0 голосов
/ 01 января 2019

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ансамблевые сравнения текста и изображений

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

Например,

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

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

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

...