Consejos de escaneo de recibos de Tesseract necesarios

He luchado una y otra vez con Tesseract para varios proyectos de OCR y hoy encontré un caso de uso que pensé que sería una volcada para él, pero después de muchas horas todavía estoy insatisfecho. Quería plantear el problema aquí y ver si alguien más tiene consejos sobre cómo resolver esta tarea.

Mi esposa vino a mí esta mañana y me preguntó si de todos modos podía escanear fácilmente sus recibos de Wal-Mart y, con el tiempo, crear un historial de precios gastados en categorías y artículos específicos para que pudiéramos hacer tendencias y profundizar fácilmente en a dónde va el gasto. Al principio sentí que esto era una tarea muy difícil, pero después de investigar un poco, encontré algunas cosas que me hacen sentir que está a nuestro alcance:

Los recibos de Wal-Mart son, en general, muy bien estructurados y fáciles de leer. Incluso incluyen el UPC para cada artículo (¿potencial para búsquedas en una base de datos UPC?) Y parecen clasificar los alimentos con una F o I (no estoy seguro de cuál es la diferencia) y también tienen una columna de código de impuestos que puede resultar útil si Aprendo los secretos de lo que significan los códigos.

Descubrí además que hay algún tipo de API de búsqueda de elementos de Wal-Mart a la que puedo tener acceso, lo que podría resultar útil en la búsqueda de UPC.

Tienen una aplicación para teléfonos inteligentes que le permite escanear un código QR impreso en cada recibo. Esa aplicación busca un código "TC" en el recibo y extrae todo el recibo detallado de sus servidores. Le muestra una excelente representación gráfica del recibo, incluyendo imágenes en miniatura de todos los artículos y el costo, etc. Si esta aplicación simplemente clasificara y resumiera el recibo, ¡ya estaría listo! Pero, por desgracia, ese no es el propósito de la aplicación ...

La pieza final del rompecabezas es que puede exportar una imagen PNG generada por computadora del recibo en caso de que desee guardarlo y desechar la versión en papel. Esto es para mí la oportunidad de dinero, ya que estos PNG son creados por computadora y, por lo tanto, no están sujetos a los problemas relacionados con tomar una foto o escanear un recibo en papel

Aquí hay un ejemplo de uno de estos (ligeramente editado para blanquear algunas áreas pero exactamente como se obtuvo de la aplicación):

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

Puede ver que la parte importante del texto está perfectamente alineada en 5 columnas y de eso se trata en última instancia esta pregunta. Cómo hacer que Tesseract haga un OCR exacto en el texto. Tengo muchas ideas sobre dónde llevarlo desde aquí, ¡pero todo comienza con el OCR!

Lo más cerca que he llegado es este ejemplo aquí:

http://pastebin.com/nuZJBVg8

Usé psm6 y un conjunto de limitación de caracteres para forzarlo a hacer mayúsculas + números + solo algunos símbolos:

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

A primera vista, el OCR parece casi coincidir. Pero a medida que profundices, verás que falla de manera bastante horrible en general. Los 3 y 8 casi siempre están equivocados. Lo mismo con 6s y 5s. Luego hay veces que simplemente salta por completo los caracteres o simplemente comienza a desmoronarse (como la línea 31+ en el ejemplo). Comienza a ver 2s como 1s, o incluso solo falta caracteres. SO PIZZA en la línea 33 debe ser "2.82" pero sale como "32".

Intenté hacer un preprocesamiento de la imagen para engrosar los caracteres y asegurarme de que sea en blanco y negro puro, pero ninguno de mis esfuerzos se acercó más que la imagen en bruto de Wal-Mart + los comandos anteriores.

Idealmente, dado que este es un PNG tan bien estructurado que presumiblemente siempre tiene el mismo ancho, me encantaría poder definir las columnas por ancho de píxeles para que Tesseract tratara cada columna de forma independiente. Traté de investigar esto, pero los archivos UZN que he visto mencionados no se traducen a mí en cuanto a los anchos de píxeles y parece que la altura es un factor que no funcionaría en estos, ya que la altura siempre será variable.

Además, necesito descubrir cómo entrenar a Tesseract para que reconozca los números con un 100% de precisión (las letras no son realmente importantes). Comencé a investigar cómo entrenar el programa, pero para ser honesto, se me pasó por la cabeza muy rápidamente, ya que el alcance de la capacitación en la documentación es más para que reconozca idiomas enteros, no solo 10 dígitos.

La solución definitiva para el juego final sería una cadena de comandos que tomó el PNG original de la aplicación y me devolvió un CSV con las 5 columnas de datos de la parte importante del recibo. ¡No espero eso fuera de esta pregunta, pero cualquier ayuda que me guíe hacia ella sería muy apreciada! En este punto, simplemente no tengo ganas de ser azotado por Tesseract una vez más, ¡así que estoy decidido a encontrar una manera de dominarla!

Respuestas a la pregunta(2)

Su respuesta a la pregunta