概述
本文将讲解利用PaddleCals实现对图像进行分类的任务,利用AI Studio平台训练,并通过猫十二分类例子讲解如何进行训练与预测。
版本
- PaddlePaddle 2.1.2
- PaddleClas 2.3
下载PaddleClas
此时可以将PaddleClas下载到项目中。
1 | !git clone https://gitee.com/paddlepaddle/PaddleClas/ --depth=1 |
预处理
1.解压数据集
1 | # 解压缩数据集 |
2.划分数据集
1 | import os |
3.通道转化
由于图片中存在一些非RGB格式的图片,会影响训练,因此进行处理。
1 | #导入需要的包 |
训练
1.修改bug
由于PaddleClas2.3版本读数据存在bug,因此修改如下文件
目录:\ppcls\data\dataloader\imagenet_dataset.py
注释:
assert os.path.exists(self._cls_path)
assert os.path.exists(self._img_path)
添加:self._cls_path=os.path.join(self._img_root,self._cls_path)
同时修改with open()as fd:中的内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class ImageNetDataset(CommonDataset):
def _load_anno(self, seed=None):
# 会对目录进行检测,如果cls_path使用相对目录,就会报错,在此注释掉,并修改为self._cls_path=os.path.join(self._img_root,self._cls_path)
self.images = []
self.labels = []
with open(self._cls_path) as fd:
lines = fd.readlines()
if seed is not None:
np.random.RandomState(seed).shuffle(lines)
for l in lines:
# tab分割
# l = l.strip().split(" ")
l = l.strip().split("\t")
self.images.append(os.path.join(self._img_root, l[0]))
self.labels.append(int(l[1]))
# 不需要判断这个
# assert os.path.exists(self.images[-1])2.修改配置文件
选择PaddleClas/ppcls/configs/ImageNet/ 中的模型,这里以ResNet为例,选择其中的ResNet50_vd.yaml
配置文件,主要修改参数如下:- class_num: 12
Train和Eval下均需修改 - image_root: /home/aistudio/data/data_sets/cat_12/
- cls_label_path: /home/aistudio/data/eval.txt
3.配置说明
3.1 全局配置(Global)
参数名字 | 具体含义 | 默认值 | 可选值 |
---|---|---|---|
checkpoints | 断点模型路径,用于恢复训练 | null | str |
pretrained_model | 预训练模型路径 | null | str |
output_dir | 保存模型路径 | “./output/“ | str |
save_interval | 每隔多少个epoch保存模型 | 1 | int |
eval_during_train | 是否在训练时进行评估 | True | bool |
eval_interval | 每隔多少个epoch进行模型评估 | 1 | int |
epochs | 训练总epoch数 | int | |
print_batch_step | 每隔多少个mini-batch打印输出 | 10 | int |
use_visualdl | 是否是用visualdl可视化训练过程 | False | bool |
image_shape | 图片大小 | [3,224,224] | list, shape: (3,) |
save_inference_dir | inference模型的保存路径 | “./inference” | str |
eval_mode | eval的模式 | “classification” | “retrieval” |
3.2 结构(Arch)
参数名字 | 具体含义 | 默认值 | 可选值 |
---|---|---|---|
name | 模型结构名字 | ResNet50 | PaddleClas提供的模型结构 |
class_num | 分类数 | 1000 | int |
pretrained | 预训练模型 | False | bool, str |
3.3 损失函数(Loss)
参数名字 | 具体含义 | 默认值 | 可选值 |
---|---|---|---|
CELoss | 交叉熵损失函数 | —— | —— |
CELoss.weight | CELoss的在整个Loss中的权重 | 1.0 | float |
CELoss.epsilon | CELoss中label_smooth的epsilon值 | 0.1 | float,0-1之间 |
3.4 优化器(Optimizer)
参数名字 | 具体含义 | 默认值 | 可选值 |
---|---|---|---|
name | 优化器方法名 | “Momentum” | “RmsProp”等其他优化器 |
momentum | momentum值 | 0.9 | float |
lr.name | 学习率下降方式 | “Cosine” | “Linear”、”Piecewise”等其他下降方式 |
lr.learning_rate | 学习率初始值 | 0.1 | float |
lr.warmup_epoch | warmup轮数 | 0 | int,如5 |
regularizer.name | 正则化方法名 | “L2” | [“L1”, “L2”] |
regularizer.coeff | 正则化系数 | 0.00007 | float |
4.开始训练
1 | # 使用以下命令进入项目目录 |
1 | # GPU设置 |
使用多卡训练
1 | !export CUDA_VISIBLE_DEVICES=0,1,2,3 |
预测
输入以下命令进行单张图片预测:
1 | # 预测 |
输入以下命令进行批量图片预测,并重定向到output.txt文件中。
1 | # 预测 |
输入以下命令生成提交的csv文件格式
1 | import ast |