ultimos posts

Script SCAN+OCR para test (TESSERACT-OCRAD-GOCR)

OCR personalizado en Debian

Objetivo: Escanear y reconocer 500 paginas de texto impresas

Un amigo necesita pasar su libro escrito parte en maquina de escribir y parte impreso en PC (sin acceso a los archivos digitales)
Me propuse hacerlo en debian de la manera mas simple posible. Mi tarea es definir como seria el proceso y derivar el trabajo a un usuario no muy capacitado.

Tengo una multifuncion HP PSC 1510 conctada por USB. La impresora no me habia dado problemas pero nunca habia usado el escanner en debian lnny.
Luego de verficar con "lsusb" (desde la consola entrega una lista de dispositivos USB conectados) que estuviera detectado. Me di cuenta de que al abrir los programas de escaneo como usuario no tenia acceso al escaner. Luego de buscar en internet me di cuenta de que lo predeterminado es que los usuarios no-root no pertenecen al grupo "escanner" asi que es necesario configurar en "usuarios y grupos" el acceso de los usuarios que vayan a usar el escanner.

Con el scanner fucionando busque programas para escanear (se consiguen muy facil por synaptic o desde la consola con apt):
.- xsane 0.996 .- Completo y concreto a lo que se necesita para escanear. Para reconocer caracteres usa GOCR, pemite usar otros pero esta mas preparado para GOCR.
.- kooka0.44 .- Interesante, util como xsane. Para reconocer caracteres usa GOCR u OCRAD.
.- gscantopdf 0.9.25 .- Esta hecho para automatizar la creacion de PDF con imagenes de escaneos (imagino que para revistas es muy practico). Incluye OCR, a diferencia de los dos anteriores pemite "tesseract" como motor de OCR y detecta para este ultimo los idiomas instalados. Como contra no tiene la posibilidad de grabar a texto lo que se reconoce (solo copiar y pegar).

En resume me gusto mas xsane por la simplicidad y cantidad de opciones pero el reconocimiento de texto era mejor gscantopdf al tener tesseract
Hay comparativas en internet, en todas tesseract es mas efectivo.
La contra de tesseract es que solo trabaja con formato TIFF y solo cuando el archivo tiene la extencion TIF (!?).

Si bien claramente el proceso de escaneo y de reconocimiento de texto deben optimizarse y manejarse por separado mi intencion no era complicar demasiado a la persona que haria el trabajo finalmente por lo que me propuse hacer un script que:

1- Escaneara la imagen con la calidad y parametros necesarios
2- Corregir la imagen (por formato necesario y si fuera posible optimizarla para OCR).
3- Realizar el reconocimiento de texto

La correcion de la imagen surge luego de descubrir "imagemagick" que nos da el comando "convert" que permite aplicar cambios de formato, de cantidad de colores e innumerables filtros graficos desde la linea de comandos. Ideal para mi script

Queria que todo sea muy simple de modo que el usuario pusiera cada hoja y al cabo de unos segundos tuviera en pantalla un editor de textos para revisar la hoja.
Despues de hacer muchas pruebas. Variar dpi del escaneo, usar 1 bit de colores, escala de grises, cambiar contraste, probar diferentes motores de OCR, etc, etc, me di cuenta que era necesario tomar una hoja base (una que sea representativa de lo que vamos a escanear) y ver que combinacion era la mejor.

Como dento de las 500 hojas elegidas no habia una sola representativa (habia por lo menos 3 grupos de entre 100 y 200 paginas con blancos de fondo diferente y fuentes diferentes) iba a necesitar optimizar cada grupo.
Es por esto que el primer script escanearia una hoja de diferentes formas, con diferentes filtros graficos y diferentes motores de ocr. A cada resultado lo grabaria e un archivo de texto de la forma

GOCR-300dpi-blancoynegro.txt
GOCR-450dpi-blancoynegro.txt
OCRAD-300dpi-blancoynegro.txt
...
TESSERACT-600dpi-grises.txt
etc, etc

