2013-04-21 2 views
1

Я работаю над проектом, который включает в себя OCRing огромное количество PDF-файлов. Каждый PDF - это изображение обычного документа офисного типа. Каждая страница PDF хранится в отдельном файле. Есть ли способ сделать это быстрее (т. Е. С более низким временем вычисления), чем мой текущий подход?Эффективный OCR finetuning

С проектом такого размера любое небольшое улучшение производительности даст значительное сокращение вычислительной стоимости/времени. В настоящее время призыв к Tesseract занимает примерно 2-3 порядка больше времени, чем все другие этапы обработки в проекте.

Для каждого файла (page.pdf) я сначала конвертирую его в Tiff (image.tiff), например. Я отделил Python от этого вызова для ясности.

ghostscript -o image.tiff -q -r300x300 -sCompression=none -sDEVICE=tiffgray page.pdf 

Затем я выполняю в основном следующую процедуру.

def ocr(image): 
    import tesseract, cv2.cv as cv 

    # Load Tesseract 
    api = tesseract.TessBaseAPI() 
    api.Init(".","eng",tesseract.OEM_DEFAULT) 
    api.SetPageSegMode(tesseract.PSM_AUTO) 

    # Load and OCR the image file 
    cv_image = cv.LoadImage(image, cv.CV_LOAD_IMAGE_GRAYSCALE) 
    tesseract.SetCvImage(cv_image, api) 

    # Return the text 
    return api.GetUTF8Text() 

Я немного упростил для ясности. Например, я фактически не загружаю Tesseract отдельно для каждого файла. Я обрабатываю исключения и т. Д. Однако различия не имеют большого значения, так как 99,9% времени используется в вызове api.GetUTF8Text().

Есть идеи, чтобы ускорить его?

ответ

0

Ваш лучший выбор - это, вероятно, параллелизировать его, если на многоядерном процессоре.

Посмотрите на что-то вроде http://wiki.python.org/moin/ParallelProcessing для получения дополнительной информации.

+0

Спасибо за ваш ответ. Однако я уже распараллеливаю процесс в целом. Я запускаю процесс в облаке, поэтому каждый PDF-файл получает отдельную машину. Я запускаю около 100 ядер сразу. – beerslayer