深度学习小白入门教程(二):使用numpy存储你的图片数据集,为传入网络做准备

摘要:

使用numpy将你的图片数据集存储为np.array,并写入npy文件作为能够直接传入网络的数据集
本教程来自515Turtledove Lab斑鸠实验室
在这里插入图片描述
在卷积神经网络中,很大一部分应用就是图像的分类识别,对于上次我们爬取的数据集,
深度学习小白入门教程(一):以英雄联盟为例,爬取你感兴趣图片,构建你自己的数据集
我想到了一个应用分类的好方法,根据各英雄背景故事的来自于不同的地区,我们可以将英雄们按照其所在地区分类:
数据集下载地址:LOL英雄-地区数据集下载

在这里插入图片描述
这样的话,我们就建立好了一个图片–分类对应的数据集,接下来的任务应该就是网络结构编写了,为什么还要多一个流程,使用npy文件呢,有个老哥在他的博客里给我们了答案:
在模型训练前为什么要把数据打包为.npy文件,和普通文件格式有什么区别?来自Ethan的博客,这里引用其一张图片:
在这里插入图片描述
处理速度更快,数据更加统一,对于大数据以后这么干就完事了,接下来
我们建立一个txt文件,格式如下:
在这里插入图片描述
因为我们的分类结果不可能用中文表示,所以使用数字对应来代表对应的地区。

图片数据处理&标签制作

我在代码所在文件夹建立了一个data_heros文件夹作为图片的根目录,将上次我们做好的数据文件夹传入:
在这里插入图片描述
按照txt文件修改对应文件夹名称:
在这里插入图片描述
接下来我们要处理我们的英雄图片,将图片的名称变成下面图的样子,并将其地区作为标签保存到hero_list.txt文件夹中:
在这里插入图片描述
英雄的名称也无关紧要了,我们训练的时候只需要知道他来自哪里就好啦,文件名下划线前的数字代表他的地区,整理好的数据名称如下格式:

#图片格式
地区_标号.jpg

实现代码如下:

import os
import shutil
data_base = "./data_heros/"#这个就是我们刚才建立的用来存放图片的文件夹


#get_path函数用来获取某个路径下所有路径
def get_path(pic_dir):
    pic_path=[]
    for path in os.listdir(pic_dir):
        real_path = os.path.join(pic_dir,path)
        pic_path.append(real_path)
    return pic_path

def rename():
    a = get_path(data_base)#得到database文件夹的所有文件夹地址
     #这是对于文件夹排序,因为默认排序顺序为1,10,11,12,13,14而不是1,2,3,4
    a.sort(key=lambda x: int(x.split("data_heros")[1][1:]))
    print(a)
    for i in range(14):#14个文件夹
        count = 0
        for content in get_path(a[i]):#找到每个文件夹中的图片地址
        	#把图片从各个文件夹里挪出来到图片存放的根目录,并重新命名
            shutil.move(content, data_base + str(i)+'_'+str(count)+'.jpg')
            #将图片名称与其对应地区写入hero_list.txt文件,用以后来做数据集标签部分
            with open('hero_list.txt','a+') as f:
                f.write(str(i)+'_'+str(count)+'.jpg'+' '+str(i)+"\n")
            count += 1

rename()

这个文件或者说第二个函数写的不好,违反领域原则哈哈
程序运行结果如下:
在这里插入图片描述
在这里插入图片描述

将数据存入.npy文件

最后一步,有了图片,有了标签我们就可以制作npy数据集啦:
实现代码如下,主要参照曹健老师课程代码修改,受益匪浅,读取图片方面,我更喜欢用opencv,小小修改

import numpy as np
import cv2


x_path = "E:\pys\loldiqu\data_heros/" #咱们刚才存的图片地址
y_path = 'E:\pys\loldiqu\hero_list.txt' #刚才存的标签地址
x_savepath = "E:\pys\loldiqu/x_save.npy" #npy图片集存储地址
y_savepath = 'E:\pys\loldiqu/y_save.npy' #npy标签存储地址


def generateds(path, txt):
    f = open(txt, 'r') # 打开标签txt
    contents = f.readlines()  # 按行读取,存入contents列表
    f.close()
    x, y_ = [], []
    for content in contents:
        value = content.split()  # 以空格分开,存入value数组
        img_path = path + value[0]
        img = cv2.imread(img_path,cv2.IMREAD_GRAYSCALE)#使用opencv读入图片,读入格式为灰度
        img = cv2.resize(img,(192, 108))#重新修改图片大小,默认高清大图算起来太费劲
        img = img / 255.#归一化,就是将图片的0-255都变到0-1
        x.append(img)#图片信息存入x数组
        y_.append(value[1])#标签信息存入y_数组
        print('loading : ' + content)

    x = np.array(x)#变成np.数组格式
    y_ = np.array(y_))#变成np.数组格式
    y_ = y_.astype(np.int64)
    return x, y_


print('-------------Generate Datasets-----------------')
x_save, y_save = generateds(x_path, y_path)

print('-------------Save Datasets-----------------')
x_save = np.reshape(x_save, (len(x_save), -1))#一行一张图,-1表示默认的尺寸格式即192*108
np.save(x_savepath, x_save)
np.save(y_savepath, y_save)

程序运行结果如下:
在这里插入图片描述
好啦,万事具备了,接下来就是传入网络,训练你的英雄联盟英雄–地区分类网络啦!下期再见!

  • 13
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值