14

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

Вот подробности моей проблемы. У меня есть большая коллекция отсканированных документов и вам необходимо обнаружить наличие определенных типов страниц в этих документах. Я планирую «лопнуть» документы на свои страницы компонентов (каждый из которых является отдельным изображением) и классифицировать каждое из этих изображений как «A» или «B». Но я не могу понять, как это сделать.

Подробнее:

  • У меня есть многочисленные примеры "A" и "B" изображение (страница), так что я могу сделать контролируемое обучение.
  • Непонятно, как лучше всего извлекать из этих изображений функции для обучения. Например. Что это за особенности?
  • Страницы иногда слегка вращаются, поэтому было бы замечательно, если бы классификация была несколько нечувствительной к вращению и (в меньшей степени) масштабированию.
  • Я хотел бы получить кросс-платформенное решение, идеально в чистом питоне или с использованием общих библиотек.
  • Я думал об использовании OpenCV, но это похоже на «тяжелое» решение.

РЕДАКТИРОВАТЬ:

  • «A» и «B» страницы отличаются тем, что «B» страницы имеют формы на них с одной и той же общей структуры, в том числе наличие штрих-кода. Страницы «А» - это бесплатный текст.
+0

Как они отличаются? Шрифт? Размер? Не могли бы вы просто OCR его часть (заголовок или автор в заголовке?) –

+0

Ник, я добавил изменение, чтобы уточнить, что. На самом деле, моя цель - выбрасывать все * после * страниц B, потому что мне не нужно их OCR. Поэтому мне действительно нужно их обнаружить, прежде чем делать OCR. – Kyle

+3

Это довольно сложная проблема - если ваша коллекция действительно потрясающая, было бы проще просто классифицировать страницы вручную как «A» или «B»? Вы можете написать небольшое графическое приложение, чтобы отображать их по очереди, чтобы вы могли просто нажать один ключ на страницу. – katrielalex

ответ

4

Во-первых, я хотел бы сказать, что на мой взгляд, OpenCV - очень хороший инструмент для таких манипуляций. Более того, он имеет интерфейс python, хорошо описанный here.

OpenCV очень оптимизирован, и ваша проблема не из легких.

[GLOBAL EDIT: реорганизация моих идей]

Вот некоторые идеи функций, которые могут быть использованы:

  • Для обнаружения штрих-коды, вы должны, возможно, попытаться сделать расстояние преобразования (DistTransform в OpenCV), если штрих-код изолирован. Возможно, вы сможете найти интерес с помощью матчей или matchShapes. Я думаю, что это возможно, потому что штрих-коды shoudl имеют одинаковую форму (размер и т. Д.). Оценка очков интереса может быть использована как функция.

  • Моменты изображения могут быть полезны здесь, потому что у вас есть разные типы глобальных структур. Это будет возможно, достаточно для создания различия между & страниц В (см there для функции OpenCV) (вы получите инвариантные дескрипторы кстати :))

  • Вы должны возможно попытаться вычислить vertical gradient и horizontal gradient. Штрих-код - это конкретное место, где vertical gradient == 0 и horizontal gradient! = 0. Это основное преимущество - низкая стоимость этих операций, так как ваша цель состоит только в том, чтобы проверить, есть ли такая зона на вашей странице.Вы можете найти процентную зону и использовать его счет в качестве признака

После того, как у Вас есть свои особенности, вы можете попробовать сделать supervised learning и тест-обобщение. Ваша проблема требует очень мало false negative (потому что вы собираетесь выбросить несколько страниц), поэтому вы должны оценить свою производительность с помощью кривых ROC и внимательно изучить чувствительность (которая должна быть высокой). Для классификации вы можете использовать регрессию с лассо-штрафом, чтобы найти лучшие функции. Должность whatnick также дает товарные идеи и другие дескрипторы (возможно, более общие).

2

Таким образом, вы хотите иметь возможность различать два типа страниц с использованием конкретных элементов - в основном, наличие штрих-кодов. Есть два шага:

  1. функция извлечения (компьютерное зрение): найти процентные точки или линии, которые были бы конкретные особенности штрих-коды, а не текст.

  2. двоичная классификация (статистическое обучение): определить, есть ли штрих-код или нет, на основе извлеченных функций.


Работа с первым шагом, вы должны обязательно взглянуть на Hough transform. Это идеальное решение для идентификации линий в изображении и может быть полезно для обнаружения штрих-кода. Прочтите эти two pages, например. Вот examples с OpenCV.


О втором этапе, наиболее полезные классификации будет основываться на:

  • K ближайших соседей
  • логистическая регрессия
  • случайного леса (очень хорошо реализован в R, но я не знаю о Python)
+0

Orange Learning kit имеет прекрасную случайную реализацию леса, которую я использовал до того, как нашел ее в R. – whatnick

9

Я отвечу на 3 части, так как ваша проблема явно большая и Я очень рекомендую ручной метод с дешевой рабочей силой, если набор страниц не превышает 1000.

Часть 1: Feature Extraction - У вас есть очень большой набор функций, чтобы выбрать из в области обнаружения объекта. Поскольку одним из ваших требований является инвариантность вращения, я бы рекомендовал класс функций/SURF. Вы также можете найти подходящие углы Харриса и т. Д. Решение о том, какие функции использовать, может потребовать экспертных знаний, и если у вас есть вычислительная мощность, я бы рекомендовал создать хороший плавильный котел функций и передать его через классификатор важности оценки классификатора.

Часть 2: Выбор Классификатор - Я большой поклонник Random Forest классификатором. Концепция очень проста в понимании и очень гибкая и непараметрическая. Для настройки требуется очень мало параметров, и вы также можете запустить его в режиме выбора параметров во время контролируемого обучения.

Часть 3: Реализация - Python по сути является языком клея. Чистые реализации python для обработки изображений никогда не будут очень быстрыми. Я рекомендую использовать комбинацию OpenCV для обнаружения функции и R для статистической работы и классификаторов.

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

+0

SIFT - это, безусловно, хорошая идея, но в этом случае мы можем определить непосредственно более индивидуальные функции из-за наших предварительных знаний (наличие штрих-кода или открытого текста и т. д.) (см. мой пост). Использование обучения классификатора, чтобы найти, как объединить наши функции, чтобы дать ответ, является хорошим выбором. (+1 вообще для сообщения) – ThR37

+0

@wok: Я думаю, что whatnick хотел предложить более общий (и чистый) подход проблемы вместо того, чтобы идти глубже в вопросе «какую функцию я должен использовать?». Мы должны помнить, что штрих-код не является единственным решением этой проблемы и пытается сочетать разные способы. Ваша ссылка очень интересна во всех случаях. – ThR37

+0

отличный ответ. Я видел SIFT & SURF, но, увы, мое приложение является коммерческим, и SIFT запатентован. – Kyle

0

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

1) Загрузить свои обучающие данные здесь:

demo.nanonets.ai

2) Тогда запрос к API с помощью следующих (Python код):

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) ответ выглядит так:

{ 
    "message": "Model trained", 
    "result": [ 
    { 
     "label": "A", 
     "probability": 0.97 
    }, 
    { 
     "label": "B", 
     "probability": 0.03 
    } 
    ] 
}