MPII 数据 annotations.mat 文件来自 matlab,它是 matlab 中的结构类型,所以如果你想使用 scipy.io.loadmat 处理它,你应该添加这样的参数:
matph = './mpii_human_pose_v1_u12_1.mat'
mat = sio.loadmat(matph, struct_as_record=False) # add here
让我们打印垫子:
{'RELEASE': array([[<scipy.io.matlab.mio5_params.mat_struct object at 0x7f7b0ba51790>]],
dtype=object), '__version__': '1.0', '__header__': 'MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Tue Sep 23 22:09:02 2014', '__globals__': []}
它是一个字典,所以我们得到它的值:
release = mat['RELEASE']
让我们打印发布的一些属性:
print(release, type(release), release.shape)
(array([[<scipy.io.matlab.mio5_params.mat_struct object at 0x7fd407de1790>]],
dtype=object), <type 'numpy.ndarray'>, (1, 1))
release是一个数组,其元素是scipy.io.matlab.mio5_params.mat_struct对象,这里我们可以使用对象的两种方法:__dict__和_fieldnames这样:
object1 = release[0,0]
print(object1._fieldnames)
['annolist', 'img_train', 'version', 'single_person', 'act', 'video_list']
annolist = object1.__dict__['annolist']
print(annolist, type(annolist), annolist.shape)
(array([[<scipy.io.matlab.mio5_params.mat_struct object at 0x7fd407de1810>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fd407de1850>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fd407de1910>,
...,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fd3db7f1710>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fd3db7f1c50>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fd3db794490>]],
dtype=object), <type 'numpy.ndarray'>, (1, 24987))
我们得到一个包含 24987 个元素的数组,其中也是 scipy.io.matlab.mio5_params.mat_struct 对象。
那么我们可以继续研究:
anno1 = annolist[0,0]
print(anno1._fieldnames)
['image', 'annorect', 'frame_sec', 'vididx']
annorect = anno1.__dict__['annorect']
print(annorect, type(annorect), annorect.shape)
(array([[<scipy.io.matlab.mio5_params.mat_struct object at 0x7fd407de19d0>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fd407de1710>]],
dtype=object), <type 'numpy.ndarray'>, (1, 2))
anno2 = annorect[0,0]
print(anno2._fieldnames)
['scale', 'objpos']
objpos = anno2.__dict__['objpos']
print(objpos, type(objpos), objpos.shape)
(array([[<scipy.io.matlab.mio5_params.mat_struct object at 0x7fd398204b90>]],
dtype=object), <type 'numpy.ndarray'>, (1, 1))
objpos1 = objpos[0,0]
print(objpos1._fieldnames)
['x', 'y']
y = objpos1.__dict__['y']
print(y, type(y), y.shape)
(array([[210]], dtype=uint8), <type 'numpy.ndarray'>, (1, 1))