2015-12-19 53 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”;还使用dos2unix转换了common.py的换行符。我无法解决这个问题。如果有人已经预见到类似的问题,请分享。

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() 

更新:嗨,请注意,我已经使用Python的本地gzip,它工作正常。谢谢你指出。这是在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模块应该可以毫无问题地处理。