[Feature] Add training tutorials for classification tasks (#37)

own
Lin Manhui 3 years ago committed by GitHub
parent 39c82d943a
commit ce96ff2367
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. BIN
      .DS_Store
  2. BIN
      docs/.DS_Store
  3. 6
      paddlers/datasets/cd_dataset.py
  4. 2
      paddlers/utils/utils.py
  5. 48
      tutorials/train/README.md
  6. 3
      tutorials/train/classification/data/.gitignore
  7. 87
      tutorials/train/classification/hrnet.py
  8. 87
      tutorials/train/classification/mobilenetv3.py
  9. 87
      tutorials/train/classification/resnet50_vd.py
  10. 49
      tutorials/train/classification/resnet50_vd_rs.py

BIN
.DS_Store vendored

Binary file not shown.

BIN
docs/.DS_Store vendored

Binary file not shown.

@ -82,12 +82,14 @@ class CDDataset(Dataset):
format(line.strip(), file_list))
items = list(map(path_normalization, items))
if not all(map(is_pic, items)):
continue
full_path_im_t1 = osp.join(data_dir, items[0])
full_path_im_t2 = osp.join(data_dir, items[1])
full_path_label = osp.join(data_dir, items[2])
if not all(
map(is_pic, (full_path_im_t1, full_path_im_t2,
full_path_label))):
continue
if not osp.exists(full_path_im_t1):
raise IOError('Image file {} does not exist!'.format(
full_path_im_t1))

@ -79,7 +79,7 @@ def path_normalization(path):
def is_pic(img_path):
valid_suffix = [
'JPEG', 'jpeg', 'JPG', 'jpg', 'BMP', 'bmp', 'PNG', 'png', '.npy'
'JPEG', 'jpeg', 'JPG', 'jpg', 'BMP', 'bmp', 'PNG', 'png', 'npy'
]
suffix = img_path.split('.')[-1]
if suffix in valid_suffix:

@ -1,14 +1,31 @@
# 使用教程——训练模型
本目录下整理了使用PaddleRS训练模型的示例代码,代码中均提供了示例数据的自动下载,并均使用单张GPU卡进行训练。
本目录下整理了使用PaddleRS训练模型的示例代码。代码中均提供了示例数据的自动下载,并均使用GPU对模型进行训练。
|代码 | 模型任务 | 数据 |
|示例代码路径 | 任务 | 模型 |
|------|--------|---------|
|object_detection/ppyolo.py | 目标检测PPYOLO | 昆虫检测 |
|semantic_segmentation/deeplabv3p_resnet50_multi_channel.py | 语义分割DeepLabV3 | 地块分类 |
|semantic_segmentation/farseg_test.py | 语义分割FarSeg | 遥感建筑分割 |
|change_detection/cdnet_build.py | 变化检测CDNet | 遥感变化检测 |
|classification/resnet50_vd_rs.py | 图像分类ResNet50_vd | 遥感场景分类 |
|change_detection/bit.py | 变化检测 | BIT |
|change_detection/cdnet.py | 变化检测 | CDNet |
|change_detection/dsamnet.py | 变化检测 | DSAMNet |
|change_detection/dsifn.py | 变化检测 | DSIFN |
|change_detection/snunet.py | 变化检测 | SNUNet |
|change_detection/stanet.py | 变化检测 | STANet |
|change_detection/fc_ef.py | 变化检测 | FC-EF |
|change_detection/fc_siam_conc.py | 变化检测 | FC-Siam-conc |
|change_detection/fc_siam_diff.py | 变化检测 | FC-Siam-diff |
|classification/hrnet.py | 场景分类 | HRNet |
|classification/mobilenetv3.py | 场景分类 | MobileNetV3 |
|classification/resnet50_vd.py | 场景分类 | ResNet50-vd |
|image_restoration/drn.py | 超分辨率 | DRN |
|image_restoration/esrgan.py | 超分辨率 | ESRGAN |
|image_restoration/lesrcnn.py | 超分辨率 | LESRCNN |
|object_detection/faster_rcnn.py | 目标检测 | Faster R-CNN |
|object_detection/ppyolo.py | 目标检测 | PP-YOLO |
|object_detection/ppyolotiny.py | 目标检测 | PP-YOLO Tiny |
|object_detection/ppyolov2.py | 目标检测 | PP-YOLOv2 |
|object_detection/yolov3.py | 目标检测 | YOLOv3 |
|semantic_segmentation/deeplabv3p.py | 图像分割 | DeepLab V3+ |
|semantic_segmentation/unet.py | 图像分割 | UNet |
<!-- 可参考API接口说明了解示例代码中的API:
* [数据集读取API](../../docs/apis/datasets.md)
@ -35,26 +52,25 @@ python setup.py install
```
## 开始训练
* 在安装PaddleRS后,使用如下命令开始训练,代码会自动下载训练数据, 并均使用单张GPU卡进行训练。
* 在安装PaddleRS后,使用如下命令进行单卡训练。代码会自动下载训练数据。以DeepLab V3+图像分割模型为例:
```commandline
# 指定需要使用的GPU设备编号
export CUDA_VISIBLE_DEVICES=0
python tutorials/train/semantic_segmentation/deeplabv3p_resnet50_multi_channel.py
python tutorials/train/semantic_segmentation/deeplabv3p.py
```
* 若需使用多张GPU卡进行训练,例如使用2张卡时执行
* 如需使用多块GPU进行训练,例如使用2张显卡时,执行如下命令
```commandline
python -m paddle.distributed.launch --gpus 0,1 tutorials/train/semantic_segmentation/deeplabv3p_resnet50_multi_channel.py
python -m paddle.distributed.launch --gpus 0,1 tutorials/train/semantic_segmentation/deeplabv3p.py
```
使用多卡时,参考[训练参数调整](../../docs/parameters.md)调整学习率和批量大小。
## VisualDL可视化训练指标
在模型训练过程,在`train`函数中,将`use_vdl`设为True,则训练过程会自动将训练日志以VisualDL的格式打点在`save_dir`(用户自己指定的路径)下的`vdl_log`目录,用户可以使用如下命令启动VisualDL服务,查看可视化指标
将传入`train`方法的`use_vdl`参数设为`True`,则模型训练过程中将自动把训练日志以VisualDL的格式存储到`save_dir`(用户自己指定的路径)目录下名为`vdl_log`的子目录中。用户可以使用如下命令启动VisualDL服务,查看可视化指标。同样以DeepLab V3+模型为例:
```commandline
visualdl --logdir output/deeplabv3p_resnet50_multi_channel/vdl_log --port 8001
# 指定端口号为8001
visualdl --logdir output/deeplabv3p/vdl_log --port 8001
```
服务启动后,使用浏览器打开 https://0.0.0.0:8001 或 https://localhost:8001

@ -0,0 +1,3 @@
*.zip
*.tar.gz
ucmerced/

@ -0,0 +1,87 @@
#!/usr/bin/env python
# 场景分类模型HRNet训练示例脚本
# 执行此脚本前,请确认已正确安装PaddleRS库
import paddlers as pdrs
from paddlers import transforms as T
# 下载文件存放目录
DOWNLOAD_DIR = './data/ucmerced/'
# 数据集存放目录
DATA_DIR = './data/ucmerced/UCMerced_LandUse/'
# 训练集`file_list`文件路径
TRAIN_FILE_LIST_PATH = './data/ucmerced/train.txt'
# 验证集`file_list`文件路径
EVAL_FILE_LIST_PATH = './data/ucmerced/val.txt'
# 数据集类别信息文件路径
LABEL_LIST_PATH = './data/ucmerced/labels.txt'
# 实验目录,保存输出的模型权重和结果
EXP_DIR = './output/hrnet/'
# 下载和解压UC Merced数据集
ucmerced_dataset = 'http://weegee.vision.ucmerced.edu/datasets/UCMerced_LandUse.zip'
pdrs.utils.download_and_decompress(ucmerced_dataset, path=DOWNLOAD_DIR)
# 定义训练和验证时使用的数据变换(数据增强、预处理等)
# 使用Compose组合多种变换方式。Compose中包含的变换将按顺序串行执行
# API说明:https://github.com/PaddleCV-SIG/PaddleRS/blob/develop/docs/apis/transforms.md
train_transforms = T.Compose([
# 将影像缩放到256x256大小
T.Resize(target_size=256),
# 以50%的概率实施随机水平翻转
T.RandomHorizontalFlip(prob=0.5),
# 以50%的概率实施随机垂直翻转
T.RandomVerticalFlip(prob=0.5),
# 将数据归一化到[-1,1]
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
eval_transforms = T.Compose([
T.Resize(target_size=256),
# 验证阶段与训练阶段的数据归一化方式必须相同
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
# 分别构建训练和验证所用的数据集
train_dataset = pdrs.datasets.ClasDataset(
data_dir=DATA_DIR,
file_list=TRAIN_FILE_LIST_PATH,
label_list=LABEL_LIST_PATH,
transforms=train_transforms,
num_workers=0,
shuffle=True)
eval_dataset = pdrs.datasets.ClasDataset(
data_dir=DATA_DIR,
file_list=EVAL_FILE_LIST_PATH,
label_list=LABEL_LIST_PATH,
transforms=eval_transforms,
num_workers=0,
shuffle=False)
# 使用默认参数构建HRNet模型
# 目前已支持的模型请参考:https://github.com/PaddleCV-SIG/PaddleRS/blob/develop/docs/apis/model_zoo.md
# 模型输入参数请参考:https://github.com/PaddleCV-SIG/PaddleRS/blob/develop/paddlers/tasks/classifier.py
model = pdrs.tasks.HRNet_W18_C(num_classes=len(train_dataset.labels))
# 执行模型训练
model.train(
num_epochs=2,
train_dataset=train_dataset,
train_batch_size=16,
eval_dataset=eval_dataset,
save_interval_epochs=1,
# 每多少次迭代记录一次日志
log_interval_steps=50,
save_dir=EXP_DIR,
# 初始学习率大小
learning_rate=0.01,
# 是否使用early stopping策略,当精度不再改善时提前终止训练
early_stop=False,
# 是否启用VisualDL日志功能
use_vdl=True,
# 指定从某个检查点继续训练
resume_checkpoint=None)

@ -0,0 +1,87 @@
#!/usr/bin/env python
# 场景分类模型MobileNetV3训练示例脚本
# 执行此脚本前,请确认已正确安装PaddleRS库
import paddlers as pdrs
from paddlers import transforms as T
# 下载文件存放目录
DOWNLOAD_DIR = './data/ucmerced/'
# 数据集存放目录
DATA_DIR = './data/ucmerced/UCMerced_LandUse/'
# 训练集`file_list`文件路径
TRAIN_FILE_LIST_PATH = './data/ucmerced/train.txt'
# 验证集`file_list`文件路径
EVAL_FILE_LIST_PATH = './data/ucmerced/val.txt'
# 数据集类别信息文件路径
LABEL_LIST_PATH = './data/ucmerced/labels.txt'
# 实验目录,保存输出的模型权重和结果
EXP_DIR = './output/mobilenetv3/'
# 下载和解压UC Merced数据集
ucmerced_dataset = 'http://weegee.vision.ucmerced.edu/datasets/UCMerced_LandUse.zip'
pdrs.utils.download_and_decompress(ucmerced_dataset, path=DOWNLOAD_DIR)
# 定义训练和验证时使用的数据变换(数据增强、预处理等)
# 使用Compose组合多种变换方式。Compose中包含的变换将按顺序串行执行
# API说明:https://github.com/PaddleCV-SIG/PaddleRS/blob/develop/docs/apis/transforms.md
train_transforms = T.Compose([
# 将影像缩放到256x256大小
T.Resize(target_size=256),
# 以50%的概率实施随机水平翻转
T.RandomHorizontalFlip(prob=0.5),
# 以50%的概率实施随机垂直翻转
T.RandomVerticalFlip(prob=0.5),
# 将数据归一化到[-1,1]
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
eval_transforms = T.Compose([
T.Resize(target_size=256),
# 验证阶段与训练阶段的数据归一化方式必须相同
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
# 分别构建训练和验证所用的数据集
train_dataset = pdrs.datasets.ClasDataset(
data_dir=DATA_DIR,
file_list=TRAIN_FILE_LIST_PATH,
label_list=LABEL_LIST_PATH,
transforms=train_transforms,
num_workers=0,
shuffle=True)
eval_dataset = pdrs.datasets.ClasDataset(
data_dir=DATA_DIR,
file_list=EVAL_FILE_LIST_PATH,
label_list=LABEL_LIST_PATH,
transforms=eval_transforms,
num_workers=0,
shuffle=False)
# 使用默认参数构建MobileNetV3模型
# 目前已支持的模型请参考:https://github.com/PaddleCV-SIG/PaddleRS/blob/develop/docs/apis/model_zoo.md
# 模型输入参数请参考:https://github.com/PaddleCV-SIG/PaddleRS/blob/develop/paddlers/tasks/classifier.py
model = pdrs.tasks.MobileNetV3_small_x1_0(num_classes=len(train_dataset.labels))
# 执行模型训练
model.train(
num_epochs=2,
train_dataset=train_dataset,
train_batch_size=16,
eval_dataset=eval_dataset,
save_interval_epochs=1,
# 每多少次迭代记录一次日志
log_interval_steps=50,
save_dir=EXP_DIR,
# 初始学习率大小
learning_rate=0.01,
# 是否使用early stopping策略,当精度不再改善时提前终止训练
early_stop=False,
# 是否启用VisualDL日志功能
use_vdl=True,
# 指定从某个检查点继续训练
resume_checkpoint=None)

@ -0,0 +1,87 @@
#!/usr/bin/env python
# 场景分类模型ResNet50-vd训练示例脚本
# 执行此脚本前,请确认已正确安装PaddleRS库
import paddlers as pdrs
from paddlers import transforms as T
# 下载文件存放目录
DOWNLOAD_DIR = './data/ucmerced/'
# 数据集存放目录
DATA_DIR = './data/ucmerced/UCMerced_LandUse/'
# 训练集`file_list`文件路径
TRAIN_FILE_LIST_PATH = './data/ucmerced/train.txt'
# 验证集`file_list`文件路径
EVAL_FILE_LIST_PATH = './data/ucmerced/val.txt'
# 数据集类别信息文件路径
LABEL_LIST_PATH = './data/ucmerced/labels.txt'
# 实验目录,保存输出的模型权重和结果
EXP_DIR = './output/resnet50_vd/'
# 下载和解压UC Merced数据集
ucmerced_dataset = 'http://weegee.vision.ucmerced.edu/datasets/UCMerced_LandUse.zip'
pdrs.utils.download_and_decompress(ucmerced_dataset, path=DOWNLOAD_DIR)
# 定义训练和验证时使用的数据变换(数据增强、预处理等)
# 使用Compose组合多种变换方式。Compose中包含的变换将按顺序串行执行
# API说明:https://github.com/PaddleCV-SIG/PaddleRS/blob/develop/docs/apis/transforms.md
train_transforms = T.Compose([
# 将影像缩放到256x256大小
T.Resize(target_size=256),
# 以50%的概率实施随机水平翻转
T.RandomHorizontalFlip(prob=0.5),
# 以50%的概率实施随机垂直翻转
T.RandomVerticalFlip(prob=0.5),
# 将数据归一化到[-1,1]
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
eval_transforms = T.Compose([
T.Resize(target_size=256),
# 验证阶段与训练阶段的数据归一化方式必须相同
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
# 分别构建训练和验证所用的数据集
train_dataset = pdrs.datasets.ClasDataset(
data_dir=DATA_DIR,
file_list=TRAIN_FILE_LIST_PATH,
label_list=LABEL_LIST_PATH,
transforms=train_transforms,
num_workers=0,
shuffle=True)
eval_dataset = pdrs.datasets.ClasDataset(
data_dir=DATA_DIR,
file_list=EVAL_FILE_LIST_PATH,
label_list=LABEL_LIST_PATH,
transforms=eval_transforms,
num_workers=0,
shuffle=False)
# 使用默认参数构建ResNet50-vd模型
# 目前已支持的模型请参考:https://github.com/PaddleCV-SIG/PaddleRS/blob/develop/docs/apis/model_zoo.md
# 模型输入参数请参考:https://github.com/PaddleCV-SIG/PaddleRS/blob/develop/paddlers/tasks/classifier.py
model = pdrs.tasks.ResNet50_vd(num_classes=len(train_dataset.labels))
# 执行模型训练
model.train(
num_epochs=2,
train_dataset=train_dataset,
train_batch_size=16,
eval_dataset=eval_dataset,
save_interval_epochs=1,
# 每多少次迭代记录一次日志
log_interval_steps=50,
save_dir=EXP_DIR,
# 初始学习率大小
learning_rate=0.01,
# 是否使用early stopping策略,当精度不再改善时提前终止训练
early_stop=False,
# 是否启用VisualDL日志功能
use_vdl=True,
# 指定从某个检查点继续训练
resume_checkpoint=None)

@ -1,49 +0,0 @@
import paddlers as pdrs
from paddlers import transforms as T
# 下载aistudio的数据到当前文件夹并解压、整理
# https://aistudio.baidu.com/aistudio/datasetdetail/63189
# 定义训练和验证时的transforms
train_transforms = T.Compose([
T.Resize(target_size=512),
T.RandomHorizontalFlip(),
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
eval_transforms = T.Compose([
T.Resize(target_size=512),
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
# 定义训练和验证所用的数据集
train_dataset = pdrs.datasets.ClasDataset(
data_dir='tutorials/train/classification/DataSet',
file_list='tutorials/train/classification/DataSet/train_list.txt',
label_list='tutorials/train/classification/DataSet/label_list.txt',
transforms=train_transforms,
num_workers=0,
shuffle=True)
eval_dataset = pdrs.datasets.ClasDataset(
data_dir='tutorials/train/classification/DataSet',
file_list='tutorials/train/classification/DataSet/test_list.txt',
label_list='tutorials/train/classification/DataSet/label_list.txt',
transforms=eval_transforms,
num_workers=0,
shuffle=False)
# 初始化模型
num_classes = len(train_dataset.labels)
model = pdrs.tasks.ResNet50_vd(num_classes=num_classes)
# 进行训练
model.train(
num_epochs=10,
train_dataset=train_dataset,
train_batch_size=4,
eval_dataset=eval_dataset,
learning_rate=0.1,
save_dir='output/resnet_vd')
Loading…
Cancel
Save