从网上下载的数据集是npz格式的,无法直接用解压程序打开,需要借助python查看。
利用python查看其中的文件的程序如下:
import numpy as np
face_data=np.load('C:/Users/Lenovo/Desktop/eye_tracker_train_and_val.npz')
print(face_data.files)
运行该段程序,可以看到其中的文件层次如下所示:
分为face、eye_left、eye_right、face_mask、y等5个训练集和5个测试集。
以train_face文件为例,如果想知道其中由哪些数据组成,可以用下面的程序查看:
// 查看train_face文件中的第48000张数据
print(face_data['train_face'][48000])
在控制台就会输出如下,这是一张训练图片的矩阵数据。由于太长,只截取其中一部分展示。
由于数据不够直观,我们可以利用下面的程序,查看这些数据可以呈现出什么样的图片:
from PIL import Image;
im = Image.fromarray(data['train_face'][47999])
im.show()
屏幕上就会出现这些数据代表的图片,如下所示:
不光如此,我们还可以用下面的代码,查看该图片具体的信息:
// 获取图片的大小
w,h=im.size
print(w)
print(h)
// 获取图片的颜色空间,尺寸等
print(im)
// 获取图片在具体位置的像素值
print(im.getpixel((16,16)))
在控制台得到的结果如下,说明该图片的大小是64**64,RGB三通道格式,具体像素点处的R、G、B的值等等。
有时候,为了方便我们需要将数据转换为图片保存,以方便查看,下面就来说一说。
经过查资料,得到numpy数组转图片的方法主要有以下几种,我们分别去试一试。
from PIL import Image;
im = Image.fromarray(data['train_face'][47999])
im.save("C://Users//Lenovo//Desktop//Eyetracking for everyone程序//我的调试//face_pil.jpg")
程序如下:
import matplotlib;
matplotlib.image.imsave('face_matplotlib.jpg', data['train_face'][47999])
在指定路径下也会出现一张图片
顺带提一下,因为我的python环境中没有该模块,需要导入,导入的程序如下:
// 打开命令行窗口
C:\Users\Lenovo>activate myenv
// 需要注意的是要安装的包是scipy而不是scipy.misc
(myenv) C:\Users\Lenovo>pip install scipy
scipy库安装完毕后,就可以用以下程序,实现保存图片:
import scipy.misc
// 第一种方法
scipy.misc.imsave('face_scipy.jpg', data['train_face'][47999])
// 第二种方法
scipy.misc.toimage(data['train_face'][47999]).save("face_scipy2.jpg")
你会发现出现如下错误,经过调整,发现将scipy库的版本调整为1.2.1即可。
// 报的错误
module 'scipy.misc' has no attribute 'imsave'
// 重新安装scipy
(myenv) C:\Users\Lenovo>pip uninstall scipy
(myenv) C:\Users\Lenovo>pip install scipy==1.2.1
经过上述调整,并再次运行程序,指定路径下就会出现一张你想要的图片啦!
这里只介绍上述几种方法,需要做进一步了解的,参见以下链接
* Saving a Numpy array as an image
由于在之前的博客中,发现数组保存为图像后,再读取,与原始数据有误差,这里对之前保存的图片进行比较,以验证自己的假设。
将图片读取为数组的程序如下:
// 打开图像文件
raw_image=Image.open("face_pil.jpg")
// 转换为numpy数组
image_array=np.array(raw_image)
// 将数组打印输出
print(image_array)
对不同方法生成的图片,输出图像数据如下所示:
通过比较发现,所有方法将数组转化成图片后,再从图片转化为数组后,输出的结果都与原始数据不一致,并且不同方法的结果都一致,这说明是从图像转化为数组的方式出了问题,需要进一步研究。
通过实践,发现是由数组到图片的后缀名出了问题,原始数据集对应的图像格式是png格式的,而我的程序中保存的图像格式是jpg格式的。对之前的程序作修改,得到下面的结果。