May 23, 2013

Proyecto Final.

Reconocimiento de caracteres

Link al proyecto en github: Link

Presentación.



 

Reporte

  • Propósito

El propósito del proyecto es el reconocimiento de caracteres en imágenes en base a técnicas de visión computacional. Los caracteres o texto son grabados por una cámara o cargados desde una carpeta si es que ya han sido previamente escaneados.

  • Justificación

La justificación del proyecto son las aplicaciones que tiene, una de ellas la digitalización de documentos.

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

Básicamente lo que el programa hace es:
  • 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.
A continuación se presenta un diagrama para explicar de forma más sencilla el funcionamiento del programa:

ó

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.

Captura desde cámara web
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.
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

OpenCV: El módulo de OpenCV para python lo utilicé para usar cámara web, cargar imágenes y para aplicar los filtros de escala de grises y binarización a las imágenes.

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.

Pytesser: PyTesser es un módulo de reconocimiento óptico de caracteres de Python. Toma como entrada un archivo de imagen o la imagen y da salida a una cadena. De este módulo utilicé la función image_to_string a la cual se le proporciona una imagen y retorna la cadena de texto que pudo reconocer.

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 

Ahora mismo mi intención solo es mejorar la parte del proyecto que toma las imágenes escaneadas ya que me parece más sencillo y más útil, además el convertir a .epub me sirve mucho para leer en el teléfono móvil. Algunas de las mejoras o ideas que se pueden aplicar a este proyecto es:
  • 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.

No comments:

Post a Comment