Python cPickle 无法加载 OCR 模型库

Python cPickle unable to load an OCR model library

我刚刚在我的 windows 7 机器上安装了带有所有依赖项的 ocropus OCR。 (我使用的是 32 位 python 2.7)除了我无法加载默认的 OCR 模型:en-default.pyrnn.gz 之外,它似乎工作正常。 ,并接收回溯。我正在使用以下语法:

python ocropus-rpred -m en-default.pyrnn.gz book[=11=]01\*.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 的正确语法:{with gzip.GzipFile(fname,"rb") as stream:}

您对 gunzip(在 load_object 函数中)的使用不正确。除非传递了 -c 参数,否则 gunzip 将解压缩的数据写入一个新文件, 而不是 到它的标准输出(这似乎是你试图做的) .

因此,它不会向其标准输出写入任何内容,并且您的 stream 变量不包含任何数据,因此 EOFError.

一个快速的解决方法是更改​​您的 gunzip 命令行,为它提供 -c 参数。

更多信息在这里:http://linux.die.net/man/1/gzip

也就是说,您为什么还要花钱 gunzip 来解压缩您的数据? Python 的内置 gzip 模块应该可以毫无问题地处理这个问题。