Puede haber mas combinaciones a gusto. La idea es tener 12 o 15 archivos de texto sacados de la primera muestra representativa y elegir el mejor.

Hacer este script no fue simple ya que nunca habia hecho uno con mas de 5 lineas de texto. De todas formas bash no es muy complicado y ademas es muy potente.

El script final para probar los escaneos es:

*********************************************
*********************************************
*********************************************

#!/bin/bash
#MODULO PARA PROBAR QUE ES MEJOR PARA TU DOCUEMNTO
#usa tesseract - gocr - ocrad

#elegir el escaner, el comando scanimage trae una lista con el parametro -L
#leer los disponibles y ofrecer al usuario que elija (si hay solo uno no preguntar)
#scanimage debe esta en el path

clear
echo
echo "Script desarrollado por gnusiervos / http://gnusiervos.blogspot.com"
echo
echo "Buscando dispositivos de entradas de imagen"

#me interesan ahora estos dos parametros para scanimage
#-L, --list-devices show available scanner devices
#-f, --formatted-device-list=FORMAT similar to -L, but the FORMAT of the output
# can be specified: %d (device name), %v (vendor),
# %m (model), %t (type), and %i (index number)

listaScanners=$(scanimage -f "%d ")

#esto imprime un rnglon por cada dispositivo de entrada de imagenes (si hay camaras web o entradas de video estaran tambien)
#en mi caso:
#device `v4l:/dev/video0' is a Noname LifeView FlyTV Platinum FM / Go virtual device
#device `hpaio:/usb/PSC_1500_series?serial=BR6442N04D0498' is a Hewlett-Packard PSC_1500_series all-in-one

#o sea= "device 'id dispositivo' datos extras"
#debo identificar el dispostivo a usar para usar luego en el comando scanimage. Para eso busco las cadenas entre las comilla simples luego de device e cada renglon

#preservar el separador oficial IFS
exIFS=$IFS
export IFS=$" "

#la linea que sigue tomara a $listaScanners como un array separado por IFS. Tomara un valor por vez y lo asiganar a EsacanerElegido
select EscanerElegido in $listaScanners
do
if [ $EscanerElegido ];
then
echo
echo " Escaner elegido: $EscanerElegido"
break
else
echo " Opcion no valida. Saliendo del sistema"
exit 0
fi
done

#definir las combinaciones posibles
declare -a listaResoluciones=300 450
declare -a modesScanner=Lineart gray
declare -a formatScan=pnm tiff


for scanFormats in $formatScan
do
for res in $listaResoluciones
do

for modS in $modesScanner
do
echo " ---- scan $scanFormats + res $res + mode $modS"
scanimage -d $EscanerElegido --progress -v -y 279.4 -x 215.9 --format=$scanFormats --mode $modS --resolution $res > scan-$scanFormats-$modS-$res.$scanFormats

echo " ImaeClick - adaptando ..."
#necesito varios tipos de imagenes para los distintos motores (tif pnm y pgm)
# me aseguro que esten todos
if [ "$scanFormats" = "pnm" ];
then
convert scan-$scanFormats-$modS-$res.$scanFormats -monitor scan-$scanFormats-$modS-$res.tif # para tess
else
convert scan-$scanFormats-$modS-$res.$scanFormats -monitor scan-$scanFormats-$modS-$res.pnm # multiple formato pbm y pgm
fi

convert scan-$scanFormats-$modS-$res.$scanFormats -monitor scan-$scanFormats-$modS-$res.pgm #escala de grises
convert scan-$scanFormats-$modS-$res.$scanFormats -monitor scan-$scanFormats-$modS-$res.pbm #1 bit

#convert de imageclick tiene decenas de filtros graficos. Seguramente habra algunos que mejoraran la imagen para escaneo
#seria bueno poner algunos aqui

#---------TESSERACT----------------------------------------------------
#pasarle todos los motores ocr encontrados
echo " OCR 1 = TESSERACT"
tesseract scan-$scanFormats-$modS-$res.tif scan-$scanFormats-$modS-$res-OCR-TESS.tif -l spa

