PaddleClas图像分类
        
        
            
                概述
本文将讲解利用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  | 
         Comments