数据建模-数据集加载

undefined数据建模-数据集加载


以下内容均按照作者的个人思路去编排,如果有更好的想法等,则以自己的优先


undefined利用Open CV2读取、加载数据集

个人猜测,比赛中“数据集的加载与代码了解”是合二为一的,所以首先得弄懂如何加载


undefined零、准备

  • 提前下载好图片数据,并最好跟自己的代码文件放在同一目录下

①这里使用的数据集是来自Kaggle的Intel图像分类
②“Intel图像分类”数据集已分为Train、Test和Val,我们将仅使用训练数据集学习如何使用不同的库加载数据集【注:Train:训练集 Test:测试集 Val:验证集】

  • 了解深度学习模型加载自定义数据集的典型步骤

① 打开图像文件。文件的格式可以是JPEG、PNG、BMP等。
② 调整图像大小以匹配深度学习模型的输入层的输入大小。
③ 将图像像素转换为浮点数据类型。
④ 将图像标准化,使像素值在0到1之间。
⑤ 深度学习模型的图像数据应该是一个numpy数组或一个张量对象【张量:(人工智能领域:多维数组】。

  • 分析图片数据中包含哪些内容

易知图片数据中的每个类都是一个文件夹,其中包含该特定类的图像,如"buildings-建筑物图片"


undefined一、加载【包含"深度学习模型加载自定义数据集的典型步骤"】

  • 导入所需的库
  1. 【适用于Tensorflow 1.X】:
  2. import pandas as pd
  3. import numpy as np
  4. import os
  5. import cv2
  6. from matplotlib import pyplot as plt
  7. import matplotlib.image as mpimg
  8. %matplotlib inline
  9. ----------------------------------------------------------------------------------------------------------------------
  10. 【适用于Tensorflow 2.X】:
  11. import pandas as pd
  12. import numpy as np
  13. import os
  14. import cv2
  15. from matplotlib import pyplot as plt
  16. import matplotlib.image as mpimg
  17. %matplotlib inline
  • 从其中一个文件夹中随机输出五张图像
  1. import random
  2. plt.figure(figsize=(20,20)) #【创建自定义图像的宽与高】
  3. img_folder=r'CV\Intel_Images\seg_train\seg_train\forest' #【自定义目录】
  4. for i in range(5):
  5. file = random.choice(os.listdir(img_folder)) #【在自定义目录里随机抽图,赋给file】
  6. image_path= os.path.join(img_folder, file) #【将自定义目录的路径与file拼接】
  7. img=mpimg.imread(image_path) #【读取自定义目录下的图像】
  8. ax=plt.subplot(1,5,i+1) #【把显示界面分割成1*5的网格,其中,第一个参数是行数,第二个参数是列数,第三个参数表示图形的编号,之后赋予ax】
  9. ax.title.set_text(file) #【ax的标题设置为抽取的图像名称】
  10. plt.imshow(img) #【展示】

如图数据建模-数据集加载 - 图1

  1. 设置用于加载数据集的图像维度和源文件夹
  1. IMG_WIDTH=200 #【设置图像宽度为200】
  2. IMG_HEIGHT=200 #【设置图像高度为200】
  3. img_folder=r'CV\Intel_Images\seg_train\seg_train\' #【图像路径设置】

undefined二、设置

从文件夹中的图像创建图像数据和标签

  1. def create_dataset(img_folder): #【定义 create_dataset函数(即创建图像数据)】
  2. img_data_array=[] #【图像数据用数组保存】
  3. class_name=[] #【类名用数组保存】
  4. for dir1 in os.listdir(img_folder): #【返回指定(这里是'img_folder')的文件夹包含的文件或文件夹的名字的文件夹为dir1】
  5. for file in os.listdir(os.path.join(img_folder, dir1)): #【返回指定(这里是'img_folder'和'dir1'拼接在一起)的文件夹包含的文件或文件夹的名字的文件夹为file】
  6. image_path= os.path.join(img_folder, dir1, file) #【将'img_folder'、'dir1'、'file'目录拼接在一起,赋予image_path】
  7. image= cv2.imread( image_path, cv2.COLOR_BGR2RGB) #【读取'image_path'里的图片,并将其由BGR模式转为RGB模式】
  8. image=cv2.resize(image, (IMG_HEIGHT, IMG_WIDTH),interpolation = cv2.INTER_AREA) #【将图像进行缩放,读取'image'里的内容,高与宽为之前设定的图像维度的值,利用'像素区域关系进行重采样’进行插值】
  9. image=np.array(image) #【将image的数据存储到数组中】
  10. image = image.astype('float32') #【将数据类型强制转换为float32】
  11. image /= 255 #【将图像数组归一化,使值在0和1之间,这有助于更快地收敛。】
  12. img_data_array.append(image) #【呈现image数组中的数据】
  13. class_name.append(dir1) #【呈现dir1的类名】
  14. return img_data_array, class_name #【返回'img_data_array','claa_name'】
  15. img_data, class_name =create_dataset(r'CV\Intel_Images\seg_train\seg_train') #【提取图像数组和类名】

知识补充:

  • 插值:利用已知邻近像素点的灰度值(或rgb图像中的三色值)来产生未知像素点的灰度值,以便由原始图像再生出具有更高分辨率的图像。
  • 计算机里存储图片是按照’先行后列‘存储,也符合数组的规律形式

undefined三、划分

选取训练数据集、测试数据集

  1. # -*- coding: utf-8 -*-
  2. """
  3. 将数据集划分为训练集,验证集,测试集
  4. """
  5. import os
  6. import random
  7. import shutil
  8. # 创建保存图像的文件夹
  9. def makedir(new_dir):
  10. if not os.path.exists(new_dir):
  11. os.makedirs(new_dir)
  12. random.seed(1) # 随机种子
  13. # 1.确定原图像数据集路径
  14. dataset_dir = "D:\Source Code\Python\Conda\AI\exampls\seg_train\seg_train" ##原始数据集路径
  15. # 2.确定数据集划分后保存的路径
  16. split_dir = "D:/Source Code/Python/Conda/AI/exampls/test" ##划分后保存路径【!一定是反斜杠!】
  17. train_dir = os.path.join(split_dir, "train")
  18. valid_dir = os.path.join(split_dir, "val")
  19. test_dir = os.path.join(split_dir, "test")
  20. # 3.确定将数据集划分为训练集,验证集,测试集的比例
  21. train_pct = 0.9
  22. valid_pct = 0.1
  23. test_pct = 0
  24. # 4.划分
  25. for root, dirs, files in os.walk(dataset_dir):
  26. for sub_dir in dirs: # 遍历0,1,2,3,4,5...9文件夹
  27. imgs = os.listdir(os.path.join(root, sub_dir)) # 展示目标文件夹下所有的文件名
  28. imgs = list(filter(lambda x: x.endswith('.jpg'), imgs)) # 取到所有以.jpg结尾的文件,如果改了图片格式,这里需要修改
  29. random.shuffle(imgs) # 乱序图片路径
  30. img_count = len(imgs) # 计算图片数量
  31. train_point = int(img_count * train_pct) # 0:train_pct
  32. valid_point = int(img_count * (train_pct + valid_pct)) # train_pct:valid_pct
  33. for i in range(img_count):
  34. if i < train_point: # 保存0-train_point的图片到训练集
  35. out_dir = os.path.join(train_dir, sub_dir)
  36. elif i < valid_point: # 保存train_point-valid_point的图片到验证集
  37. out_dir = os.path.join(valid_dir, sub_dir)
  38. else: # 保存valid_point-结束的图片到测试集
  39. out_dir = os.path.join(test_dir, sub_dir)
  40. makedir(out_dir) # 创建文件夹
  41. target_path = os.path.join(out_dir, imgs[i]) # 指定目标保存路径
  42. src_path = os.path.join(dataset_dir, sub_dir, imgs[i]) #指定目标原图像路径
  43. shutil.copy(src_path, target_path) # 复制图片
  44. print('Class:{}, train:{}, valid:{}, test:{}'.format(sub_dir, train_point, valid_point-train_point,
  45. img_count-valid_point))

结果为:

数据建模-数据集加载 - 图2