#---------OCRAD--------------------------------------------------------

#segun el escaneo necesitaremos cosas diferentes
if [ "$modS" = "Lineart" ];
then
#uso los archivos pbm que son byn de 1 bit
echo " OCR 2 = OCRAD iso-8859-9"
ocrad scan-$scanFormats-$modS-$res.pbm -c iso-8859-9 -f -v -o scan-$scanFormats-$modS-$res-OCR-OCRAD-iso88599.txt

echo " OCR 2 = OCRAD - ascii"
ocrad scan-$scanFormats-$modS-$res.pbm -c ascii -f -v -o scan-$scanFormats-$modS-$res-OCR-OCRAD-ascii.txt

echo " OCR 3 = GOCR - ascii"
gocr -f ASCII scan-$scanFormats-$modS-$res.pbm > scan-$scanFormats-$modS-$res-OCR-GOCR-ascii.txt

echo " OCR 3 = GOCR - ISO8859_1"
gocr -f ISO8859_1 scan-$scanFormats-$modS-$res.pbm > scan-$scanFormats-$modS-$res-OCR-GOCR-ISO8859_1.txt

echo " OCR 3 = GOCR - UTF8"
gocr -f UTF8 scan-$scanFormats-$modS-$res.pbm > scan-$scanFormats-$modS-$res-OCR-GOCR-UTF8.txt


else
#uso los de escala de rises pgn

echo " OCR 2 = OCRAD - iso-8859-9"
ocrad scan-$modS-$res.pgm -c iso-8859-9 -f -v -o scan-$modS-$res-OCR-OCRAD-iso88599.txt

echo " OCR 2 = OCRAD - ascii"
ocrad scan-$modS-$res.pgm -c ascii -f -v -o scan-$modS-$res-OCR-OCRAD-ascii.txt

echo " OCR 3 = GOCR"
gocr scan-$modS-$res.pbm > scan-$modS-$res-OCR-GOCR.txt

echo " OCR 3 = GOCR - ascii"
gocr -f ASCII scan-$modS-$res.pgm > scan-$modS-$res-OCR-GOCR-ascii.txt

echo " OCR 3 = GOCR - ISO8859_1"
gocr -f ISO8859_1 scan-$modS-$res.pgm > scan-$modS-$res-OCR-GOCR-ISO8859_1.txt

echo " OCR 3 = GOCR - UTF8"
gocr -f UTF8 scan-$modS-$res.pgm > scan-$modS-$res-OCR-GOCR-UTF8.txt

fi
done
echo "FIN MODES"
done
echo "FIN RESOLUTIONS"
done
echo "FIN FORMATS"


#devolver el separador oficial IFS
export IFS=exIFS

echo "################ FIN ################"
exit 0

*********************************************
*********************************************
*********************************************

Luego de ejecutarlo esaran los archivos de texto disponible para elegir la mejor opcion

Mi resumen (probando textos sin imagenes a 1 sola columna) es:

Mejor OCR:
1º Tesseract
2º OCRAD
3º GOCR

Velocidad
1º OCRAD
2º Tesseract
3º GOCR

No asustarse por algunos resultados. GOCR puede entregar verdaderos geroglificos.
Siempre se puede configurar mejor y encontrar soluciones.

rr

Algunas referencias usadas
*********************************************
comparativa muy ineteresante
http://www.mscs.dal.ca/~selinger/ocr-test/

ejemplo de script
http://jduck.net/2008/01/05/ocr-scanning/

muy buena descripcion de convert
http://www.imagemagick.org/www/command-line-options.html

refresque mi pobre conocimiento de bash en:
parte I http://www.linux-es.org/node/70
parte II http://www.linux-es.org/node/107
parte III http://www.linux-es.org/node/147
parte IV http://www.linux-es.org/node/238

OCRAD en español
http://www.gnu.org/software/ocrad/ocrad_es.html

0 comentarios:

Publicar un comentario

comentarios para gnusiervos