Я снова и снова боролся с Tesseract для различных проектов OCR, и сегодня я нашел вариант использования, который, как я думал, будет для него хлопком, но после многих часов я все еще ухожу неудовлетворенным. Я хотел поставить проблему здесь и посмотреть, есть ли у кого-нибудь еще советы о том, как решить эту задачу.
Моя жена подошла ко мне этим утром и спросила, есть ли какой-либо способ, которым она могла бы легко отсканировать свои квитанции из Wal-Mart и со временем построить историю цен, потраченных на категории и на определенные товары, чтобы мы могли сделать некоторые тренды и легко погрузиться в них. куда идут траты. Сначала мне казалось, что это очень сложная задача, но, немного покопавшись, я обнаружил несколько вещей, которые заставляют меня чувствовать, что это вполне достижимо:
Чеки Wal-Mart в целом очень хорошо структурированы и легко читаются. Они даже включают UPC для каждого элемента (возможность поиска по базе данных UPC?) и, кажется, классифицируют продукты питания с помощью F или I (не уверен, в чем разница), а также имеют столбец налогового кода, который может оказаться полезным, если Я узнаю секреты того, что означают коды.
Кроме того, я обнаружил, что существует некий API-интерфейс поиска товаров Wal-Mart, к которому я могу получить доступ и который окажется полезным при поиске UPC.
У них есть приложение для смартфонов, которое позволяет сканировать QR-код, напечатанный на каждой квитанции. Это приложение ищет код «TC» в квитанции и получает всю детализированную квитанцию со своих серверов. Оно показывает вам отличное графическое представление квитанции, включая эскизы всех предметов, их стоимость и т. д. Если бы это приложение просто классифицировало и резюмировало квитанцию, я был бы готов! Но, увы, это не цель приложения ....
Последняя часть головоломки заключается в том, что вы можете экспортировать сгенерированное компьютером изображение квитанции в формате PNG на случай, если вы захотите сохранить его и выбросить бумажную версию. Для меня это денежный выстрел, поскольку эти PNG созданы на компьютере и, следовательно, не подвержены проблемам, связанным с фотографированием или сканированием бумажной квитанции.
Пример одного из них (слегка отредактированный, чтобы сделать некоторые области белыми, но в остальном точно такой же, как полученный из приложения) здесь:
https://postimg.cc/image/s56o0wbzf/
Вы можете видеть, что важная часть текста идеально выровнена по 5 столбцам, и в конечном итоге это то, о чем этот вопрос. Как заставить Tesseract точно распознавать это в тексте. У меня есть много идей, где это взять отсюда, но все начинается с OCR!
Ближе всего я пришел к этому примеру здесь:
Я использовал 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 столбцами данных из важной части квитанции. Я не ожидаю этого от этого вопроса, но любая помощь, которая поможет мне в этом, будет очень признательна! На данный момент я просто не хочу, чтобы Тессеракт снова хлестал меня, и поэтому я полон решимости найти способ овладеть ею!