在[项目简介][环境搭建]中我们已经为模型训练做好了准备,但是,接下来,还不能开始训练,我们要完成训练前的一项重要内容:数据预处理。
数据预处理应该属于特征工程的范畴,是人工智能必备的步骤,我们通常将数据划分为训练集,验证集,测试集,训练过程就是让模型从训练集中学习经验,然后在验证集和测试集中评估模型,最终在未见过的数据中评估模型泛化能力,在未见过的数据中模型表现的好才是真好,那如何才能做到呢?目前除了在模型上下功夫外,还有就是从数据上做文章,如何优化模型我们以后再讲,今天我们主要讲数据预处理。
首先就是数据增广,如果模型在训练数据中没见过某种类型的数据,那模型学到的知识就会受限,在未来预测中,当输入这种数据类型时,他还是不认识,所以针对这种情况,我们可以增加训练数据集的分布广度,让训练数据集的分布更加接近真实的数据分布。
在图像领域,常见的数据增广手段包括随机对比度,图像随机缩放,图像水平垂直翻转,图像随机旋转,随机裁剪等等,具体要使用哪种手段要根据实际使用场景来决定,举个例子,自然条件下拍摄的图像,由于拍摄时间的不同,光照条件不同,致使图像对比度不同,我们可以改变对比度来模拟光照变化,医疗图像虽然不会受到自然光的影响,但在不同扫描参数下,图像的对比度也会不同,这时就可以用对比度增强手段模拟不同的扫描参数,还有,利用随机旋转来模拟扫描时的不同摆位姿势,但超过90度旋转角的图像就不会带来效果,因为受限于机器的扫描孔径大小,不可能出现这么大的旋转角度。
还有就是着重突出或者抑制某些特征,例如,在医疗图像中,通过窗宽窗位技术来突出某些解剖结构等。
最后就是图像归一化,标准化,这两种方式不光只应用在图像领域,也不只在深度学习中独有,机器学习中标准化手段可以消除量纲的影响,例如房子的房间数和房价就不是一个量纲,这会导致模型更加倾向量纲大的特征,另外,这两种手段也会加快训练速度,例如我们接下来要用到的批归一化手段。
数据增广对于训练数据不是很多的情况非常有用,例如,医疗图像的稀缺就可以用数据增广的方式来补充数据集。
回到我们的例子中,依据上面的原则,我们选择的图像增强手段有:图像随机旋转,最大旋转角度为45度,图像随机对比度,图像归一化。
接下来,对于初学者而言肯定会问,这些增强手段需要自己实现吗?不需要,基本所有的深度学习框架都封装了图像增强手段,不仅如此,还提供了数据集的封装。
我们本次使用的MRI头部矢状位数据集来自IXI Dataset,下载完数据集后,首先就要划分训练集和验证集,这里我们不使用测试集。
#导入常用库
import os
import random
import numpy as np
import matplotlib.pyplot as plt
from random import shuffle
import cv2
import paddle
from PIL import Image
import shutil
import re
random.seed(1000)
path_origin = ‘/home/aistudio/work/callosum/origin’
files = list(filter(lambda x: x.endswith(‘.jpg’), os.listdir(path_origin)))
random.shuffle(files)
rate = int(len(files) * 0.8)#训练集和测试集8:2
train_txt = open(‘/home/aistudio/work/callosum/train_list.txt’,‘w’)
val_txt = open(‘/home/aistudio/work/callosum/val_list.txt’,‘w’)
for i,f in enumerate(files):
image_path = os.path.join(path_origin, f)
im = cv2.imread(image_path,0)
label_path = image_path.replace(‘origin’,‘mask’).replace(‘.jpg’,‘.png’)
if i < rate:
train_txt.write(image_path +’ ’ + label_path+ ‘\n’)
else:
val_txt.write(image_path + ’ ’ + label_path+ ‘\n’)
train_txt.close()
val_txt.close()
接下来就要搭建DataSet
import paddleseg.transforms as T
from paddleseg.datasets import Dataset
train_transforms = [
T.RandomHorizontalFlip(),#水平翻转
T.RandomDistort(),#随机对比度,颜色等变化
T.RandomRotation(max_rotation = 45,im_padding_value =(0,0,0),label_padding_value = 0),#随机旋转
T.Resize(target_size=(512, 512)),
T.Normalize()
]
val_transforms = [
T.Resize(target_size=(512, 512)),
T.Normalize()
]
dataset_root = ‘/home/aistudio/work/callosum’
train_path = ‘/home/aistudio/work/callosum/train_list.txt’
val_path = ‘/home/aistudio/work/callosum/val_list.txt’
train_dataset = Dataset(
transforms = train_transforms,
dataset_root = dataset_root,
num_classes = 2,
train_path = train_path,
mode = ‘train’
)
#验证集
val_dataset = Dataset(
transforms = val_transforms,
dataset_root = dataset_root,
num_classes = 2,
val_path = val_path,
mode = ‘val’
)
到这里我们就已经完成了训练数据集的搭建和预处理过程,接下来就可以开始训练了。
详情请关注微信公众号“计算机视觉大讲堂”