Reconocimiento de caracteres
Link al proyecto en github: LinkPresentación.
Reporte
Propósito
Justificación
La digitalización documentos ayuda a preservar documentos importantes (libros, revistas, notas), ahorra el tiempo de tener que transcribir el documento entero.
Esta idea de proyecto la tuve en base al proyecto Gutenberg (Project Gutenberg) el cual digitaliza libros, en su mayoría clásicos, en distintos formatos (txt, html, epub, pdf, etc) y los distribuye de forma gratuita.
Google también tiene en Google books un proyecto de digitalización de libros, solo que aquí si cobran por las descargas.
Descripción textual
- Obtener los datos de entrada.
- Un pequeño preprocesamiento.
- Reconocimiento de caracteres con ayuda de Tesseract.
- Obtener la salida en forma de un archivo de extensión txt.
- Convertir ese archivo .txt en un archivo epub.
ó
La entrada del sistema se puede hacer de dos formas distintas: mediante la cámara web ó cargando imágenes escaneadas previamente desde la carpeta "imagenes" que se encuentra en la misma carpeta que el script. Si se utiliza la opción de la cámara, se abre una ventana que muestra la toma hecha por la cámara web; donde el usuario debe poner a la vista de la cámara el documento que se va a digitalizar, una vez puesto el documento frente a la cámara se debe presionar la tecla "enter" para tomar captura a la imagen, cuando se tengan tomas de las imágenes necesarias se presiona la tecla "esc" para continuar con el proceso.
En el caso de la cámara web todos los frames o imágenes tomadas se cargan y se recortan de manera de que solamente quede la región de interés, que en este caso es el texto.
Después a las imágenes recortadas o escaneadas se les aplican unos filtros (escala de grises y binarización) esto con el fin de que el motor de reconocimiento tenga imágenes más sencillas de reconocer. Cabe aclarar que obtuve mejores resultados cuando solamente cambiaba a escala de grises que cuando aplicaba ambos filtros.
Una vez procesada la imagen actual se llama a Tessaract OCR para que realice el reconocimiento de caracteres con la función image_to_string. Al final el texto que se alcanzó a reconocer (cabe aclarar que un motor de reconocimiento de caracteres no es perfecto) se guarda en un archivo .txt y por último se llama a un módulo que cree, el cual utiliza el módulo ez_epub y epub, los cuales al recibir un archivo de texto lo convierten en un archivo .epub que se puede visualizar desde un dispositivo móvil.
Captura desde cámara web |
Región de interés |
Después a las imágenes recortadas o escaneadas se les aplican unos filtros (escala de grises y binarización) esto con el fin de que el motor de reconocimiento tenga imágenes más sencillas de reconocer. Cabe aclarar que obtuve mejores resultados cuando solamente cambiaba a escala de grises que cuando aplicaba ambos filtros.
Imagen procesada |
Una vez procesada la imagen actual se llama a Tessaract OCR para que realice el reconocimiento de caracteres con la función image_to_string. Al final el texto que se alcanzó a reconocer (cabe aclarar que un motor de reconocimiento de caracteres no es perfecto) se guarda en un archivo .txt y por último se llama a un módulo que cree, el cual utiliza el módulo ez_epub y epub, los cuales al recibir un archivo de texto lo convierten en un archivo .epub que se puede visualizar desde un dispositivo móvil.
Hice distintas pruebas y como es ovbio cuando se capturan imágenes de la cámara entre más grande este la letra se realiza una mejor detección lo cual no es bueno si se considera que los libros tienen un tamaño de letra de 10 o 12.
Librerías utilizadas
os: proporciona una manera de emplear funciones del sistema operativo. Este módulo lo utilicé para crear y remover carpetas y el archivo .txt.
glob: este módulo permite buscar todos los nombres de las rutas que coincidan con un patrón especificado de acuerdo con las reglas utilizadas por el shell de Unix. Lo utilicé para cargar todas las imágenes que se almacenaban en las distintas carpetas.
Image: es un módulo para procesamiento de imágenes para el intérprete de Python. Este módulo lo utilicé solamente para cargar las imágenes que se pasan al motor Tesseract.
ez_epub y epub: son una pequeña biblioteca de python para generar libros en formato EPUB.
Llegué a utilizar el motor Tesseract debido a que mis primeras aproximaciones fueron detectando caracter por caracter en una imagen. En un entrenamiento se detectaban todos los caracteres:
Detección caracter por caracter |
Al momento de detectar cada caracter aumentaba su tamaño, se detectaban los contornos de cada detección (fuese una sola letra o más) y tanto las coordenadas de los contornos como la letra a la que pertenecen los contornos se se almacenaban en dos archivos de texto distintos pero en orden de manera que coincidieran. Después utilizando el algoritmo K-nearest neighbors implementado en OpenCv se le proporcionaba los contornos y las letras y se guardaba un modelo. Pero esta implementación no daba como resultado ni un 10% del texto debido a que en muchas ocasiones no se detectaban letras solas sino en un conjunto y además cuando se pasaba a obtener el texto el algoritmo K-nearest obtiene el más parecido a los contornos que se le pasen como parámetro por lo que no es muy preciso sino se ha entrenado bien el modelo.
Imagen de entrenamiento |
También hice una implementación utilizando un método de correlación pero de igual manera no obtuve resultados satisfactorios.
Entrada: SERIF, salida obtenida:flflo |
Después de esto también noté que influye mucho el tipo de letra, el espaciado y el tamaño de letra por lo que crear un motor propio iba a requerir mucho tiempo de entrenamiento.
Una implementación extra que intenté realizar fue corregir el ángulo de las imágenes cuándo éstas estuvieran inclinadas pero no pude realizarlo correctamente, el script que realicé se encuentra también en el git del proyecto con el nombre de "ocrprep". Estas son algunas de las pruebas:
Imagen original |
Imagen procesada |
Prueba utilizando cámara:
Prueba utilizando imágenes escaneadas
Imagen original |
Imagen procesada |
Archivo .epub:
Evaluación de desempeño
Como mencione anteriormente al utilizar el reconocimiento con la cámara entre más pequeña la letra el reconocimiento era peor, por lo que mi evaluación de desempeño se basó en eso.Realicé una gráfica que compara los errores y aciertos durante la detección de caracteres. Utilicé 6 pruebas con el mismo tipo de letra ("Arial") pero distinto tamaño (10, 12, 14, 18, 24, 30).
Estos fueron los resultados:
Tamaño de letra | Aciertos | Errores | Total |
10 | 5 | 15 | 20 |
12 | 7 | 13 | 20 |
14 | 7 | 8 | 15 |
18 | 7 | 8 | 15 |
24 | 14 | 6 | 20 |
30 | 17 | 3 | 20 |
Como se puede apreciar en la gráfica entre más grande es la letra la detección fue mejor, pero esto también depende de que tan bien esté enfocada la cámara y cómo termina procesada la imagen con los filtros.
Trabajo a futuro
- Mejorar los filtros para obtener al 100% la detección de caracteres mediante Tesseract OCR.
- Agregar de manera automática los capítulos de cada libro.
- Mejorar el módulo para corregir el ángulo de las imágenes escaneadas.
Fuentes.
- K.M. Sajjad. Automatic License Plate Recognition system. 13 Jul 2010. http://sajjad.in/content/alpr_final.pdf
- Genshi, Python toolkit for generation of output for the web. [Web en línea]. http://genshi.edgewall.org/
- Basic OCR in OpenCV. [Web en línea]. http://blog.damiles.com/2008/11/basic-ocr-in-opencv/
- Executing cv::warpPerspective for a fake deskewing on a set of cv::Point. [Web en línea]. http://stackoverflow.com/questions/7838487/executing-cvwarpperspective-for-a-fake-deskewing-on-a-set-of-cvpoint
- OpenCV Documentation. [Web en línea]. http://docs.opencv.org/
No comments:
Post a Comment