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
模块应该可以毫无问题地处理这个问题。
我刚刚在我的 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
模块应该可以毫无问题地处理这个问题。