ICT > Proyectos > CUDI > UDLA-USON > versión de evaluación de ocrLibris

Versión de evaluación de ocrLibris

El problema principal del reconocedor de caracteres antiguo se centra en la cantidad de ruido en la imagen. Este ruido nos limita el uso de técnicas comúnmente utilizadas en un reconocedor de caracteres común. La limitante de técnicas a utilizar son debido a los siguientes dos problemas:
   
    1.- La manera en que se trata el ruido de las imágenes comúnmente nos degrada el poco texto legible de las imágenes de los libros de texto antiguo. El texto en la imagen se encuentra muy degrado, por las condiciones del libro y las condiciones del escanneo de la imagen. Por tanto tratar de utilizar un removedor de polvo para eliminar ruido termina por eliminar las letras gastadas. Tratar de utilizar un suavizado de bordes desgasta y fusiona letras del texto haciéndolas más difíciles de reconocer. Si intentáramos binarizar la imagen sin antes tratar de remover el ruido, las manchas del texto participarían en los cálculos para encontrar el umbral de nuestro binarizador. Con este umbral mal calculado resaltarían las manchas y provocarían una segmentación muy pobre de la hoja decrementando el reconocimiento del texto.

    2.- Las técnicas comunes de realzado de texto generan más ruido que texto legible sobre la imagen. Al tratar de engrosar letras incompletas o muy borrosas sin eliminar el ruido haría que las manchas del texto se agrandaran. Al agrandar las manchas la segmentación de la hoja sería muy pobre, afectando así el reconocimiento total del texto.

Diferencias del proyecto de las entregas anteriores a la fecha actual:

    1.- Procesado de imagen y Binarización;

La binarización de las hojas ya no se basa únicamente en el valor gris de la imagen. Primero se usó como heurística común, binarizar la imagen al valor medio del total de cantidad de grises. La imagen era filtrada de colores, mediante el promedio de los valores RGB de cada píxel y sustituyéndolo por ese valor como su equivalente en gris. Ese valor gris del píxel representa la intensidad de luz del píxel.  En el tipo de color RGB existen 256 grises. La binarización de hace un año se llevaba a cabo mediante tomar el valor gris cada píxel de la imagen y al encontrarse por debajo del valor gris 128 se le asignaba el valor 1 y si se encontraba por encima de ese valor se le asignaba 0. Esto para formar la matriz binaria necesaria para procesar en los siguientes módulos del sistema reconocedor de caracteres.

Posteriormente se utilizó un histograma de frecuencias, el cuál representa la cantidad de píxeles grises de cada tono. La frecuencia se promedio con los vecinos de cada valor de gris, para generar una curva suave. Después se normaliza la frecuencia a un valor de 100 para utilizarlo como porcentaje. Se busca el valor que tiene el cien por ciento de píxeles y retrocedemos hacia la izquierda buscando el valor de gradiente cero. Este valor nos divide el tono gris más común que es el que representa el general del color del fondo, de los tonos que representan las letras impresas.

Actualmente para la limpieza y binarización de la imagen primero se aplica un filtro de negativo, dando como resultado el complemento de la imagen. Después se aplica el gradiente de La Place de la segunda derivada para encontrar los contornos. Esto nos deja las letras del texto huecas, pero también las manchas. Este método de limpieza a diferencia de otros reconocedores de contorno funciona en las cuatro direcciones de la hoja, dando un mejor resultado a los demás filtros para contornos. También se probaron filtros de contorno Prewitt y Sobel, los cuáles necesitaban cuatro pasadas por cada lado de la hoja para tener un resultado en las cuatro direcciones. Como las manchas se encuentran fuera de patrón a diferencia de las letras, el uso de un filtro de tipo blur termina de eliminar las manchas, mientas que las letras se vuelven a rellenar. Por último regresamos el negativo de la imagen para tener nuevamente los colores de nuestra hoja con fondo claro y aplicamos nuevamente un filtro blur, de esta manera se terminan de borrar manchas persistentes y las letras quedan remarcadas. Se hace el primer filtro de negativo por que de lo contrario las letras quedarían adelgazadas y terminarían por desaparecer al aplicar los demás filtros.

Pasos a seguir

  1. Contar con el ambiente de ejecución de Java (Java Runtime)  [Java]
  2. Descargar [JOCR]
  3. Extracción de patrones
  4. Aprendizaje de patrones.
  5. Reconocimiento en texto plano y descriptivo en xml

1. Instalación de Java


