npy是什么?男朋友?女朋友?都不是!这是numpy实现的特定格式数据集,在深度学习中经常使用,一般不能用文本编辑器软件直接打开。本节将通过实际案例来介绍如何使用numpy来实现自己的数据集制作。

数据集说明

每一个使用的标签标记方法都是不一样的,所以在附上源码之前,需要简单介绍一下我的数据集格式。我的数据集就是文件名里的最后一个数字。例如0_0_0_0_1.jpg打的标签就是1,这其实并不影响什么,只需要知道自己如何打的标签即可。最后可以通过一些方法实现标签label的提取即可。

图片的标签

同时用到了训练和测试的资源,txt文件里写入了文件名,在下一步会有介绍。

用到的资源

将图片及标签保存为npy文件

第一步:将图片名读取到txt中

由于一般用来训练的图片数量都比较多,保存到txt中再去读取可以防止意外出现,以更加直观方便。这里我把读取文件和保存到txt的代码放在这,需要的可以拿去简单修改一下即可,注意把相应的路径改成自己的。

import os

img_path = 'E:/Image Save/train/1-5/'
img_list = os.listdir(img_path)
print('img_list: ', img_list)

with open('E:/Image Save/train/train_label1-5.txt', 'w') as f:
    for img_name in img_list:
        f.write(img_name + '\n')

例如写入txt中的内容如下所示:

读取后的文本文件

第二步:图片的处理函数

# 导入所需模块
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import os

# 数据集路径
# 训练集的npy生成
train_data_path = "E:/Image Save/train/train1_5/"
train_label_txt = "E:/Image Save/train/train1_5.txt"
train_data_numpy_savepath = "E:/Image Save/train/train1_5_data_numpy.npy"
train_label_numpy_savepath = "E:/Image Save/train/train1_5_label_numpy.npy"
# 测试集的npy生成
test_data_path = "E:/Image Save/train/test1_5/"
test_label_txt = "E:/Image Save/train/test1_5.txt"
test_data_savepath = "E:/Image Save/train/test1_5_data_numpy.npy"
test_label_savepath = "E:/Image Save/train/test1_5_label_numpy.npy"

.npy文件可以提前新建一个空的txt,然后直接将后缀修改为.npy文件即可。

然后编写generateds函数,用来存储图片数据以及标签数据:

# data_path是指jpg文件的路径
# label_path是指标签的路径
def generateds(data_path, label_path):  
    f = open(label_path, 'r')                                            # 以只读格式打开txt文件
    contents = f.readlines()                                             # 读取文件中所有行
    f.close()                                                            # 关闭文件
    data , label = [], []                                                # 空列表
    for content in contents:                                             # 逐行取出
        print('loading: ' + content)                                     # 打印当前读取行号
        temp = content.split("_")[4]                                     # 读取的标签
        print("图片打的标签是:",temp)
        label_value = str(int(temp.split('.')[0])-1)                     # 获得标签的值
        print("分类标签是:",label_value)
        print("**********分割符*************\n\n\n")
        content1 = content.replace('\n', '')
        img_path = data_path  +   content1                               # 图片文件夹路径+图片名
        img = Image.open(img_path)                                       # 读入图片
        img = np.array(img.convert('L'))                                 # 图片转为灰度图
        img = img / 255.0                                                # 归一化
        data.append(img)                                                 # 图片逐个贴入列表
        label.append(label_value)                                        # 标签贴入列表

    data = np.array(data)                                                # 转为数组
    label = np.array(label)
    label = label.astype(np.int64)                                          # 转为64位整型
    return data, label                                                  # 返回处理后的图像,标签

上面的函数针对我的需求是可以的,具体问题可能需要再稍微修改一下。尤其再获取标签的值的时候。

由于我在打标签的时候是从1开始打的,按理说训练应该从0标签开始,于是就有了label_value = str(int(temp.split('.')[0])-1)这样的处理。

上面的函数比较简洁,不是很难理解,大概的意思就是:

假如传了训练集的图片路径(E:/Image Save/train/train1_5/)以及标签路径(E:/Image Save/train/train1_5.txt)进来

先把txt文件里的内容读取进来,contents里面包含了所有图片的文件名。contents = [1_1_1_10_1.jpg, 1_1_1_11_1.jpg,1_1_1_12_1.jpg, ...]

通过for循环实现批量处理,现在以一个为例:content = 1_1_1_10_1.jpg

进入循环后,通过split得到[1, 1, 1, 10, 1.jpg]。提取第四项(0项开始),也就是1.jpg

再split一下得到数字1,但是我的起步就是1,按理说应该从0开始,所以所有的末位数都要减1,于是就有label_value = str(int(temp.split('.')[0])-1),标签就此结束,然后是图片的处理。

先把content 末尾的回车去除,得到纯粹的文件名content1。 img_path = data_path + content1 也就是E:/Image Save/train/train1_5/1_1_1_10_1.jpg。读取并归一化。

最后将标签值和图像值分别添加到相应的列表中去。

格式转换后,返回指 return data, label

第三步:生成npy文件

# 调用函数,训练集和测试集都写入
train_data, train_label = generateds(train_data_path, train_label_txt)
test_data, test_label = generateds(test_data_path, test_label_txt)

# 将数据写入npy文件里
train_save = np.reshape(train_data, (len(train_data), -1))     # 转为1维数组
test_save = np.reshape(test_data, (len(test_data), -1))
np.save(train_data_numpy_savepath, train_save)
np.save(train_label_numpy_savepath, train_label)
np.save(test_data_savepath, test_data)
np.save(test_label_savepath, test_label)

函数里也写了一些print,用来测试一下详细的操作过程:

中间也会打印很多测试


版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/npydata.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!
▶ 站长邮箱 [email protected][email protected] ,如不方便留言可邮件联系。

最后修改:2022 年 10 月 05 日
如果觉得我的文章对你有用,请随意赞赏