Требуется консультация по проверке приема Tesseract

Я снова и снова боролся с Tesseract для различных проектов OCR, и сегодня я нашел прецеденты, которые, как я думал, будут для него хлопать, но после многих часов я все еще не ухожу. Я хотел поставить проблему здесь и посмотреть, есть ли у кого-нибудь еще советы о том, как решить эту задачу.

Моя жена пришла ко мне сегодня утром и спросила, есть ли она в любом случае, она может легко отсканировать свои квитанции от Wal-Mart и со временем построить историю цен, проводимых в категориях и для конкретных предметов, чтобы мы могли сделать некоторые тенденции и легко глубокое погружение на том, куда идут расходы. Сначала я чувствовал, что это был очень высокий порядок, но после некоторого рытья я нашел несколько вещей, которые заставляют меня чувствовать, что это находится в пределах досягаемости:

  • Доходы Wal-Mart в целом, очень хорошо структурированы и легко читаются. Они даже включают UPC для каждого элемента (потенциал для поиска по базе данных UPC?) И, как представляется, классифицируют продукты питания с помощью F или я (не уверен, в чем разница), а также столбцы налогового кода, которые могут оказаться полезными, если Я узнаю секреты того, что означают коды.

  • Я также обнаружил, что есть какой-то API-интерфейс поиска элементов Wal-Mart, который я могу получить, доступ к которому будет полезен при поиске UPC.

  • У них есть приложение для смартфонов, которое позволяет сканировать QR-код, напечатанный на каждой квитанции. Это приложение просматривает код "ТС" из квитанции и вытаскивает всю детальную квитанцию ​​со своих серверов. Это показывает отличное графическое представление квитанции, включая миниатюрные изображения всех предметов и стоимости и т.д. Если это приложение просто классифицирует и суммирует квитанцию, я бы сделал! Но, увы, это не цель приложения....

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

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

http://postimg.org/image/s56o0wbzf/

Вы можете видеть, что важная часть текста полностью выровнена в 5 столбцах, и в конечном итоге это вопрос. Как заставить Tesseract точно распознать это в тексте. У меня есть много идей, где взять это отсюда, но все начинается с OCR!

Самый близкий я сам пришел сюда:

http://pastebin.com/nuZJBVg8

Я использовал psm6 и набор ограничения символов, чтобы заставить его делать прописные + цифры + только несколько символов:

tessedit_char_whitelist 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ#()/*@%-.

На первый взгляд OCR, похоже, почти соответствует. Но по мере того, как вы копаете глубже, вы увидите, что это не так ужасно. 3s и 8s почти всегда ошибаются. То же самое с 6s и 5s. Затем бывают случаи, когда он просто полностью пропускает символы или просто начинает разваливаться (например, строка 31+ в примере). Он начинает видеть 2s как 1s или даже просто отсутствующих символов. SO PIZZA на строке 33 должна быть "2.82", но выходит как "32".

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

В идеале, поскольку это такой хорошо структурированный PNG, который, предположительно, всегда имеет ту же ширину, которую я бы хотел, если бы я мог определять столбцы по ширине пикселей, чтобы Tesseract обрабатывал каждый столбец независимо. Я попытался это исследовать, но файлы UZN, о которых я уже упоминал, не переводят меня до ширины пикселей, и они кажутся, что высота - это фактор, который не будет работать на них, поскольку высота всегда будет переменной.

Кроме того, мне нужно выяснить, как тренировать Tesseract, чтобы точно распознавать цифры на 100% (буквы не очень важны). Я начал изучать, как тренировать программу, но, честно говоря, это довольно быстро, так как объем обучения в документации больше связан с тем, что он распознает целые языки не только 10 цифр.

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

Ответ 1

В итоге я полностью вымыл это, и я очень доволен результатами, поэтому я решил опубликовать его на случай, если кто-либо еще когда-нибудь найдет его полезным.