Se requiere de Java JRE 1.5 o superior para la ejecución de JOCR. En caso de no contar con el JRE  para proceder a la instalación en la computadora hay que descargar la versión de acuerdo a la plataforma (Windows, Linux o Unix) Java. Para verificar la correcta instalación de Java  en cualquier consola del sistema (ejecutar cmd en Windows) teclear "java" esto debe de presentar un mensaje del ambiente de ejecución de Java.  Para que Java se encuentre disponible en cualquier directorio se requieren definir las siguientes variables de ambiente:

en Unix
  1. definir variable de ambiente de Java y agregar al path el comando de java, ya sea en consola o en el archivo .cshrs 
en Windows
  1. definir variable de ambiente de Java y agregar al path el comando de java

2 Descargar [JOCR]                                                                                                        


JOCR es un paquete de clases en java que ofrecen varias alternativas para el proceso de reconocimiento de texto. En este momento es un paquete "todo incluido". Para conocer las opciones que incluye utilizamos el siguiente comando
prompt>java –jar jocr.jar –h 

java -jar Jocr.jar [secuencia] [etiqueta] [libro] [imagen] [opcion-xml] [opcion-xml] :
-p :nivel de palabra
-r :nivel de renglon
sin opcion :nivel pagina

java -jar Jocr.jar -g ambiente grafico
java -jar Jocr.jar -a analisis de imagen
java -jar Jocr.jar -e aprendizaje de patrones
java -jar Jocr.jar -l lectorShell del diccionario de palabras
java -jar Jocr.jar [imagen] -r opcion de extraccion de patrones

3. Extracción de patrones

JOCR requiere de imágenes digitalizadas de los libros para extraer patrones representativos de la tipografía del libro. Este es un proceso interactivo, requiere de la intervención del usuario para indicar que tipo de texto corresponde el caracter extraido. Por ejemplo:
prompt>java –jar jocr.jar 1.jpg –r 
Este proceso presenta en consola los patrones encontrados en la página digitalizada, el usuario entonces debe de ir tecleando la letra o letras a las que corresponde el patron. Esto generará en el folder Rec con el nombre de la imagen otro folder i.jpgPatrones con archivos que serán utilizados por la red neuronal para aprender los patrones.  Esta es una salida de ejmplo para una "a" en pantalla

000000000000000
000000000000000
000000011110000
000111111111000
000111111111110
001111001111110
001110001101110
001110000111110
000000000001110
000011111001110
000011111100110
000111111101110
001110000111110
001100000000111
011100000110111
011101111110111
011111111111111
001111110011110
001111000001100
000000000000000

Nombre del archivo...
Lector-shell:>a
 Teniendo las clases con los patrones que deseamos, por lo menos 19, mandamos la red neuronal a aprender

4. Aprendizaje de patrones

Es importante señalar que debe de haber la misma cantidad de patrones en cada carpeta de los patrones. Con la instrucción de
prompt>java –jar jocr.jar  –e
entramos en el modulo de aprendizaje de patrones. Nos preguntará por la cantidad de copias que usaremos de nuestro repositorio de clases generado anteriormente. El coeficiente de aprendizaje, el cuál se escoge de acuerdo con nuestro criterio entre 0 y 1, la red neuronal enciende las neuronas al azar y ajustará sus pesos de acuerdo a cada iteración. Si le damos un valor muy grande, puede saltarse entre valores importantes y no aprender. En cambio si le damos un valor pequeño tardará más pero no se saltará en las funciones. Comúnmente se le asigna un valor de 0.5. Es posible que tengamos que poner a entrenar varias veces la red, es decir, detener e iniciar el proceso. Al iniciar el entrenamiento genera dos archivos  importantes y una copia. Uno de los archivos será weigths.dat donde estará guardando los pesos que va calculando a cada iteración y Trained.in donde guardará el valor de las neuronas que está aprendiendo.

Son necesarios estos archivos para poderlos utilizar y srán estos los que se usen en el reconocimiento. Si deseamos comenzar de nuevo el entrenamiento tendremos que borrar estos dos archivos. Después nos preguntará por el valor del error máximo que deseamos. Este valor es en el cuál se detendrá la red al haber aprendido las clases y tenga ese valor máximo como error de entrenar con los valores dados. Patrones y clases que sean parecidos y los asignemos como diferentes causará problemas en la red y podría no aprender. Dado el caso como un punto y un guión que al normalizar la matriz de 12x14 sea exactamente igual y le digamos que uno será punto y el otro guión.

4. Reconocimiento en texto plano y descriptivo en xml

