web-dev-qa-db-fra.com

Trouver un document similaire

Je travaille sur un projet dans lequel j'ai des processus et des documents stockés de rapports médicaux d'une page avec des catégories étiquetées. L'utilisateur saisira un document et je devrai classer la catégorie à laquelle il appartient. 

J'ai converti tous les documents au format d'image en niveaux de gris et les ai stockés à des fins de comparaison.

J'ai un jeu de données d'images ayant les données suivantes,

  • image_path: cette colonne a un chemin d'accès à l'image
  • histogram_value: cette colonne contient un histogramme de l'image, calculé à l'aide de la fonction cv2.calcHist
  • np_avg: cette colonne a une valeur moyenne de tous les pixels de l'image. Calculé à l'aide de np.average
    • category: Cette colonne est une catégorie de l'image.

Je prévois d'utiliser ces deux méthodes,

  • Calculez histogram_value de l'image d'entrée, trouvez les 10 images correspondantes les plus proches
    • Calculez np_avg de l'image d'entrée, trouvez les 10 images correspondantes les plus proches
    • Prendre l'intersection des deux résultats
    • Si plusieurs images sont trouvées, faites une correspondance de modèle pour trouver le meilleur ajustement.

J'ai très peu de connaissances dans le domaine du traitement d'images. Le mécanisme ci-dessus est-il fiable pour mon objectif? 

J'ai vérifié SO, trouvé quelques questions sur les mêmes, mais ils ont un problème très différent et le résultat souhaité. Cette question ressemble à ma situation, mais c'est très générique et je ne suis pas sûr que cela fonctionnera dans mon scénario.

Lien vers des exemples de rapports

4
Gaurav Gandhi

Je recommanderais quelques choses:

Comparaison basée sur le texte:

OCR les documents et extraire les fonctionnalités de texte en utilisant Tesseract de Google, qui est l’un des meilleurs progiciels de ROC open source du marché. Il existe également un wrapper Python appelé PyTesseract . Vous aurez probablement besoin de jouer avec la résolution de vos images pour que l'OCR fonctionne à votre satisfaction - cela nécessitera des essais et des erreurs.

Une fois que vous avez extrait les mots, l’une des méthodes communément admises consiste à calculer une TF-IDF (fréquence des termes - fréquence inverse des documents), puis toute approche basée sur la distance (la similarité des cosinus est l’une des plus courantes) pour comparer les documents similaires. "(plus proche) les uns des autres.

Comparaison basée sur l'image

Si vous avez déjà les images en tant que vecteur, appliquez une mesure basée sur la distance pour déterminer la similarité. Généralement, la norme L1 ou L2 fonctionnerait. Ce papier suggère que Manhattan (norme L1) conviendrait mieux pour les images naturelles. Vous pouvez commencer avec cela et essayer d'autres mesures basées sur la distance

Comparaisons texte/image d'ensemble

Exécutez les deux approches, puis effectuez une moyenne entre les deux approches pour obtenir des documents similaires. 

Par exemple.

L'approche basée sur le texte peut classer DocB et DocC comme les 2 documents les plus proches de DocA par Distance 10 et 20 unités respectivement.

L’approche basée sur l’image peut classer DocC et DocB comme les deux plus proches de Distance 5 et Distance 20 respectivement.

Ensuite, vous pouvez faire la moyenne des deux distances. DocB serait (10 + 20)/2 = 15 et DocC serait (20 + 5)/2 = 12,5 unités en dehors de DocA. Donc, vous traiterez DocC comme étant plus proche de A que de B dans une approche intégrée.

3
HakunaMaData

Mesurer la similarité de documents à partir d'images est compliqué par rapport à la mesure de documents à partir de textes pour deux raisons. 

  1. Les images peuvent présenter des similitudes en termes de luminosité, de contexte textuel, de diagrammes ou de symboles. 
  2. Il est souvent plus difficile de trouver la représentation du document à partir des images qu’il contient par rapport à ses informations textuelles. 

solution

Ma solution consiste à utiliser le machine learning pour trouver des représentations d'un document et utiliser cette représentation pour classer le document. Ici, je vais donner à Keras la mise en oeuvre de la solution que je propose. 

Type de réseau

Je propose d'utiliser des couches convolutives pour l'extraction d'entités, suivies de couches récurrentes pour la classification des séquences. J'ai choisi keras en raison de ma familiarité et son API simple permet de définir un réseau associant des couches convolutives et des couches récurrentes. Mais le code peut facilement être changé en d'autres bibliothèques telles que Pytorch, Tensorflow, etc.

Pré-traitement des images

Il existe de nombreuses façons de prétraiter les images de documents pour les réseaux de neurones. Je fais les hypothèses. 

  • Les images contiennent du texte horizontal plutôt que vertical. 
  • La taille des images de document est fixée. Si la taille des images n'est pas fixée, vous pouvez la redimensionner avec la méthode opencv's resize .

Divisez les images verticalement de manière à ce que les lignes soient alimentées sous forme de séquences (il est plus efficace de séparer la ligne de division d'une ligne vide). Je vais montrer cela en utilisant Numpy pour un seul document. Dans l’implémentation suivante, je suppose que la forme de l’image d’un seul document est (100, 100, 3). Commençons par définir l'image_shape en tant que forme d'images de document.

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)

La mise en réseau

Les keras ont ConvLSTM2D layer pour traiter les images séquentielles. Les entrées sur le réseau sont des listes d'une séquence d'images produites en scindant des images de document.

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"))

Idéalement, ce modèle fonctionnera, car il pourrait apprendre une représentation hiérarchique (caractères, mots, phrases, contextes, symboles) du document à partir de son image.

2
Mitiku

Les exemples de documents varient énormément, impossible de les comparer au niveau de l’image (histogramme, np_avg).

Le contenu des rapports est constitué de plusieurs résultats numériques (min, max, recommandé) ou de catégorie (négatif/positif).

Pour chaque type de rapport , vous devrez effectuer un prétraitement.

Si la source des documents est numérique (non numérisée), vous effectuez l'extraction et la comparaison des champs, des lignes. Chaque rangée séparément.

  • extraction de l'image d'une partie du champ ou de la ligne et comparaison avec NN
  • extraction en texte et comparaison de valeurs (OCR)

Si les documents sont numérisés, vous devez gérer la rotation de l'image, la qualité et les artefacts, avant l'extraction.

Chaque type de rapport est un problème en soi. Choisissez un type de rapport avec plusieurs échantillons pour commencer.

Puisque vous avez affaire à des nombres, vous obtiendrez de bons résultats uniquement avec l'extraction de texte et de chiffres. Si report indique que la valeur est 0,2 et que la plage tolérée est comprise entre 0,1 et 0,3, NN n’est pas un outil pour cela. Vous devez comparer les chiffres.

Les NN ne sont pas le meilleur outil pour cela, du moins pas pour comparer des valeurs. Peut-être pour une partie du processus d'extraction.

Étapes de la solution

  • automatiser la catégorisation des rapports
  • pour chaque type de rapport, champs de marque avec données
  • pour chaque type de rapport automatiser l'extraction des valeurs
  • pour chaque type de rapport, interpréter les valeurs conformément aux règles de gestion
1
dario

Cela semble être un bon endroit pour utiliser l'apprentissage automatique pour classer les documents.

Avez-vous envisagé d'utiliser TensorFlow? (TensorFlow.org)

Vous formeriez votre réseau de neurones avec un tas de documents, puis vous le lâchez avec le reste.

0
Chris Hubley