未验证 提交 8ac9881e 编写于 作者: C cuicheng01 提交者: GitHub

Merge pull request #1384 from cuicheng01/develop

polish docs
# 一、数据增强分类实战
# 数据增强分类实战
---
本节将基于ImageNet-1K的数据集详细介绍数据增强实验,如果想快速体验此方法,可以参考[**30分钟玩转PaddleClas(进阶版)**](../quick_start/quick_start_classification_professional.md)中基于CIFAR100的数据增强实验。如果想了解相关算法的内容,请参考[数据增强算法介绍](../algorithm_introduction/DataAugmentation.md)
## 1.1 参数配置
## 目录
- [参数配置](#1)
- [1.1 AutoAugment](#1.1)
- [1.2 RandAugment](#1.2)
- [1.3 TimmAutoAugment](#1.3)
- [1.4 Cutout](#1.4)
- [1.5 RandomErasing](#1.5)
- [1.6 HideAndSeek](#1.6)
- [1.7 GridMask](#1.7)
- [1.8 Mixup](#1.8)
- [1.9 Cutmix](#1.9)
- [1.10 Mixup与Cutmix同时使用](#1.10)
- [启动命令](#2)
- [注意事项](#3)
- [实验结果](#4)
<a name="1"></a>
## 一、参数配置
由于不同的数据增强方式含有不同的超参数,为了便于理解和使用,我们在`configs/DataAugment`里分别列举了8种训练ResNet50的数据增强方式的参数配置文件,用户可以在`tools/run.sh`里直接替换配置文件的路径即可使用。此处分别挑选了图像变换、图像裁剪、图像混叠中的一个示例展示,其他参数配置用户可以自查配置文件。
### AutoAugment
<a name="1.1"></a>
### 1.1 AutoAugment
`AotoAugment`的图像增广方式的配置如下。`AutoAugment`是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
......@@ -27,7 +48,8 @@
order: ''
```
### RandAugment
<a name="1.2"></a>
### 1.2 RandAugment
`RandAugment`的图像增广方式的配置如下,其中用户需要指定其中的参数`num_layers``magnitude`,默认的数值分别是`2``5``RandAugment`是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
......@@ -49,7 +71,9 @@
std: [0.229, 0.224, 0.225]
order: ''
```
### TimmAutoAugment
<a name="1.3"></a>
### 1.3 TimmAutoAugment
`TimmAutoAugment`的图像增广方式的配置如下,其中用户需要指定其中的参数`config_str``interpolation``img_size`,默认的数值分别是`rand-m9-mstd0.5-inc1``bicubic``224``TimmAutoAugment`是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
......@@ -73,7 +97,8 @@
order: ''
```
### Cutout
<a name="1.4"></a>
### 1.4 Cutout
`Cutout`的图像增广方式的配置如下,其中用户需要指定其中的参数`n_holes``length`,默认的数值分别是`1``112`。类似其他图像裁剪类的数据增强方式,`Cutout`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。
......@@ -96,7 +121,8 @@
length: 112
```
### RandomErasing
<a name="1.5"></a>
### 1.5 RandomErasing
`RandomErasing`的图像增广方式的配置如下,其中用户需要指定其中的参数`EPSILON``sl``sh``r1``attempt``use_log_aspect``mode`,默认的数值分别是`0.25``0.02``1.0/3.0``0.3``10``True``pixel`。类似其他图像裁剪类的数据增强方式,`RandomErasing`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。
......@@ -124,7 +150,8 @@
mode: pixel
```
### HideAndSeek
<a name="1.6"></a>
### 1.6 HideAndSeek
`HideAndSeek`的图像增广方式的配置如下。类似其他图像裁剪类的数据增强方式,`HideAndSeek`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。
......@@ -145,7 +172,8 @@
- HideAndSeek:
```
### GridMask
<a name="1.7"></a>
### 1.7 GridMask
`GridMask`的图像增广方式的配置如下,其中用户需要指定其中的参数`d1``d2``rotate``ratio``mode`, 默认的数值分别是`96``224``1``0.5``0`。类似其他图像裁剪类的数据增强方式,`GridMask`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。
......@@ -171,8 +199,8 @@
mode: 0
```
### Mixup
<a name="1.8"></a>
### 1.8 Mixup
`Mixup`的图像增广方式的配置如下,其中用户需要指定其中的参数`alpha`,默认的数值是`0.2`。类似其他图像混合类的数据增强方式,`Mixup`是在图像做完数据处理后将每个batch内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。
......@@ -195,7 +223,8 @@
alpha: 0.2
```
### Cutmix
<a name="1.9"></a>
### 1.9 Cutmix
`Cutmix`的图像增广方式的配置如下,其中用户需要指定其中的参数`alpha`,默认的数值是`0.2`。类似其他图像混合类的数据增强方式,`Cutmix`是在图像做完数据处理后将每个batch内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。
......@@ -218,7 +247,8 @@
alpha: 0.2
```
### Mixup与Cutmix同时使用
<a name="1.10"></a>
### 1.10 Mixup与Cutmix同时使用
`Mixup``与Cutmix`同时使用的配置如下,其中用户需要指定额外的参数`prob`,该参数控制不同数据增强的概率,默认为`0.5`
```yaml
......@@ -244,7 +274,8 @@
prob: 0.5
```
## 1.2 启动命令
<a name="2"></a>
## 二、启动命令
当用户配置完训练环境后,类似于训练其他分类任务,只需要将`tools/train.sh`中的配置文件替换成为相应的数据增强方式的配置文件即可。
......@@ -265,7 +296,8 @@ python3 -m paddle.distributed.launch \
sh tools/train.sh
```
## 1.3 注意事项
<a name="3"></a>
## 三、注意事项
* 由于图像混叠时需对label进行混叠,无法计算训练数据的准确率,所以在训练过程中没有打印训练准确率。
......@@ -275,7 +307,8 @@ sh tools/train.sh
* 几乎每一类图像增强均含有超参数,我们只提供了基于ImageNet-1k的超参数,其他数据集需要用户自己调试超参数,具体超参数的含义用户可以阅读相关的论文,调试方法也可以参考训练技巧的章节。
## 二、实验结果
<a name="4"></a>
## 四、实验结果
基于PaddleClas,在ImageNet1k数据集上的分类精度如下。
......
# PaddleClas代码解析
## 1. 整体代码结构解析
### 1.1 整体代码和目录概览
## 目录
- [整体代码和目录概览](#1)
- [训练模块定义](#2)
- [2.1 数据](#2.1)
- [2.2 模型结构](#2.2)
- [2.3 损失函数](#2.3)
- [2.4 优化器和学习率衰减、权重衰减策略](#2.4)
- [2.5 训练时评估](#2.5)
- [2.6 模型存储](#2.6)
- [2.7 模型裁剪与量化](#2.7)
- [预测部署代码和方式](#3)
<a name="1"></a>
## 一、整体代码和目录概览
PaddleClas主要代码和目录结构如下
......@@ -15,11 +26,15 @@ PaddleClas主要代码和目录结构如下
* requirements.txt 文件用于安装 PaddleClas 的依赖项。使用pip进行升级安装使用。
* tests:PaddleClas模型从训练到预测的全链路测试,验证各功能是否能够正常使用。
### 1.2 训练模块定义
<a name="2"></a>
## 二、训练模块定义
深度学习模型训练过程中,主要包含数据、模型结构、损失函数、优化器和学习率衰减、权重衰减策略等,以下一一解读。
深度学习模型训练过程中,主要包含以下几个核心模块。
<a name="2.1"></a>
## 2.1 数据
* 数据:对于有监督任务来说,训练数据一般包含原始数据及其标注。在基于单标签的图像分类任务中,原始数据指的是图像数据,而标注则是该图像数据所属的类比。PaddleClas中,训练时需要提供标签文件,形式如下,每一行包含一条训练样本,分别表示图片路径和类别标签,用分隔符隔开(默认为空格)。
对于有监督任务来说,训练数据一般包含原始数据及其标注。在基于单标签的图像分类任务中,原始数据指的是图像数据,而标注则是该图像数据所属的类比。PaddleClas中,训练时需要提供标签文件,形式如下,每一行包含一条训练样本,分别表示图片路径和类别标签,用分隔符隔开(默认为空格)。
```
train/n01440764/n01440764_10026.JPEG 0
......@@ -58,7 +73,8 @@ PaddleClas 中也包含了 `AutoAugment`, `RandAugment` 等数据增广方法,
图像分类中,数据后处理主要为 `argmax` 操作,在此不再赘述。
* 模型结构
<a name="2.2"></a>
## 2.2 模型结构
在配置文件中,模型结构定义如下
......@@ -83,7 +99,8 @@ def build_model(config):
return arch
```
* 损失函数
<a name="2.3"></a>
## 2.3 损失函数
PaddleClas中,包含了 `CELoss` , `JSDivLoss`, `TripletLoss`, `CenterLoss` 等损失函数,均定义在 `ppcls/loss` 中。
......@@ -107,7 +124,8 @@ Loss:
margin: 0.5
```
* 优化器和学习率衰减、权重衰减策略
<a name="2.4"></a>
## 2.4 优化器和学习率衰减、权重衰减策略
图像分类任务中,`Momentum` 是一种比较常用的优化器, PaddleClas 中提供了 `Momentum``RMSProp``Adam``AdamW`等几种优化器策略。
......@@ -164,8 +182,8 @@ def build_optimizer(config, epochs, step_each_epoch, parameters):
不同优化器和权重衰减策略均以类的形式实现,具体实现可以参考文件 `ppcls/optimizer/optimizer.py` ;不同的学习率衰减策略可以参考文件 `ppcls/optimizer/learning_rate.py`
* 训练时评估与模型存储
<a name="2.5"></a>
## 2.5 训练时评估
模型在训练的时候,可以设置模型保存的间隔,也可以选择每隔若干个epoch对验证集进行评估,从而可以保存在验证集上精度最佳的模型。配置文件中,可以通过下面的字段进行配置。
......@@ -176,6 +194,8 @@ Global:
eval_interval: 1 # 评估的epoch间隔
```
<a name="2.6"></a>
## 2.6 模型存储
模型存储是通过 Paddle 框架的 `paddle.save()` 函数实现的,存储的是模型的动态图版本,以字典的形式存储,便于继续训练。具体实现如下
```python
......@@ -196,7 +216,10 @@ def save_model(program, model_path, epoch_id, prefix='ppcls'):
如果想对模型进行压缩训练,则通过下面字段进行配置
模型裁剪:
<a name="2.7"></a>
## 2.7 模型裁剪与量化
1.模型裁剪:
```yaml
Slim:
......@@ -205,7 +228,7 @@ Slim:
pruned_ratio: 0.3
```
模型量化:
2.模型量化:
```yaml
Slim:
......@@ -215,9 +238,12 @@ Slim:
训练方法详见模型[裁剪量化使用介绍](../advanced_tutorials/model_prune_quantization.md), 算法介绍详见[裁剪量化算法介绍](../algorithm_introduction/model_prune_quantization.md)
### 1.3 预测部署代码和方式
<a name="3"></a>
## 三、预测部署代码和方式
* 如果希望在服务端使用 cpp 进行部署,可以参考 [cpp inference 预测教程](../../../deploy/cpp_infer/readme.md)
* 如果希望将分类模型部署为服务,可以参考 [hub serving 预测部署教程](../../../deploy/hubserving/readme.md)
* 如果希望将对分类模型进行离线量化,可以参考 [模型量化裁剪教程](../advanced_tutorials/model_prune_quantization.md) 中离线量化部分。
* 如果希望在移动端使用分类模型进行预测,可以参考 [PaddleLite 预测部署教程](../../../deploy/lite/readme.md)
* 如果希望在服务端使用 python 进行部署,可以参考 [python inference 预测教程](../inference_deployment/python_deploy.md)
* 如果希望在服务端使用 cpp 进行部署,可以参考 [cpp inference 预测教程](../inference_deployment/cpp_deploy.md)
* 如果希望将分类模型部署为服务,可以参考 [hub serving 预测部署教程](../inference_deployment/paddle_hub_serving_deploy.md)
* 如果希望在移动端使用分类模型进行预测,可以参考 [PaddleLite 预测部署教程](../inference_deployment/paddle_lite_deploy.md)
* 如果希望使用whl包对分类模型进行预测,可以参考 [whl包预测](./docs/zh_CN/inference_deployment/whl_deploy.md)
# PaddleClas 社区贡献指南
---
## 目录
- [如何贡献代码](#1)
- [1.1 PaddleClas 分支说明](#1.1)
- [1.2 PaddleClas 代码提交流程与规范](#1.2)
- [1.2.1 fork 和 clone 代码](1.2.1)
- [1.2.2 和远程仓库建立连接](1.2.2)
- [1.2.3 创建本地分支](1.2.3)
- [1.2.4 使用 pre-commit 勾子](1.2.4)
- [1.2.5 修改与提交代码](1.2.5)
- [1.2.6 保持本地仓库最新](1.2.6)
- [1.2.7 push到远程仓库](1.2.7)
- [1.2.8 提交Pull Request](1.2.8)
- [1.2.9 签署 CLA 协议和通过单元测试](1.2.9)
- [1.2.10 删除分支](1.2.10)
- [1.2.11 提交代码的一些约定](1.2.11)
- [总结](#2)
- [参考文献](#3)
<a name="1"></a>
## 一、如何贡献代码
<a name="1.1"></a>
### 1.1 PaddleClas 分支说明
PaddleClas 未来将维护 2 种分支,分别为:
......@@ -16,8 +39,10 @@ PaddleClas 的历史分支,未来将不再维护。考虑到一些同学可能
PaddleClas 欢迎大家向 repo 中积极贡献代码,下面给出一些贡献代码的基本流程。
<a name="1.2"></a>
### 1.2 PaddleClas 代码提交流程与规范
<a name="1.2.1"></a>
#### 1.2.1 fork 和 clone 代码
* 跳转到 [PaddleClas GitHub首页](https://github.com/PaddlePaddle/PaddleClas) ,然后单击 Fork 按钮,生成自己目录下的仓库,比如 `https://github.com/USERNAME/PaddleClas`
......@@ -42,6 +67,7 @@ clone 的地址可以从下面获取
<img src="../../images/quick_start/community/002_clone.png" width = "600" />
</div>
<a name="1.2.2"></a>
#### 1.2.2 和远程仓库建立连接
首先通过 `git remote -v` 查看当前远程仓库的信息。
......@@ -68,6 +94,7 @@ upstream https://github.com/PaddlePaddle/PaddleClas.git (push)
这主要是为了后续在提交 pull request (PR) 时,始终保持本地仓库最新。
<a name="1.2.3"></a>
#### 1.2.3 创建本地分支
可以基于当前分支创建新的本地分支,命令如下。
......@@ -93,6 +120,7 @@ Branch new_branch set up to track remote branch develop from upstream.
Switched to a new branch 'new_branch'
```
<a name="1.2.4"></a>
#### 1.2.4 使用 pre-commit 勾子
Paddle 开发人员使用 pre-commit 工具来管理 Git 预提交钩子。 它可以帮助我们格式化源代码(C++,Python),在提交(commit)前自动检查一些基本事宜(如每个文件只有一个 EOL,Git 中不要添加大文件等)。
......@@ -109,7 +137,7 @@ pre-commit install
1. Paddle 使用 clang-format 来调整 C/C++ 源代码格式,请确保 `clang-format` 版本在 3.8 以上。
2. 通过 `pip install pre-commit``conda install -c conda-forge pre-commit` 安装的 `yapf` 稍有不同的,PaddleClas 开发人员使用的是 `pip install pre-commit`
<a name="1.2.5"></a>
#### 1.2.5 修改与提交代码
可以通过 `git status` 查看改动的文件。
......@@ -133,6 +161,7 @@ pre-commit
git commit -m "your commit info"
```
<a name="1.2.6"></a>
#### 1.2.6 保持本地仓库最新
获取 upstream 的最新代码并更新当前分支。这里的 upstream 来自于 1.2 节的`和远程仓库建立连接`部分。
......@@ -143,12 +172,14 @@ git fetch upstream
git pull upstream develop
```
<a name="1.2.7"></a>
#### 1.2.7 push到远程仓库
```shell
git push origin new_branch
```
<a name="1.2.8"></a>
#### 1.2.8 提交Pull Request
点击 new pull request,选择本地分支和目标分支,如下图所示。在 PR 的描述说明中,填写该 PR 所完成的功能。接下来等待 review ,如果有需要修改的地方,参照上述步骤更新 origin 中的对应分支即可。
......@@ -157,7 +188,7 @@ git push origin new_branch
<img src="../../images/quick_start/community/004_create_pr.png" width = "600" />
</div>
<a name="1.2.9"></a>
#### 1.2.9 签署 CLA 协议和通过单元测试
* 签署 CLA
......@@ -166,6 +197,7 @@ git push origin new_branch
1. 请您查看 PR 中的 Check 部分,找到 license/cla ,并点击右侧 detail ,进入 CLA 网站
2. 点击 CLA 网站中的 `Sign in with GitHub to agree` , 点击完成后将会跳转回您的 Pull Request 页面
<a name="1.2.10"></a>
#### 1.2.10 删除分支
* 删除远程分支
......@@ -189,6 +221,7 @@ git checkout develop
git branch -D new_branch
```
<a name="1.2.11"></a>
#### 1.2.11 提交代码的一些约定
为了使官方维护人员在评审代码时更好地专注于代码本身,请您每次提交代码时,遵守以下约定:
......@@ -219,11 +252,12 @@ git branch -D new_branch
- 请给出总体的修改情况。
- 请采用 `start a review` 进行回复,而非直接回复的方式。原因是每个回复都会发送一封邮件,会造成邮件灾难。
## 2. 总结
<a name="2"></a>
## 二、总结
* 开源社区依赖于众多开发者与用户的贡献和反馈,在这里感谢与期待大家向 PaddleClas 提出宝贵的意见与 Pull Request ,希望我们可以一起打造一个领先实用全面的图像识别代码仓库!
## 3. 参考文献
<a name="3"></a>
## 三、参考文献
1. [PaddlePaddle本地开发指南](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/08_contribution/index_cn.html)
2. [向开源框架提交pr的过程](https://blog.csdn.net/vim_wj/article/details/78300239)
# 知识蒸馏
## 目录
- [模型压缩与知识蒸馏方法简介](#1)
- [SSLD 蒸馏策略](#2)
- [2.1 简介](#2.1)
- [2.2 数据选择](#2.2)
- [实验](#3)
- [3.1 教师模型的选择](#3.1)
- [3.2 大数据蒸馏](#3.2)
- [3.3 ImageNet1k 训练集 finetune](#3.3)
- [3.4 数据增广以及基于 Fix 策略的微调](#3.4)
- [3.5 实验过程中的一些问题](#3.5)
- [蒸馏模型的应用](#4)
- [4.1 使用方法](#4.1)
- [4.2 迁移学习 finetune](#4.2)
- [4.3 目标检测](#4.3)
- [SSLD实战](#5)
- [5.1 参数配置](#5.1)
- [5.2 启动命令](#5.2)
- [5.3 注意事项](#5.3)
- [参考文献](#6)
<a name="1"></a>
## 一、模型压缩与知识蒸馏方法简介
近年来,深度神经网络在计算机视觉、自然语言处理等领域被验证是一种极其有效的解决问题的方法。通过构建合适的神经网络,加以训练,最终网络模型的性能指标基本上都会超过传统算法。
......@@ -13,8 +36,10 @@
<img src="../../images/distillation/distillation_perform_s.jpg" width = "600" />
</div>
<a name="2"></a>
## 二、SSLD 蒸馏策略
<a name="2.1"></a>
### 2.1 简介
SSLD 的流程图如下图所示。
......@@ -36,7 +61,7 @@ SSLD 的流程图如下图所示。
* ImageNet1k 蒸馏 finetune 。 我们仅使用 ImageNet1k 数据,使用蒸馏方法对上述模型进行 finetune ,最终仍然可以获得 0.4% 的性能提升( `78.5%->78.9%` )。
<a name="2.2"></a>
### 2.2 数据选择
* SSLD 蒸馏方案的一大特色就是无需使用图像的真值标签,因此可以任意扩展数据集的大小,考虑到计算资源的限制,我们在这里仅基于 ImageNet22k 数据集对蒸馏任务的训练集进行扩充。在 SSLD 蒸馏任务中,我们使用了 `Top-k per class` 的数据采样方案 [3] 。具体步骤如下。
......@@ -50,11 +75,12 @@ SSLD 的流程图如下图所示。
* Top-k 数据选择, ImageNet1k 数据共有 1000 类,对于每一类,找出属于该类并且得分最高的 `k` 张图片,最终得到一个数据量不超过`1000*k`的数据集(某些类上得到的图片数量可能少于 `k` 张)。
* 将该数据集与 ImageNet1k 的训练集融合组成最终蒸馏模型所使用的数据集,数据量为 500 万。
<a name="3"></a>
## 三、实验
* PaddleClas 的蒸馏策略为`大数据集训练 + ImageNet1k 蒸馏 finetune`的策略。选择合适的教师模型,首先在挑选得到的 500 万数据集上进行训练,然后在 ImageNet1k 训练集上进行 finetune,最终得到蒸馏后的学生模型。
<a name="3.1"></a>
### 3.1 教师模型的选择
为了验证教师模型和学生模型的模型大小差异和教师模型的模型精度对蒸馏结果的影响,我们做了几组实验验证。训练策略统一为:`cosine_decay_warmup,lr=1.3, epoch=120, bs=2048`,学生模型均为从头训练。
......@@ -75,6 +101,7 @@ SSLD 的流程图如下图所示。
因此最终在蒸馏实验中,对于ResNet系列学生模型,我们使用 `ResNeXt101_32x16d_wsl` 作为教师模型;对于 MobileNet 系列学生模型,我们使用蒸馏得到的 `ResNet50_vd` 作为教师模型。
<a name="3.2"></a>
### 3.2 大数据蒸馏
基于 PaddleClas 的蒸馏策略为`大数据集训练 + imagenet1k finetune` 的策略。
......@@ -92,6 +119,7 @@ SSLD 的流程图如下图所示。
| ResNet101_vd | 360 | 7e-5 | 1024/32 | 0.4 | cosine_decay_warmup | 83.41% |
| Res2Net200_vd_26w_4s | 360 | 4e-5 | 1024/32 | 0.4 | cosine_decay_warmup | 84.82% |
<a name="3.3"></a>
### 3.3 ImageNet1k 训练集 finetune
对于在大数据集上训练的模型,其学习到的特征可能与 ImageNet1k 数据特征有偏,因此在这里使用 ImageNet1k 数据集对模型进行 finetune。 finetune 的超参和 finetune 的精度收益如下。
......@@ -107,7 +135,7 @@ SSLD 的流程图如下图所示。
| ResNet101_vd | 30 | 7e-5 | 1024/32 | 0.004 | cosine_decay_warmup | 83.73% |
| Res2Net200_vd_26w_4s | 360 | 4e-5 | 1024/32 | 0.004 | cosine_decay_warmup | 85.13% |
<a name="3.4"></a>
### 3.4 数据增广以及基于 Fix 策略的微调
* 基于前文所述的实验结论,我们在训练的过程中加入自动增广 (AutoAugment)[4] ,同时进一步减小了 l2_decay (4e-5->2e-5) ,最终 ResNet50_vd 经过 SSLD 蒸馏策略,在 ImageNet1k 上的精度可以达到 82.99% ,相比之前不加数据增广的蒸馏策略再次增加了 0.6% 。
......@@ -115,7 +143,7 @@ SSLD 的流程图如下图所示。
* 对于图像分类任务,在测试的时候,测试尺度为训练尺度的 1.15 倍左右时,往往在不需要重新训练模型的情况下,模型的精度指标就可以进一步提升 [5] ,对于 82.99% 的 ResNet50_vd 在 320x320 的尺度下测试,精度可达 83.7% ,我们进一步使用 Fix 策略,即在 320x320 的尺度下进行训练,使用与预测时相同的数据预处理方法,同时固定除 FC 层以外的所有参数,最终在 320x320 的预测尺度下,精度可以达到 **84.0%**
<a name="3.5"></a>
### 3.5 实验过程中的一些问题
* 在预测过程中, batch norm 的平均值与方差是通过加载预训练模型得到(设其模式为 test mode )。在训练过程中, batch norm 是通过统计当前 batch 的信息(设其模式为 train mode ),与历史保存信息进行滑动平均计算得到,在蒸馏任务中,我们发现通过 train mode ,即教师模型的均值与方差实时变化的模式,去指导学生模型,比通过 test mode 蒸馏,得到的学生模型性能更好一些,下面是一组实验结果。因此我们在该蒸馏方案中,均使用 train mode 去得到教师模型的 soft label 。
......@@ -125,9 +153,10 @@ SSLD 的流程图如下图所示。
| ResNet50_vd | 82.35% | MobileNetV3_large_x1_0 | 76.00% |
| ResNet50_vd | 82.35% | MobileNetV3_large_x1_0 | 75.84% |
<a name="4"></a>
## 四、蒸馏模型的应用
<a name="4.1"></a>
### 4.1 使用方法
* 中间层学习率调整。蒸馏得到的模型的中间层特征图更加精细化,因此将蒸馏模型预训练应用到其他任务中时,如果采取和之前相同的学习率,容易破坏中间层特征。而如果降低整体模型训练的学习率,则会带来训练收敛速度慢的问题。因此我们使用了中间层学习率调整的策略。具体地:
......@@ -137,7 +166,7 @@ SSLD 的流程图如下图所示。
* 适当的 l2 decay 。不同分类模型在训练的时候一般都会根据模型设置不同的 l2 decay ,大模型为了防止过拟合,往往会设置更大的 l2 decay ,如 ResNet50 等模型,一般设置为 `1e-4` ;而如 MobileNet 系列模型,在训练时往往都会设置为 `1e-5~4e-5` ,防止模型过度欠拟合,在蒸馏时亦是如此。在将蒸馏模型应用到目标检测任务中时,我们发现也需要调节 backbone 甚至特定任务模型模型的 l2 decay ,和预训练蒸馏时的 l2 decay 尽可能保持一致。以 Faster RCNN MobiletNetV3 FPN 为例,我们发现仅修改该参数,在 COCO2017 数据集上就可以带来最多 0.5% 左右的精度 (mAP) 提升(默认 Faster RCNN l2 decay 为 1e-4 ,我们修改为 1e-5~4e-5 均有 0.3%~0.5% 的提升)。
<a name="4.2"></a>
### 4.2 迁移学习 finetune
* 为验证迁移学习的效果,我们在 10 个小的数据集上验证其效果。在这里为了保证实验的可对比性,我们均使用 ImageNet1k 数据集训练的标准预处理过程,对于蒸馏模型我们也添加了蒸馏模型中间层学习率的搜索。
* 对于 ResNet50_vd , baseline 为 Top1 Acc 79.12% 的预训练模型基于 grid search 搜索得到的最佳精度,对比实验则为基于该精度对预训练和中间层学习率进一步搜索得到的最佳精度。下面给出 10 个数据集上所有 baseline 和蒸馏模型的精度对比。
......@@ -158,7 +187,7 @@ SSLD 的流程图如下图所示。
* 可以看出在上面 10 个数据集上,结合适当的中间层学习率倍数设置,蒸馏模型平均能够带来 1% 以上的精度提升。
<a name="4.3"></a>
### 4.3 目标检测
我们基于两阶段目标检测 Faster/Cascade RCNN 模型验证蒸馏得到的预训练模型的效果。
......@@ -175,11 +204,12 @@ SSLD 的流程图如下图所示。
在这里可以看出,对于未蒸馏模型,过度调整中间层学习率反而降低最终检测模型的性能指标。基于该蒸馏模型,我们也提供了领先的服务端实用目标检测方案,详细的配置与训练代码均已开源,可以参考 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_enhance)
<a name="5"></a>
## 五、SSLD实战
本节将基于 ImageNet-1K 的数据集详细介绍 SSLD 蒸馏实验,如果想快速体验此方法,可以参考 [**30分钟玩转PaddleClas(进阶版)**](../../tutorials/quick_start_professional.md) 中基于 CIFAR100 的 SSLD 蒸馏实验。
<a name="5.1"></a>
### 5.1 参数配置
实战部分提供了 SSLD 蒸馏的示例,在 `ppcls/configs/ImageNet/Distillation/mv3_large_x1_0_distill_mv3_small_x1_0.yaml` 中提供了 `MobileNetV3_large_x1_0` 蒸馏`MobileNetV3_small_x1_0` 的配置文件,用户可以在 `tools/train.sh` 里直接替换配置文件的路径即可使用。
......@@ -207,7 +237,7 @@ Arch:
在参数配置中,`freeze_params_list` 中需要指定模型是否需要冻结参数, `models` 中需要指定 Teacher 模型和 Student 模型,其中 Teacher 模型需要加载预训练模型。用户可以直接在此处更改模型。
<a name="5.2"></a>
### 5.2 启动命令
当用户配置完训练环境后,类似于训练其他分类任务,只需要将 `tools/train.sh` 中的配置文件替换成为相应的蒸馏配置文件即可。
......@@ -229,6 +259,7 @@ python -m paddle.distributed.launch \
sh tools/train.sh
```
<a name="5.3"></a>
### 5.3 注意事项
* 用户在使用 SSLD 蒸馏之前,首先需要在目标数据集上训练一个教师模型,该教师模型用于指导学生模型在该数据集上的训练。
......@@ -239,8 +270,8 @@ sh tools/train.sh
* 若用户准备添加无标签的训练数据,只需要将新的训练数据放置在原本训练数据的路径下,生成新的数据 list 即可,另外,新生成的数据 list 需要将无标签的数据添加伪标签(只是为了统一读数据)。
## 参考文献
<a name="6"></a>
## 六、参考文献
[1] Hinton G, Vinyals O, Dean J. Distilling the knowledge in a neural network[J]. arXiv preprint arXiv:1503.02531, 2015.
......
## 模型量化、裁剪使用介绍
# 模型量化、裁剪使用介绍
复杂的模型有利于提高模型的性能,但也导致模型中存在一定冗余。此部分提供精简模型的功能,包括两部分:模型量化(量化训练、离线量化)、模型剪枝。
其中模型量化将全精度缩减到定点数减少这种冗余,达到减少模型计算复杂度,提高模型推理性能的目的。
......@@ -12,8 +13,23 @@
在开始本教程之前,建议先了解[PaddleClas模型的训练方法](../models_training/classification.md)以及[PaddleSlim](https://paddleslim.readthedocs.io/zh_CN/latest/index.html),相关裁剪、量化方法可以参考[模型裁剪量化算法介绍文档](../algorithm_introduction/model_prune_quantization.md)
## 目录
- [准备环境](#1)
- [1.1 安装PaddleSlim](#1.1)
- [1.2 准备训练好的模型](#1.2)
- [快速开始](#2)
- [2.1 模型量化](#2.1)
- [2.1.1 在线量化训练](2.1.1)
- [2.1.2 离线量化](2.1.2)
- [2.2 模型剪枝](#2.2)
- [导出模型](#3)
- [模型部署](#4)
- [训练超参数建议](#5)
## 快速开始
<a name="1"></a>
## 一、准备环境
当训练出一个模型后,如果希望进一步的压缩模型大小并加速预测,可使用量化或者剪枝的方法压缩模型。
模型压缩主要包括五个步骤:
......@@ -23,7 +39,8 @@
4. 导出量化推理模型
5. 量化模型预测部署
### 1. 安装PaddleSlim
<a name="1.1"></a>
### 1.1 安装PaddleSlim
* 可以通过pip install的方式进行安装。
......@@ -39,11 +56,13 @@ cd Paddleslim
python3.7 setup.py install
```
### 2. 准备训练好的模型
<a name="1.2"></a>
### 1.2 准备训练好的模型
PaddleClas提供了一系列训练好的[模型](../models/models_intro.md),如果待量化的模型不在列表中,需要按照[常规训练](../models_training/classification.md)方法得到训练好的模型。
### 3. 模型裁剪、量化
<a name="2"></a>
## 二、 快速开始
进入PaddleClas根目录
......@@ -53,11 +72,13 @@ cd PaddleClas
`slim`训练相关代码已经集成到`ppcls/engine/`下,离线量化代码位于`deploy/slim/quant_post_static.py`
#### 3.1 模型量化
<a name="2.1"></a>
### 2.1 模型量化
量化训练包括离线量化训练和在线量化训练,在线量化训练效果更好,需加载预训练模型,在定义好量化策略后即可对模型进行量化。
##### 3.1.1 在线量化训练
<a name="2.1.1"></a>
#### 2.1.1 在线量化训练
训练指令如下:
......@@ -82,7 +103,8 @@ python3.7 -m paddle.distributed.launch \
-c ppcls/configs/slim/ResNet50_vd_quantization.yaml
```
##### 3.1.2 离线量化
<a name="2.1.2"></a>
#### 2.1.2 离线量化
**注意**:目前离线量化,必须使用已经训练好的模型,导出的`inference model`进行量化。一般模型导出`inference model`可参考[教程](../inference_deployment/export_model.md).
......@@ -98,7 +120,8 @@ python3.7 deploy/slim/quant_post_static.py -c ppcls/configs/ImageNet/ResNet/ResN
执行成功后,在`Global.save_inference_dir`的目录下,生成`quant_post_static_model`文件夹,其中存储生成的离线量化模型,其可以直接进行预测部署,无需再重新导出模型。
#### 3.2 模型剪枝
<a name="2.2"></a>
### 2.2 模型剪枝
训练指令如下:
......@@ -120,7 +143,8 @@ python3.7 -m paddle.distributed.launch \
-c ppcls/configs/slim/ResNet50_vd_prune.yaml
```
### 4. 导出模型
<a name="3"></a>
## 三、导出模型
在得到在线量化训练、模型剪枝保存的模型后,可以将其导出为inference model,用于预测部署,以模型剪枝为例:
......@@ -131,16 +155,16 @@ python3.7 tools/export.py \
-o Global.save_inference_dir=./inference
```
<a name="4"></a>
## 四、模型部署
### 5. 模型部署
上述步骤导出的模型可以直接使用inferecne 进行部署,参考[inference部署](../inference_deployment/)
上述步骤导出的模型可以直接使用inferecne进行部署,参考[inference部署](../inference_deployment/)
也通过PaddleLite的opt模型转换工具,完成inference模型到移动端模型转换,用于移动端的模型部署。
移动端模型部署的可参考 [移动端模型部署](../../../deploy/lite/readme.md)
移动端模型部署的可参考 [移动端模型部署](../inference_deployment/paddle_lite_deploy.md)
## 训练超参数建议
<a name="5"></a>
## 五、训练超参数建议
* 量化、裁剪训练时,建议加载常规训练得到的预训练模型,加速量化训练收敛。
* 量化训练时,建议初始学习率修改为常规训练的`1/20~1/10`,同时将训练epoch数修改为常规训练的`1/5~1/2`,学习率策略方面,加上Warmup,其他配置信息不建议修改。
......
......@@ -3,10 +3,38 @@
## ImageNet预训练模型库
### 目录
- [模型库概览图](#模型库概览图)
- [SSLD知识蒸馏预训练模型](#模型库概览图)
- [服务器端知识蒸馏模型](#服务器端知识蒸馏模型)
- [移动端知识蒸馏模型](#移动端知识蒸馏模型)
- [Intel CPU端知识蒸馏模型](#Intel-CPU端知识蒸馏模型)
- [PP-LCNet系列](#PP-LCNet系列)
- [ResNet系列](#ResNet系列)
- [移动端系列](#移动端系列)
- [SEResNeXt与Res2Net系列](#SEResNeXt与Res2Net系列)
- [DPN与DenseNet系列](#DPN与DenseNet系列)
- [HRNet系列](#HRNet系列)
- [Inception系列](#Inception系列)
- [EfficientNet与ResNeXt101_wsl系列](#EfficientNet与ResNeXt101_wsl系列)
- [ResNeSt与RegNet系列](#ResNeSt与RegNet系列)
- [ViT_and_DeiT系列](#ViT_and_DeiT系列)
- [RepVGG系列](#RepVGG系列)
- [MixNet系列](#MixNet系列)
- [SwinTransformer系列](#SwinTransformer系列)
- [LeViT系列](#LeViT系列)
- [HarDNet系列](#HarDNet系列)
- [DLA系列](#DLA系列)
- [RedNet系列](#RedNet系列)
- [TNT系列](#TNT系列)
- [其他模型](#其他模型)
<a name="模型库概览图"></a>
### 模型库概览图
基于ImageNet1k分类数据集,PaddleClas支持35个系列分类网络结构以及对应的164个图像分类预训练模型,训练技巧、每个系列网络结构的简单介绍和性能评估将在相应章节展现,下面所有的速度指标评估环境如下:
基于ImageNet1k分类数据集,PaddleClas支持36个系列分类网络结构以及对应的175个图像分类预训练模型,训练技巧、每个系列网络结构的简单介绍和性能评估将在相应章节展现,下面所有的速度指标评估环境如下:
* Arm CPU的评估环境基于骁龙855(SD855)。
* Intel CPU的评估环境基于Intel(R) Xeon(R) Gold 6148。
* GPU评估环境基于T4机器,在FP32+TensorRT配置下运行500次测得(去除前10次的warmup时间)。
......@@ -27,7 +55,8 @@
### SSLD知识蒸馏预训练模型
基于SSLD知识蒸馏的预训练模型列表如下所示,更多关于SSLD知识蒸馏方案的介绍可以参考:[SSLD知识蒸馏文档](./knowledge_distillation.md)
* 服务器端知识蒸馏模型
<a name="服务器端知识蒸馏模型"></a>
#### 服务器端知识蒸馏模型
| 模型 | Top-1 Acc | Reference<br>Top-1 Acc | Acc gain | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
|---------------------|-----------|-----------|---------------|----------------|-----------|----------|-----------|-----------------------------------|
......@@ -41,8 +70,8 @@
| HRNet_W48_C_ssld | 0.836 | 0.790 | 0.046 | 13.707 | 34.435 | 34.58 | 77.47 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/HRNet_W48_C_ssld_pretrained.pdparams) |
| SE_HRNet_W64_C_ssld | 0.848 | - | - | 31.697 | 94.995 | 57.83 | 128.97 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/SE_HRNet_W64_C_ssld_pretrained.pdparams) |
* 移动端知识蒸馏模型
<a name="移动端知识蒸馏模型"></a>
#### 移动端知识蒸馏模型
| 模型 | Top-1 Acc | Reference<br>Top-1 Acc | Acc gain | SD855 time(ms)<br>bs=1 | Flops(G) | Params(M) | 模型大小(M) | 下载地址 |
|---------------------|-----------|-----------|---------------|----------------|-----------|----------|-----------|-----------------------------------|
......@@ -53,8 +82,8 @@
| MobileNetV3_small_x1_0_ssld | 0.713 | 0.682 | 0.031 | 6.546 | 0.123 | 2.94 | 12 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/MobileNetV3_small_x1_0_ssld_pretrained.pdparams) |
| GhostNet_x1_3_ssld | 0.794 | 0.757 | 0.037 | 19.983 | 0.44 | 7.3 | 29 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GhostNet_x1_3_ssld_pretrained.pdparams) |
* Intel CPU端知识蒸馏模型
<a name="Intel-CPU端知识蒸馏模型"></a>
#### Intel CPU端知识蒸馏模型
| 模型 | Top-1 Acc | Reference<br>Top-1 Acc | Acc gain | Intel-Xeon-Gold-6148 time(ms)<br>bs=1 | Flops(M) | Params(M) | 下载地址 |
|---------------------|-----------|-----------|---------------|----------------|----------|-----------|-----------------------------------|
......@@ -84,8 +113,8 @@ PP-LCNet系列模型的精度、速度指标如下表所示,更多关于该系
| PPLCNet_x2_5 |0.7660 | 0.9300 | 5.39 | 906 | 9.0 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x2_5_pretrained.pdparams) |
<a name="ResNet及其Vd系列"></a>
### ResNet及其Vd系列
<a name="ResNet系列"></a>
### ResNet系列
ResNet及其Vd系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNet及其Vd系列模型文档](../models/ResNet_and_vd.md)
......@@ -314,7 +343,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
<a name="RepVGG系列"></a>
### RepVGG系列
关于RepVGG系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RepVGG系列模型文档](../models/RepVGG.md)
......@@ -334,7 +362,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| RepVGG_B3g4 | 0.7965 | 0.9485 | | | | | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_B3g4_pretrained.pdparams) |
<a name="MixNet系列"></a>
### MixNet系列
关于MixNet系列模型的精度、速度指标如下表所示,更多介绍可以参考:[MixNet系列模型文档](../models/MixNet.md)
......@@ -346,7 +373,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| MixNet_L | 0.7860 | 0.9437 | | | 579.017 | 7.384 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixNet_L_pretrained.pdparams) |
<a name="ReXNet系列"></a>
### ReXNet系列
关于ReXNet系列模型的精度、速度指标如下表所示,更多介绍可以参考:[ReXNet系列模型文档](../models/ReXNet.md)
......@@ -360,7 +386,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| ReXNet_3_0 | 0.8209 | 0.9612 | | | 3.445 | 34.833 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_3_0_pretrained.pdparams) |
<a name="SwinTransformer系列"></a>
### SwinTransformer系列
关于SwinTransformer系列模型的精度、速度指标如下表所示,更多介绍可以参考:[SwinTransformer系列模型文档](../models/SwinTransformer.md)
......@@ -463,7 +488,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
**注**:TNT模型的数据预处理部分`NormalizeImage`中的`mean``std`均为0.5。
<a name="其他模型"></a>
### 其他模型
关于AlexNet、SqueezeNet系列、VGG系列、DarkNet53等模型的精度、速度指标如下表所示,更多介绍可以参考:[其他模型文档](../models/Others.md)
......
# 图像分类
---
## 目录
- [数据集介绍](#1)
- [1.1 ImageNet-1k](#1.1)
- [1.2 CIFAR-10/CIFAR-100](#1.2)
- [图像分类的流程](#2)
- [2.1 数据及其预处理](#2.1)
- [2.2 模型准备](#2.2)
- [2.3 模型训练](#2.3)
- [2.4 模型评估](#2.4)
- [主要算法简介](#3)
图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析等,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等。
一般来说,图像分类通过手工特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。在深度学习算法之前使用较多的是基于词袋(Bag of Words)模型的物体分类方法。而基于深度学习的图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN)近年来在图像领域取得了惊人的成绩,CNN直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于"输入-输出"直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。
图像分类是计算机视觉里很基础但又重要的一个领域,其研究成果一直影响着计算机视觉甚至深度学习的发展,图像分类有很多子领域,如多标签分类、细粒度分类等,此处只对单标签图像分类做一个简述。
<a name="1"></a>
## 一、数据集介绍
<a name="1.1"></a>
### 1.1 ImageNet-1k
ImageNet项目是一个大型视觉数据库,用于视觉目标识别软件研究。该项目已手动注释了1400多万张图像,以指出图片中的对象,并在至少100万张图像中提供了边框。ImageNet-1k是ImageNet数据集的子集,其包含1000个类别。训练集包含1281167个图像数据,验证集包含50000个图像数据。2010年以来,ImageNet项目每年举办一次图像分类竞赛,即ImageNet大规模视觉识别挑战赛(ILSVRC)。挑战赛使用的数据集即为ImageNet-1k。到目前为止,ImageNet-1k已经成为计算机视觉领域发展的最重要的数据集之一,其促进了整个计算机视觉的发展,很多计算机视觉下游任务的初始化模型都是基于该数据集训练得到的权重。
<a name="1.2"></a>
### 1.2 CIFAR-10/CIFAR-100
CIFAR-10数据集由10个类的60000个彩色图像组成,图像分辨率为32x32,每个类有6000个图像,其中训练集5000张,验证集1000张,10个不同的类代表飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、轮船和卡车。CIFAR-100数据集是CIFAR-10的扩展,由100个类的60000个彩色图像组成,图像分辨率为32x32,每个类有600个图像,其中训练集500张,验证集100张。由于这两个数据集规模较小,因此可以让研究人员快速尝试不同的算法。这两个数据集也是图像分类领域测试模型好坏的常用数据集。
<a name="2"></a>
## 二、图像分类的流程
将准备好的训练数据做相应的数据预处理后经过图像分类模型,模型的输出与真实标签做交叉熵损失函数,该损失函数描述了模型的收敛方向,遍历所有的图片数据输入模型,对最终损失函数通过某些优化器做相应的梯度下降,将梯度信息回传到模型中,更新模型的权重,如此循环往复遍历多次数据,即可得到一个图像分类的模型。
<a name="2.1"></a>
### 2.1 数据及其预处理
数据的质量及数量往往可以决定一个模型的好坏。在图像分类领域,数据包括图像及标签。在大部分情形下,带有标签的数据比较匮乏,所以数量很难达到使模型饱和的程度,为了可以使模型学习更多的图像特征,图像数据在进入模型之前要经过很多图像变换或者数据增强,来保证输入图像数据的多样性,从而保证模型有更好的泛化能力。PaddleClas提供了训练ImageNet-1k的标准图像变换,也提供了8中数据增强的方法,相关代码可以[数据处理](../../../ppcls/data/preprocess),配置文件可以参考[数据增强配置文件](../../../ppcls/configs/ImageNet/DataAugment)
<a name="2.2"></a>
### 2.2 模型准备
在数据确定后,模型往往决定了最终算法精度的上限,在图像分类领域,经典的模型层出不穷,PaddleClas提供了36个系列共175个ImageNet预训练模型。具体的精度、速度等指标请参考[骨干网络和预训练模型库](./ImageNet_models.md)
<a name="2.3"></a>
### 2.3 模型训练
在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas提供了一些列的[训练调优方法](../models/Tricks.md),可以快速助你获得高精度的模型。
<a name="2.4"></a>
### 2.4 模型评估
当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是Top1-Acc或者Top5-Acc,该指标越高往往代表模型性能越好。
<a name="3"></a>
## 三、主要算法简介
- LeNet:Yan LeCun等人于上个世纪九十年代第一次将卷积神经网络应用到图像分类任务上,创造性的提出了LeNet,在手写数字识别任务上取得了巨大的成功。
......
## 模型裁剪、量化算法介绍
# 模型裁剪、量化算法介绍
深度学习因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩、优化加速、异构计算等方法突破瓶颈。模型压缩算法能够有效降低参数冗余,从而减少存储占用、通信带宽和计算复杂度,有助于深度学习的应用部署。其中模型量化、裁剪应用比较广泛。在PaddleClas中,主要应该应用以下两种算法。
......@@ -7,7 +7,7 @@
其中具体算法参数请参考[PaddeSlim](https://github.com/PaddlePaddle/PaddleSlim/)
### PACT量化方法
## PACT量化方法
模型量化主要包括两个部分,一是对权重Weight量化,一是针对激活值Activation量化。同时对两部分进行量化,才能获得最大的计算效率收益。权重可以借助网络正则化等手段,让权重分布尽量紧凑,减少离群点、不均匀分布情况发生,而对于激活值还缺乏有效的手段。
......@@ -38,7 +38,7 @@
算法具体参数请参考PaddleSlim中[参数介绍](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/dygraph/quanter/qat.rst#qat)
### FPGM裁剪
## FPGM裁剪
模型剪枝是减小模型大小,提升预测效率的一种非常重要的手段。在之前的网络剪枝文章中一般将网络filter的范数作为其重要性度量,**范数值较小的代表的filter越不重要**,将其从网络中裁剪掉,反之也就越重要。而**FPGM**认为之前的方法要依赖如下两点
......
......@@ -4,7 +4,18 @@
---
## 1. 数据集格式说明
## 目录
- [数据集格式说明](#数据集格式说明)
- [图像分类任务常见数据集介绍](#图像分类任务常见数据集介绍)
- [2.1 ImageNet1k](#ImageNet1k])
- [2.2 Flowers102](#Flowers102)
- [2.3 CIFAR10 / CIFAR100](#CIFAR10/CIFAR100)
- [2.4 MNIST](#MNIST)
- [2.5 NUS-WIDE](#NUS-WIDE)
<a name="数据集格式说明"></a>
## 一、数据集格式说明
PaddleClas 使用 `txt` 格式文件指定训练集和测试集,以 `ImageNet1k` 数据集为例,其中 `train_list.txt``val_list.txt` 的格式形如:
......@@ -19,11 +30,12 @@ train/n01440764/n01440764_10026.JPEG 0
val/ILSVRC2012_val_00000001.JPEG 65
...
```
## 2. 图像分类任务常见数据集介绍
<a name="图像分类任务常见数据集介绍"></a>
## 二、 图像分类任务常见数据集介绍
这里整理了常用的图像分类任务数据集,持续更新中,欢迎各位小伙伴补充完善~
<a name="ImageNet1k"></a>
### 2.1 ImageNet1k
[ImageNet](https://image-net.org/)项目是一个大型视觉数据库,用于视觉目标识别研究任务,该项目已手动标注了 1400 多万张图像。ImageNet-1k 是 ImageNet 数据集的子集,其包含 1000 个类别。训练集包含 1281167 个图像数据,验证集包含 50000 个图像数据。2010 年以来,ImageNet 项目每年举办一次图像分类竞赛,即 ImageNet 大规模视觉识别挑战赛(ILSVRC)。挑战赛使用的数据集即为 ImageNet-1k。到目前为止,ImageNet-1k 已经成为计算机视觉领域发展的最重要的数据集之一,其促进了整个计算机视觉的发展,很多计算机视觉下游任务的初始化模型都是基于该数据集训练得到的。
......@@ -53,6 +65,7 @@ PaddleClas/dataset/ILSVRC2012/
|_ val_list.txt
```
<a name="Flowers102"></a>
### 2.2 Flowers102
数据集 | 训练集大小 | 测试集大小 | 类别数 | 备注|
......@@ -88,18 +101,21 @@ PaddleClas/dataset/flowers102/
|_ val_list.txt
```
<a name="CIFAR10/CIFAR100"></a>
### 2.3 CIFAR10 / CIFAR100
CIFAR-10 数据集由 10 个类的 60000 个彩色图像组成,图像分辨率为 32x32,每个类有 6000 个图像,其中训练集 5000 张,验证集 1000 张,10 个不同的类代表飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、轮船和卡车。CIFAR-100 数据集是CIFAR-10的扩展,由 100 个类的 60000 个彩色图像组成,图像分辨率为 32x32,每个类有 600 个图像,其中训练集 500 张,验证集 100 张。
数据集地址:http://www.cs.toronto.edu/~kriz/cifar.html
<a name="MNIST"></a>
### 2.4 MNIST
MMNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例。其包含 60000 张图片数据,50000 张作为训练集,10000 张作为验证集,每张图片的大小为 28 * 28。
数据集地址:http://yann.lecun.com/exdb/mnist/
<a name="NUS-WIDE"></a>
### 2.5 NUS-WIDE
NUS-WIDE 是一个多分类数据集。该数据集包含 269648 张图片, 81 个类别, 每张图片被标记为该 81 个类别中的某一类或某几类。
......
......@@ -4,7 +4,21 @@
---
## 1. 数据集格式说明
## 目录
- [数据集格式说明](#数据集格式说明)
- [图像识别任务常见数据集介绍](#图像识别任务常见数据集介绍)
- [2.1 通用图像识别数据集](#通用图像识别数据集)
- [2.2 垂类图像识别数据集](#垂类图像识别数据集)
- [2.2.1 动漫人物识别](#动漫人物识别)
- [2.2.2 商品识别](#商品识别)
- [2.2.3 Logo识别](#Logo识别)
- [2.2.4 车辆识别](#车辆识别)
<a name="数据集格式说明"></a>
## 一、数据集格式说明
与分类任务数据集不同,图像检索任务的数据集分为以下三部分:
......@@ -23,14 +37,31 @@ train/99/Ovenbird_0128_93366.jpg 99 6
...
```
验证数据集(`CUB_200_2011`中既是gallery dataset,也是query dataset) `test_list.txt` 文件内容格式如下所示:
```shell
# 采用"空格"作为分隔符号
...
test/200/Common_Yellowthroat_0126_190407.jpg 200 1
...
test/200/Common_Yellowthroat_0114_190501.jpg 200 6
...
```
每行数据使用“空格”分割,三列数据的含义分别是训练数据的路径、训练数据的label信息、训练数据的unique id。
**注意**:当gallery dataset和query dataset相同时,为了去掉检索得到的第一个数据(检索图片本身无须评估),每个数据需要对应一个unique id,用于后续评测mAP、recall@1等指标。
**注意**
1.当gallery dataset和query dataset相同时,为了去掉检索得到的第一个数据(检索图片本身无须评估),每个数据需要对应一个unique id(每张图片的id不同即可,可以用行号来表示unique id),用于后续评测mAP、recall@1等指标。yaml配置文件的数据集选用`VeriWild`
## 2. 图像识别任务常见数据集介绍
2.当gallery dataset和query dataset不同时,无需增加unique id,`query_list.txt``gallery_list.txt` 均为两列,分别是训练数据的路径、训练数据的label信息。yaml配置文件的数据集选用`ImageNetDataset`
<a name="图像识别任务常见数据集介绍"></a>
## 二、图像识别任务常见数据集介绍
这里整理了常用的图像识别任务数据集,持续更新中,欢迎各位小伙伴补充完善~
<a name="通用图像识别数据集"></a>
### 2.1 通用图像识别数据集
- SOP: SOP数据集是通用识别研究领域、MetricLearning技术研究方向常用的一个商品数据集, 其包含从eBay.com下载的22,634个产品的120,053张图片。其中, 训练集包含图片59551张, 类别数11318; 验证集包含图片60502张,类别数11316个。
......@@ -48,8 +79,10 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训
地址: http://mmlab.ie.cuhk.edu.hk/projects/DeepFashion.html
<a name="垂类图像识别数据集"></a>
### 2.2 垂类图像识别数据集
<a name="动漫人物识别"></a>
#### 2.2.1 动漫人物识别
+ iCartoonFace: iCartoonFace是由爱奇艺开放的目前全球最大的手工标注卡通人物检测数据集与识别数据集,它包含超过5013个卡通人物、389678张高质量实景图片。相比于其他数据集,它具有大规模、高质量、多样性丰富、挑战难度大等特点,是目前研究动漫人物识别最常用的数据集之一。
......@@ -63,7 +96,7 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训
地址: http://cvit.iiit.ac.in/research/projects/cvit-projects/cartoonfaces
<a name="商品识别"></a>
#### 2.2.2 商品识别
+ AliProduct: AliProduct数据集是目前开源最大的商品数据集,它是一个SKU级别的图像分类数据集, 包含5万类别、300万张商品图像,商品图像的类别和总量均为业界之最。此数据集中涵盖了大量的生活用品、食物等,数据集中没有人工标注,数据较脏,数据分布较不均衡,且有很多相似的商品图片。
......@@ -75,6 +108,7 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训
+ DeepFashion-Inshop: 同通用图像识别数据集中的In-shop Clothes
<a name="Logo识别"></a>
### 2.2.3 Logo识别
+ Logo-2K+: Logo-2K+是一个仅用于logo图像识别的数据集,其包含10个大类,2341个小类和167140张图片。
......@@ -83,7 +117,7 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训
+ Tsinghua-Tencent 100K: 该数据集是从10万张腾讯街景全景图中创建的一个大型交通标志基准数据集。它提供包含30000个交通标志实例的100000张图像。这些图像涵盖了照度和天气条件的巨大变化。基准测试中的每个交通标志都标注了类别标签、边界框和像素掩码。 它总共包含222个类别 (0 background + 221 traffic signs)
地址: https://cg.cs.tsinghua.edu.cn/traffic-sign/
<a name="车辆识别"></a>
### 2.2.4 车辆识别
+ CompCars: 图像主要来自网络和监控数据,其中网络数据包含163个汽车制造商、1716个汽车型号的汽车。共136,726张全车图像,27,618张部分车图像。其中网络汽车数据包含bounding box、视角、5个属性(最大速度、排量、车门数、车座数、汽车类型)。监控数据包含50,000张前视角图像。
......
# FAQ
## 写在前面
* 我们收集整理了开源以来在issues和用户群中的常见问题并且给出了简要解答,旨在为图像分类的开发者提供一些参考,也希望帮助大家少走一些弯路。
* 图像分类领域大佬众多,模型和论文更新速度也很快,本文档回答主要依赖有限的项目实践,难免挂一漏万,如有遗漏和不足,也希望有识之士帮忙补充和修正,万分感谢。
## PaddleClas常见问题汇总
* [图像分类30个问题](#图像分类30个问题)
* [基础知识](#基础知识)
* [模型训练相关](#模型训练相关)
* [数据相关](#数据相关)
* [模型推理与预测相关](#模型推理与预测相关)
* [PaddleClas使用问题](#PaddleClas使用问题)
<a name="图像分类30个问题"></a>
## 图像分类30个问题
<a name="基础知识"></a>
### 基础知识
>>
* Q: 图像分类领域常用的分类指标有几种
* A:
* 对于单个标签的图像分类问题(仅包含1个类别与背景),评估指标主要有Accuracy,Precision,Recall,F-score等,令TP(True Positive)表示将正类预测为正类,FP(False Positive)表示将负类预测为正类,TN(True Negative)表示将负类预测为负类,FN(False Negative)表示将正类预测为负类。那么Accuracy=(TP + TN) / NUM,Precision=TP /(TP + FP),Recall=TP /(TP + FN)。
* 对于类别数大于1的图像分类问题,评估指标主要有Accuary和Class-wise Accuracy,Accuary表示所有类别预测正确的图像数量占总图像数量的百分比;Class-wise Accuracy是对每个类别的图像计算Accuracy,然后再对所有类别的Accuracy取平均得到。
>>
* Q: 怎样根据自己的任务选择合适的模型进行训练?
* A: 如果希望在服务器部署,或者希望精度尽可能地高,对模型存储大小或者预测速度的要求不是很高,那么推荐使用ResNet_vd、Res2Net_vd、DenseNet、Xception等适合于服务器端的系列模型;如果希望在移动端侧部署,则推荐使用MobileNetV3、GhostNet等适合于移动端的系列模型。同时,我们推荐在选择模型的时候可以参考[模型库](../models)中的速度-精度指标图。
>>
* Q: 如何进行参数初始化,什么样的初始化可以加快模型收敛?
* A: 众所周知,参数的初始化可以影响模型的最终性能。一般来说,如果目标数据集不是很大,建议使用ImageNet-1k训练得到的预训练模型进行初始化。如果是自己手动设计的网络或者暂时没有基于ImageNet-1k训练得到的预训练权重,可以使用Xavier初始化或者MSRA初始化,其中Xavier初始化是针对Sigmoid函数提出的,对RELU函数不太友好,网络越深,各层输入的方差越小,网络越难训练,所以当神经网络中使用较多RELU激活函数时,推荐使用MSRA初始化。
>>
* Q: 针对深度神经网络参数冗余的问题,目前有哪些比较好的解决办法?
* A: 目前有几种主要的方法对模型进行压缩,减少模型参数冗余的问题,如剪枝、量化、知识蒸馏等。模型剪枝指的是将权重矩阵中相对不重要的权值剔除,然后再重新对网络进行微调;模型量化指的是一种将浮点计算转成低比特定点计算的技术,如8比特、4比特等,可以有效的降低模型计算强度、参数大小和内存消耗。知识蒸馏是指使用教师模型(teacher model)去指导学生模型(student model)学习特定任务,保证小模型在参数量不变的情况下,性能有较大的提升,甚至获得与大模型相似的精度指标。
>>
* Q: 怎样在其他任务,如目标检测、图像分割、关键点检测等任务中选择比较合适的分类模型作为骨干网络?
* A: 在不考虑速度的情况下,在大部分的任务中,推荐使用精度更高的预训练模型和骨干网络,PaddleClas中开源了一系列的SSLD知识蒸馏预训练模型,如ResNet50_vd_ssld, Res2Net200_vd_26w_4s_ssld等,在模型精度和速度方面都是非常有优势的,推荐大家使用。对于一些特定的任务,如图像分割或者关键点检测等任务,对图像分辨率的要求比较高,那么更推荐使用HRNet等能够同时兼顾网络深度和分辨率的神经网络模型,PaddleClas也提供了HRNet_W18_C_ssld、HRNet_W48_C_ssld等精度非常高的HRNet SSLD蒸馏系列预训练模型,大家可以使用这些精度更高的预训练模型与骨干网络,提升自己在其他任务上的模型精度。
>>
* Q: 注意力机制是什么?目前有哪些比较常用的注意力机制方法?
* A: 注意力机制(Attention Mechanism)源于对人类视觉的研究。将注意力机制用在计算机视觉任务上,可以有效捕捉图片中有用的区域,从而提升整体网络性能。目前比较常用的有[SE block](https://arxiv.org/abs/1709.01507)[SK-block](https://arxiv.org/abs/1903.06586)[Non-local block](https://arxiv.org/abs/1711.07971)[GC block](https://arxiv.org/abs/1904.11492)[CBAM](https://arxiv.org/abs/1807.06521)等,核心思想就是去学习特征图在不同区域或者不同通道中的重要性,从而让网络更加注意显著性的区域。
<a name="模型训练相关"></a>
### 模型训练相关
>>
* Q: 使用深度卷积网络做图像分类如果训练一个拥有1000万个类的模型会碰到什么问题?
* A: 因为FC层参数很多,内存/显存/模型的存储占用都会大幅增大;模型收敛速度也会变慢一些。建议在这种情况下,再最后的FC层前加一层维度较小的FC,这样可以大幅减少模型的存储大小。
>>
* Q: 训练过程中,如果模型收敛效果很差,可能的原因有哪些呢?
* A: 主要有以下几个可以排查的地方:(1)应该检查数据标注,确保训练集和验证集的数据标注没有问题。(2)可以试着调整一下学习率(初期可以以10倍为单位进行调节),过大(训练震荡)或者过小(收敛太慢)的学习率都可能导致收敛效果差。(3)数据量太大,选择的模型太小,难以学习所有数据的特征。(4)可以看下数据预处理的过程中是否使用了归一化,如果没有使用归一化操作,收敛速度可能会比较慢。(5)如果数据量比较小,可以试着加载PaddleClas中提供的基于ImageNet-1k数据集的预训练模型,这可以大大提升训练收敛速度。(6)数据集存在长尾问题,可以参考[数据长尾问题解决方案](#jump)
>>
* Q: 训练图像分类任务时,该怎么选择合适的优化器?
* A: 优化器的目的是为了让损失函数尽可能的小,从而找到合适的参数来完成某项任务。目前业界主要用到的优化器有SGD、RMSProp、Adam、AdaDelt等,其中由于带momentum的SGD优化器广泛应用于学术界和工业界,所以我们发布的模型也大都使用该优化器来实现损失函数的梯度下降。带momentum的SGD优化器有两个劣势,其一是收敛速度慢,其二是初始学习率的设置需要依靠大量的经验,然而如果初始学习率设置得当并且迭代轮数充足,该优化器也会在众多的优化器中脱颖而出,使得其在验证集上获得更高的准确率。一些自适应学习率的优化器如Adam、RMSProp等,收敛速度往往比较快,但是最终的收敛精度会稍差一些。如果追求更快的收敛速度,我们推荐使用这些自适应学习率的优化器,如果追求更高的收敛精度,我们推荐使用带momentum的SGD优化器。
>>
* Q: 当前主流的学习率下降策略有哪些?一般需要怎么选择呢?
* A: 学习率是通过损失函数的梯度调整网络权重的超参数的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是piecewise_decay,即阶梯式下降学习率,如在ResNet50标准的训练中,我们设置的初始学习率是0.1,每30epoch学习率下降到原来的1/10,一共迭代120epoch。除了piecewise_decay,很多研究者也提出了学习率的其他下降方式,如polynomial_decay(多项式下降)、exponential_decay(指数下降),cosine_decay(余弦下降)等,其中cosine_decay无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay和piecewise_decay的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较peicewise_decay更好一些。
![](../../images/models/lr_decay.jpeg)
>>
* Q: Warmup学习率策略是什么?一般用在什么样的场景中?
* A: Warmup策略顾名思义就是让学习率先预热一下,在训练初期我们不直接使用最大的学习率,而是用一个逐渐增大的学习率去训练网络,当学习率增大到最高点时,再使用学习率下降策略中提到的学习率下降方式衰减学习率的值。如果使用较大的batch_size训练神经网络时,我们建议您使用warmup策略。实验表明,在batch_size较大时,warmup可以稳定提升模型的精度。在训练MobileNetV3等batch_size较大的实验中,我们默认将warmup中的epoch设置为5,即先用5epoch将学习率从0增加到最大值,再去做相应的学习率衰减。
>>
* Q: 什么是`batch size`?在模型训练中,怎么选择合适的`batch size`
* A: `batch size`是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络参与训练。论文[Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/abs/1706.02677),当`batch size`的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练ImageNet数据时,大部分的神经网络选择的初始学习率为0.1,`batch size`是256,所以根据实际的模型大小和显存情况,可以将学习率设置为0.1*k,batch_size设置为256*k。在实际任务中,也可以将该设置作为初始参数,进一步调节学习率参数并获得更优的性能。
>>
* Q: weight_decay是什么?怎么选择合适的weight_decay呢?
* A: 过拟合是机器学习中常见的一个名词,简单理解即为模型在训练数据上表现很好,但在测试数据上表现较差,在卷积神经网络中,同样存在过拟合的问题,为了避免过拟合,很多正则方式被提出,其中,weight_decay是其中一个广泛使用的避免过拟合的方式。在使用SGD优化器时,weight_decay等价于在最终的损失函数后添加L2正则化,L2正则化使得网络的权重倾向于选择更小的值,最终整个网络中的参数值更趋向于0,模型的泛化性能相应提高。在各大深度学习框架的实现中,该值表达的含义是L2正则前的系数,在paddle框架中,该值的名称是l2_decay,所以以下都称其为l2_decay。该系数越大,表示加入的正则越强,模型越趋于欠拟合状态。在训练ImageNet的任务中,大多数的网络将该参数值设置为1e-4,在一些小的网络如MobileNet系列网络中,为了避免网络欠拟合,该值设置为1e-5~4e-5之间。当然,该值的设置也和具体的数据集有关系,当任务的数据集较大时,网络本身趋向于欠拟合状态,可以将该值适当减小,当任务的数据集较小时,网络本身趋向于过拟合状态,可以将该值适当增大。下表展示了MobileNetV1_x0_25在ImageNet-1k上使用不同l2_decay的精度情况。由于MobileNetV1_x0_25是一个比较小的网络,所以l2_decay过大会使网络趋向于欠拟合状态,所以在该网络中,相对1e-4,3e-5是更好的选择。
| 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:|
| MobileNetV1_x0_25 | 1e-4 | 43.79%/67.61% | 50.41%/74.70% |
| MobileNetV1_x0_25 | 3e-5 | 47.38%/70.83% | 51.45%/75.45% |
>>
* Q: 标签平滑(label_smoothing)指的是什么?有什么效果呢?一般适用于什么样的场景中?
* A: Label_smoothing是深度学习中的一种正则化方法,其全称是 Label Smoothing Regularization(LSR),即标签平滑正则化。在传统的分类任务计算损失函数时,是将真实的one hot标签与神经网络的输出做相应的交叉熵计算,而label_smoothing是将真实的one hot标签做一个标签平滑的处理,使得网络学习的标签不再是一个hard label,而是一个有概率值的soft label,其中在类别对应的位置的概率最大,其他位置概率是一个非常小的数。具体的计算方式参见论文[2]。在label_smoothing里,有一个epsilon的参数值,该值描述了将标签软化的程度,该值越大,经过label smoothing后的标签向量的标签概率值越小,标签越平滑,反之,标签越趋向于hard label,在训练ImageNet-1k的实验里通常将该值设置为0.1。
在训练ImageNet-1k的实验中,我们发现,ResNet50大小级别及其以上的模型在使用label_smooting后,精度有稳定的提升。下表展示了ResNet50_vd在使用label_smoothing前后的精度指标。同时,由于label_smoohing相当于一种正则方式,在相对较小的模型上,精度提升不明显甚至会有所下降,下表展示了ResNet18在ImageNet-1k上使用label_smoothing前后的精度指标。可以明显看到,在使用label_smoothing后,精度有所下降。
| 模型 | Use_label_smoothing | Test acc1 |
|:--:|:--:|:--:|
| ResNet50_vd | 0 | 77.9% |
| ResNet50_vd | 1 | 78.4% |
| ResNet18 | 0 | 71.0% |
| ResNet18 | 1 | 70.8% |
>>
* Q: 在训练的时候怎么通过训练集和验证集的准确率或者loss确定进一步的调优策略呢?
* A: 在训练网络的过程中,通常会打印每一个epoch的训练集准确率和验证集准确率,二者刻画了该模型在两个数据集上的表现。通常来说,训练集的准确率比验证集准确率微高或者二者相当是比较不错的状态。如果发现训练集的准确率比验证集高很多,说明在这个任务上已经过拟合,需要在训练过程中加入更多的正则,如增大l2_decay的值,加入更多的数据增广策略,加入label_smoothing策略等;如果发现训练集的准确率比验证集低一些,说明在这个任务上可能欠拟合,需要在训练过程中减弱正则效果,如减小l2_decay的值,减少数据增广方式,增大图片crop区域面积,减弱图片拉伸变换,去除label_smoothing等。
>>
* Q: 怎么使用已有的预训练模型提升自己的数据集的精度呢?
* A: 在现阶段计算机视觉领域中,加载预训练模型来训练自己的任务已成为普遍的做法,相比从随机初始化开始训练,加载预训练模型往往可以提升特定任务的精度。一般来说,业界广泛使用的预训练模型是通过训练128万张图片1000类的ImageNet-1k数据集得到的,该预训练模型的fc层权重是是一个k\*1000的矩阵,其中k是fc层以前的神经元数,在加载预训练权重时,无需加载fc层的权重。在学习率方面,如果您的任务训练的数据集特别小(如小于1千张),我们建议你使用较小的初始学习率,如0.001(batch_size:256,下同),以免较大的学习率破坏预训练权重。如果您的训练数据集规模相对较大(大于10万),我们建议你尝试更大的初始学习率,如0.01或者更大。
<a name="数据相关"></a>
### 数据相关
>>
* Q: 图像分类的数据预处理过程一般包括哪些步骤?
* A: 以在ImageNet-1k数据集上训练ResNet50为例,一张图片被输入进网络,主要有图像解码、随机裁剪、随机水平翻转、标准化、数据重排,组batch并送进网络这几个步骤。图像解码指的是将图片文件读入到内存中,随机裁剪指的是将读入的图像随机拉伸并裁剪到长宽均为224的图像,随机水平翻转指的是对裁剪后的图片以0.5的概率进行水平翻转,标准化指的是将图片每个通道的数据通过去均值实现中心化的处理,使得数据尽可能符合`N(0,1)`的正态分布,数据重排指的是将数据由`[224,224,3]`的格式变为`[3,224,224]`的格式,组batch指的是将多幅图像组成一个批数据,送进网络进行训练。
>>
* Q: 随机裁剪是怎么影响小模型训练的性能的?
* A: 在ImageNet-1k数据的标准预处理中,随机裁剪函数中定义了scale和ratio两个值,两个值分别确定了图片crop的大小和图片的拉伸程度,其中scale的默认取值范围是0.08-1(lower_scale-upper_scale),ratio的默认取值范围是3/4-4/3(lower_ratio-upper_ratio)。在非常小的网络训练中,此类数据增强会使得网络欠拟合,导致精度有所下降。为了提升网络的精度,可以使其数据增强变的更弱,即增大图片的crop区域或者减弱图片的拉伸变换程度。我们可以分别通过增大lower_scale的值或缩小lower_ratio与upper_scale的差距来实现更弱的图片变换。下表列出了使用不同lower_scale训练MobileNetV2_x0_25的精度,可以看到,增大图片的crop区域面积后训练精度和验证精度均有提升。
| 模型 | Scale取值范围 | Train_acc1/acc5 | Test_acc1/acc5 |
|:--:|:--:|:--:|:--:|
| MobileNetV2_x0_25 | [0.08,1] | 50.36%/72.98% | 52.35%/75.65% |
| MobileNetV2_x0_25 | [0.2,1] | 54.39%/77.08% | 53.18%/76.14% |
>>
* Q: 数据量不足的情况下,目前有哪些常见的数据增广方法来增加训练样本的丰富度呢?
* A: PaddleClas中将目前比较常见的数据增广方法分为了三大类,分别是图像变换类、图像裁剪类和图像混叠类,图像变换类主要包括AutoAugment和RandAugment,图像裁剪类主要包括CutOut、RandErasing、HideAndSeek和GridMask,图像混叠类主要包括Mixup和Cutmix,更详细的关于数据增广的介绍可以参考:[数据增广章节](../algorithm_introduction/DataAugmentation.md)
>>
* Q: 对于遮挡情况比较常见的图像分类场景,该使用什么数据增广方法去提升模型的精度呢?
* A: 在训练的过程中可以尝试对训练集使用CutOut、RandErasing、HideAndSeek和GridMask等裁剪类数据增广方法,让模型也能够不止学习到显著区域,也能关注到非显著性区域,从而在遮挡的情况下,也能较好地完成识别任务。
>>
* Q: 对于色彩变换情况比较复杂的情况下,应该使用哪些数据增广方法提升模型精度呢?
* A: 可以考虑使用AutoAugment或者RandAugment的数据增广策略,这两种策略中都包括了锐化、直方图均衡化等丰富的颜色变换,可以让模型在训练的过程中对这些变换更加鲁棒。
>>
* Q: Mixup和Cutmix的工作原理是什么?为什么它们也是非常有效的数据增广方法?
* A: Mixup通过线性叠加两张图片生成新的图片,对应label也进行线性叠加用以训练,Cutmix则是从一幅图中随机裁剪出一个 感兴趣区域(ROI),然后覆盖当前图像中对应的区域,label也按照图像面积比例进行线性叠加。它们其实也是生成了和训练集不同的样本和label并让网络去学习,从而扩充了样本的丰富度。
>>
* Q: 对于精度要求不是那么高的图像分类任务,大概需要准备多大的训练数据集呢?
* A: 训练数据的数量和需要解决问题的复杂度有关系。难度越大,精度要求越高,则数据集需求越大,而且一般情况实际中的训练数据越多效果越好。当然,一般情况下,在加载预训练模型的情况下,每个类别包括10-20张图像即可保证基本的分类效果;不加载预训练模型的情况下,每个类别需要至少包含100-200张图像以保证基本的分类效果。
>>
* Q: <span id="jump">对于长尾分布的数据集,目前有哪些比较常用的方法?</span>
* A: (1)可以对数据量比较少的类别进行重采样,增加其出现的概率;(2)可以修改loss,增加图像较少对应的类别的图片的loss权重;(3)可以借鉴迁移学习的方法,从常见类别中学习通用知识,然后迁移到少样本的类别中。
<a name="模型推理与预测相关"></a>
### 模型推理与预测相关
>>
* Q: 有时候图像中只有小部分区域是所关注的前景物体,直接拿原图来进行分类的话,识别效果很差,这种情况要怎么做呢?
* A: 可以在分类之前先加一个主体检测的模型,将前景物体检测出来之后再进行分类,可以大大提升最终的识别效果。如果不考虑时间成本,也可以使用multi-crop的方式对所有的预测做融合来决定最终的类别。
>>
* Q: 目前推荐的,模型预测方式有哪些?
* A: 在模型训练完成之后,推荐使用导出的固化模型(inference model),基于Paddle预测引擎进行预测,目前支持python inference与cpp inference。如果希望基于服务化部署预测模型,那么推荐使用HubServing的部署方式。
>>
* Q: 模型训练完成之后,有哪些比较合适的预测方法进一步提升模型精度呢?
* A: (1)可以使用更大的预测尺度,比如说训练的时候使用的是224,那么预测的时候可以考虑使用288或者320,这会直接带来0.5%左右的精度提升。(2)可以使用测试时增广的策略(Test Time Augmentation, TTA),将测试集通过旋转、翻转、颜色变换等策略,创建多个副本,并分别预测,最后将所有的预测结果进行融合,这可以大大提升预测结果的精度和鲁棒性。(3)当然,也可以使用多模型融合的策略,将多个模型针对相同图片的预测结果进行融合。
>>
* Q: 多模型融合的时候,该怎么选择合适的模型进行融合呢?
* A: 在不考虑预测速度的情况下,建议选择精度尽量高的模型;同时建议选择不同结构或者系列的模型进行融合,比如在精度相似的情况下,ResNet50_vd与Xception65的模型融合结果往往比ResNet50_vd与ResNet101_vd的模型融合结果要好一些。
>>
* Q: 使用固定的模型进行预测时有哪些比较常用的加速方法?
* A: (1)使用性能更优的GPU进行预测;(2)增大预测的batch size;(3)使用TenorRT以及FP16半精度浮点数等方法进行预测。
<a name="PaddleClas使用问题"></a>
## PaddleClas使用问题
>>
* Q: 多卡评估时,为什么每张卡输出的精度指标不相同?
* A: 目前PaddleClas基于fleet api使用多卡,在多卡评估时,每张卡都是单独读取各自part的数据,不同卡中计算的图片是不同的,因此最终指标也会有微量差异,如果希望得到准确的评估指标,可以使用单卡评估。
>>
* Q: 在配置文件的`TRAIN`字段中配置了`mix`的参数,为什么`mixup`的数据增广预处理没有生效呢?
* A: 使用mixup时,数据预处理部分与模型输入部分均需要修改,因此还需要在配置文件中显式地配置`use_mix: True`,才能使得`mixup`生效。
>>
* Q: 评估和预测时,已经指定了预训练模型所在文件夹的地址,但是仍然无法导入参数,这么为什么呢?
* A: 加载预训练模型时,需要指定预训练模型的前缀,例如预训练模型参数所在的文件夹为`output/ResNet50_vd/19`,预训练模型参数的名称为`output/ResNet50_vd/19/ppcls.pdparams`,则`pretrained_model`参数需要指定为`output/ResNet50_vd/19/ppcls`,PaddleClas会自动补齐`.pdparams`的后缀。
>>
* Q: 在评测`EfficientNetB0_small`模型时,为什么最终的精度始终比官网的低0.3%左右?
* A: `EfficientNet`系列的网络在进行resize的时候,是使用`cubic插值方式`(resize参数的interpolation值设置为2),而其他模型默认情况下为None,因此在训练和评估的时候需要显式地指定resize的interpolation值。具体地,可以参考以下配置中预处理过程中ResizeImage的参数。
```
VALID:
batch_size: 16
num_workers: 4
file_list: "./dataset/ILSVRC2012/val_list.txt"
data_dir: "./dataset/ILSVRC2012/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- ResizeImage:
resize_short: 256
interpolation: 2
- CropImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
```
>>
* Q: python2下,使用visualdl的时候,报出以下错误,`TypeError: __init__() missing 1 required positional argument: 'sync_cycle'`,这是为什么呢?
* A: 目前visualdl仅支持在python3下运行,visualdl需要是2.0以上的版本,如果visualdl版本不对的话,可以通过以下方式进行安装:`pip3 install visualdl==2.0.0b8 -i https://mirror.baidu.com/pypi/simple`
>>
* Q: 自己在测ResNet50_vd预测单张图片速度的时候发现比官网提供的速度benchmark慢了很多,而且CPU速度比GPU速度快很多,这个是为什么呢?
* A: 模型预测需要初始化,初始化的过程比较耗时,因此在统计预测速度的时候,需要批量跑一批图片,去除前若干张图片的预测耗时,再统计下平均的时间。GPU比CPU速度测试单张图片速度慢是因为GPU的初始化并CPU要慢很多。
>>
* Q: 在动态图中加载静态图预训练模型的时候,需要注意哪些问题?
* A: 在使用infer.py预测单张图片或者文件夹中的图片时,需要注意指定[infer.py](https://github.com/PaddlePaddle/PaddleClas/blob/53c5850df7c49a1bfcd8d989e6ccbea61f406a1d/tools/infer/infer.py#L40)中的`load_static_weights`为True,在finetune或者评估的时候需要添加`-o load_static_weights=True`的参数。
>>
* Q: 灰度图可以用于模型训练吗?
* A: 灰度图也可以用于模型训练,不过需要修改模型的输入shape为`[1, 224, 224]`,此外数据增广部分也需要注意适配一下。不过为了更好地使用PaddleClas代码的话,即使是灰度图,也建议调整为3通道的图片进行训练(RGB通道的像素值相等)。
>>
* Q: 怎么在windows上或者cpu上面模型训练呢?
* A: 可以参考[PaddleClas开始使用教程](https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/tutorials/getting_started.md),详细介绍了在Linux、Windows、CPU等环境中进行模型训练、评估与预测的教程。
>>
* Q: 怎样在模型训练的时候使用label smoothing呢?
* A: 可以在配置文件中设置label smoothing epsilon的值,`ls_epsilon=0.1`,表示设置该值为0.1,若该值为-1,则表示不使用label smoothing。
>>
* Q: PaddleClas提供的10W类图像分类预训练模型能否用于模型推断呢?
* A: 该10W类图像分类预训练模型没有提供fc全连接层的参数,无法用于模型推断,目前可以用于模型微调。
>>
* Q: 在使用`tools/infere/predict.py`进行模型预测的时候,报了这个问题:`Error: Pass tensorrt_subgraph_pass has not been registered`,这是为什么呢?
* A: 如果希望使用TensorRT进行模型预测推理的话,需要编译带TensorRT的PaddlePaddle,编译的时候参考以下的编译方式,其中`TENSORRT_ROOT`表示TensorRT的路径。
```
cmake .. \
-DWITH_CONTRIB=OFF \
-DWITH_MKL=ON \
-DWITH_MKLDNN=ON \
-DWITH_TESTING=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DWITH_INFERENCE_API_TEST=OFF \
-DON_INFER=ON \
-DWITH_PYTHON=ON \
-DPY_VERSION=2.7 \
-DTENSORRT_ROOT=/usr/local/TensorRT6-cuda10.0-cudnn7/
make -j16
make inference_lib_dist
```
>>
* Q: 怎样在训练的时候使用自动混合精度(Automatic Mixed Precision, AMP)训练呢?
* A: 可以参考[ResNet50_fp16.yml](https://github.com/PaddlePaddle/PaddleClas/blob/master/configs/ResNet/ResNet50_fp16.yml)这个配置文件;具体地,如果希望自己的配置文件在模型训练的时候也支持自动混合精度,可以在配置文件中添加下面的配置信息。
```
use_fp16: True
amp_scale_loss: 128.0
use_dynamic_loss_scaling: True
```
......@@ -5,6 +5,7 @@
本部分主要从数据集、模型选择和模型训练 3 个方面对该部分内容进行介绍。
## 1. 数据集
在 PaddleClas 的识别任务中,训练主体检测模型时主要用到了以下几个数据集。
......
# 服务器端C++预测
本教程将介绍在服务器端部署PaddleClas模型的详细步骤
本教程将介绍在服务器端部署PaddleClas分类模型的详细步骤,识别模型部署方式将在近期支持,敬请期待
---
## 目录
- [准备环境](#1)
- [1.1编译opencv库](#1.1)
- [1.2准备环境](#1.2)
- [1.2.1 预测库源码编译](1.2.1)
- [1.2.2 直接下载安装](1.2.2)
- [编译](#2)
- [2.1 编译 PaddleClas C++ 预测 demo](#2.1)
- [2.2 编译 config lib 预测库与 cls lib 预测库](#2.2)
- [运行](#3)
- [3.1 准备 inference model](#3.1)
- [3.2 运行 demo](#3.2)
<a name="1"></a>
## 1. 准备环境
- Linux 环境,推荐使用 docker。
......@@ -11,6 +27,7 @@
* 该文档主要介绍基于 Linux 环境下的 PaddleClas C++ 预测流程,如果需要在 Windows 环境下使用预测库进行 C++ 预测,具体编译方法请参考 [Windows下编译教程](./cpp_deploy_on_windows.md)
<a name="1.1"></a>
### 1.1 编译opencv库
* 首先需要从 opencv 官网上下载在 Linux 环境下源码编译的包,以 3.4.7 版本为例,下载及解压缩命令如下:
......@@ -71,10 +88,12 @@ opencv3/
|-- share
```
<a name="1.2"></a>
### 1.2 获取 Paddle 预测库
* 有 2 种方式获取 Paddle 预测库,下面进行详细介绍。
<a name="1.2.1"></a>
#### 1.2.1 预测库源码编译
如果希望获取最新预测库特性,可以从 GitHub 上克隆 Paddle 最新代码,从源码编译预测库。对于不同平台的编译流程,请参考 [Paddle预测库官网](https://paddleinference.paddlepaddle.org.cn/v2.1/user_guides/source_compile.html) 的说明。编译示例如下:
......@@ -118,6 +137,7 @@ build/paddle_inference_install_dir/
|-- version.txt
```
<a name="1.2.2"></a>
#### 1.2.2 直接下载安装
[Paddle预测库官网](https://paddleinference.paddlepaddle.org.cn/v2.1/user_guides/download_lib.html#c) 上提供了不同版本的 Paddle 预测库,包括多个操作系统平台和GPU、CPU等多个硬件平台的预编译库,可以在官网查找并选择合适的预测库版本进行下载,建议选择 `2.1.1` 版本。
......@@ -135,10 +155,10 @@ tar -xf paddle_inference.tgz
上述命令会在当前目录下生成 `paddle_inference/` 目录。
## 2. 开始编译
<a name="2"></a>
## 2. 编译
<a name="2.1"></a>
### 2.1 编译 PaddleClas C++ 预测 demo
编译命令如下,其中 Paddle C++ 预测库、OpenCV 等依赖库的路径需要根据机器上的实际位置进行修改。
......@@ -195,6 +215,7 @@ make -j
在执行上述命令,编译完成之后,会在当前路径下生成 `build` 目录,其中有可执行文件 `clas_system`。并且,如未设置 `DCONFIG_LIB``DCLS_LIB`,则会在 `.\lib\` 路径下生成 `config lib` 和 `cls lib` 两个库文件,根据 `DCMP_STATIC` 的设置,两个库文件将被编译为静态链接库(`libconfig.a`、`libcls.a`)或动态链接库(`libconfig.so`、`libcls.so`)。
<a name="2.2"></a>
### 2.2 编译 config lib 预测库与 cls lib 预测库
除了可以直接编译 demo,也同样可以仅编译 config lib 和 cls lib 预测库,只需运行如下命令:
......@@ -228,8 +249,10 @@ make
执行上述命令后,将在目录 `./lib/` 下生成 `config lib` 和 `cls lib` 的动态链接库(`libcls.so` 和 `libconfig.so`)或静态链接库(`libcls.a` 和 `libconfig.a`)。在[2.1 编译 PaddleClas C++ 预测 demo](#2.1)中,可以通过指定编译选项 `DCLS_LIB` 和 `DCONFIG_LIB` 指定已有链接库的路径,链接库同样也可用于二次开发。
## 3. 运行 demo
<a name="3"></a>
## 3. 运行
<a name="3.l"></a>
### 3.1 准备 inference model
首先需要准备 inference model,关于将模型导出为 inference model 的具体步骤,可以参考 [模型导出](./export_model.md) 文档。假设导出的预测模型文件放在 `./inference` 目录下,则目录结构如下。
......@@ -242,6 +265,7 @@ inference/
**注意**:上述文件中,`cls_infer.pdmodel` 文件存储了模型网络结构信息,`cls_infer.pdiparams` 文件存储了模型参数权重信息。在运行预测时,注意两个文件的路径需要分别设置为配置文件 `tools/config.txt` 中的字段 `cls_model_path` 和 `cls_params_path` 的值。
<a name="3.2"></a>
### 3.2 运行 demo
首先修改 `tools/config.txt` 中对应字段:
......
......@@ -4,10 +4,22 @@ PaddlePaddle 支持导出 inference 模型用于部署推理场景,相比于
---
## 目录
- [环境准备](#环境准备)
- [分类模型导出](#分类模型导出)
- [主体检测模型导出](#主体检测模型导出)
- [识别模型导出](#识别模型导出)
- [命令参数说明](#命令参数说明])
<a name="环境准备"></a>
## 1. 环境准备
首先请参考文档[安装PaddlePaddle](../installation/install_paddle.md)和文档[安装PaddleClas](../installation/install_paddleclas.md)配置运行环境。
<a name="分类模型导出"></a>
## 2. 分类模型导出
进入 PaddleClas 目录下:
......@@ -31,7 +43,13 @@ python tools/export_model.py \
-o Global.save_inference_dir=./deploy/models/class_ResNet50_vd_ImageNet_infer
```
## 3. 识别模型导出
<a name="主体检测模型导出"></a>
## 3. 主体检测模型导出
主体检测模型的导出,可以参考[主题检测介绍](../image_recognition_pipeline/mainbody_detection.md)
<a name="识别模型导出"></a>
## 4. 识别模型导出
进入 PaddleClas 目录下:
......@@ -56,7 +74,8 @@ python3 tools/export_model.py \
注意,此处保存的 inference 模型在 embedding 特征层做了截断,即导出后模型最终的输出为 n 维 embedding 特征。
## 4. 命令参数说明
<a name="命令参数说明"></a>
## 5. 命令参数说明
在上述模型导出命令中,所使用的配置文件需要与该模型的训练文件相同,在配置文件中有以下字段用于配置模型导出参数:
......@@ -76,5 +95,5 @@ python3 tools/export_model.py \
* [C++ 预测](./cpp_deploy.md)(目前仅支持分类模型)
* [Python Whl 预测](./whl_deploy.md)(目前仅支持分类模型)
* [PaddleHub Serving 部署](./paddle_hub_serving_deploy.md)(目前仅支持分类模型)
* [PaddleServing 部署](./paddle_serving_deploy.md)(目前仅支持分类模型)
* [PaddleServing 部署](./paddle_serving_deploy.md)
* [PaddleLite 部署](./paddle_lite_deploy.md)(目前仅支持分类模型)
# 基于PaddleHub Serving的服务部署
PaddleClas 支持通过 PaddleHub 快速进行服务化部署。
PaddleClas 支持通过 PaddleHub 快速进行服务化部署。目前支持图像分类的部署,图像识别的部署敬请期待。
---
## 目录
- [简介](#1)
- [准备环境](#2)
- [下载推理模型](#3)
- [安装服务模块](#4)
- [启动服务](#5)
- [5.1命令行命令启动](#5.1)
- [5.2 配置文件启动](#5.2)
- [发送预测请求](#6)
- [自定义修改服务模块](#7)
<a name="1"></a>
## 1. 简介
hubserving 服务部署配置服务包 `clas` 下包含 3 个必选文件,目录如下:
......@@ -16,12 +30,16 @@ hubserving/clas/
└─ params.py 参数文件,必选,包含模型路径、前后处理参数等参数
```
<a name="2"></a>
## 2. 准备环境
```shell
# 安装paddlehub,请安装2.0版本
pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
```
<a name="3"></a>
## 3. 下载推理模型
安装服务模块前,需要准备推理模型并放到正确路径,默认模型路径为:
......@@ -39,6 +57,8 @@ pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/sim
* 模型文件(包括 `.pdmodel``.pdiparams`)名称必须为`inference`
* 我们也提供了大量基于ImageNet-1k数据集的预训练模型,模型列表及下载地址详见[模型库概览](../models/models_intro.md),也可以使用自己训练转换好的模型。
<a name="4"></a>
## 4. 安装服务模块
针对 Linux 环境和 Windows 环境,安装命令如下。
......@@ -58,8 +78,12 @@ cd PaddleClas\deploy
hub install hubserving\clas\
```
<a name="5"></a>
## 5. 启动服务
<a name="5.1"></a>
### 5.1 命令行命令启动
该方式仅支持使用 CPU 预测。启动命令:
......@@ -83,6 +107,8 @@ $ hub serving start --modules Module1==Version1 \
这样就完成了一个服务化 API 的部署,使用默认端口号 8866。
<a name="5.2"></a>
### 5.2 配置文件启动
该方式仅支持使用 CPU 或 GPU 预测。启动命令:
......@@ -130,6 +156,7 @@ export CUDA_VISIBLE_DEVICES=3
hub serving start -c hubserving/clas/config.json
```
<a name="6"></a>
## 6. 发送预测请求
配置好服务端后,可使用以下命令发送预测请求,获取预测结果:
......@@ -167,6 +194,8 @@ list: 返回结果
└─ float: 该图分类耗时,单位秒
```
<a name="7"></a>
## 7. 自定义修改服务模块
如果需要修改服务逻辑,需要进行以下操作:
......
# PaddleLite推理部署
---
本教程将介绍基于[Paddle Lite](https://github.com/PaddlePaddle/Paddle-Lite)在移动端部署 PaddleClas 分类模型的详细步骤。
本教程将介绍基于[Paddle Lite](https://github.com/PaddlePaddle/Paddle-Lite)在移动端部署 PaddleClas 分类模型的详细步骤。识别模型的部署将在近期支持,敬请期待。
Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理能力,并广泛整合跨平台硬件,为端侧部署及应用落地问题提供轻量化的部署方案。
<!-- TODO(gaotingquan): 下述 benchmark 文档在新文档结构中缺失 -->
......@@ -8,17 +9,32 @@ Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理
---
## 1. 准备环境
## 目录
- [准备环境](#1)
- [1.1 准备交叉编译环境](#1.1)
- [1.2 准备预测库](#1.2)
- [开始运行](#2)
- [2.1模型优化](#2.1)
- [2.1.1 pip安装paddlelite并进行转换](#2.1.1)
- [2.1.2 源码编译Paddle-Lite生成opt工具](#2.1.2)
- [2.1.3 转换示例](#2.1.3)
- [2.2与手机联调](#2.2)
- [FAQ](#3)
<a name="1"></a>
## 一、准备环境
Paddle Lite 目前支持以下平台部署:
* 电脑(编译Paddle Lite)
* 安卓手机(armv7或armv8)
<a name="1.1"></a>
### 1.1 准备交叉编译环境
交叉编译环境用于编译 Paddle Lite 和 PaddleClas 的 C++ demo。
支持多种开发环境,关于 Docker、Linux、macOS、Windows 等不同开发环境的编译流程请参考[文档](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html)
<a name="1.2"></a>
### 1.2 准备预测库
预测库有两种获取方式:
......@@ -74,13 +90,17 @@ inference_lite_lib.android.armv8/
| `-- java Java 预测库demo
```
## 2. 开始运行
<a name="2"></a>
## 二、开始运行
<a name="2.1"></a>
### 2.1 模型优化
Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括量化、子图融合、混合精度、Kernel 优选等方法,使用 Paddle-Lite 的 `opt` 工具可以自动对 inference 模型进行优化,目前支持两种优化方式,优化后的模型更轻量,模型运行速度更快。在进行模型优化前,需要先准备 `opt` 优化工具,有以下两种方式。
**注意**:如果已经准备好了 `.nb` 结尾的模型文件,可以跳过此步骤。
<a name="2.1.1"></a>
#### 2.1.1 [建议]pip安装paddlelite并进行转换
Python下安装 `paddlelite`,目前最高支持 `Python3.7`
......@@ -104,6 +124,7 @@ pip install paddlelite==2.8
`--model_file` 表示 inference 模型的 model 文件地址,`--param_file` 表示 inference 模型的 param 文件地址;`optimize_out` 用于指定输出文件的名称(不需要添加 `.nb` 的后缀)。直接在命令行中运行 `paddle_lite_opt`,也可以查看所有参数及其说明。
<a name="2.1.2"></a>
#### 2.1.2 源码编译Paddle-Lite生成opt工具
模型优化需要 Paddle-Lite 的 `opt` 可执行文件,可以通过编译 Paddle-Lite 源码获得,编译步骤如下:
......@@ -127,7 +148,6 @@ cd build.opt/lite/api/
`opt` 的使用方式与参数与上面的 `paddle_lite_opt` 完全一致。
<a name="2.1.3"></a>
#### 2.1.3 转换示例
下面以PaddleClas的 `MobileNetV3_large_x1_0` 模型为例,介绍使用 `paddle_lite_opt` 完成预训练模型到inference模型,再到 Paddle-Lite 优化模型的转换。
......@@ -148,6 +168,7 @@ paddle_lite_opt --model_file=./MobileNetV3_large_x1_0_infer/inference.pdmodel --
**注意**`--optimize_out` 参数为优化后模型的保存路径,无需加后缀 `.nb``--model_file` 参数为模型结构信息文件的路径,`--param_file` 参数为模型权重信息文件的路径,请注意文件名。
<a name="2.2"></a>
### 2.2 与手机联调
首先需要进行一些准备工作。
......@@ -255,7 +276,8 @@ export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH
<img src="../../images/inference_deployment/lite_demo_result.png" width="600">
</div>
## FAQ
<a name="3"></a>
## 三、FAQ
Q1:如果想更换模型怎么办,需要重新按照流程走一遍吗?
A1:如果已经走通了上述步骤,更换模型只需要替换 `.nb` 模型文件即可,同时要注意修改下配置文件中的 `.nb` 文件路径以及类别映射文件(如有必要)。
......
......@@ -4,6 +4,14 @@
首先请参考文档[安装PaddlePaddle](../installation/install_paddle.md)和文档[安装PaddleClas](../installation/install_paddleclas.md)配置运行环境。
## 目录
- [图像分类推理](#图像分类推理)
- [主体检测模型推理](#主体检测模型推理)
- [特征提取模型推理](#特征提取模型推理)
- [主体检测、特征提取和向量检索串联](#主体检测、特征提取和向量检索串联)
<a name="图像分类推理"></a>
## 1. 图像分类推理
首先请参考文档[模型导出](./export_model.md)准备 inference 模型,然后进入 PaddleClas 的 `deploy` 目录下:
......@@ -33,6 +41,7 @@ python python/predict_cls.py -c configs/inference_cls.yaml
* 如果使用 VisionTransformer 系列模型,如 `DeiT_***_384`, `ViT_***_384` 等,请注意模型的输入数据尺寸,部分模型需要修改参数: `PreProcess.resize_short=384`, `PreProcess.resize=384`
* 如果你希望提升评测模型速度,使用gpu评测时,建议开启TensorRT加速预测,使用cpu评测时,建议开启MKL-DNN加速预测。
<a name="主体检测模型推理"></a>
## 2. 主体检测模型推理
进入 PaddleClas 的 `deploy` 目录下:
......@@ -60,6 +69,8 @@ python python/predict_det.py -c configs/inference_det.yaml
* `Global.infer_imgs`:待预测的图片文件路径;
* `Global.use_gpu`: 是否使用 GPU 预测,默认为 `True`
<a name="特征提取模型推理"></a>
## 3. 特征提取模型推理
下面以商品特征提取为例,介绍特征提取模型推理。首先进入 PaddleClas 的 `deploy` 目录下:
......@@ -79,6 +90,7 @@ tar -xf ./models/product_ResNet50_vd_aliproduct_v1.0_infer.tar -C ./models/
上述预测命令可以得到一个 512 维的特征向量,直接输出在在命令行中。
<a name="主体检测、特征提取和向量检索串联"></a>
## 4. 主体检测、特征提取和向量检索串联
主体检测、特征提取和向量检索的串联预测,可以参考图像识别[快速体验](../quick_start/quick_start_recognition.md)
......@@ -4,7 +4,23 @@ PaddleClas 支持 Python Whl 包方式进行预测,目前 Whl 包方式仅支
---
## 1. 安装
## 目录
- [安装paddleclas](#1)
- [快速开始](#2)
- [参数解释](#3)
- [使用示例](#4)
- [4.1 查看帮助信息](#4.1)
- [4.2 使用PaddleClas提供的预训练模型进行预测](#4.2)
- [4.3 使用本地模型文件预测](#4.3)
- [4.4 批量预测](#4.4)
- [4.5 对网络图片进行预测](#4.5)
- [4.6 对`NumPy.ndarray`格式数据进行预测](#4.6)
- [4.7 保存预测结果](#4.7)
- [4.8 指定label name](#4.8)
<a name="1"></a>
## 一、安装paddleclas
* pip安装
......@@ -19,8 +35,8 @@ python3 setup.py bdist_wheel
pip3 install dist/*
```
## 2. 快速开始
<a name="2"></a>
## 二、快速开始
* 使用`ResNet50`模型,以下图(`PaddleClas/docs/images/inference_deployment/whl_demo.jpg`)为例进行说明。
<div align="center">
......@@ -55,7 +71,8 @@ filename: docs/images/inference_deployment/whl_demo.jpg, top-5, class_ids: [8, 7
Predict complete!
```
## 3. 参数解释
<a name="3"></a>
## 三、参数解释
以下参数可在命令行方式使用中通过参数指定,或在Python代码中实例化PaddleClas对象时作为构造函数的参数使用。
* model_name(str): 模型名称,使用PaddleClas提供的基于ImageNet1k的预训练模型。
* inference_model_dir(str): 本地模型文件目录,当未指定 `model_name` 时该参数有效。该目录下需包含 `inference.pdmodel``inference.pdiparams` 两个模型文件。
......@@ -86,14 +103,14 @@ from paddleclas import PaddleClas
clas = PaddleClas(model_name='ViT_base_patch16_384', resize_short=384, crop_size=384)
```
## 4. 使用示例
<a name="4"></a>
## 四、使用示例
PaddleClas提供两种使用方式:
1. Python代码中使用;
2. 命令行中使用。
<a name="4.1"></a>
### 4.1 查看帮助信息
* CLI
......@@ -101,7 +118,7 @@ PaddleClas提供两种使用方式:
paddleclas -h
```
<a name="4.2"></a>
### 4.2 使用PaddleClas提供的预训练模型进行预测
可以使用PaddleClas提供的预训练模型来预测,并通过参数`model_name`指定。此时PaddleClas会根据`model_name`自动下载指定模型,并保存在目录`~/.paddleclas/`下。
......@@ -119,7 +136,7 @@ print(next(result))
paddleclas --model_name='ResNet50' --infer_imgs='docs/images/inference_deployment/whl_demo.jpg'
```
<a name="4.3"></a>
### 4.3 使用本地模型文件预测
可以使用本地的模型文件进行预测,通过参数`inference_model_dir`指定模型文件目录即可。需要注意,模型文件目录下必须包含`inference.pdmodel``inference.pdiparams`两个文件。
......@@ -137,7 +154,7 @@ print(next(result))
paddleclas --inference_model_dir='./inference/' --infer_imgs='docs/images/inference_deployment/whl_demo.jpg'
```
<a name="4.4"></a>
### 4.4 批量预测
当参数 `infer_imgs` 为包含图片文件的目录时,可以对图片进行批量预测,只需通过参数 `batch_size` 指定batch大小。
......@@ -156,7 +173,7 @@ for r in result:
paddleclas --model_name='ResNet50' --infer_imgs='docs/images/' --batch_size 2
```
<a name="4.5"></a>
### 4.5 对网络图片进行预测
可以对网络图片进行预测,只需通过参数`infer_imgs`指定图片`url`。此时图片会下载并保存在`~/.paddleclas/images/`目录下。
......@@ -174,7 +191,7 @@ print(next(result))
paddleclas --model_name='ResNet50' --infer_imgs='https://raw.githubusercontent.com/paddlepaddle/paddleclas/release/2.2/docs/images/inference_deployment/whl_demo.jpg'
```
<a name="4.6"></a>
### 4.6 对`NumPy.ndarray`格式数据进行预测
在Python中,可以对`Numpy.ndarray`格式的图像数据进行预测,只需通过参数`infer_imgs`指定即可。注意该图像数据必须为三通道图像数据。
......@@ -188,7 +205,7 @@ result=clas.predict(infer_imgs)
print(next(result))
```
<a name="4.7"></a>
### 4.7 保存预测结果
可以指定参数`pre_label_out_dir='./output_pre_label/'`,将图片按其top1预测结果保存到`pre_label_out_dir`目录下对应类别的文件夹中。
......@@ -206,7 +223,7 @@ print(next(result))
paddleclas --model_name='ResNet50' --infer_imgs='docs/images/whl/' --save_dir='./output_pre_label/'
```
<a name="4.8"></a>
### 4.8 指定label name
可以通过参数`class_id_map_file`指定`class id``lable`的对应关系。PaddleClas默认使用ImageNet1K的label_name(`ppcls/utils/imagenet1k_label_list.txt`)。
......
# PP-LCNet系列
## 摘要
---
## 目录
- [摘要](#1)
- [介绍](#2)
- [方法](#3)
- [3.1 更好的激活函数](#3.1)
- [3.2 合适的位置添加SE模块](#3.2)
- [3.3 合适的位置添加更大的卷积核](#3.3)
- [3.4 GAP后使用更大的1x1卷积层](#3.4)
- [实验部分](#4)
- [图像分类](#4.1)
- [目标检测](#4.2)
- [语义分割](#4.3)
- [总结](#5)
- [引用](#6)
<a name="1"></a>
## 一、摘要
在计算机视觉领域中,骨干网络的好坏直接影响到整个视觉任务的结果。在之前的一些工作中,相关的研究者普遍将FLOPs或者Params作为优化目的,但是在工业界真实落地的场景中,推理速度才是考量模型好坏的重要指标,然而,推理速度和准确性很难兼得。考虑到工业界有很多基于Intel CPU的应用,所以我们本次的工作旨在使骨干网络更好的适应Intel CPU,从而得到一个速度更快、准确率更高的轻量级骨干网络,与此同时,目标检测、语义分割等下游视觉任务的性能也同样得到提升。
## 介绍
<a name="2"></a>
## 二、介绍
近年来,有很多轻量级的骨干网络问世,尤其最近两年,各种NAS搜索出的网络层出不穷,这些网络要么主打FLOPs或者Params上的优势,要么主打ARM设备上的推理速度的优势,很少有网络专门针对Intel CPU做特定的优化,导致这些网络在Intel CPU端的推理速度并不是很完美。基于此,我们针对Intel CPU设备以及其加速库MKLDNN设计了特定的骨干网络PP-LCNet,比起其他的轻量级的SOTA模型,该骨干网络可以在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的SOTA模型。与其他模型的对比图如下。
<div align=center><img src="../../images/PP-LCNet/PP-LCNet-Acc.png" width="500" height="400"/></div>
## 方法
<a name="3"></a>
## 三、方法
网络结构整体如下图所示。
<div align=center><img src="../../images/PP-LCNet/PP-LCNet.png" width="700" height="400"/></div>
我们经过大量的实验发现,在基于Intel CPU设备上,尤其当启用MKLDNN加速库后,很多看似不太耗时的操作反而会增加延时,比如elementwise-add操作、split-concat结构等。所以最终我们选用了结构尽可能精简、速度尽可能快的block组成我们的BaseNet(类似MobileNetV1)。基于BaseNet,我们通过实验,总结了四条几乎不增加延时但是可以提升模型精度的方法,融合这四条策略,我们组合成了PP-LCNet。下面对这四条策略一一介绍:
### 更好的激活函数
<a name="3.1"></a>
### 3.1 更好的激活函数
自从卷积神经网络使用了ReLU激活函数后,网络性能得到了大幅度提升,近些年ReLU激活函数的变体也相继出现,如Leaky-ReLU、P-ReLU、ELU等,2017年,谷歌大脑团队通过搜索的方式得到了swish激活函数,该激活函数在轻量级网络上表现优异,在2019年,MobileNetV3的作者将该激活函数进一步优化为H-Swish,该激活函数去除了指数运算,速度更快,网络精度几乎不受影响。我们也经过很多实验发现该激活函数在轻量级网络上有优异的表现。所以在PP-LCNet中,我们选用了该激活函数。
### 合适的位置添加SE模块
<a name="3.2"></a>
### 3.2 合适的位置添加SE模块
SE模块是SENet提出的一种通道注意力机制,可以有效提升模型的精度。但是在Intel CPU端,该模块同样会带来较大的延时,如何平衡精度和速度是我们要解决的一个问题。虽然在MobileNetV3等基于NAS搜索的网络中对SE模块的位置进行了搜索,但是并没有得出一般的结论,我们通过实验发现,SE模块越靠近网络的尾部对模型精度的提升越大。下表也展示了我们的一些实验结果:
| SE Location | Top-1 Acc(\%) | Latency(ms) |
|-------------------|---------------|-------------|
| 1100000000000 | 61.73 | 2.06 |
......@@ -32,13 +54,15 @@ SE模块是SENet提出的一种通道注意力机制,可以有效提升模型
| <b>0000000000011<b> | <b>63.14<b> | <b>2.05<b> |
| 1111111111111 | 64.27 | 3.80 |
最终,PP-LCNet中的SE模块的位置选用了表格中第三行的方案。
### 更大的卷积核
<a name="3.3"></a>
### 3.3 合适的位置添加更大的卷积核
在MixNet的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种split-concat范式的MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。我们通过实验总结了一些更大的卷积核在不同位置的作用,类似SE模块的位置,更大的卷积核在网络的中后部作用更明显,下表展示了5x5卷积核的位置对精度的影响:
| SE Location | Top-1 Acc(\%) | Latency(ms) |
| large-kernel Location | Top-1 Acc(\%) | Latency(ms) |
|-------------------|---------------|-------------|
| 1111111111111 | 63.22 | 2.08 |
| 1111111000000 | 62.70 | 2.07 |
......@@ -46,13 +70,14 @@ SE模块是SENet提出的一种通道注意力机制,可以有效提升模型
实验表明,更大的卷积核放在网络的中后部即可达到放在所有位置的精度,与此同时,获得更快的推理速度。PP-LCNet最终选用了表格中第三行的方案。
### 3.4 GAP后使用更大的1x1卷积层
<a name="3.4"></a>
### 3.4 GAP后使用更大的1x1卷积层
在GoogLeNet之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致GAP后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的1x1卷积层(等同于FC层),GAP后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。
BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步说明了每个方案对结果的影响:
| Activation | SE-block | Large-kernal | last-1x1-conv | Top-1 Acc(\%) | Latency(ms) |
| Activation | SE-block | Large-kernel | last-1x1-conv | Top-1 Acc(\%) | Latency(ms) |
|------------|----------|--------------|---------------|---------------|-------------|
| 0 | 1 | 1 | 1 | 61.93 | 1.94 |
| 1 | 0 | 1 | 1 | 62.51 | 1.87 |
......@@ -60,10 +85,11 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步
| 1 | 1 | 1 | 0 | 59.91 | 1.85 |
| <b>1<b> | <b>1<b> | <b>1<b> | <b>1<b> | <b>63.14<b> | <b>2.05<b> |
<a name="4"></a>
## 四、实验部分
## 实验部分
### 图像分类
<a name="4.1"></a>
### 4.1 图像分类
图像分类我们选用了ImageNet数据集,相比目前主流的轻量级网络,PP-LCNet在相同精度下可以获得更快的推理速度。当使用百度自研的SSLD蒸馏策略后,精度进一步提升,在Intel cpu端约5ms的推理速度下ImageNet的Top-1 Acc超过了80%。
......@@ -81,7 +107,7 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步
| PP-LCNet-0.25x\* | 3.0 | 161 | 74.39 | 92.09 | 2.46 |
| PP-LCNet-0.25x\* | 9.0 | 906 | 80.82 | 95.33 | 5.39 |
其中*表示使用SSLD蒸馏后的模型。
其中\*表示使用SSLD蒸馏后的模型。
与其他轻量级网络的性能对比:
......@@ -100,8 +126,8 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步
| MobileNetV3-small-1.25x | 3.6 | 100 | 70.67 | 89.51 | 3.95 |
| <b>PP-LCNet-1x<b> |<b> 3.0<b> | <b>161<b> | <b>71.32<b> | <b>90.03<b> | <b>2.46<b> |
### 目标检测
<a name="4.2"></a>
### 4.2 目标检测
目标检测的方法我们选用了百度自研的PicoDet,该方法主打轻量级目标检测场景,下表展示了在COCO数据集上、backbone选用PP-LCNet与MobileNetV3的结果的比较,无论在精度还是速度上,PP-LCNet的优势都非常明显。
......@@ -112,8 +138,8 @@ MobileNetV3-large-0.35x | 19.2 | 8.1 |
MobileNetV3-large-0.75x | 25.8 | 11.1 |
<b>PP-LCNet-1x<b> | <b>26.9<b> | <b>7.9<b> |
### 语义分割
<a name="4.3"></a>
### 4.3 语义分割
语义分割的方法我们选用了DeeplabV3+,下表展示了在Cityscapes数据集上、backbone选用PP-LCNet与MobileNetV3的比较,在精度和速度方面,PP-LCNet的优势同样明显。
......@@ -124,11 +150,13 @@ MobileNetV3-large-0.5x | 55.42 | 135 |
MobileNetV3-large-0.75x | 64.53 | 151 |
<b>PP-LCNet-1x<b> | <b>66.03<b> | <b>96<b> |
## 总结
<a name="5"></a>
## 五、总结
PP-LCNet没有像学术界那样死扣极致的FLOPs与Params,而是着眼于分析如何添加对Intel CPU友好的模块来提升模型的性能,这样可以更好的平衡准确率和推理时间,其中的实验结论也很适合其他网络结构设计的研究者,同时也为NAS搜索研究者提供了更小的搜索空间和一般结论。最终的PP-LCNet在产业界也可以更好的落地和应用。
## 引用
<a name="6"></a>
## 六、引用
如果你的论文用到了PP-LCNet的方法,请添加如下cite:
```
......
......@@ -2,45 +2,79 @@
---
图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析等,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等。
一般来说,图像分类通过手工特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。在深度学习算法之前使用较多的是基于词袋(Bag of Words)模型的物体分类方法。而基于深度学习的图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN)近年来在图像领域取得了惊人的成绩,CNN直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于"输入-输出"直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。
一般来说,图像分类通过手工特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。在深度学习算法之前使用较多的是基于词袋(Bag of Words)模型的物体分类方法。而基于深度学习的图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN)近年来在图像领域取得了惊人的成绩,CNN直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于"输入-输出"直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。
图像分类是计算机视觉里很基础但又重要的一个领域,其研究成果一直影响着计算机视觉甚至深度学习的发展,图像分类有很多子领域,如多标签分类、细粒度分类等,此处只对单标签图像分类做一个简述。
具体图像分类算法介绍详见[文档](../algorithm_introduction/image_classification.md)
## 目录
- [数据集介绍](#1)
- [1.1 ImageNet-1k](#1.1)
- [1.2 CIFAR-10/CIFAR-100](#1.2)
- [图像分类的流程](#2)
- [2.1 数据及其预处理](#2.1)
- [2.2 模型准备](#2.2)
- [2.3 模型训练](#2.3)
- [2.3 模型评估](#2.4)
- [使用方法介绍](#3)
- [3.1 基于CPU/单卡GPU上的训练与评估](#3.1)
- [3.1.1 模型训练](#3.1.1)
- [3.1.2 模型微调](#3.1.2)
- [3.1.3 模型恢复训练](#3.1.3)
- [3.1.4 模型评估](#3.1.4)
- [3.2 基于Linux+多卡GPU的模型训练与评估](#3.2)
- [3.2.1 模型训练](#3.2.1)
- [3.2.2 模型微调](#3.2.2)
- [3.2.3 模型恢复训练](#3.2.3)
- [3.2.4 模型评估](#3.2.4)
- [3.3 使用预训练模型进行模型预测](#3.3)
- [3.4 使用inference模型进行模型推理](#3.4)
<a name="1"></a>
## 一、数据集介绍
<a name="1.1"></a>
### 1.1 ImageNet-1k
ImageNet项目是一个大型视觉数据库,用于视觉目标识别软件研究。该项目已手动注释了1400多万张图像,以指出图片中的对象,并在至少100万张图像中提供了边框。ImageNet-1k是ImageNet数据集的子集,其包含1000个类别。训练集包含1281167个图像数据,验证集包含50000个图像数据。2010年以来,ImageNet项目每年举办一次图像分类竞赛,即ImageNet大规模视觉识别挑战赛(ILSVRC)。挑战赛使用的数据集即为ImageNet-1k。到目前为止,ImageNet-1k已经成为计算机视觉领域发展的最重要的数据集之一,其促进了整个计算机视觉的发展,很多计算机视觉下游任务的初始化模型都是基于该数据集训练得到的权重。
<a name="1.2"></a>
### 1.2 CIFAR-10/CIFAR-100
CIFAR-10数据集由10个类的60000个彩色图像组成,图像分辨率为32x32,每个类有6000个图像,其中训练集5000张,验证集1000张,10个不同的类代表飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、轮船和卡车。CIFAR-100数据集是CIFAR-10的扩展,由100个类的60000个彩色图像组成,图像分辨率为32x32,每个类有600个图像,其中训练集500张,验证集100张。由于这两个数据集规模较小,因此可以让研究人员快速尝试不同的算法。这两个数据集也是图像分类领域测试模型好坏的常用数据集。
<a name="2"></a>
## 二、图像分类的流程
将准备好的训练数据做相应的数据预处理后经过图像分类模型,模型的输出与真实标签做交叉熵损失函数,该损失函数描述了模型的收敛方向,遍历所有的图片数据输入模型,对最终损失函数通过某些优化器做相应的梯度下降,将梯度信息回传到模型中,更新模型的权重,如此循环往复遍历多次数据,即可得到一个图像分类的模型。
<a name="2.1"></a>
### 2.1 数据及其预处理
数据的质量及数量往往可以决定一个模型的好坏。在图像分类领域,数据包括图像及标签。在大部分情形下,带有标签的数据比较匮乏,所以数量很难达到使模型饱和的程度,为了可以使模型学习更多的图像特征,图像数据在进入模型之前要经过很多图像变换或者数据增强,来保证输入图像数据的多样性,从而保证模型有更好的泛化能力。PaddleClas提供了训练ImageNet-1k的标准图像变换,也提供了多种数据增强的方法,相关代码可以[数据处理](../../../ppcls/data/preprocess),配置文件可以参考[数据增强配置文件](../../../ppcls/configs/ImageNet/DataAugment), 相关数据增强算法详见数据[增强介绍文档](../algorithm_introduction/DataAugmentation.md)
<a name="2.2"></a>
### 2.2 模型准备
在数据确定后,模型往往决定了最终算法精度的上限,在图像分类领域,经典的模型层出不穷,PaddleClas提供了35个系列共164个ImageNet预训练模型。具体的精度、速度等指标请参考[骨干网络和预训练模型库](../algorithm_introduction/ImageNet_models.md)
<a name="2.3"></a>
### 2.3 模型训练
在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas提供了一些列的[训练调优方法](./train_strategy.md),可以快速助你获得高精度的模型。
<a name="2.4"></a>
### 2.4 模型评估
当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是Top1-Acc或者Top5-Acc,该指标越高往往代表模型性能越好。
<a name="3"></a>
## 三、使用方法介绍
请参考[安装指南](../installation/install_paddleclas.md)配置运行环境,并根据[快速开始](../quick_start/quick_start_classification.md)文档准备flower102数据集,本章节下面所有的实验均以flower102数据集为例。
请参考[安装指南](../installation/install_paddleclas.md)配置运行环境,并根据[快速开始](../quick_start/quick_start_classification_new_user.md)文档准备flower102数据集,本章节下面所有的实验均以flower102数据集为例。
PaddleClas目前支持的训练/评估环境如下:
```shell
......@@ -52,12 +86,13 @@ PaddleClas目前支持的训练/评估环境如下:
└── Linux
```
<a name="3.1"></a>
### 3.1 基于CPU/单卡GPU上的训练与评估
在基于CPU/单卡GPU上训练与评估,推荐使用`tools/train.py``tools/eval.py`脚本。关于Linux平台多卡GPU环境下的训练与评估,请参考[3.2. 基于Linux+GPU的模型训练与评估](#3.2)
<a name="3.1.1"></a>
<a name="3.1.1"></a>
#### 3.1.1 模型训练
准备好配置文件之后,可以使用下面的方式启动训练。
......@@ -96,6 +131,7 @@ python3 tools/train.py \
训练期间也可以通过VisualDL实时观察loss变化,详见[VisualDL](../extension/VisualDL.md)
<a name="3.1.2"></a>
#### 3.1.2 模型微调
根据自己的数据集路径设置好配置文件后,可以通过加载预训练模型的方式进行微调,如下所示。
......@@ -111,8 +147,8 @@ python3 tools/train.py \
我们也提供了大量基于`ImageNet-1k`数据集的预训练模型,模型列表及下载地址详见[模型库概览](../algorithm_introduction/ImageNet_models.md)
<a name="3.1.3"></a>
<a name="3.1.3"></a>
#### 3.1.3 模型恢复训练
如果训练任务因为其他原因被终止,也可以加载断点权重文件,继续训练:
......@@ -144,8 +180,8 @@ python3 tools/train.py \
.
```
<a name="3.1.4"></a>
<a name="3.1.4"></a>
#### 3.1.4 模型评估
可以通过以下命令进行模型评估。
......@@ -164,12 +200,13 @@ python3 tools/eval.py \
**注意:** 在加载待评估模型时,需要指定模型文件的路径,但无需包含文件后缀名,PaddleClas会自动补齐`.pdparams`的后缀,如[3.1.3 模型恢复训练](#3.1.3)
<a name="3.2"></a>
### 3.2. 基于Linux+多卡GPU的模型训练与评估
<a name="3.2"></a>
### 3.2 基于Linux+多卡GPU的模型训练与评估
如果机器环境为Linux+GPU,那么推荐使用`paddle.distributed.launch`启动模型训练脚本(`tools/train.py`)、评估脚本(`tools/eval.py`),可以更方便地启动多卡训练与评估。
<a name="3.2.1"></a>
#### 3.2.1 模型训练
参考如下方式启动模型训练,`paddle.distributed.launch`通过设置`gpus`指定GPU运行卡号:
......@@ -186,6 +223,7 @@ python3 -m paddle.distributed.launch \
输出日志信息的格式同上,详见[3.1.1 模型训练](#3.1.1)
<a name="3.2.2"></a>
#### 3.2.2 模型微调
根据自己的数据集配置好配置文件之后,可以加载预训练模型进行微调,如下所示。
......@@ -201,10 +239,10 @@ python3 -m paddle.distributed.launch \
其中`Arch.pretrained``True``False`,当然也可以设置加载预训练权重文件的路径,使用时需要换成自己的预训练模型权重文件路径,也可以直接在配置文件中修改该路径。
30分钟玩转PaddleClas[尝鲜版](./quick_start_new_user.md)[进阶版](./quick_start_professional.md)中包含大量模型微调的示例,可以参考该章节在特定的数据集上进行模型微调。
30分钟玩转PaddleClas[尝鲜版](../quick_start/quick_start_classification_new_user.md)[进阶版](../quick_start/quick_start_classification_professional.md)中包含大量模型微调的示例,可以参考该章节在特定的数据集上进行模型微调。
<a name="model_resume"></a>
<a name="3.2.3"></a>
#### 3.2.3 模型恢复训练
如果训练任务因为其他原因被终止,也可以加载断点权重文件继续训练。
......@@ -222,6 +260,7 @@ python3 -m paddle.distributed.launch \
其中配置文件不需要做任何修改,只需要在训练时设置`Global.checkpoints`参数即可,该参数表示加载的断点权重文件路径,使用该参数会同时加载保存的模型参数权重和学习率、优化器等信息,详见[3.1.3 模型恢复训练](#3.1.3)
<a name="3.2.4"></a>
#### 3.2.4 模型评估
可以通过以下命令进行模型评估。
......@@ -236,8 +275,8 @@ python3 -m paddle.distributed.launch \
参数说明详见[3.1.4 模型评估](#3.1.4)
<a name="model_infer"></a>
<a name="3.3"></a>
### 3.3 使用预训练模型进行模型预测
模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测:
......@@ -254,7 +293,7 @@ python3 tools/infer.py \
+ `Global.pretrained_model`:模型权重文件路径,如 `./output/MobileNetV3_large_x1_0/best_model`
<a name="model_inference"></a>
<a name="3.4"></a>
### 3.4 使用inference模型进行模型推理
通过导出inference模型,PaddlePaddle支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理:
......@@ -286,7 +325,7 @@ python3 python/predict_cls.py \
-o Global.inference_model_dir=../inference/ \
-o PostProcess.Topk.class_id_map_file=None
```
其中:
+ `Global.infer_imgs`:待预测的图片文件路径。
+ `Global.inference_model_dir`:inference模型结构文件路径,如 `../inference/inference.pdmodel`
......@@ -298,5 +337,5 @@ python3 python/predict_cls.py \
注意: 如果使用`Transformer`系列模型,如`DeiT_***_384`, `ViT_***_384`等,请注意模型的输入数据尺寸,需要设置参数`resize_short=384`, `resize=384`
如果你希望提升评测模型速度,使用gpu评测时,建议开启TensorRT加速预测,使用cpu评测时,建议开启MKL-DNN加速预测。
```
如果你希望提升评测模型速度,使用gpu评测时,建议开启TensorRT加速预测,使用cpu评测时,建议开启MKLDNN加速预测。
......@@ -7,12 +7,35 @@
本文档介绍了PaddleClas配置文件(`ppcls/configs/*.yaml`)中各参数的含义,以便您更快地自定义或修改超参数配置。
## 配置详解
### 目录
- [分类模型](#1)
- [1.1 全局配置(Global)](#1.1)
- [1.2 结构(Arch)](#1.2)
- [1.3 损失函数(Loss)](#1.3)
- [1.4 优化器(Optimizer)](#1.4)
- [1.5数据读取模块(DataLoader)](#1.5)
- [1.5.1 dataset](#1.5.1)
- [1.5.1 sampler](#1.5.2)
- [1.5.1 loader](#1.5.3)
- [1.6 评估指标(Metric)](#1.6)
- [蒸馏模型](#2)
- [2.1 结构(Arch)](#2.1)
- [2.2 损失函数(Loss)](#2.2)
- [2.3 评估指标(Metric)](#2.3)
- [识别模型](#3)
- [3.1 结构(Arch)](#3.1)
- [3.2 评估指标(Metric)](#3.2)
<a name="1"></a>
### 1.分类模型
此处以`ResNet50_vd``ImageNet-1k`上的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/ImageNet/ResNet/ResNet50_vd.yaml)
<a name="1.1"></a>
#### 1.1 全局配置(Global)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -34,6 +57,7 @@
**注**`pretrained_model`也可以填写存放预训练模型的http地址。
<a name="1.2"></a>
#### 1.2 结构(Arch)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -44,6 +68,7 @@
**注**:此处的pretrained可以设置为`True`或者`False`,也可以设置权重的路径。另外当`Global.pretrained_model`也设置相应路径时,此处的`pretrained`失效。
<a name="1.3"></a>
#### 1.3 损失函数(Loss)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -52,7 +77,7 @@
| CELoss.weight | CELoss的在整个Loss中的权重 | 1.0 | float |
| CELoss.epsilon | CELoss中label_smooth的epsilon值 | 0.1 | float,0-1之间 |
<a name="1.4"></a>
#### 1.4 优化器(Optimizer)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -77,9 +102,10 @@
添加方法及参数请查看[learning_rate.py](../../../ppcls/optimizer/learning_rate.py)
<a name="1.5"></a>
#### 1.5数据读取模块(DataLoader)
<a name="1.5.1"></a>
##### 1.5.1 dataset
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -112,6 +138,7 @@ batch_transform_ops中参数的含义:
|:---:|:---:|:---:|
| MixupOperator | alpha | Mixup参数值,该值越大增强越强 |
<a name="1.5.2"></a>
##### 1.5.2 sampler
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -121,6 +148,7 @@ batch_transform_ops中参数的含义:
| drop_last | 是否丢掉最后不够batch-size的数据 | False | bool |
| shuffle | 数据是否做shuffle | True | bool |
<a name="1.5.3"></a>
##### 1.5.3 loader
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -128,13 +156,14 @@ batch_transform_ops中参数的含义:
| num_workers | 数据读取线程数 | 4 | int |
| use_shared_memory | 是否使用共享内存 | True | bool |
<a name="1.6"></a>
#### 1.6 评估指标(Metric)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| TopkAcc | TopkAcc | [1, 5] | list, int |
<a name="1.7"></a>
#### 1.7 预测(Infer)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -147,11 +176,12 @@ batch_transform_ops中参数的含义:
**注**:Infer模块的`transforms`的解释参考数据读取模块中的dataset中`transform_ops`的解释。
<a name="2"></a>
### 2.蒸馏模型
**注**:此处以`MobileNetV3_large_x1_0``ImageNet-1k`上蒸馏`MobileNetV3_small_x1_0`的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/ImageNet/Distillation/mv3_large_x1_0_distill_mv3_small_x1_0.yaml)。这里只介绍与分类模型有区别的参数。
<a name="2.1"></a>
#### 2.1 结构(Arch)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -175,6 +205,7 @@ batch_transform_ops中参数的含义:
```
2.Student的参数情况类似,不再赘述。
<a name="2.2"></a>
#### 2.2 损失函数(Loss)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -186,7 +217,7 @@ batch_transform_ops中参数的含义:
| DistillationGTCELos.weight | Loss权重 | 1.0 | float |
| DistillationCELoss.model_names | 与真实label作交叉熵的模型名字 | ["Student"] | —— |
<a name="2.3"></a>
#### 2.3 评估指标(Metric)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -197,10 +228,12 @@ batch_transform_ops中参数的含义:
**注**`DistillationTopkAcc`与普通`TopkAcc`含义相同,只是只用在蒸馏任务中。
<a name="3"></a>
### 3. 识别模型
**注**:此处以`ResNet50``LogoDet-3k`上的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/Logo/ResNet50_ReID.yaml)。这里只介绍与分类模型有区别的参数。
<a name="3.1"></a>
#### 3.1 结构(Arch)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......@@ -228,6 +261,7 @@ batch_transform_ops中参数的含义:
3.调用`tools/export_model.py`会将模型的权重转为inference model,其中`infer_add_softmax`参数会控制是否在其后增加`Softmax`激活函数,代码中默认为`True`(分类任务中最后的输出层会接`Softmax`激活函数),识别任务中特征层无须接激活函数,此处要设置为`False`
<a name="3.2"></a>
#### 3.2 评估指标(Metric)
| 参数名字 | 具体含义 | 默认值 | 可选值 |
......
......@@ -11,13 +11,13 @@
其中特征库,需要利用已经标注好的图像数据集提前建立。完整的图像识别系统,如下图所示
<div align="center">
<img src="../../images/structure.png" width = "400" />
<img src="../../images/structure.jpg" width = "600" />
</div>
体验整体图像识别系统,或查看特征库建立方法,详见[图像识别快速开始文档](../quick_start/quick_start_recognition.md) 。其中,图像识别快速开始文档主要讲解整体流程的使用过程。以下内容,主要对上述三个步骤的训练部分进行介绍。
体验整体图像识别系统,或查看特征库建立方法,详见[图像识别快速开始文档](../quick_start/quick_start_recognition.md)。其中,图像识别快速开始文档主要讲解整体流程的使用过程。以下内容,主要对上述三个步骤的训练部分进行介绍。
首先,请参考[安装指南](../installation/install_paddleclas.md)配置运行环境。
具体目录如下:
## 目录
- [主体检测](#主体检测)
- [特征模型训练](#特征模型训练)
......
......@@ -8,7 +8,7 @@
* [1. 环境配置](#环境配置)
* [2. 图像识别体验](#图像识别体验)
* [2.1 下载、解压inference 模型与demo数据](#下载、解压inference_模型与demo数据)
* [2.1 下载、解压inference 模型与demo数据](#下载、解压inference模型与demo数据)
* [2.2 瓶装饮料识别与检索](#瓶装饮料识别与检索)
* [2.2.1 识别单张图像](#识别单张图像)
* [2.2.2 基于文件夹的批量识别](#基于文件夹的批量识别)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册