Después podemos usar la red entrenada para hacer los reconocimientos. Por ahora el segmentador necesita mejoras en las técnicas de frecuencias y no extrae correctamente los patrones. Esto puede causar un reconocimiento muy bajo aún. Pero se puede usar el JOCR.jar como librería y ustilizar sus módulos para mejorarlo e ir creando una aplicación de mayor robustez. Tiene implementado una salida del reconocimiento en texto plano y descriptivo en xml que nos da diferentes niveles de descripción. Nivel pagina, que sería sin opción después de la imagen
prompt>java –jar Jocr.jar [secuencia de la hoja] [etiqueta del libro ] [nombre del libro] 1.jpg 
Para tener una descripción de nivel renglón en XML;
prompt>java –jar Jocr.jar 1 1 adlo 1.jpg -r
Donde nos describe la cantidad de palabras encontradas a cada renglón y la cantidad de renglones.

Para tener una descripción a nivel palabra en XML;
prompt>java –jar Jocr.jar 1 1 adlo 1.jpg -p
Donde nos describe hasta la cantidad de letras que tiene cada palabra en cada renglón.

El resultado de este progama son 2 archivos en el folder Rec, 1.txt y 1.xml los cuales conteinen la salida en texto y xml respectivamente.

Ejemplo de la salida en XML a  nivel renglón y palabra
<?xml version="1.0" encoding="UTF-8" ?> 
<libro id="tres">
<pagina id="uno" pag="dos" num_reng="22">
<renglon id="1" num_palabras="4">q: qsmSis,- suse,rdese -- </renglon>
<renglon id="2" num_palabras="3">seis ECbese xCO </renglon>
<renglon id="3" num_palabras="4">fi ECS OxSOEn nOIOMES- </renglon>
<renglon id="4" num_palabras="10">, C Onyr ism Iis :xeOnqgng y Asdebr xxbex-nn:S </renglon>
<renglon id="5" num_palabras="11"> , : S- gsm O,qrenSa q-Crem1nfOr: rer xfa- qümnxaxqre smho- </renglon>
<renglon id="6" num_palabras="12">,, OUfiyrmfi: C M ,O qgO se Brmb de ágis m, qq- </renglon>
<renglon id="7" num_palabras="10">,, nnOSanm IisnJmC de fOg nü81MmS - rO,g: se- ,n </renglon>
<renglon id="8" num_palabras="9">,, Sannq8-ábnb risnre nnebfir AsC nonr deciáO á xxer </renglon>
<renglon id="9" num_palabras="7">,, reILmciürxaCfODm- de IDq -isnpernis n,I- Saynm </renglon>
<renglon id="10" num_palabras="10">, , 8isC mDü8Asxe, xex,ydeDn nse -ánfin Asb m:n, y </renglon>
<renglon id="11" num_palabras="10">,, Sary nhdeAsmci xay: Lisnse SaBUqnn- reI rxendecise r hSa </renglon>
<renglon id="12" num_palabras="9"> ,, CreECdeOnh ciOre m:nisAsO: cifi yxe verbeqci- de </renglon>
<renglon id="13" num_palabras="10">,, nf á B-Iby, xq Orn:D y Crbeder: den seá- </renglon>
<renglon id="14" num_palabras="12"> ,, rense Nrre Sg n: de nE fámmCon de nnmsm: de </renglon>
<renglon id="15" num_palabras="11">,, nE Mr mdeOáüM de Esmis: cire misn figBUSaS y sere </renglon>
<renglon id="16" num_palabras="10">,: brpefi SO Ixa Sarendedem8 Mrpeg -smisis: nC be Son- </renglon>
<renglon id="17" num_palabras="7">,, rnáM COonrefiChOr: de nre gSqsunreEse nde- </renglon>
<renglon id="18" num_palabras="9">,, q0Dve: de ,g -fnCáreOy seJCnren: de gsm isdeis- </renglon>
<renglon id="19" num_palabras="9">,, qnCnOD I rexerC,n fiq bn ismlnü, - Sa </renglon>
<renglon id="20" num_palabras="9">,, serbeOS ,M xef SonMür 8r Idedent DfiBre 8 </renglon>
<renglon id="21" num_palabras="4"> I bá: :dex:r: </renglon>
<renglon id="22" num_palabras="3"> Cvern </renglon>
</pagina>
</libro>

Requerimientos


JAVA

 J2SE v 1.5.0 JRE ó SDK (para desarrollo)
 http://java.sun.com


Descargas


JAR de evaluación

jocr.jar (72 kb)


Responsable del sitio: anrazo @ mail.udlap.mx
Fecha de última actualización: 
23 de enero 2006