python - tesseractnotfounderror - Mejora del rendimiento de OCR en exploraciones de varios párrafos
tesseract ocr (2)
Estoy trabajando en un proyecto que consiste en extraer textos científicos almacenados en formato PDF. Para la mayoría de los papeles, esto se logra fácilmente usando PDFMiner, pero algunos papeles más antiguos almacenan su texto como imágenes grandes. En esencia, se escanea un papel y ese archivo de imagen (normalmente PNG o JPEG) abarca toda la página.
Intenté usar el motor Tesseract a través de sus enlaces python-tesseract , pero los resultados son bastante decepcionantes.
Antes de profundizar en las preguntas que tengo con esta biblioteca, me gustaría mencionar que estoy abierto a sugerencias para las bibliotecas de OCR. Parece que hay pocas soluciones nativas de python.
Here hay una imagen (JPEG) en la que estoy tratando de extraer texto. I el código exacto proporcionado en los fragmentos de ejemplo en la página de códigos de python-tesseract de google al que he vinculado anteriormente. Debo mencionar que la documentación es un poco escasa, por lo que es muy posible que una de las muchas opciones en mi código esté mal configurada. Cualquier consejo (o enlaces a tutoriales en profundidad) sería muy apreciado.
Here está la salida de mi intento de OCR.
Mis preguntas son las siguientes:
- ¿Hay algo subóptimo en el código que estoy usando? ¿Hay una mejor manera de hacer esto? ¿Una biblioteca diferente quizás?
- ¿Qué tipo de preprocesamiento puedo realizar para mejorar la detección? Las imágenes son todas en blanco y negro, pero ¿quizás debería establecer un umbral y establecer todo lo que esté por encima de él en un color negro de valor único y todo lo que esté debajo de él en un color blanco de valor nulo? ¿Algo más?
- Una pregunta más específica: ¿se puede mejorar el rendimiento al realizar OCR en palabras individuales? Si es así, ¿puede alguien sugerir una forma de delimitar palabras sueltas en un archivo de imagen (por ejemplo, la que está vinculada arriba) y extraerlas en imágenes separadas que puedan tratarse de manera independiente?
- ¿Puede la presencia de gráficos y otras imágenes incrustadas en la imagen de la página PDF interferir con OCR? ¿Debo eliminar estos? Si es así, ¿alguien puede sugerir un método para eliminarlos automáticamente?
EDITAR: Por simplicidad, aquí está el código que usé.
import tesseract
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetPageSegMode(tesseract.PSM_AUTO)
mImgFile = "eurotext.jpg"
mBuffer=open(mImgFile,"rb").read()
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)
print "result(ProcessPagesBuffer)=",result
Y aquí está el código alterativo (cuyos resultados no se muestran en esta pregunta, aunque el rendimiento parece ser bastante similar).
import cv2.cv as cv
import tesseract
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetPageSegMode(tesseract.PSM_AUTO)
image=cv.LoadImage("eurotext.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
tesseract.SetCvImage(image,api)
text=api.GetUTF8Text()
conf=api.MeanTextConf()
¿Alguien podría explicar las diferencias entre estos dos fragmentos?
El primer ejemplo lee el archivo como un búfer y luego lo transmite a tesseract-ocr sin hacer ninguna modificación, mientras que el segundo lee el archivo en un formato abierto, lo que le permitirá hacer un retoque de imagen, como cambiar la relación de aspecto, la escala de grises y etc utilizando la biblioteca cv. El segundo método es muy útil si desea realizar la manipulación de la imagen antes de pasar la imagen a tesseract.
Por cierto, soy el dueño de python-tesseract. Si desea hacer una pregunta, siempre puede enviar su pregunta a http://code.google.com/p/python-tesseract
Joe
Tesseract es muy bueno en el texto de entrada limpio (como su ejemplo) si hace pequeños retoques. algunas sugerencias:
- Antes de automatizar, comience con tesseract en la línea de comando
- Restrinja su conjunto de caracteres si es posible (por ejemplo, eche un vistazo en / usr / local / share / tessdata / configs en ./digits - configúrelo para caracteres en inglés en mayúsculas / minúsculas, etc.) y proporcione un argumento de línea de comando
- Utilice solo imágenes PNG o TIFF (TIFF para versiones anteriores) ya que JPG introduce artefactos
- Muestra la imagen de manera que tu texto sea más grande que la fuente pequeña actual. Líneas de Tesseract> caracteres de 10 píxeles de alto (si la memoria sirve), ciertamente se comporta peor con caracteres pequeños
- No hay necesidad de hacer un umbral si ya tienes dos niveles, pero no te dolerá si lo haces y puedes ver exactamente la misma imagen que Tesseract verá
Revisaré aquí para ver si puedo ayudar más, pero sí me uno a la lista de correo de tesseract, son muy útiles.
Nota: Tengo algunos parches para pytesseract que debo publicar para obtener caracteres, confidencias y palabras a través de la API (que no fue posible hace un par de meses). Grita si pueden ser útiles.