2015-12-19 55 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模塊應該可以毫無問題地處理。