Нужен совет по сканированию чеков Tesseract

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

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

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

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

  3. У них есть приложение для смартфонов, которое позволяет сканировать QR-код, напечатанный на каждой квитанции. Это приложение ищет код «TC» в квитанции и получает всю детализированную квитанцию ​​​​со своих серверов. Оно показывает вам отличное графическое представление квитанции, включая эскизы всех предметов, их стоимость и т. д. Если бы это приложение просто классифицировало и резюмировало квитанцию, я был бы готов! Но, увы, это не цель приложения ....

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

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

https://postimg.cc/image/s56o0wbzf/

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

Ближе всего я пришел к этому примеру здесь:

http://pastebin.com/nuZJBVg8

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

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

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

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

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

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

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


person Jim Sanders    schedule 26.07.2015    source источник
comment
Джим, исходя из моего опыта работы с Tesseract, вы можете сделать еще несколько трюков: 1) изменить разрешение изображения, изменив его размер примерно до 150% или 75% от исходного размера изображения (поэкспериментируйте с разными факторами), я думаю, Tesseract обучается на определенных значениях DPI. (300, 600, 900) для отсканированных документов, иногда вам нужно приблизиться к ним для лучших результатов OCR. 2) Сегментируйте изображение на столбцы только с текстом или цифрами и используйте соответствующие белые списки. 3) Проверьте коммерческие решения, такие как FineReader, для сравнения (можно ли это сделать?).   -  person RevJohn    schedule 26.07.2015
comment
Вау, это на самом деле очень помогло с точностью! Я еще не проверил каждое число, но кажется, что я набрал 100%, так что спасибо! Я сделал увеличение на 150%, как вы предложили.   -  person Jim Sanders    schedule 26.07.2015
comment
Кроме того, я попытался вручную сегментировать изображение на столбцы и распознавать их независимо (также увеличено на 150%), а затем я смог использовать команду Linux, вставить, чтобы создать свой CSV-файл. Однако, поскольку все они распознавались отдельно, у меня возникали серьезные проблемы с выравниванием столбцов. У кого-нибудь есть какие-либо советы о том, как обеспечить соответствие между результатами OCR? Моя следующая мысль - это регулярное выражение для разбиения столбцов с использованием того факта, что UPC всегда состоит из 12 чисел, зарезервированных пробелами, а цена всегда представляет собой 1 или более чисел + точка + 2 числа, зарезервированные пробелами.   -  person Jim Sanders    schedule 26.07.2015


Ответы (2)


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

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

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

# -----------------------------------------------------------------
# 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.

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

https://s3.postimg.cc/b6cjsb4bn/Receipt_Excel.png

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

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

person Jim Sanders    schedule 27.07.2015
comment
Да, разрешение имеет значение, в прошлом я проводил несколько экспериментов с точностью распознавания текста по сравнению с разрешением изображения: вы получаете не увеличивающийся график (чем больше разрешение, тем лучше), а график с локальными максимумами, соответствующими (я думаю) разрешениям DPI, используемым в повышение квалификации. Масштабирование изображения вверх или вниз помогает; то же самое относится и к другим механизмам OCR. - person RevJohn; 30.07.2015

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

Причин множество:

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

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

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

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

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

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

pod try PPBlinkOCR
person Cerovec    schedule 30.07.2015