Classification des images en python

je cherche une méthode de classification des pages numérisées qui consistent principalement en du texte.

Voici les détails de mon problème. J'ai une vaste collection de documents numérisés et j'ai besoin de détecter la présence de certains types de pages dans ces documents. J'ai l'intention de" faire éclater "les documents dans leurs pages composantes (dont chacune est une image individuelle) et de classer chacune de ces images comme" A "ou"B". Mais je n'arrive pas à trouver la meilleure façon de faire ça.

Plus de détails:

  • j'ai de nombreux exemples d'images" A "et" B " (pages), donc je peux faire de l'apprentissage supervisé.
  • Je ne sais pas trop comment extraire les traits de ces images pour la formation. E. g. Quelles sont ces caractéristiques?
  • les pages font parfois l'objet d'une légère rotation, de sorte qu'il serait préférable que la classification soit quelque peu insensible à la rotation et (dans une moindre mesure) à l'échelle.
  • je voudrais une plateforme croisée solution, idéalement en python pur ou en utilisant des bibliothèques communes.
  • J'ai pensé à utiliser OpenCV, mais cela semble être une solution" lourde".

EDIT:

  • les pages" A "et" B "diffèrent en ce que les pages" B " ont des formulaires avec la même structure générale, y compris la présence d'un code à barres. Les pages " A " sont des textes libres.
15
demandé sur Wok 2010-10-11 17:31:39

4 réponses

je vais répondre en 3 parties puisque votre problème est clairement un grand et je recommande fortement la méthode manuelle avec la main-d'œuvre bon marché si la collection de pages ne dépasse pas un 1000.

Partie 1: Extraction de fonctionnalités - vous avez un très large éventail de fonctionnalités à choisir dans le champ de détection d'objets. Puisque l'une de vos exigences est l'invariance de rotation, je recommande le SIFT/SURF de classe d'entités. Vous pouvez également trouver Harris angles, etc. approprié. Décider quelles caractéristiques à utiliser peut exiger des connaissances d'expert et si vous avez la puissance de calcul, je recommande de créer un mélange agréable de caractéristiques et de passer par un estimateur d'importance basé sur la formation classifier.

Partie 2: Classifier la sélection - je suis un grand fan de la Forêt Aléatoire classificateur. Le concept est très simple à saisir et il est très flexible et non paramétrique. Le réglage nécessite très peu de paramètres et vous pouvez l'exécuter également en mode de sélection des paramètres pendant la formation supervisée.

Partie 3: Implémentation-Python est essentiellement un langage de colle. Les implémentations python pures pour le traitement d'image ne seront jamais très rapides. Je recommande L'utilisation d'une combinaison D'OpenCV pour la détection des caractéristiques et de R pour le travail statistique et les classificateurs.

la solution peut sembler trop technique, mais l'apprentissage automatique n'a jamais été une tâche simple, même lorsque la différence entre les pages sont simplement les pages de gauche et de droite d'un livre.

9
répondu whatnick 2010-10-11 14:49:18

tout d'abord, je voudrais dire que dans mon esprit OpenCV est un très bon outil pour ce genre de manipulation. De plus, il dispose d'une interface python bien décrite ici.

OpenCV est hautement optimisé et votre problème n'est pas facile.

[GLOBAL EDIT : réorganisation de mes idées]

voici quelques caractéristiques qui pourraient être utilisées:

  • pour détecter les codes à barres, vous devriez peut-être essayer de faire une distance transform (DistTransform in OpenCV) si le code à barres est isolé. Peut-être que vous serez en mesure de trouver l'intérêt pointseasily avec match ou matchShapes. Je pense que c'est faisable parce que les codes à barres doivent avoir la même forme (taille, etc). Le score des points d'intérêt pourrait être utilisé comme une fonction.

  • les moments de l'image pourraient être utiles ici parce que vous avez différents types de structures globales. Cela sera peut-être suffisant pour faire une distinction entre les pages A & B (voir il y a pour la fonction openCV) (vous obtiendrez des descripteurs invariants par la route :) )

  • Vous devriez peut-être essayer de calculer vertical gradient et horizontal gradient. Un code à barres est un endroit spécifique où vertical gradient==0 et horizontal gradient!=0. Ce principal avantage est le faible coût de ces opérations puisque votre but est seulement de vérifier s'il y a une telle zone sur votre page. Vous pouvez trouver la zone d'intérêt et utiliser son score comme une fonctionnalité

une Fois que vous avez votre les fonctionnalités, vous pouvez essayer de faire supervised learning et tester la généralisation. Votre problème nécessite très peu d' false negative (parce que vous allez jeter quelques pages) donc vous devriez évaluer votre performance avec des courbes ROC et regarder attentivement la sensistivité (qui devrait être élevée). Pour la classification, vous pouvez utiliser la régression avec la pénalisation de lasso pour trouver les meilleures caractéristiques. Le post de whatnick donne aussi des idées de produits et d'autres descripteurs (peut-être plus généraux).

4
répondu ThR37 2010-10-11 15:15:53

donc vous voulez pouvoir distinguer entre deux types de pages en utilisant des éléments spécifiques - essentiellement, la présence de codes à barres. Il y a deux étapes:

  1. extraction des caractéristiques (computer vision): trouver des points d'intérêt ou des lignes qui seraient des caractéristiques spécifiques des codes à barres et non du texte.

  2. classification binaire (apprentissage statistique): déterminer s'il existe un code à barres ou non, sur la base de l'extrait caractéristique.


face à la première étape, vous devriez certainement jeter un oeil à la Hough transformer. Il est idéal pour identifier les lignes dans une image, et pourrait être utile pour la détection de code barres. La lecture de ces deux pages par exemple. Voici exemples avec OpenCV.


à propos de la deuxième étape, les classifications les plus utiles seraient basées sur:

  • k voisins les plus proches
  • régression logistique
  • forêt au hasard (vraiment bien mis en œuvre dans R, mais je ne sais pas à propos de Python)
3
répondu Wok 2010-10-11 18:06:32

Vous pouvez essayer de construire un modèle en téléchargeant vos données d'entraînement de A et de B démo.nanonets.ai (gratuit)

Démo.nanonets.ai

2) puis interrogez L'API en utilisant le Code Python suivant:

import requests
import json
import urllib
model_name = "Enter-Your-Model-Name-Here"
url = "https://cdn.pixabay.com/photo/2012/04/24/12/13/letter-39694_960_720.png"
files = {'uploadfile': urllib.urlopen(url).read()}
url = "http://demo.nanonets.ai/classify/?appId="+model_name
r = requests.post(url, files=files)
print json.loads(r.content)

3) la réponse ressemble à:

{
  "message": "Model trained",
  "result": [
    {
      "label": "A",
      "probability": 0.97
    },
    {
      "label": "B",
      "probability": 0.03
    }
  ]
}
0
répondu sj7 2017-01-15 21:28:03