数据的预处理
import paddle.vision.transforms as T
__all__ = ['FaceDataset']
# 定义图像的大小
image_shape = get('image_shape') #事先image_shape添加在之前的config_label文件的CONFIG下
IMAGE_SIZE = (image_shape[1], image_shape[2])
print(IMAGE_SIZE)
class FaceDataset(paddle.io.Dataset):
"""
人脸表情数据集类的定义
"""
def __init__(self, mode='train'):
"""
初始化函数
"""
assert mode in ['train', 'test'], 'mode is one of train, test.' #判断参数合法性
self.data = []
"""
根据不同模式选择不同的数据标注文件
"""
with open('./{}.txt'.format(mode)) as f:
for line in f.readlines():
info = line.strip().split('\t')
if len(info) > 0:
self.data.append([info[0].strip(), info[1].strip()])##切分成数组,每个数组包含图像的地址和labe
if mode == 'train':
self.transforms = T.Compose([
T.RandomResizedCrop(IMAGE_SIZE), # 随机裁剪大小
T.RandomHorizontalFlip(0.5), # 随机水平翻转
T.ToTensor(), # 数据的格式转换和标准化 HWC => CHW
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 图像归一化
])
else:
self.transforms = T.Compose([
T.Resize(256), # 图像大小修改
T.RandomCrop(IMAGE_SIZE), # 随机裁剪
T.ToTensor(), # 数据的格式转换和标准化 HWC => CHW
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 图像归一化
])
def __getitem__(self, index):
"""
根据索引获取单个样本
"""
image_file, label = self.data[index]
image = Image.open(image_file)
image = self.transforms(image) ##得到预处理后的结果
return image, np.array(label, dtype='int64') ##label要将int类型转成numpy
def __len__(self):
"""
获取样本总数
"""
return len(self.data)
对训练集和测试集进行预处理
train_dataset = FaceDataset(mode='train')
valid_dataset = FaceDataset(mode='test')
print('训练数据集:{}张;测试数据集:{}张'.format(len(train_dataset), len(valid_dataset)))
总结:
图像的预处理是提高模型准确率的途径之一,好的预处理使训练出来的模型有更高的准确率。