一、图像分类(快速在 PaddleLabel 标注的花朵分类数据集上展示如何应用 PaddleX 训练 MobileNetV3_ssld 网络)
PaddleLabel 标注数据+PaddleX 训练预测=快速完成一次图像分类的任务
1. 数据准备
- 首先使用
PaddleLabel
对自制的花朵数据集进行标注,其次使用Split Dataset
功能分割数据集,最后导出数据集 - 从
PaddleLabel
导出后的内容全部放到自己的建立的文件夹下,例如dataset/flower_clas_dataset
,其目录结构如下:
├── flower_clas_dataset
│ ├── image
│ │ ├── flower1.jpg
│ │ ├── flower2.jpg
│ │ ├── ...
│ ├── labels.txt
│ ├── test_list.txt
│ ├── train_list.txt
│ ├── val_list.txt
2. 训练
2.1 安装必备的库
2.1.1 安装 paddlepaddle
# 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装
pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
# 您的机器是CPU,请运行以下命令安装
# pip install paddlepaddle
2.1.2 安装 PaddleX 以及依赖项
pip install "paddlex<=2.0.0"
pip install scikit-image
pip install threadpoolctl==2.0.0 -i https://mirror.baidu.com/pypi/simple
pip install scikit-learn==0.23.2
2.2 准备训练
2.2.1 配置 GPU
# jupyter中使用paddlex需要设置matplotlib
import matplotlib
matplotlib.use('Agg')
# 设置使用0号GPU卡(如无GPU,执行此代码后仍然会使用CPU训练模型)
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import paddlex as pdx
2.2.2 定义图像处理流程 transforms
定义训练和验证过程中,图像的处理流程,其中训练过程包括了部分数据增强操作(验证时不需要),如在本示例中,训练过程使用了RandomCrop
和RandomHorizontalFlip
两种数据增强方式,更多图像预处理流程 transforms 的使用可参见paddlex.cls.transforms
from paddlex import transforms as T
train_transforms = T.Compose([
T.RandomCrop(crop_size=224),
T.RandomHorizontalFlip(),
T.Normalize()])
eval_transforms = T.Compose([
T.ResizeByShort(short_size=256),
T.CenterCrop(crop_size=224),
T.Normalize()
])
2.2.3 定义数据集 Dataset 使用 PaddleX 内置的数据集读取器读取训练和验证数据集。在图像分类中使用ImageNet
格式的数据集,因此这里采用pdx.datasets.ImageNet
来加载数据集,该接口的介绍可参见文档paddlex.datasets.ImageNet
train_dataset = pdx.datasets.ImageNet(
data_dir='./dataset/flower_clas_dataset',
file_list='./dataset/flower_clas_dataset/train_list.txt',
label_list='./dataset/flower_clas_dataset/labels.txt',
transforms=train_transforms)
eval_dataset = pdx.datasets.ImageNet(
data_dir='./dataset/flower_clas_dataset',
file_list='./dataset/flower_clas_dataset/val_list.txt',
label_list='./dataset/flower_clas_dataset/labels.txt',
transforms=eval_transforms)
2.3 模型开始训练
在定义好数据集后,即可选择分类模型(这里使用了MobileNetV3_large_ssld
模型),开始进行训练。 更多模型训练参数介绍可参见文档paddlex.cls.MobileNetV3_large_ssld,在如下代码中,模型训练过程每间隔save_interval_epochs
轮会保存一次模型在save_dir
目录下,同时在保存的过程中也会在验证数据集上计算相关指标,模型训练过程中相关日志的含义可参见文档
num_classes = len(train_dataset.labels)
model = pdx.cls.MobileNetV3_large_ssld(num_classes=num_classes)
model.train(num_epochs=12,
train_dataset=train_dataset,
train_batch_size=32,
eval_dataset=eval_dataset,
lr_decay_epochs=[6, 8],
save_interval_epochs=3,
learning_rate=0.00625,
save_dir='output/mobilenetv3_large_ssld'
)
3. 预测
3.1 预测
import paddlex as pdx
model = pdx.load_model('./output/mobilenetv3_large_ssld/best_model')
image_path = './dataset/flower_clas_dataset/image/1008566138_6927679c8a.jpg'
result = model.predict(image_path)
print("Predict Result:", result)
预测的样例图片是:
预测的结果是:
Predict Result: [{‘category_id’: 0, ‘category’: ‘sunflower’, ‘score’: 0.9999815}] 最终结论:预测正确 ✔
二、目标检测(快速在 PaddleLabel 标注的道路标志检测数据集上展示如何应用 PaddleX 训练 YOLOv3 网络
PaddleLabel 标注数据+PaddleX 训练预测=快速完成一次目标检测的任务
1. 数据准备
- 首先使用
PaddleLabel
对自制的路标数据集进行标注,其次使用Split Dataset
功能分割数据集,最后导出数据集 - 从
PaddleLabel
导出后的内容全部放到自己的建立的文件夹下,例如dataset/roadsign_det_dataset
,其目录结构如下:
├── roadsign_det_dataset
│ ├── Annotations
│ ├── JPEGImages
│ ├── labels.txt
│ ├── test_list.txt
│ ├── train_list.txt
│ ├── val_list.txt
2. 训练
2.1 安装必备的库
2.1.1 安装 paddlepaddle
# 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装
pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
# 您的机器是CPU,请运行以下命令安装
# pip install paddlepaddle
2.1.2 安装 PaddleX
pip install "paddlex<=2.0.0" -i https://mirror.baidu.com/pypi/simple
2.2 准备训练
2.2.1 配置 GPU
# 设置使用0号GPU卡(如无GPU,执行此代码后仍然会使用CPU训练模型)
import matplotlib
matplotlib.use('Agg')
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import paddlex as pdx
2.2.2 定义图像处理流程 transforms
定义数据处理流程,其中训练和测试需分别定义,训练过程包括了部分测试过程中不需要的数据增强操作,如在本示例中,训练过程使用了MixupImage
、RandomDistort
、RandomExpand
、RandomCrop
和RandomHorizontalFlip
共 5 种数据增强方式,更多图像预处理流程paddlex.det.transforms
from paddlex import transforms as T
train_transforms = T.Compose([
T.MixupImage(mixup_epoch=250),
T.RandomDistort(),
T.RandomExpand(),
T.RandomCrop(),
T.Resize(target_size=608, interp='RANDOM'),
T.RandomHorizontalFlip(),
T.Normalize()])
eval_transforms = T.Compose([
T.Resize(target_size=608, interp='CUBIC'),
T.Normalize()
])
2.2.3 定义数据集 Dataset
目标检测可使用VOCDetection
格式和COCODetection
两种数据集,此处由于数据集为 VOC 格式,因此采用 pdx.datasets.VOCDetection
来加载数据集,该接口的介绍可参见文档paddlex.datasets.VOCDetection
train_dataset = pdx.datasets.VOCDetection(
data_dir='./dataset/roadsign_det_dataset',
file_list='./dataset/roadsign_det_dataset/train_list.txt',
label_list='./dataset/roadsign_det_dataset/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(
data_dir='./dataset/roadsign_det_dataset',
file_list='./dataset/roadsign_det_dataset/val_list.txt',
label_list='./dataset/roadsign_det_dataset/labels.txt',
transforms=eval_transforms)
2.3 模型开始训练
在定义好数据集后,即可选择检测模型(这里使用了yolov3_darknet53
模型),开始进行训练。 关于检测模型训练,更多参数介绍可参见文档paddlex.det.YOLOv3,在如下代码中,模型训练过程每间隔save_interval_epochs
轮会保存一次模型在save_dir
目录下,同时在保存的过程中也会在验证数据集上计算相关指标,模型训练过程中相关日志的含义可参见文档
num_classes = len(train_dataset.labels)
model = pdx.det.YOLOv3(num_classes=num_classes, backbone='DarkNet53')
model.train(
num_epochs=10,
train_dataset=train_dataset,
train_batch_size=8,
eval_dataset=eval_dataset,
learning_rate=0.000125,
lr_decay_epochs=[210, 240],
save_interval_epochs=20,
save_dir='output/yolov3_darknet53')
3. 预测
3.1 预测
使用模型进行预测,同时使用pdx.det.visualize
将结果可视化,可视化结果将保存到./output/yolov3_mobilenetv1
下,其中threshold
代表Box
的置信度阈值,将Box
置信度低于该阈值的框过滤不进行可视化
import paddlex as pdx
model = pdx.load_model('output/yolov3_darknet53/best_model')
image_path = './dataset/roadsign_det_dataset/JPEGImages/road554.png'
result = model.predict(image_path)
pdx.det.visualize(image_path, result, threshold=0.5, save_dir='./output/yolov3_darknet53')
预测的样例图片如下图:
预测的结果是:
speedlimit 0.77 预测正确 ✔
三、图像分割(快速在 PaddleLabel 标注的狗子分割数据集上展示如何应用 PaddleX 训练 DeepLabV3 网络)
PaddleLabel 标注数据+PaddleX 训练预测=快速完成一次图像语义分割的任务
1. 数据准备
- 首先使用
PaddleLabel
对自制的狗子数据集进行标注,其次使用Split Dataset
功能分割数据集,最后导出数据集 - 从
PaddleLabel
导出后的内容全部放到自己的建立的文件夹下,例如dataset/dog_seg_dataset
,其目录结构如下:
├── dog_seg_dataset
│ ├── Annotations
│ ├── JPEGImages
│ ├── labels.txt
│ ├── test_list.txt
│ ├── train_list.txt
│ ├── val_list.txt
2. 训练
2.1 安装必备的库
2.1.1 安装 paddlepaddle
# 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装
pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
# 您的机器是CPU,请运行以下命令安装
# pip install paddlepaddle
2.1.2 安装 PaddleX
pip install "paddlex<=2.0.0" -i https://mirror.baidu.com/pypi/simple
2.2 准备训练
2.2.1 配置 GPU
# 设置使用0号GPU卡(如无GPU,执行此代码后仍然会使用CPU训练模型)
import matplotlib
matplotlib.use('Agg')
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import paddlex as pdx
2.2.2 定义图像处理流程 transforms
定义数据处理流程,其中训练和测试需分别定义,训练过程包括了部分测试过程中不需要的数据增强操作,如在本示例中,训练过程使用了RandomHorizontalFlip
这种数据增强方式,更多图像预处理流程 transforms 的使用可参见paddlex.seg.transforms
from paddlex import transforms as T
train_transforms = T.Compose([
T.RandomHorizontalFlip(),
T.Resize(target_size=512),
T.Normalize()
])
eval_transforms = T.Compose([
T.Resize(target_size=512),
T.Normalize()
])
2.2.3 定义数据集 Dataset 语义分割使用SegDataset
格式的数据集,因此采用pdx.datasets.SegDataset
来加载数据集,该接口的介绍可参见文档paddlex.datasets.SegDataset
train_dataset = pdx.datasets.SegDataset(
data_dir='./dataset/dog_seg_dataset',
file_list='./dataset/dog_seg_dataset/train_list.txt',
label_list='./dataset/dog_seg_dataset/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.SegDataset(
data_dir='./dataset/dog_seg_dataset',
file_list='./dataset/dog_seg_dataset/val_list.txt',
label_list='./dataset/dog_seg_dataset/labels.txt',
transforms=eval_transforms)
2.3 模型开始训练
在定义好数据集后,即可选择分割模型(这里使用了deeplabv3
模型),开始进行训练。
更多训练模型的参数介绍可参见文档paddlex.seg.DeepLabv3,在如下代码中,模型训练过程每间隔save_interval_epochs
轮会保存一次模型在save_dir
目录下,同时在保存的过程中也会在验证数据集上计算相关指标,模型训练过程中相关日志的含义可参见文档
num_classes = len(train_dataset.labels)
model = pdx.seg.DeepLabV3P(num_classes=num_classes, backbone='ResNet50_vd')
model.train(
num_epochs=40,
train_dataset=train_dataset,
train_batch_size=4,
eval_dataset=eval_dataset,
learning_rate=0.01,
save_interval_epochs=1,
save_dir='output/deeplab',
use_vdl=True)
3. 预测
3.1 预测
使用模型进行预测,同时使用pdx.seg.visualize
将结果可视化,可视化结果将保存到./output/deeplab
下,其中weight
代表原图的权重,即 mask 可视化结果与原图权重因子。
import paddlex as pdx
model = pdx.load_model('output/deeplab/best_model')
image_name = './dataset/dog_seg_dataset/JPEGImages/e619b17a9c1b9f085dc2712eb603171f.jpeg'
result = model.predict(image_name)
pdx.seg.visualize(image_name, result, weight=0.4, save_dir='./output/deeplab')
可视化结果如下所示: