我正在开始一个机器学习项目,在实际构建模型之前,我想先尝试导入我的图像(我保存了一组图像文件,它们是.png格式,如果这有影响的话),然后对它们进行一些操作和调整,以便它们能适应模型。我只是加载这些文件,然后尝试显示它们,但什么也没显示出来。文件路径似乎是正确的,因为第一次尝试时路径错误,返回了一个很大的错误消息,但现在似乎没有问题。我该怎么做才能在加载文件后,运行类似于
data[0]
的代码来查看第一张图像(或图像的详细信息)呢?我的代码如下(我在这个代码上方按照tensorflow指南导入了很多其他东西,所以我认为这不是问题所在,但如果有必要,我可以编辑并添加我的其他导入语句):
import pathlibimport sklearn.datasetsdata_dir = sklearn.datasets.load_files('/Users/USer/Downloads/C4IMAGES/', shuffle='False')data_dir
运行这段代码的输出是:
{'data': [], 'filenames': array([], dtype=float64), 'target_names': [], 'target': array([], dtype=float64), 'DESCR': None}
如果我尝试使用data_dir[0]来查看第一张图像,会得到以下错误消息:
---------------------------------------------------------------------------KeyError Traceback (most recent call last)<ipython-input-48-5541d6af8248> in <module> 2 import sklearn.datasets 3 data_dir = sklearn.datasets.load_files('/Users/USer/Downloads/C4IMAGES/', shuffle='False')----> 4 data_dir[0]KeyError: 0
感谢任何帮助!
回答:
实际上,sklearn.datasets.load_files
的文档说明,图像或任何数据文件必须按照以下层次结构放置:
container_folder/
category_1_folder/
file_1.txt file_2.txt … file_42.txt
category_2_folder/
file_43.txt file_44.txt …
我认为你的图像位于路径/Users/USer/Downloads/C4IMAGES/
。在这种情况下,你需要创建一个子文件夹,如category 1
、category 2
(如果你的数据没有分类,只需创建一个任意名称的子文件夹,并将所有图像放入该子文件夹中),并将相应类别的图像放入这些子文件夹中。
现在,你可以在load_files
函数中传递参数/Users/USer/Downloads/C4IMAGES/
,它应该会将你的数据以二进制格式加载到Python列表data_dir['data']
中。
然后,你可以将图像从二进制格式转换为numpy数组并显示你的图像:
import ioimport numpy as np from PIL import Image# decode i'th image using: img = Image.open(io.BytesIO(data_dir.data[i]))img = np.asarray(img)# display i'th imageimport matplotlib.pyplot as pltplt.imshow(img)plt.show()
参考资料:
1. https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_files.html
2. 将作为二进制字符串加载的图像转换为numpy数组