我最近做的实验需要把都是图片的数据集转成numpy形式存储,然后放入模型训练。
首先要有一个.csv文件,这个文件存放了训练集中所有图片的名字和所属类别,共两列,这个文件在下载某些数据集的时候会自带或者有处理好的让你下载,但也可以自己生成,可以看这里(要点三)
import pandas as pd import cv2 import numpy as np #读取存有图片名和对应类别名的.csv文件 train = pd.read_csv('train_new.csv') #print(train) #创建一个空的列表,后面用来存放训练集中的每张图片 train_image = [] ''' csv文件总共两列,一列图片名,一列对应类别名,这里就是遍历图片名,总共2408张 ''' for i in range(train.shape[0]):#2408 #加载图像,这里进入文件夹下,遍历csv文件中列名为'image'的列,即图片名,进而读取图片 img_cv2 = cv2.imread('train_1_50/'+train['image'][i]) #将目标大小设置为(224,224,3) image = cv2.resize(img_cv2,(224,224),interpolation=cv2.INTER_AREA) #像素值归一化 img = image / 255 #把图像加入train_image列表 train_image.append(img) # 将列表转为numpy数组 X = np.array(train_image)#train_image中有2408张图片,都是numpy格式 # 查看数组的大小 print(X.shape) # 查看数组 print(X)
参考博文里大佬加载图像和设置图片大小是一行代码完成的,但用image.load_img读取的只是图片,然后再转成numpy形式,而cv2.imread可以一步完成。(我为什么要换呢,因为大佬的方式在我这里一直报错,我解决不了,私信大佬也不理我,555.。。)
# 加载图像,并将目标大小设置为(224,224,3) img = image.load_img('train_1/'+train['image'][i], target_size=(224,224,3)) # 将其转换为数组 img = image.img_to_array(img)
看下效果:
这里好多0是因为我的图片都是从视频中提取出来的,提取的有些图片正好上一帧下一帧的切换,故是黑色的,没有值,再加上数组显示不完全。
查看列表,就全部显示出来了。。。
参考博文