Мне не нужно было делать какое-либо разделение изображений и вместо этого использовало регулярное выражение, поскольку квитанции Wal-mart настолько предсказуемы.

Я нахожусь в Windows, поэтому я создал powershell script для запуска команд преобразования и поиска и замены регулярных выражений:

# -----------------------------------------------------------------
# Script: ParseReceipt.ps1
# Author: Jim Sanders
# Date: 7/27/2015
# Keywords: tesseract OCR ImageMagick CSV
# Comments:
#   Used to convert a Wal-mart receipt image to a CSV file
# -----------------------------------------------------------------
param(
    [Parameter(Mandatory=$true)] [string]$image
) # end param

# create output and temporary files based on input name
$base = (Get-ChildItem -Filter $image -File).BaseName
$csvOutfile = $base + ".txt"
$upscaleImage = $base + "_150.png"
$ocrFile = $base + "_ocr"

# upscale by 150% to ensure OCR works consistently
convert $image -resize 150% $upscaleImage

# perform the OCR to a temporary file
tesseract $upscaleImage -psm 6 $ocrFile

# column headers for the CSV
$newline = "Description,UPC,Type,Cost,TaxType`n"
$newline | Out-File $csvOutfile

# read in the OCR file and write back out the CSV (Tesseract automatically adds .txt to the file name)
$lines = Get-Content "$ocrFile.txt"

Foreach ($line in $lines) {
    # This wraps the 12 digit UPC code and the price with commas, giving us our 5 columns for CSV
    $newline = $line -replace '\s\d{12}\s',',$&,' -replace '.\d+\.\d{2}.',',$&,' -replace ',\s',',' -replace '\s,',','
    $newline | Out-File -Append $csvOutfile
}

# clean up temporary files
del $upscaleImage
del "$ocrFile.txt"

Полученный файл необходимо открыть в Excel, а затем запустить функцию "Текст в столбцы", чтобы она не разрушала коды UPC, автоматически преобразовывая их в числа. Это хорошо известная проблема, в которую я не буду погружаться, но есть множество способов обработки, и я решил немного более вручную.

Я был бы счастлив, если бы получился простой .csv. Я мог бы дважды щелкнуть, но я не смог найти отличный способ сделать это, не сводя кодов UPC еще больше, например, обернув их в этом формате:

 "=""12345"""

Это работает, но я хотел, чтобы код UPC был всего лишь цифрами в виде текста в Excel, если я смогу позже выполнить поиск по API Wal-Mart.

В любом случае, вот как они выглядят после импорта и быстрого создания:

http://s3.postimg.org/b6cjsb4bn/Receipt_Excel.png

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

Спасибо за подталкивание в правильном направлении @RevJohn, я бы не подумал попробовать просто масштабировать изображение, но это сделало всю разницу в мире с Tesseract!

Ответ 2

Распознавание текста в квитанциях является одной из самых сложных проблем для обработки OCR.

Причины многочисленны:

  • квитанции печатаются на дешевой бумаге с дешевыми принтерами - чтобы сделать их дешевыми, не читаемыми!
  • у них очень большой объем плотного текста (особенно квитанции Wall-Mart)
  • существующие двигатели OCR почти исключительно обучены данным о не получениях (книги, документы и т.д.).
  • Структура расписки, которая является чем-то между табличной и свободной формами, трудно использовать для любого механизма компоновки.

Лучше всего выполнить следующее:

  • Анализ входных изображений. Если их трудно читать глазами, их трудно читать и в тессерате.
  • Выполните дополнительную предварительную обработку изображения. Масштабирование изображения (0.5x, 1.5x, 2x) иногда помогает. Также помогает очистка существующего шума.
  • Обучение Tesseract. Это не так сложно сделать:)
  • Постобработка результатов распознавания, чтобы обеспечить макетирование.

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

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

Компания, с которой я работаю, MicroBlink, имеет OCR для мобильных устройств. Если вы работаете в iOS, вы можете легко попробовать его с помощью CocoaPods

pod try PPBlinkOCR