数据获取与处理
一、常用数据集
数据是深度学习的关键。数据来源于百度AI Studio、Kaggle、天池、讯飞等比赛平台,或者Github,以及一些小的平台。数据集用于学术目的,而且有些数据需要申请才能获得链接。
常用数据集 | ||
---|---|---|
kaggle | House Prices-Advanced Regression Techniques | 预测销售价格 |
Cat and Dog | 猫狗分类 | |
Machine Learning from Disaster | 预测泰坦尼克号的生存情况并熟悉机器学习基础知识 | |
天池 | Barley Remote Sensing Dataset | 遥感影像分割 |
耶鲁人脸数据库 | 目标检测任务(人脸检测) | |
Data Fountain | 花卉分类数据集 | 图像分类 |
二、纯数据处理流程
- 数据预处理与特征工程
- 感知数据
- 初步了解数据
- 记录和特征的数量特征的名称
- 抽样了解记录中的数值特点描述性统计结果
- 特征类型
- 与相关知识领域数据结合,特征融合
-
数据清理
-
转换数据类型
-
处理缺失数据
-
处理离散数据
-
-
特征变换
-
特征数值化
-
特征二值化
-
OneHot编码
-
特征离散化特征
-
规范化
-
区间变换
-
标准化
-
归一化
-
-
-
特征选择
-
封装器法
-
循序特征选择
-
穷举特征选择
-
递归特征选择
-
-
过滤器法
-
嵌入法
-
-
特征抽取
-
无监督特征抽取
-
主成分分析
-
因子分析
-
-
有监督特征抽取
-
三、图像处理流程
- 图片数据获取
- 图片数据清洗,初步了解数据,筛选掉不合适的数据
- 图片数据标注,常用标注工具labeling、labelme、PPOCRLabel
-
图片数据预处理
-
标准化
-
中心化=取均值, 将各个维度中心化到0,目的是加快收敛速度,在某些激活函数上表现更好
-
-
归一化
-
除以标准差, 将各个维度的方差标准化处于[-1,1]之间,目的是提高收敛效率,统一不同输入范围的数据对于模型学习的影响,映射到激活函数有效梯度的值域
-
-
- 图片数据准备data preparation(训练+测试阶段),划分训练集,验证集和测试集
- 图片数据增强data augjmentation(训练阶段 )
- 为什么要进行数据增强
- 很多深度学习的模型复杂度太高,在数据量少的情况下,比较容易造成过拟合(通俗来说就是训练的这个模型它太沉浸在这个训练样本当中的一些特质上面了),表现为这个模型受到很多无关因素的影响。 所得出的结果就是在没有看到过的样本上对它做出的预测表现不太好。
- 很多深度学习的模型复杂度太高,在数据量少的情况下,比较容易造成过拟合(通俗来说就是训练的这个模型它太沉浸在这个训练样本当中的一些特质上面了),表现为这个模型受到很多无关因素的影响。 所得出的结果就是在没有看到过的样本上对它做出的预测表现不太好。
- CV常见的数据增强
- 随机旋转
- 随机水平或者垂直翻转
- 缩放
- 裁剪
- 平移
- 调整亮度、对比度、饱和度、色差等等
- 注入噪声
- 基于生成对抗网络GAN进行数据增强AutoAugment等
- 为什么要进行数据增强
四、口罩检测
本次课程使用PaddleX训练模型,查看帮助文档知,需要PascalVOC数据集格式的训练集和验证集。
PASCAL的全称是模式分析、静态建模和计算学习(Pattern Analysis, Statical Modeling and Computational Learning)。PASCAL VOC挑战赛是视觉对象分类识别和检测的一个基准测试,提供了检测算法和学习性能的
标准图像注释数据集合标准的评估系统。自2005年至今,该组织每年都会提供一系列类别的、带标签的图片,挑战者通过设计各种精妙的算法,仅根据分析图片内容来将其分类,最终通过准确率、召回率、效率来一决高下。如今,挑战赛和其所使用的数据集已经成为了对象检测领域普遍接受的一种标准。更多的自述和背景故事可以参阅官方说明文件。
VOC数据集格式,文件夹路径样式:
本次课程的初始数据集合为口罩检测,解压后可以看到文件夹路径样式为:
对比VOC数据集格式,还缺少ImageSets、label_list.txt、train_val.txt和val.txt。
使用PaddleX,对数据集进行随机划分,命令如下:
!paddlex --split_dataset --format VOC --dataset_dir /home/aistudio/work/PaddleDetection/dataset/MaskVOCData/ --val_value 0.15 --test_value 0.05
其中val_value表示验证集的比例,test_value表示测试集的比例(可以为0),剩余的比例用于训练集。
此时,MaskVOCData文件夹下的结构样式为:
接下来,使用PaddleX进行数据增强和数据集加载,代码如下
import paddle
import paddlex as pdx
import numpy as np
import paddle.nn as nn
import paddle.nn.functional as F
import PIL.Image as Image
import cv2
import os
from random import shuffle
from paddlex.det import transforms as T
from PIL import Image, ImageFilter, ImageEnhance
# 数据增强
def preprocess(dataType="train"):
if dataType == "train":
transform = T.Compose([
T.MixupImage(mixup_epoch=10), #对图像进行mixup操作,模型训练时的数据增强操作,目前仅YOLOv3模型支持该transform
# T.RandomExpand(), #随机扩张图像
# T.RandomDistort(brightness_range=1.2, brightness_prob=0.3), #以一定的概率对图像进行随机像素内容变换
# T.RandomCrop(), #随机裁剪图像
# T.ResizeByShort(), #根据图像的短边调整图像大小
T.Resize(target_size=608, interp='RANDOM'), #调整图像大小,[’NEAREST’, ‘LINEAR’, ‘CUBIC’, ‘AREA’, ‘LANCZOS4’, ‘RANDOM’]
# T.RandomHorizontalFlip(), #以一定的概率对图像进行随机水平翻转
T.Normalize() #对图像进行标准化
])
return transform
else:
transform = T.Compose([
T.Resize(target_size=608, interp='CUBIC'),
T.Normalize()
])
return transform
train_transforms = preprocess(dataType="train")
eval_transforms = preprocess(dataType="eval")
# 定义训练和验证所用的数据集
# API地址:https://paddlex.readthedocs.io/zh_CN/develop/data/format/detection.html?highlight=paddlex.det
train_dataset = pdx.datasets.VOCDetection(
data_dir='/home/aistudio/work/PaddleDetection/dataset/MaskVOCData',
file_list='/home/aistudio/work/PaddleDetection/dataset/MaskVOCData/train_list.txt',
label_list='/home/aistudio/work/PaddleDetection/dataset/MaskVOCData/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(
data_dir='/home/aistudio/work/PaddleDetection/dataset/MaskVOCData',
file_list='/home/aistudio/work/PaddleDetection/dataset/MaskVOCData/val_list.txt',
label_list='/home/aistudio/work/PaddleDetection/dataset/MaskVOCData/labels.txt',
transforms=eval_transforms)
然后,进行模型训练与评估,代码如下:
# 模型训练与评估
import matplotlib
matplotlib.use('Agg')
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")
#num_classes有些模型需要加1 比如faster_rcnn
num_classes = len(train_dataset.labels)
model = pdx.det.PPYOLO(num_classes=num_classes, )
model.train(
num_epochs=70,
train_dataset=train_dataset,
train_batch_size=16,
eval_dataset=eval_dataset,
learning_rate=3e-5,
warmup_steps=90,
warmup_start_lr=0.0,
save_interval_epochs=7,
lr_decay_epochs=[42, 70],
save_dir='output/PPYOLO',
use_vdl=True)
最终结果为:
代码详见:https://aistudio.baidu.com/aistudio/projectdetail/2248870