我们知道我们采集的图片大小可能是任意的,但是网络的输入大小通常是固定的,所以我们需要变换尺寸。
数据预处理步骤
第一步Image Resize
第二步 data argumentation(数据增强)使图片数量增多,模型计算更精准。比如随机的裁剪和旋转工作
第三步Normalize,把原来的从0-1分布的像素点变换成0附近,比如-1到1或-0.5到0.5等
第四步ToTensr,把数据类型转换到tensor上
import torch
import os,glob
import random,csv
from torch.utils.data import Dataset # 所有自定义数据集的母类
class Pokemon(Dataset):
# 初始化函数,首先需要接收的是文件位置,固定大小(在这里接收方便更改,适用所有网络),mode即代表区分train vaild test三种类型
def __init__(self,root,resize,mode):
super(Pokemon, self).__init__()
# 把参数保存下来
self.root=root
self.resize=resize
# 之后要把每一个保存下来的类,做一个映射,即你对应的类别的label是多少,人为编码并且编好之后不能改变。
# 字典类型
self.name2label = {} # ‘bulbasaur(妙蛙种子)’=>0
# 创建映射表,谁先加载进来就编码为0
# root下边所有文件夹都遍历一下
for name in sorted(os.listdir(os.path.join(root))): # listdir返回的顺序不固定,所以进行一个排序,固定好顺序
# listdir可能会把目录和文件都包含进来,我们把文件过滤掉
if not os.path.isdir(os.path.join(root,name)):
continue
# 拿到了目录的名字,然后保存到上边创建的表里,name作为key
# 把你当前的元素数量的长度作为最新的元素的label值,比如你当前只有一个映射,label=0再进来的一个就是1
self.name2label[name] = len(self.name2label.keys())
print(self.name2label)
def __len__(self):
pass
def __getitem__(self, idx):
pass
# 写一个验证的函数
def main():
db=Pokemon('pokeman',224,'train')
if __name__ == '__main__':
main()
# 结果输出:{'bulbasaur': 0, 'charmander': 1, 'mewtwo': 2, 'pikachu': 3, 'squirtle': 4}
我们拿到了数据和标签的表格了然后来接受图片
然后创建一个文件来接收图片
# 输出表格后,只是第一步,然后来接收图片
# 希望拿到一个文件,文件是image path+image label
def load_csv(self,filename):
# 把所有的图片放进来
images=[]
for name in self.name2label.keys():
# 把当前类别里的png和jpg文件合并到image里面去,即所有图片都放到images这个list里面
# 比如保存进去的格式‘pokeman\\mewtwo\\00001.png’
images += glob.glob(os.path.join(self.root,name,'*.png')) # 把当前所有的len下边的文件都保存进来。
images += glob.glob(os.path.join(self.r