.mat格式数据转换(OCFW数据集)
前言
(废话):
由于学校要求,前段时间不得不去找了份实习,测试岗,工作内容是对公司的一些AI组件进行测试,看看与其他公司的对比与差距。入职的第一个任务就是对比一下我们公司和百度智能云的人脸检测产品,自己在网上找数据集,找了好几个,但是都不太行,最后找到了OCFW数据集比较符合我的要求。然而,这个数据集竟然是.mat格式,在网上找了半天不知道该怎么用python进行数据转换,搞出来以后就打算写篇博客稍微记录一下。
OCFW数据集我也会上传上来,不需要积分。当然官网链接也放在这(这是官网链接),可以自己去下载,就是我之前下载的时候速度时快时慢的,可以多尝试几次。接下来讲下代码,代码其实很短,就二十几行就搞定了。
这些是引入的库,path是.mat文件所在,将文件打开保存在test里。
import h5py
import numpy as np
import matplotlib as plt
from PIL import Image
path="D:\COFW\COFW_color\COFW_test_color.mat"
test = h5py.File(path,"r")
打印出test中的内容,发现里面算是有四组数据,可以用print(test["IsT"])
分别再打印每组数据保存的内容,像IsT
就是HDF5 dataset "IsT": shape (1, 507)
,这里实际上要去了解一下数据集里面的具体内容,知道这些是什么东西,像IsT
里面存放的就是图片的ref。OCFW采用的是HDF数据格式,简单来说就是它把图片数据放在一个库里,然后把图片的索引放在.mat文件里,如果我们需要这些图片,就根据索引去库里找(我是这么理解的,有可能有问题)。
print(test.keys()) # <KeysViewHDF5 ['#refs#', 'IsT', 'bboxesT', 'phisT']>
将图片的ref提取出来,方便后面的查找。这里range(507)
是因为我用的是OCFW数据集中的测试集,一共507张图片。
images = np.transpose(test['IsT']) # 所有测试集图像的ref
for num in range(507):
img_name = images[num][0] # 获取第 num 个图像的ref
img = test[img_name] # 读取第 num 个图像的数据
print(img) # <HDF5 dataset "b": shape (239, 179), type "|u1">
print(type(img)) # <class 'h5py._hl.dataset.Dataset'>
img = np.transpose(test[img_name]) # 转换为np数组,并对维度进行转置
print(type(img)) # <class 'numpy.ndarray'>
print(img.shape) # (179, 239)
image = Image.fromarray(np.uint8(img))
image.save('output'+str(num)+'.jpg')