2015-12-19 2 views
2

Я только что установил Ocropus OCR со всеми зависимостями в моей машине Windows 7. (Я использую 32-битный python 2.7). Кажется, он работает отлично, за исключением того, что я не могу загрузить модель OCR по умолчанию: en-default.pyrnn.gz. , и получение Traceback. Я использую следующий синтаксис:Python cPickle не может загрузить библиотеку моделей OCR

python ocropus-rpred -m en-default.pyrnn.gz book\0001\*.png 

здесь ошибка

INFO: #inputs47 
# loading object /usr/local/share/ocropus/en-default.pyrnn.gz 
Traceback (most recent call last): 
    File "ocropus-rpred" line 109, in <module> 
     network = ocrolib.load_object(args.model,verbose=1) 
    File "C:\anaconda32\lib\site-packages\ocrolib\common.py", line 513, in load_object 
     return unpickler.load() 
    EOFError 

Я проверил файл не пуст; также дважды проверял флаг двоичного режима, включенный, т. е. «wb» и «rb»; также преобразовали новые строки common.py с помощью dos2unix. Я не могу решить эту проблему. Если кто-то испытал подобные проблемы, любезно поделитесь.

import cPickle 
import gzip 

def save_object(fname,obj,zip=0): 
    if zip==0 and fname.endswith(".gz"): 
     zip = 1 
    if zip>0: 
     # with gzip.GzipFile(fname,"wb") as stream: 
     with os.popen("gzip -9 > '%s'"%fname,"wb") as stream: 
      cPickle.dump(obj,stream,2) 
    else: 
     with open(fname,"wb") as stream: 
      cPickle.dump(obj,stream,2) 

def unpickle_find_global(mname,cname): 
    if mname=="lstm.lstm": 
     return getattr(lstm,cname) 
    if not mname in sys.modules.keys(): 
     exec "import "+mname 
    return getattr(sys.modules[mname],cname) 

def load_object(fname,zip=0,nofind=0,verbose=0): 
    """Loads an object from disk. By default, this handles zipped files 
    and searches in the usual places for OCRopus. It also handles some 
    class names that have changed.""" 
    if not nofind: 
     fname = ocropus_find_file(fname) 
    if verbose: 
     print "# loading object",fname 
    if zip==0 and fname.endswith(".gz"): 
     zip = 1 
    if zip>0: 
     # with gzip.GzipFile(fname,"rb") as stream: 
     with os.popen("gunzip < '%s'"%fname,"rb") as stream: 
      unpickler = cPickle.Unpickler(stream) 
      unpickler.find_global = unpickle_find_global 
      return unpickler.load() 
    else: 
     with open(fname,"rb") as stream: 
      unpickler = cPickle.Unpickler(stream) 
      unpickler.find_global = unpickle_find_global 
      return unpickler.load() 

UPDATE: Привет, пожалуйста, обратите внимание, что я использовал родной GZIP Python, и это работает отлично. Спасибо, что указали это. Вот правильный синтаксис, который работает в Windows: {с gzip.GzipFile (fname, "rb") в качестве потока:}

ответ

1

Неправильное использование gunzip (в функции load_object). Если не передан аргумент -c, gunzip записывает распакованные данные в новый файл, , а не в его stdout (это то, что вы пытаетесь сделать).

В результате, он ничего не пишет в своем выводе, а ваша переменная stream не содержит данных, следовательно EOFError.

Быстрое решение заключается в изменении командной строки gunzip, чтобы дать ей аргумент -c.

Больше информации здесь: http://linux.die.net/man/1/gzip

Тем не менее, почему вы даже выкладывая на gunzip распаковывать свои данные? Модуль Python gzip должен справиться с этим без проблем.