我一直在阅读和处理与街景房号(SVHN)数据集相关的SO问题。这些文件位于两个不同的位置:
斯坦福: The Street View House Numbers (SVHN) Dataset
kaggle: Street View House Numbers (SVHN) | Kaggle
我的问题与每个图像集(火车,测试和演员)的digitStruct.mat
文件的格式有关。它们定义每个图像的名称,标签和边界框尺寸。据我所知,mat文件是以HDF5格式编写的Matlab结构(可以用h5py
读取)。
我已经能够使用digitStruct.mat
从kaggle访问和阅读h5py
文件。我无法使用h5py
(或使用HDFView)从斯坦福网站打开相同的文件。我读过的一些SO帖子表明斯坦福文件是一种较旧的Matlab格式,应该用scipy.io.loadmat
阅读。
digitStruct.mat
打开斯坦福h5py
文件吗?我正在添加其他信息来记录使用不同.mat文件观察到的不同行为。它可能有助于诊断。
我可以通过以下调用打开并操作来自kaggle的.mat文件:
h5f = h5py.File('digitStruct.mat','r')
对于来自斯坦福的文件,我会根据用于打开的文件和函数获得不同的错误。
下面的命令执行时没有错误消息。这让我相信它不是一个可以用h5py打开的Matlab v7.3文件。
mat = scipy.io.loadmat('./Stanford/test_32x32.mat')
这两个调用都不起作用(提供简短的错误消息):
mat = scipy.io.loadmat('./test/digitStruct.mat')
Traceback...
NotImplementedError: Please use HDF reader for matlab v7.3 files
h5f = h5py.File('./test/digitStruct.mat','r')
Traceback...
OSError: Unable to open file (file signature not found)
另外,我无法用HDFView打开test/digitStruct.mat
。我对Stanford digitStruct.mat文件的结论:它们可能是Matlab v7.3文件,但在我下载时已损坏。但是,我不确定我做错了什么(因为我可以毫无问题地下载和阅读kaggle文件)。
通过一些Linux侦探工作,我找出了问题所在。我怀疑,从斯坦福网站上的digitStruct.mat
文件中提取的*.tar.gz
文件是HDF5(Matlab v7.3)文件,并且在我下载时被破坏了。
为了确认,我在Linux系统上使用浏览器下载了3个tar.gz文件,然后使用tar
命令解压缩它们,并在Linux上使用h5py
成功打开。然后我将它们转移到我的Windows系统,每个都按照预期与h5py
一起工作。
这有点令人惊讶,因为我过去曾使用WinZip来提取tarball文件。显然,这些因素导致了腐败。 希望这能为将来的人们带来同样的麻烦。
注意:3个xxxx_32x32.mat
文件是较旧的Matlab格式,必须使用scipy.io.loadmat()
访问