quick_start_classification_professional.md 10.3 KB
Newer Older
S
sibo2rr 已提交
1
# 30 分钟玩转 PaddleClas(进阶版)
C
cuicheng01 已提交
2

S
sibo2rr 已提交
3
此处提供了专业用户在 linux 操作系统上使用 PaddleClas 的快速上手教程,主要内容基于 CIFAR-100 数据集,快速体验不同模型的训练、加载不同预训练模型、SSLD 知识蒸馏方案和数据增广的效果。请事先参考[安装指南](../installation/install_paddleclas.md)配置运行环境和克隆 PaddleClas 代码。
C
cuicheng01 已提交
4

5
------
C
cuicheng01 已提交
6

7 8 9 10
## 目录

- [1. 数据和模型准备](#1)
  - [1.1 数据准备](#1.1)
S
sibo2rr 已提交
11
    - [1.1.1 准备 CIFAR100](#1.1.1)
12 13 14 15 16 17 18 19 20 21 22
- [2. 模型训练](#2)
  - [2.1 单标签训练](#2.1)
    - [2.1.1 零基础训练:不加载预训练模型的训练](#2.1.1)
    - [2.1.2 迁移学习](#2.1.2)
- [3. 数据增广](#3)
  - [3.1 数据增广的尝试-Mixup](#3.1)
- [4. 知识蒸馏](#4)
- [5. 模型评估与推理](#5)
  - [5.1 单标签分类模型评估与推理](#5.1)
    - [5.1.1 单标签分类模型评估](#5.1.1)
    - [5.1.2 单标签分类模型预测](#5.1.2)
S
sibo2rr 已提交
23
    - [5.1.3 单标签分类使用 inference 模型进行模型推理](#5.1.3)
24 25 26 27 28 29

<a name="1"></a>

## 1. 数据和模型准备

<a name="1.1"></a>
C
cuicheng01 已提交
30 31 32 33

### 1.1 数据准备


S
sibo2rr 已提交
34
* 进入 PaddleClas 目录。
C
cuicheng01 已提交
35 36 37 38 39

```
cd path_to_PaddleClas
```

40 41
<a name="1.1.1"></a> 

S
sibo2rr 已提交
42
#### 1.1.1 准备 CIFAR100
C
cuicheng01 已提交
43

S
sibo2rr 已提交
44
* 进入 `dataset/` 目录,下载并解压 CIFAR100 数据集。
C
cuicheng01 已提交
45 46 47 48 49 50 51 52

```shell
cd dataset
wget https://paddle-imagenet-models-name.bj.bcebos.com/data/CIFAR100.tar
tar -xf CIFAR100.tar
cd ../
```

53 54
<a name="2"></a>

S
sibo2rr 已提交
55
## 2. 模型训练
C
cuicheng01 已提交
56

57
<a name="2.1"></a> 
C
cuicheng01 已提交
58 59 60

### 2.1 单标签训练

S
sibo2rr 已提交
61
<a name="2.1.1"></a> 
62

C
cuicheng01 已提交
63 64
#### 2.1.1 零基础训练:不加载预训练模型的训练

65
* 基于 ResNet50_vd 模型,训练脚本如下所示。
C
cuicheng01 已提交
66 67 68 69 70 71 72 73 74 75

```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/quick_start/professional/ResNet50_vd_CIFAR100.yaml \
        -o Global.output_dir="output_CIFAR"
```

76
验证集的最高准确率为 0.415 左右。
C
cuicheng01 已提交
77

C
cuicheng01 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90
此处的使用了多个 GPU 训练,如果只使用一个 GPU,请将 `CUDA_VISIBLE_DEVICES` 设置指定 GPU,`--gpus`设置指定 GPU,下同。例如,只使用 0 号 GPU 训练:

```shell
export CUDA_VISIBLE_DEVICES=0
python3 -m paddle.distributed.launch \
    --gpus="0" \
    tools/train.py \
        -c ./ppcls/configs/quick_start/professional/ResNet50_vd_CIFAR100.yaml \
        -o Global.output_dir="output_CIFAR" \
        -o Optimizer.lr.learning_rate=0.01
```

* **注意**: 
C
update  
cuicheng01 已提交
91

C
cuicheng01 已提交
92 93
* `--gpus`中指定的 GPU 可以是 `CUDA_VISIBLE_DEVICES` 指定的 GPU 的子集。
* 由于初始学习率和 batch-size 需要保持线性关系,所以训练从 4 个 GPU 切换到 1 个 GPU 训练时,总 batch-size 缩减为原来的 1/4,学习率也需要缩减为原来的 1/4,所以改变了默认的学习率从 0.04 到 0.01。
C
cuicheng01 已提交
94

95
<a name="2.1.2"></a> 
C
cuicheng01 已提交
96 97 98 99


#### 2.1.2 迁移学习

100
* 基于 ImageNet1k 分类预训练模型 ResNet50_vd_pretrained(准确率 79.12%)进行微调,训练脚本如下所示。
C
cuicheng01 已提交
101 102 103 104 105 106 107 108 109 110 111

```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/quick_start/professional/ResNet50_vd_CIFAR100.yaml \
        -o Global.output_dir="output_CIFAR" \
        -o Arch.pretrained=True
```

112
验证集最高准确率为 0.718 左右,加载预训练模型之后,CIFAR100 数据集精度大幅提升,绝对精度涨幅 30%。
C
cuicheng01 已提交
113

114
* 基于 ImageNet1k 分类预训练模型 ResNet50_vd_ssld_pretrained(准确率 82.39%)进行微调,训练脚本如下所示。
C
cuicheng01 已提交
115 116 117 118 119 120 121 122 123 124 125 126

```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/quick_start/professional/ResNet50_vd_CIFAR100.yaml \
        -o Global.output_dir="output_CIFAR" \
        -o Arch.pretrained=True \
        -o Arch.use_ssld=True
```

S
sibo2rr 已提交
127
最终 CIFAR100 验证集上精度指标为 0.73,相对于 79.12% 预训练模型的微调结构,新数据集指标可以再次提升 1.2%。
C
cuicheng01 已提交
128

129
* 替换 backbone 为 MobileNetV3_large_x1_0 进行微调,训练脚本如下所示。
C
cuicheng01 已提交
130 131 132 133 134 135 136 137 138 139 140

```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/quick_start/professional/MobileNetV3_large_x1_0_CIFAR100_finetune.yaml \
        -o Global.output_dir="output_CIFAR" \
        -o Arch.pretrained=True
```

141 142 143
验证集最高准确率为 0.601 左右, 较 ResNet50_vd 低近 12%。

<a name="3"></a>
C
cuicheng01 已提交
144 145


146
## 3. 数据增广
C
cuicheng01 已提交
147

S
sibo2rr 已提交
148
PaddleClas 包含了很多数据增广的方法,如 Mixup、Cutout、RandomErasing 等,具体的方法可以参考[数据增广的章节](../algorithm_introduction/DataAugmentation.md)
C
cuicheng01 已提交
149

150
<a name="3.1"></a> 
C
cuicheng01 已提交
151

152 153
### 3.1 数据增广的尝试-Mixup

S
sibo2rr 已提交
154
基于[数据增广的章节](../algorithm_introduction/DataAugmentation.md) `3.3 节` 中的训练方法,结合 Mixup 的数据增广方式进行训练,具体的训练脚本如下所示。
C
cuicheng01 已提交
155 156 157 158 159 160 161 162 163 164 165

```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/quick_start/professional/ResNet50_vd_mixup_CIFAR100_finetune.yaml \
        -o Global.output_dir="output_CIFAR"

```

S
sibo2rr 已提交
166
最终 CIFAR100 验证集上的精度为 0.73,使用数据增广可以使得模型精度再次提升约 1.2%。
C
cuicheng01 已提交
167 168 169 170 171



* **注意**

S
sibo2rr 已提交
172
  * 其他数据增广的配置文件可以参考 `ppcls/configs/ImageNet/DataAugment/` 中的配置文件。
C
cuicheng01 已提交
173
* 训练 CIFAR100 的迭代轮数较少,因此进行训练时,验证集的精度指标可能会有 1% 左右的波动。
C
cuicheng01 已提交
174

175
<a name="4"></a>
C
cuicheng01 已提交
176 177


178
## 4. 知识蒸馏
C
cuicheng01 已提交
179 180


S
sibo2rr 已提交
181
PaddleClas 包含了自研的 SSLD 知识蒸馏方案,具体的内容可以参考[知识蒸馏章节](../algorithm_introduction/knowledge_distillation.md), 本小节将尝试使用知识蒸馏技术对 MobileNetV3_large_x1_0 模型进行训练,使用 `2.1.2 小节` 训练得到的 ResNet50_vd 模型作为蒸馏所用的教师模型,首先将 `2.1.2 小节` 训练得到的 ResNet50_vd 模型保存到指定目录,脚本如下。
C
cuicheng01 已提交
182 183 184 185 186 187

```shell
mkdir pretrained
cp -r output_CIFAR/ResNet50_vd/best_model.pdparams  ./pretrained/
```

188
配置文件中模型名字、教师模型和学生模型的配置、预训练地址配置以及 freeze_params 配置如下,其中 `freeze_params_list` 中的两个值分别代表教师模型和学生模型是否冻结参数训练。
C
cuicheng01 已提交
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207

```yaml
Arch:
  name: "DistillationModel"
  # if not null, its lengths should be same as models
  pretrained_list:
  # if not null, its lengths should be same as models
  freeze_params_list:
  - True
  - False
  models:
    - Teacher:
        name: ResNet50_vd
        pretrained: "./pretrained/best_model"
    - Student:
        name: MobileNetV3_large_x1_0
        pretrained: True
```

208 209
Loss 配置如下,其中训练 Loss 是学生模型的输出和教师模型的输出的交叉熵、验证 Loss 是学生模型的输出和真实标签的交叉熵。

C
cuicheng01 已提交
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
```yaml
Loss:
  Train:
    - DistillationCELoss:
        weight: 1.0
        model_name_pairs:
        - ["Student", "Teacher"]
  Eval:
    - DistillationGTCELoss:
        weight: 1.0
        model_names: ["Student"]
```

最终的训练脚本如下所示。

```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/quick_start/professional/R50_vd_distill_MV3_large_x1_0_CIFAR100.yaml \
        -o Global.output_dir="output_CIFAR"

```

S
sibo2rr 已提交
235
最终 CIFAR100 验证集上的精度为 64.4%,使用教师模型进行知识蒸馏,MobileNetV3 的精度涨幅 4.3%。
C
cuicheng01 已提交
236 237 238

* **注意**

239
  * 蒸馏过程中,教师模型使用的预训练模型为 CIFAR100 数据集上的训练结果,学生模型使用的是 ImageNet1k 数据集上精度为 75.32% 的 MobileNetV3_large_x1_0 预训练模型。
240
  * 该蒸馏过程无须使用真实标签,所以可以使用更多的无标签数据,在使用过程中,可以将无标签数据生成假的 `train_list.txt`,然后与真实的 `train_list.txt` 进行合并, 用户可以根据自己的数据自行体验。
C
cuicheng01 已提交
241

242
<a name="5"></a>
C
cuicheng01 已提交
243

244
## 5. 模型评估与推理
C
cuicheng01 已提交
245

246
<a name="5.1"></a> 
C
cuicheng01 已提交
247 248 249

### 5.1 单标签分类模型评估与推理

250 251
<a name="5.1.1"></a> 

C
cuicheng01 已提交
252 253 254 255 256 257 258 259 260 261
#### 5.1.1 单标签分类模型评估。

训练好模型之后,可以通过以下命令实现对模型精度的评估。

```bash
python3 tools/eval.py \
    -c ./ppcls/configs/quick_start/professional/ResNet50_vd_CIFAR100.yaml \
    -o Global.pretrained_model="output_CIFAR/ResNet50_vd/best_model"
```

262 263
<a name="5.1.2"></a> 

C
cuicheng01 已提交
264 265 266 267 268 269 270 271 272 273 274
#### 5.1.2 单标签分类模型预测

模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测:

```python
python3 tools/infer.py \
    -c ./ppcls/configs/quick_start/professional/ResNet50_vd_CIFAR100.yaml \
    -o Infer.infer_imgs=./dataset/CIFAR100/test/0/0001.png \
    -o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model
```

275
<a name="5.1.3"></a> 
C
cuicheng01 已提交
276

S
sibo2rr 已提交
277
#### 5.1.3 单标签分类使用 inference 模型进行模型推理
C
cuicheng01 已提交
278

279
通过导出 inference 模型,PaddlePaddle 支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理:
C
cuicheng01 已提交
280 281 282 283 284 285 286 287
首先,对训练好的模型进行转换:

```bash
python3 tools/export_model.py \
    -c ./ppcls/configs/quick_start/professional/ResNet50_vd_CIFAR100.yaml \
    -o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model
```

288
* 默认会在 `inference` 文件夹下生成 `inference.pdiparams``inference.pdmodel``inference.pdiparams.info` 文件。
C
cuicheng01 已提交
289 290 291

使用预测引擎进行推理:

S
sibo2rr 已提交
292
进入 deploy 目录下:
C
cuicheng01 已提交
293 294 295 296

```bash
cd deploy
```
297 298

更改 `inference_cls.yaml` 文件,由于训练 CIFAR100 采用的分辨率是 32x32,所以需要改变相关的分辨率,最终配置文件中的图像预处理如下:
C
cuicheng01 已提交
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314

```yaml
PreProcess:
  transform_ops:
    - ResizeImage:
        resize_short: 36
    - CropImage:
        size: 32
    - NormalizeImage:
        scale: 0.00392157
        mean: [0.485, 0.456, 0.406]
        std: [0.229, 0.224, 0.225]
        order: ''
    - ToCHWImage:
```

315
执行命令进行预测,由于默认 `class_id_map_file` 是 ImageNet 数据集的映射文件,所以此处需要置 None。
C
cuicheng01 已提交
316 317 318 319 320 321 322

```bash
python3 python/predict_cls.py \
    -c configs/inference_cls.yaml \
    -o Global.infer_imgs=../dataset/CIFAR100/test/0/0001.png \
    -o PostProcess.Topk.class_id_map_file=None
```