提交 b956f84b 编写于 作者: C cuicheng01

polish docs

上级 7d333515
# 一、数据增强分类实战 # 数据增强分类实战
---
本节将基于ImageNet-1K的数据集详细介绍数据增强实验,如果想快速体验此方法,可以参考[**30分钟玩转PaddleClas(进阶版)**](../quick_start/quick_start_classification_professional.md)中基于CIFAR100的数据增强实验。如果想了解相关算法的内容,请参考[数据增强算法介绍](../algorithm_introduction/DataAugmentation.md) 本节将基于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`里直接替换配置文件的路径即可使用。此处分别挑选了图像变换、图像裁剪、图像混叠中的一个示例展示,其他参数配置用户可以自查配置文件。 由于不同的数据增强方式含有不同的超参数,为了便于理解和使用,我们在`configs/DataAugment`里分别列举了8种训练ResNet50的数据增强方式的参数配置文件,用户可以在`tools/run.sh`里直接替换配置文件的路径即可使用。此处分别挑选了图像变换、图像裁剪、图像混叠中的一个示例展示,其他参数配置用户可以自查配置文件。
### AutoAugment <a name="1.1"></a>
### 1.1 AutoAugment
`AotoAugment`的图像增广方式的配置如下。`AutoAugment`是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。 `AotoAugment`的图像增广方式的配置如下。`AutoAugment`是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
...@@ -27,7 +48,8 @@ ...@@ -27,7 +48,8 @@
order: '' order: ''
``` ```
### RandAugment <a name="1.2"></a>
### 1.2 RandAugment
`RandAugment`的图像增广方式的配置如下,其中用户需要指定其中的参数`num_layers``magnitude`,默认的数值分别是`2``5``RandAugment`是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。 `RandAugment`的图像增广方式的配置如下,其中用户需要指定其中的参数`num_layers``magnitude`,默认的数值分别是`2``5``RandAugment`是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
...@@ -49,7 +71,9 @@ ...@@ -49,7 +71,9 @@
std: [0.229, 0.224, 0.225] std: [0.229, 0.224, 0.225]
order: '' 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`)之前。 `TimmAutoAugment`的图像增广方式的配置如下,其中用户需要指定其中的参数`config_str``interpolation``img_size`,默认的数值分别是`rand-m9-mstd0.5-inc1``bicubic``224``TimmAutoAugment`是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
...@@ -73,7 +97,8 @@ ...@@ -73,7 +97,8 @@
order: '' order: ''
``` ```
### Cutout <a name="1.4"></a>
### 1.4 Cutout
`Cutout`的图像增广方式的配置如下,其中用户需要指定其中的参数`n_holes``length`,默认的数值分别是`1``112`。类似其他图像裁剪类的数据增强方式,`Cutout`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。 `Cutout`的图像增广方式的配置如下,其中用户需要指定其中的参数`n_holes``length`,默认的数值分别是`1``112`。类似其他图像裁剪类的数据增强方式,`Cutout`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。
...@@ -96,7 +121,8 @@ ...@@ -96,7 +121,8 @@
length: 112 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`)后的数据上操作,此处给出的是在归一化后的操作。 `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 @@ ...@@ -124,7 +150,8 @@
mode: pixel mode: pixel
``` ```
### HideAndSeek <a name="1.6"></a>
### 1.6 HideAndSeek
`HideAndSeek`的图像增广方式的配置如下。类似其他图像裁剪类的数据增强方式,`HideAndSeek`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。 `HideAndSeek`的图像增广方式的配置如下。类似其他图像裁剪类的数据增强方式,`HideAndSeek`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。
...@@ -145,7 +172,8 @@ ...@@ -145,7 +172,8 @@
- HideAndSeek: - 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`)后的数据上操作,此处给出的是在归一化后的操作。 `GridMask`的图像增广方式的配置如下,其中用户需要指定其中的参数`d1``d2``rotate``ratio``mode`, 默认的数值分别是`96``224``1``0.5``0`。类似其他图像裁剪类的数据增强方式,`GridMask`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。
...@@ -171,8 +199,8 @@ ...@@ -171,8 +199,8 @@
mode: 0 mode: 0
``` ```
<a name="1.8"></a>
### Mixup ### 1.8 Mixup
`Mixup`的图像增广方式的配置如下,其中用户需要指定其中的参数`alpha`,默认的数值是`0.2`。类似其他图像混合类的数据增强方式,`Mixup`是在图像做完数据处理后将每个batch内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。 `Mixup`的图像增广方式的配置如下,其中用户需要指定其中的参数`alpha`,默认的数值是`0.2`。类似其他图像混合类的数据增强方式,`Mixup`是在图像做完数据处理后将每个batch内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。
...@@ -195,7 +223,8 @@ ...@@ -195,7 +223,8 @@
alpha: 0.2 alpha: 0.2
``` ```
### Cutmix <a name="1.9"></a>
### 1.9 Cutmix
`Cutmix`的图像增广方式的配置如下,其中用户需要指定其中的参数`alpha`,默认的数值是`0.2`。类似其他图像混合类的数据增强方式,`Cutmix`是在图像做完数据处理后将每个batch内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。 `Cutmix`的图像增广方式的配置如下,其中用户需要指定其中的参数`alpha`,默认的数值是`0.2`。类似其他图像混合类的数据增强方式,`Cutmix`是在图像做完数据处理后将每个batch内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。
...@@ -218,7 +247,8 @@ ...@@ -218,7 +247,8 @@
alpha: 0.2 alpha: 0.2
``` ```
### Mixup与Cutmix同时使用 <a name="1.10"></a>
### 1.10 Mixup与Cutmix同时使用
`Mixup``与Cutmix`同时使用的配置如下,其中用户需要指定额外的参数`prob`,该参数控制不同数据增强的概率,默认为`0.5` `Mixup``与Cutmix`同时使用的配置如下,其中用户需要指定额外的参数`prob`,该参数控制不同数据增强的概率,默认为`0.5`
```yaml ```yaml
...@@ -244,7 +274,8 @@ ...@@ -244,7 +274,8 @@
prob: 0.5 prob: 0.5
``` ```
## 1.2 启动命令 <a name="2"></a>
## 二、启动命令
当用户配置完训练环境后,类似于训练其他分类任务,只需要将`tools/train.sh`中的配置文件替换成为相应的数据增强方式的配置文件即可。 当用户配置完训练环境后,类似于训练其他分类任务,只需要将`tools/train.sh`中的配置文件替换成为相应的数据增强方式的配置文件即可。
...@@ -265,7 +296,8 @@ python3 -m paddle.distributed.launch \ ...@@ -265,7 +296,8 @@ python3 -m paddle.distributed.launch \
sh tools/train.sh sh tools/train.sh
``` ```
## 1.3 注意事项 <a name="3"></a>
## 三、注意事项
* 由于图像混叠时需对label进行混叠,无法计算训练数据的准确率,所以在训练过程中没有打印训练准确率。 * 由于图像混叠时需对label进行混叠,无法计算训练数据的准确率,所以在训练过程中没有打印训练准确率。
...@@ -275,7 +307,8 @@ sh tools/train.sh ...@@ -275,7 +307,8 @@ sh tools/train.sh
* 几乎每一类图像增强均含有超参数,我们只提供了基于ImageNet-1k的超参数,其他数据集需要用户自己调试超参数,具体超参数的含义用户可以阅读相关的论文,调试方法也可以参考训练技巧的章节。 * 几乎每一类图像增强均含有超参数,我们只提供了基于ImageNet-1k的超参数,其他数据集需要用户自己调试超参数,具体超参数的含义用户可以阅读相关的论文,调试方法也可以参考训练技巧的章节。
## 二、实验结果 <a name="4"></a>
## 四、实验结果
基于PaddleClas,在ImageNet1k数据集上的分类精度如下。 基于PaddleClas,在ImageNet1k数据集上的分类精度如下。
......
# PaddleClas代码解析 # 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主要代码和目录结构如下 PaddleClas主要代码和目录结构如下
...@@ -15,11 +26,15 @@ PaddleClas主要代码和目录结构如下 ...@@ -15,11 +26,15 @@ PaddleClas主要代码和目录结构如下
* requirements.txt 文件用于安装 PaddleClas 的依赖项。使用pip进行升级安装使用。 * requirements.txt 文件用于安装 PaddleClas 的依赖项。使用pip进行升级安装使用。
* tests:PaddleClas模型从训练到预测的全链路测试,验证各功能是否能够正常使用。 * tests:PaddleClas模型从训练到预测的全链路测试,验证各功能是否能够正常使用。
### 1.2 训练模块定义 <a name="2"></a>
## 二、训练模块定义
深度学习模型训练过程中,主要包含数据、模型结构、损失函数、优化器和学习率衰减、权重衰减策略等,以下一一解读。
深度学习模型训练过程中,主要包含以下几个核心模块。 <a name="2.1"></a>
## 2.1 数据
* 数据:对于有监督任务来说,训练数据一般包含原始数据及其标注。在基于单标签的图像分类任务中,原始数据指的是图像数据,而标注则是该图像数据所属的类比。PaddleClas中,训练时需要提供标签文件,形式如下,每一行包含一条训练样本,分别表示图片路径和类别标签,用分隔符隔开(默认为空格)。 对于有监督任务来说,训练数据一般包含原始数据及其标注。在基于单标签的图像分类任务中,原始数据指的是图像数据,而标注则是该图像数据所属的类比。PaddleClas中,训练时需要提供标签文件,形式如下,每一行包含一条训练样本,分别表示图片路径和类别标签,用分隔符隔开(默认为空格)。
``` ```
train/n01440764/n01440764_10026.JPEG 0 train/n01440764/n01440764_10026.JPEG 0
...@@ -58,7 +73,8 @@ PaddleClas 中也包含了 `AutoAugment`, `RandAugment` 等数据增广方法, ...@@ -58,7 +73,8 @@ PaddleClas 中也包含了 `AutoAugment`, `RandAugment` 等数据增广方法,
图像分类中,数据后处理主要为 `argmax` 操作,在此不再赘述。 图像分类中,数据后处理主要为 `argmax` 操作,在此不再赘述。
* 模型结构 <a name="2.2"></a>
## 2.2 模型结构
在配置文件中,模型结构定义如下 在配置文件中,模型结构定义如下
...@@ -83,7 +99,8 @@ def build_model(config): ...@@ -83,7 +99,8 @@ def build_model(config):
return arch return arch
``` ```
* 损失函数 <a name="2.3"></a>
## 2.3 损失函数
PaddleClas中,包含了 `CELoss` , `JSDivLoss`, `TripletLoss`, `CenterLoss` 等损失函数,均定义在 `ppcls/loss` 中。 PaddleClas中,包含了 `CELoss` , `JSDivLoss`, `TripletLoss`, `CenterLoss` 等损失函数,均定义在 `ppcls/loss` 中。
...@@ -107,7 +124,8 @@ Loss: ...@@ -107,7 +124,8 @@ Loss:
margin: 0.5 margin: 0.5
``` ```
* 优化器和学习率衰减、权重衰减策略 <a name="2.4"></a>
## 2.4 优化器和学习率衰减、权重衰减策略
图像分类任务中,`Momentum` 是一种比较常用的优化器, PaddleClas 中提供了 `Momentum``RMSProp``Adam``AdamW`等几种优化器策略。 图像分类任务中,`Momentum` 是一种比较常用的优化器, PaddleClas 中提供了 `Momentum``RMSProp``Adam``AdamW`等几种优化器策略。
...@@ -164,8 +182,8 @@ def build_optimizer(config, epochs, step_each_epoch, parameters): ...@@ -164,8 +182,8 @@ def build_optimizer(config, epochs, step_each_epoch, parameters):
不同优化器和权重衰减策略均以类的形式实现,具体实现可以参考文件 `ppcls/optimizer/optimizer.py` ;不同的学习率衰减策略可以参考文件 `ppcls/optimizer/learning_rate.py` 不同优化器和权重衰减策略均以类的形式实现,具体实现可以参考文件 `ppcls/optimizer/optimizer.py` ;不同的学习率衰减策略可以参考文件 `ppcls/optimizer/learning_rate.py`
<a name="2.5"></a>
* 训练时评估与模型存储 ## 2.5 训练时评估
模型在训练的时候,可以设置模型保存的间隔,也可以选择每隔若干个epoch对验证集进行评估,从而可以保存在验证集上精度最佳的模型。配置文件中,可以通过下面的字段进行配置。 模型在训练的时候,可以设置模型保存的间隔,也可以选择每隔若干个epoch对验证集进行评估,从而可以保存在验证集上精度最佳的模型。配置文件中,可以通过下面的字段进行配置。
...@@ -176,6 +194,8 @@ Global: ...@@ -176,6 +194,8 @@ Global:
eval_interval: 1 # 评估的epoch间隔 eval_interval: 1 # 评估的epoch间隔
``` ```
<a name="2.6"></a>
## 2.6 模型存储
模型存储是通过 Paddle 框架的 `paddle.save()` 函数实现的,存储的是模型的动态图版本,以字典的形式存储,便于继续训练。具体实现如下 模型存储是通过 Paddle 框架的 `paddle.save()` 函数实现的,存储的是模型的动态图版本,以字典的形式存储,便于继续训练。具体实现如下
```python ```python
...@@ -196,7 +216,10 @@ def save_model(program, model_path, epoch_id, prefix='ppcls'): ...@@ -196,7 +216,10 @@ def save_model(program, model_path, epoch_id, prefix='ppcls'):
如果想对模型进行压缩训练,则通过下面字段进行配置 如果想对模型进行压缩训练,则通过下面字段进行配置
模型裁剪: <a name="2.7"></a>
## 2.7 模型裁剪与量化
1.模型裁剪:
```yaml ```yaml
Slim: Slim:
...@@ -205,7 +228,7 @@ Slim: ...@@ -205,7 +228,7 @@ Slim:
pruned_ratio: 0.3 pruned_ratio: 0.3
``` ```
模型量化: 2.模型量化:
```yaml ```yaml
Slim: Slim:
...@@ -215,9 +238,12 @@ Slim: ...@@ -215,9 +238,12 @@ Slim:
训练方法详见模型[裁剪量化使用介绍](../advanced_tutorials/model_prune_quantization.md), 算法介绍详见[裁剪量化算法介绍](../algorithm_introduction/model_prune_quantization.md) 训练方法详见模型[裁剪量化使用介绍](../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) 中离线量化部分。 * 如果希望将对分类模型进行离线量化,可以参考 [模型量化裁剪教程](../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 社区贡献指南 # 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 分支说明 ### 1.1 PaddleClas 分支说明
PaddleClas 未来将维护 2 种分支,分别为: PaddleClas 未来将维护 2 种分支,分别为:
...@@ -16,8 +39,10 @@ PaddleClas 的历史分支,未来将不再维护。考虑到一些同学可能 ...@@ -16,8 +39,10 @@ PaddleClas 的历史分支,未来将不再维护。考虑到一些同学可能
PaddleClas 欢迎大家向 repo 中积极贡献代码,下面给出一些贡献代码的基本流程。 PaddleClas 欢迎大家向 repo 中积极贡献代码,下面给出一些贡献代码的基本流程。
<a name="1.2"></a>
### 1.2 PaddleClas 代码提交流程与规范 ### 1.2 PaddleClas 代码提交流程与规范
<a name="1.2.1"></a>
#### 1.2.1 fork 和 clone 代码 #### 1.2.1 fork 和 clone 代码
* 跳转到 [PaddleClas GitHub首页](https://github.com/PaddlePaddle/PaddleClas) ,然后单击 Fork 按钮,生成自己目录下的仓库,比如 `https://github.com/USERNAME/PaddleClas` * 跳转到 [PaddleClas GitHub首页](https://github.com/PaddlePaddle/PaddleClas) ,然后单击 Fork 按钮,生成自己目录下的仓库,比如 `https://github.com/USERNAME/PaddleClas`
...@@ -42,6 +67,7 @@ clone 的地址可以从下面获取 ...@@ -42,6 +67,7 @@ clone 的地址可以从下面获取
<img src="../../images/quick_start/community/002_clone.png" width = "600" /> <img src="../../images/quick_start/community/002_clone.png" width = "600" />
</div> </div>
<a name="1.2.2"></a>
#### 1.2.2 和远程仓库建立连接 #### 1.2.2 和远程仓库建立连接
首先通过 `git remote -v` 查看当前远程仓库的信息。 首先通过 `git remote -v` 查看当前远程仓库的信息。
...@@ -68,6 +94,7 @@ upstream https://github.com/PaddlePaddle/PaddleClas.git (push) ...@@ -68,6 +94,7 @@ upstream https://github.com/PaddlePaddle/PaddleClas.git (push)
这主要是为了后续在提交 pull request (PR) 时,始终保持本地仓库最新。 这主要是为了后续在提交 pull request (PR) 时,始终保持本地仓库最新。
<a name="1.2.3"></a>
#### 1.2.3 创建本地分支 #### 1.2.3 创建本地分支
可以基于当前分支创建新的本地分支,命令如下。 可以基于当前分支创建新的本地分支,命令如下。
...@@ -93,6 +120,7 @@ Branch new_branch set up to track remote branch develop from upstream. ...@@ -93,6 +120,7 @@ Branch new_branch set up to track remote branch develop from upstream.
Switched to a new branch 'new_branch' Switched to a new branch 'new_branch'
``` ```
<a name="1.2.4"></a>
#### 1.2.4 使用 pre-commit 勾子 #### 1.2.4 使用 pre-commit 勾子
Paddle 开发人员使用 pre-commit 工具来管理 Git 预提交钩子。 它可以帮助我们格式化源代码(C++,Python),在提交(commit)前自动检查一些基本事宜(如每个文件只有一个 EOL,Git 中不要添加大文件等)。 Paddle 开发人员使用 pre-commit 工具来管理 Git 预提交钩子。 它可以帮助我们格式化源代码(C++,Python),在提交(commit)前自动检查一些基本事宜(如每个文件只有一个 EOL,Git 中不要添加大文件等)。
...@@ -109,7 +137,7 @@ pre-commit install ...@@ -109,7 +137,7 @@ pre-commit install
1. Paddle 使用 clang-format 来调整 C/C++ 源代码格式,请确保 `clang-format` 版本在 3.8 以上。 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` 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 修改与提交代码 #### 1.2.5 修改与提交代码
可以通过 `git status` 查看改动的文件。 可以通过 `git status` 查看改动的文件。
...@@ -133,6 +161,7 @@ pre-commit ...@@ -133,6 +161,7 @@ pre-commit
git commit -m "your commit info" git commit -m "your commit info"
``` ```
<a name="1.2.6"></a>
#### 1.2.6 保持本地仓库最新 #### 1.2.6 保持本地仓库最新
获取 upstream 的最新代码并更新当前分支。这里的 upstream 来自于 1.2 节的`和远程仓库建立连接`部分。 获取 upstream 的最新代码并更新当前分支。这里的 upstream 来自于 1.2 节的`和远程仓库建立连接`部分。
...@@ -143,12 +172,14 @@ git fetch upstream ...@@ -143,12 +172,14 @@ git fetch upstream
git pull upstream develop git pull upstream develop
``` ```
<a name="1.2.7"></a>
#### 1.2.7 push到远程仓库 #### 1.2.7 push到远程仓库
```shell ```shell
git push origin new_branch git push origin new_branch
``` ```
<a name="1.2.8"></a>
#### 1.2.8 提交Pull Request #### 1.2.8 提交Pull Request
点击 new pull request,选择本地分支和目标分支,如下图所示。在 PR 的描述说明中,填写该 PR 所完成的功能。接下来等待 review ,如果有需要修改的地方,参照上述步骤更新 origin 中的对应分支即可。 点击 new pull request,选择本地分支和目标分支,如下图所示。在 PR 的描述说明中,填写该 PR 所完成的功能。接下来等待 review ,如果有需要修改的地方,参照上述步骤更新 origin 中的对应分支即可。
...@@ -157,7 +188,7 @@ git push origin new_branch ...@@ -157,7 +188,7 @@ git push origin new_branch
<img src="../../images/quick_start/community/004_create_pr.png" width = "600" /> <img src="../../images/quick_start/community/004_create_pr.png" width = "600" />
</div> </div>
<a name="1.2.9"></a>
#### 1.2.9 签署 CLA 协议和通过单元测试 #### 1.2.9 签署 CLA 协议和通过单元测试
* 签署 CLA * 签署 CLA
...@@ -166,6 +197,7 @@ git push origin new_branch ...@@ -166,6 +197,7 @@ git push origin new_branch
1. 请您查看 PR 中的 Check 部分,找到 license/cla ,并点击右侧 detail ,进入 CLA 网站 1. 请您查看 PR 中的 Check 部分,找到 license/cla ,并点击右侧 detail ,进入 CLA 网站
2. 点击 CLA 网站中的 `Sign in with GitHub to agree` , 点击完成后将会跳转回您的 Pull Request 页面 2. 点击 CLA 网站中的 `Sign in with GitHub to agree` , 点击完成后将会跳转回您的 Pull Request 页面
<a name="1.2.10"></a>
#### 1.2.10 删除分支 #### 1.2.10 删除分支
* 删除远程分支 * 删除远程分支
...@@ -189,6 +221,7 @@ git checkout develop ...@@ -189,6 +221,7 @@ git checkout develop
git branch -D new_branch git branch -D new_branch
``` ```
<a name="1.2.11"></a>
#### 1.2.11 提交代码的一些约定 #### 1.2.11 提交代码的一些约定
为了使官方维护人员在评审代码时更好地专注于代码本身,请您每次提交代码时,遵守以下约定: 为了使官方维护人员在评审代码时更好地专注于代码本身,请您每次提交代码时,遵守以下约定:
...@@ -219,11 +252,12 @@ git branch -D new_branch ...@@ -219,11 +252,12 @@ git branch -D new_branch
- 请给出总体的修改情况。 - 请给出总体的修改情况。
- 请采用 `start a review` 进行回复,而非直接回复的方式。原因是每个回复都会发送一封邮件,会造成邮件灾难。 - 请采用 `start a review` 进行回复,而非直接回复的方式。原因是每个回复都会发送一封邮件,会造成邮件灾难。
<a name="2"></a>
## 2. 总结 ## 二、总结
* 开源社区依赖于众多开发者与用户的贡献和反馈,在这里感谢与期待大家向 PaddleClas 提出宝贵的意见与 Pull Request ,希望我们可以一起打造一个领先实用全面的图像识别代码仓库! * 开源社区依赖于众多开发者与用户的贡献和反馈,在这里感谢与期待大家向 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) 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) 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.3ImageNet1k 训练集 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 @@ ...@@ -13,8 +36,10 @@
<img src="../../images/distillation/distillation_perform_s.jpg" width = "600" /> <img src="../../images/distillation/distillation_perform_s.jpg" width = "600" />
</div> </div>
<a name="2"></a>
## 二、SSLD 蒸馏策略 ## 二、SSLD 蒸馏策略
<a name="2.1"></a>
### 2.1 简介 ### 2.1 简介
SSLD 的流程图如下图所示。 SSLD 的流程图如下图所示。
...@@ -36,7 +61,7 @@ SSLD 的流程图如下图所示。 ...@@ -36,7 +61,7 @@ SSLD 的流程图如下图所示。
* ImageNet1k 蒸馏 finetune 。 我们仅使用 ImageNet1k 数据,使用蒸馏方法对上述模型进行 finetune ,最终仍然可以获得 0.4% 的性能提升( `78.5%->78.9%` )。 * ImageNet1k 蒸馏 finetune 。 我们仅使用 ImageNet1k 数据,使用蒸馏方法对上述模型进行 finetune ,最终仍然可以获得 0.4% 的性能提升( `78.5%->78.9%` )。
<a name="2.2"></a>
### 2.2 数据选择 ### 2.2 数据选择
* SSLD 蒸馏方案的一大特色就是无需使用图像的真值标签,因此可以任意扩展数据集的大小,考虑到计算资源的限制,我们在这里仅基于 ImageNet22k 数据集对蒸馏任务的训练集进行扩充。在 SSLD 蒸馏任务中,我们使用了 `Top-k per class` 的数据采样方案 [3] 。具体步骤如下。 * SSLD 蒸馏方案的一大特色就是无需使用图像的真值标签,因此可以任意扩展数据集的大小,考虑到计算资源的限制,我们在这里仅基于 ImageNet22k 数据集对蒸馏任务的训练集进行扩充。在 SSLD 蒸馏任务中,我们使用了 `Top-k per class` 的数据采样方案 [3] 。具体步骤如下。
...@@ -50,11 +75,12 @@ SSLD 的流程图如下图所示。 ...@@ -50,11 +75,12 @@ SSLD 的流程图如下图所示。
* Top-k 数据选择, ImageNet1k 数据共有 1000 类,对于每一类,找出属于该类并且得分最高的 `k` 张图片,最终得到一个数据量不超过`1000*k`的数据集(某些类上得到的图片数量可能少于 `k` 张)。 * Top-k 数据选择, ImageNet1k 数据共有 1000 类,对于每一类,找出属于该类并且得分最高的 `k` 张图片,最终得到一个数据量不超过`1000*k`的数据集(某些类上得到的图片数量可能少于 `k` 张)。
* 将该数据集与 ImageNet1k 的训练集融合组成最终蒸馏模型所使用的数据集,数据量为 500 万。 * 将该数据集与 ImageNet1k 的训练集融合组成最终蒸馏模型所使用的数据集,数据量为 500 万。
<a name="3"></a>
## 三、实验 ## 三、实验
* PaddleClas 的蒸馏策略为`大数据集训练 + ImageNet1k 蒸馏 finetune`的策略。选择合适的教师模型,首先在挑选得到的 500 万数据集上进行训练,然后在 ImageNet1k 训练集上进行 finetune,最终得到蒸馏后的学生模型。 * PaddleClas 的蒸馏策略为`大数据集训练 + ImageNet1k 蒸馏 finetune`的策略。选择合适的教师模型,首先在挑选得到的 500 万数据集上进行训练,然后在 ImageNet1k 训练集上进行 finetune,最终得到蒸馏后的学生模型。
<a name="3.1"></a>
### 3.1 教师模型的选择 ### 3.1 教师模型的选择
为了验证教师模型和学生模型的模型大小差异和教师模型的模型精度对蒸馏结果的影响,我们做了几组实验验证。训练策略统一为:`cosine_decay_warmup,lr=1.3, epoch=120, bs=2048`,学生模型均为从头训练。 为了验证教师模型和学生模型的模型大小差异和教师模型的模型精度对蒸馏结果的影响,我们做了几组实验验证。训练策略统一为:`cosine_decay_warmup,lr=1.3, epoch=120, bs=2048`,学生模型均为从头训练。
...@@ -75,6 +101,7 @@ SSLD 的流程图如下图所示。 ...@@ -75,6 +101,7 @@ SSLD 的流程图如下图所示。
因此最终在蒸馏实验中,对于ResNet系列学生模型,我们使用 `ResNeXt101_32x16d_wsl` 作为教师模型;对于 MobileNet 系列学生模型,我们使用蒸馏得到的 `ResNet50_vd` 作为教师模型。 因此最终在蒸馏实验中,对于ResNet系列学生模型,我们使用 `ResNeXt101_32x16d_wsl` 作为教师模型;对于 MobileNet 系列学生模型,我们使用蒸馏得到的 `ResNet50_vd` 作为教师模型。
<a name="3.2"></a>
### 3.2 大数据蒸馏 ### 3.2 大数据蒸馏
基于 PaddleClas 的蒸馏策略为`大数据集训练 + imagenet1k finetune` 的策略。 基于 PaddleClas 的蒸馏策略为`大数据集训练 + imagenet1k finetune` 的策略。
...@@ -92,6 +119,7 @@ SSLD 的流程图如下图所示。 ...@@ -92,6 +119,7 @@ SSLD 的流程图如下图所示。
| ResNet101_vd | 360 | 7e-5 | 1024/32 | 0.4 | cosine_decay_warmup | 83.41% | | 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% | | 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 ### 3.3 ImageNet1k 训练集 finetune
对于在大数据集上训练的模型,其学习到的特征可能与 ImageNet1k 数据特征有偏,因此在这里使用 ImageNet1k 数据集对模型进行 finetune。 finetune 的超参和 finetune 的精度收益如下。 对于在大数据集上训练的模型,其学习到的特征可能与 ImageNet1k 数据特征有偏,因此在这里使用 ImageNet1k 数据集对模型进行 finetune。 finetune 的超参和 finetune 的精度收益如下。
...@@ -107,7 +135,7 @@ SSLD 的流程图如下图所示。 ...@@ -107,7 +135,7 @@ SSLD 的流程图如下图所示。
| ResNet101_vd | 30 | 7e-5 | 1024/32 | 0.004 | cosine_decay_warmup | 83.73% | | 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% | | Res2Net200_vd_26w_4s | 360 | 4e-5 | 1024/32 | 0.004 | cosine_decay_warmup | 85.13% |
<a name="3.4"></a>
### 3.4 数据增广以及基于 Fix 策略的微调 ### 3.4 数据增广以及基于 Fix 策略的微调
* 基于前文所述的实验结论,我们在训练的过程中加入自动增广 (AutoAugment)[4] ,同时进一步减小了 l2_decay (4e-5->2e-5) ,最终 ResNet50_vd 经过 SSLD 蒸馏策略,在 ImageNet1k 上的精度可以达到 82.99% ,相比之前不加数据增广的蒸馏策略再次增加了 0.6% 。 * 基于前文所述的实验结论,我们在训练的过程中加入自动增广 (AutoAugment)[4] ,同时进一步减小了 l2_decay (4e-5->2e-5) ,最终 ResNet50_vd 经过 SSLD 蒸馏策略,在 ImageNet1k 上的精度可以达到 82.99% ,相比之前不加数据增广的蒸馏策略再次增加了 0.6% 。
...@@ -115,7 +143,7 @@ SSLD 的流程图如下图所示。 ...@@ -115,7 +143,7 @@ SSLD 的流程图如下图所示。
* 对于图像分类任务,在测试的时候,测试尺度为训练尺度的 1.15 倍左右时,往往在不需要重新训练模型的情况下,模型的精度指标就可以进一步提升 [5] ,对于 82.99% 的 ResNet50_vd 在 320x320 的尺度下测试,精度可达 83.7% ,我们进一步使用 Fix 策略,即在 320x320 的尺度下进行训练,使用与预测时相同的数据预处理方法,同时固定除 FC 层以外的所有参数,最终在 320x320 的预测尺度下,精度可以达到 **84.0%** * 对于图像分类任务,在测试的时候,测试尺度为训练尺度的 1.15 倍左右时,往往在不需要重新训练模型的情况下,模型的精度指标就可以进一步提升 [5] ,对于 82.99% 的 ResNet50_vd 在 320x320 的尺度下测试,精度可达 83.7% ,我们进一步使用 Fix 策略,即在 320x320 的尺度下进行训练,使用与预测时相同的数据预处理方法,同时固定除 FC 层以外的所有参数,最终在 320x320 的预测尺度下,精度可以达到 **84.0%**
<a name="3.5"></a>
### 3.5 实验过程中的一些问题 ### 3.5 实验过程中的一些问题
* 在预测过程中, batch norm 的平均值与方差是通过加载预训练模型得到(设其模式为 test mode )。在训练过程中, batch norm 是通过统计当前 batch 的信息(设其模式为 train mode ),与历史保存信息进行滑动平均计算得到,在蒸馏任务中,我们发现通过 train mode ,即教师模型的均值与方差实时变化的模式,去指导学生模型,比通过 test mode 蒸馏,得到的学生模型性能更好一些,下面是一组实验结果。因此我们在该蒸馏方案中,均使用 train mode 去得到教师模型的 soft label 。 * 在预测过程中, batch norm 的平均值与方差是通过加载预训练模型得到(设其模式为 test mode )。在训练过程中, batch norm 是通过统计当前 batch 的信息(设其模式为 train mode ),与历史保存信息进行滑动平均计算得到,在蒸馏任务中,我们发现通过 train mode ,即教师模型的均值与方差实时变化的模式,去指导学生模型,比通过 test mode 蒸馏,得到的学生模型性能更好一些,下面是一组实验结果。因此我们在该蒸馏方案中,均使用 train mode 去得到教师模型的 soft label 。
...@@ -125,9 +153,10 @@ SSLD 的流程图如下图所示。 ...@@ -125,9 +153,10 @@ SSLD 的流程图如下图所示。
| ResNet50_vd | 82.35% | MobileNetV3_large_x1_0 | 76.00% | | ResNet50_vd | 82.35% | MobileNetV3_large_x1_0 | 76.00% |
| ResNet50_vd | 82.35% | MobileNetV3_large_x1_0 | 75.84% | | ResNet50_vd | 82.35% | MobileNetV3_large_x1_0 | 75.84% |
<a name="4"></a>
## 四、蒸馏模型的应用 ## 四、蒸馏模型的应用
<a name="4.1"></a>
### 4.1 使用方法 ### 4.1 使用方法
* 中间层学习率调整。蒸馏得到的模型的中间层特征图更加精细化,因此将蒸馏模型预训练应用到其他任务中时,如果采取和之前相同的学习率,容易破坏中间层特征。而如果降低整体模型训练的学习率,则会带来训练收敛速度慢的问题。因此我们使用了中间层学习率调整的策略。具体地: * 中间层学习率调整。蒸馏得到的模型的中间层特征图更加精细化,因此将蒸馏模型预训练应用到其他任务中时,如果采取和之前相同的学习率,容易破坏中间层特征。而如果降低整体模型训练的学习率,则会带来训练收敛速度慢的问题。因此我们使用了中间层学习率调整的策略。具体地:
...@@ -137,7 +166,7 @@ SSLD 的流程图如下图所示。 ...@@ -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% 的提升)。 * 适当的 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 ### 4.2 迁移学习 finetune
* 为验证迁移学习的效果,我们在 10 个小的数据集上验证其效果。在这里为了保证实验的可对比性,我们均使用 ImageNet1k 数据集训练的标准预处理过程,对于蒸馏模型我们也添加了蒸馏模型中间层学习率的搜索。 * 为验证迁移学习的效果,我们在 10 个小的数据集上验证其效果。在这里为了保证实验的可对比性,我们均使用 ImageNet1k 数据集训练的标准预处理过程,对于蒸馏模型我们也添加了蒸馏模型中间层学习率的搜索。
* 对于 ResNet50_vd , baseline 为 Top1 Acc 79.12% 的预训练模型基于 grid search 搜索得到的最佳精度,对比实验则为基于该精度对预训练和中间层学习率进一步搜索得到的最佳精度。下面给出 10 个数据集上所有 baseline 和蒸馏模型的精度对比。 * 对于 ResNet50_vd , baseline 为 Top1 Acc 79.12% 的预训练模型基于 grid search 搜索得到的最佳精度,对比实验则为基于该精度对预训练和中间层学习率进一步搜索得到的最佳精度。下面给出 10 个数据集上所有 baseline 和蒸馏模型的精度对比。
...@@ -158,7 +187,7 @@ SSLD 的流程图如下图所示。 ...@@ -158,7 +187,7 @@ SSLD 的流程图如下图所示。
* 可以看出在上面 10 个数据集上,结合适当的中间层学习率倍数设置,蒸馏模型平均能够带来 1% 以上的精度提升。 * 可以看出在上面 10 个数据集上,结合适当的中间层学习率倍数设置,蒸馏模型平均能够带来 1% 以上的精度提升。
<a name="4.3"></a>
### 4.3 目标检测 ### 4.3 目标检测
我们基于两阶段目标检测 Faster/Cascade RCNN 模型验证蒸馏得到的预训练模型的效果。 我们基于两阶段目标检测 Faster/Cascade RCNN 模型验证蒸馏得到的预训练模型的效果。
...@@ -175,11 +204,12 @@ SSLD 的流程图如下图所示。 ...@@ -175,11 +204,12 @@ SSLD 的流程图如下图所示。
在这里可以看出,对于未蒸馏模型,过度调整中间层学习率反而降低最终检测模型的性能指标。基于该蒸馏模型,我们也提供了领先的服务端实用目标检测方案,详细的配置与训练代码均已开源,可以参考 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_enhance) 在这里可以看出,对于未蒸馏模型,过度调整中间层学习率反而降低最终检测模型的性能指标。基于该蒸馏模型,我们也提供了领先的服务端实用目标检测方案,详细的配置与训练代码均已开源,可以参考 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_enhance)
<a name="5"></a>
## 五、SSLD实战 ## 五、SSLD实战
本节将基于 ImageNet-1K 的数据集详细介绍 SSLD 蒸馏实验,如果想快速体验此方法,可以参考 [**30分钟玩转PaddleClas(进阶版)**](../../tutorials/quick_start_professional.md) 中基于 CIFAR100 的 SSLD 蒸馏实验。 本节将基于 ImageNet-1K 的数据集详细介绍 SSLD 蒸馏实验,如果想快速体验此方法,可以参考 [**30分钟玩转PaddleClas(进阶版)**](../../tutorials/quick_start_professional.md) 中基于 CIFAR100 的 SSLD 蒸馏实验。
<a name="5.1"></a>
### 5.1 参数配置 ### 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` 里直接替换配置文件的路径即可使用。 实战部分提供了 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: ...@@ -207,7 +237,7 @@ Arch:
在参数配置中,`freeze_params_list` 中需要指定模型是否需要冻结参数, `models` 中需要指定 Teacher 模型和 Student 模型,其中 Teacher 模型需要加载预训练模型。用户可以直接在此处更改模型。 在参数配置中,`freeze_params_list` 中需要指定模型是否需要冻结参数, `models` 中需要指定 Teacher 模型和 Student 模型,其中 Teacher 模型需要加载预训练模型。用户可以直接在此处更改模型。
<a name="5.2"></a>
### 5.2 启动命令 ### 5.2 启动命令
当用户配置完训练环境后,类似于训练其他分类任务,只需要将 `tools/train.sh` 中的配置文件替换成为相应的蒸馏配置文件即可。 当用户配置完训练环境后,类似于训练其他分类任务,只需要将 `tools/train.sh` 中的配置文件替换成为相应的蒸馏配置文件即可。
...@@ -229,6 +259,7 @@ python -m paddle.distributed.launch \ ...@@ -229,6 +259,7 @@ python -m paddle.distributed.launch \
sh tools/train.sh sh tools/train.sh
``` ```
<a name="5.3"></a>
### 5.3 注意事项 ### 5.3 注意事项
* 用户在使用 SSLD 蒸馏之前,首先需要在目标数据集上训练一个教师模型,该教师模型用于指导学生模型在该数据集上的训练。 * 用户在使用 SSLD 蒸馏之前,首先需要在目标数据集上训练一个教师模型,该教师模型用于指导学生模型在该数据集上的训练。
...@@ -239,8 +270,8 @@ sh tools/train.sh ...@@ -239,8 +270,8 @@ sh tools/train.sh
* 若用户准备添加无标签的训练数据,只需要将新的训练数据放置在原本训练数据的路径下,生成新的数据 list 即可,另外,新生成的数据 list 需要将无标签的数据添加伪标签(只是为了统一读数据)。 * 若用户准备添加无标签的训练数据,只需要将新的训练数据放置在原本训练数据的路径下,生成新的数据 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. [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 @@ ...@@ -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) 在开始本教程之前,建议先了解[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 @@ ...@@ -23,7 +39,8 @@
4. 导出量化推理模型 4. 导出量化推理模型
5. 量化模型预测部署 5. 量化模型预测部署
### 1. 安装PaddleSlim <a name="1.1"></a>
### 1.1 安装PaddleSlim
* 可以通过pip install的方式进行安装。 * 可以通过pip install的方式进行安装。
...@@ -39,11 +56,13 @@ cd Paddleslim ...@@ -39,11 +56,13 @@ cd Paddleslim
python3.7 setup.py install python3.7 setup.py install
``` ```
### 2. 准备训练好的模型 <a name="1.2"></a>
### 1.2 准备训练好的模型
PaddleClas提供了一系列训练好的[模型](../models/models_intro.md),如果待量化的模型不在列表中,需要按照[常规训练](../models_training/classification.md)方法得到训练好的模型。 PaddleClas提供了一系列训练好的[模型](../models/models_intro.md),如果待量化的模型不在列表中,需要按照[常规训练](../models_training/classification.md)方法得到训练好的模型。
### 3. 模型裁剪、量化 <a name="2"></a>
## 二、 快速开始
进入PaddleClas根目录 进入PaddleClas根目录
...@@ -53,11 +72,13 @@ cd PaddleClas ...@@ -53,11 +72,13 @@ cd PaddleClas
`slim`训练相关代码已经集成到`ppcls/engine/`下,离线量化代码位于`deploy/slim/quant_post_static.py` `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 \ ...@@ -82,7 +103,8 @@ python3.7 -m paddle.distributed.launch \
-c ppcls/configs/slim/ResNet50_vd_quantization.yaml -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). **注意**:目前离线量化,必须使用已经训练好的模型,导出的`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 ...@@ -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`文件夹,其中存储生成的离线量化模型,其可以直接进行预测部署,无需再重新导出模型。 执行成功后,在`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 \ ...@@ -120,7 +143,8 @@ python3.7 -m paddle.distributed.launch \
-c ppcls/configs/slim/ResNet50_vd_prune.yaml -c ppcls/configs/slim/ResNet50_vd_prune.yaml
``` ```
### 4. 导出模型 <a name="3"></a>
## 三、导出模型
在得到在线量化训练、模型剪枝保存的模型后,可以将其导出为inference model,用于预测部署,以模型剪枝为例: 在得到在线量化训练、模型剪枝保存的模型后,可以将其导出为inference model,用于预测部署,以模型剪枝为例:
...@@ -131,16 +155,16 @@ python3.7 tools/export.py \ ...@@ -131,16 +155,16 @@ python3.7 tools/export.py \
-o Global.save_inference_dir=./inference -o Global.save_inference_dir=./inference
``` ```
<a name="4"></a>
### 5. 模型部署 ## 四、模型部署
上述步骤导出的模型可以直接使用inferecne 进行部署,参考[inference部署](../inference_deployment/) 上述步骤导出的模型可以直接使用inferecne 进行部署,参考[inference部署](../inference_deployment/)
也通过PaddleLite的opt模型转换工具,完成inference模型到移动端模型转换,用于移动端的模型部署。 也通过PaddleLite的opt模型转换工具,完成inference模型到移动端模型转换,用于移动端的模型部署。
移动端模型部署的可参考 [移动端模型部署](../../../deploy/lite/readme.md) 移动端模型部署的可参考 [移动端模型部署](../../../deploy/lite/readme.md)
<a name="5"></a>
## 训练超参数建议 ## 五、训练超参数建议
* 量化、裁剪训练时,建议加载常规训练得到的预训练模型,加速量化训练收敛。 * 量化、裁剪训练时,建议加载常规训练得到的预训练模型,加速量化训练收敛。
* 量化训练时,建议初始学习率修改为常规训练的`1/20~1/10`,同时将训练epoch数修改为常规训练的`1/5~1/2`,学习率策略方面,加上Warmup,其他配置信息不建议修改。 * 量化训练时,建议初始学习率修改为常规训练的`1/20~1/10`,同时将训练epoch数修改为常规训练的`1/5~1/2`,学习率策略方面,加上Warmup,其他配置信息不建议修改。
......
...@@ -3,10 +3,38 @@ ...@@ -3,10 +3,38 @@
## ImageNet预训练模型库 ## 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> <a name="模型库概览图"></a>
### 模型库概览图 ### 模型库概览图
基于ImageNet1k分类数据集,PaddleClas支持35个系列分类网络结构以及对应的164个图像分类预训练模型,训练技巧、每个系列网络结构的简单介绍和性能评估将在相应章节展现,下面所有的速度指标评估环境如下: 基于ImageNet1k分类数据集,PaddleClas支持36个系列分类网络结构以及对应的175个图像分类预训练模型,训练技巧、每个系列网络结构的简单介绍和性能评估将在相应章节展现,下面所有的速度指标评估环境如下:
* Arm CPU的评估环境基于骁龙855(SD855)。 * Arm CPU的评估环境基于骁龙855(SD855)。
* Intel CPU的评估环境基于Intel(R) Xeon(R) Gold 6148。 * Intel CPU的评估环境基于Intel(R) Xeon(R) Gold 6148。
* GPU评估环境基于T4机器,在FP32+TensorRT配置下运行500次测得(去除前10次的warmup时间)。 * GPU评估环境基于T4机器,在FP32+TensorRT配置下运行500次测得(去除前10次的warmup时间)。
...@@ -27,7 +55,8 @@ ...@@ -27,7 +55,8 @@
### SSLD知识蒸馏预训练模型 ### SSLD知识蒸馏预训练模型
基于SSLD知识蒸馏的预训练模型列表如下所示,更多关于SSLD知识蒸馏方案的介绍可以参考:[SSLD知识蒸馏文档](./knowledge_distillation.md) 基于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) | 下载地址 | | 模型 | 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 @@ ...@@ -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) | | 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) | | 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) | 下载地址 | | 模型 | 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 @@ ...@@ -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) | | 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) | | 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) |
<a name="Intel-CPU端知识蒸馏模型"></a>
* Intel CPU端知识蒸馏模型 #### 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) | 下载地址 | | 模型 | 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系列模型的精度、速度指标如下表所示,更多关于该系 ...@@ -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) | | 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> <a name="ResNet系列"></a>
### ResNet及其Vd系列 ### ResNet系列
ResNet及其Vd系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNet及其Vd系列模型文档](../models/ResNet_and_vd.md) ResNet及其Vd系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNet及其Vd系列模型文档](../models/ResNet_and_vd.md)
...@@ -314,7 +343,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -314,7 +343,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
<a name="RepVGG系列"></a> <a name="RepVGG系列"></a>
### RepVGG系列 ### RepVGG系列
关于RepVGG系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RepVGG系列模型文档](../models/RepVGG.md) 关于RepVGG系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RepVGG系列模型文档](../models/RepVGG.md)
...@@ -334,7 +362,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -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) | | RepVGG_B3g4 | 0.7965 | 0.9485 | | | | | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_B3g4_pretrained.pdparams) |
<a name="MixNet系列"></a> <a name="MixNet系列"></a>
### MixNet系列 ### MixNet系列
关于MixNet系列模型的精度、速度指标如下表所示,更多介绍可以参考:[MixNet系列模型文档](../models/MixNet.md) 关于MixNet系列模型的精度、速度指标如下表所示,更多介绍可以参考:[MixNet系列模型文档](../models/MixNet.md)
...@@ -346,7 +373,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -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) | | 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> <a name="ReXNet系列"></a>
### ReXNet系列 ### ReXNet系列
关于ReXNet系列模型的精度、速度指标如下表所示,更多介绍可以参考:[ReXNet系列模型文档](../models/ReXNet.md) 关于ReXNet系列模型的精度、速度指标如下表所示,更多介绍可以参考:[ReXNet系列模型文档](../models/ReXNet.md)
...@@ -360,7 +386,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -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) | | 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> <a name="SwinTransformer系列"></a>
### SwinTransformer系列 ### SwinTransformer系列
关于SwinTransformer系列模型的精度、速度指标如下表所示,更多介绍可以参考:[SwinTransformer系列模型文档](../models/SwinTransformer.md) 关于SwinTransformer系列模型的精度、速度指标如下表所示,更多介绍可以参考:[SwinTransformer系列模型文档](../models/SwinTransformer.md)
...@@ -463,7 +488,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -463,7 +488,6 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
**注**:TNT模型的数据预处理部分`NormalizeImage`中的`mean``std`均为0.5。 **注**:TNT模型的数据预处理部分`NormalizeImage`中的`mean``std`均为0.5。
<a name="其他模型"></a> <a name="其他模型"></a>
### 其他模型 ### 其他模型
关于AlexNet、SqueezeNet系列、VGG系列、DarkNet53等模型的精度、速度指标如下表所示,更多介绍可以参考:[其他模型文档](../models/Others.md) 关于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.2 模型训练](#2.3)
- [2.2 模型评估](#2.4)
- [主要算法简介](#3)
图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析等,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等。 图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析等,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等。
一般来说,图像分类通过手工特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。在深度学习算法之前使用较多的是基于词袋(Bag of Words)模型的物体分类方法。而基于深度学习的图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN)近年来在图像领域取得了惊人的成绩,CNN直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于"输入-输出"直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。 一般来说,图像分类通过手工特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。在深度学习算法之前使用较多的是基于词袋(Bag of Words)模型的物体分类方法。而基于深度学习的图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN)近年来在图像领域取得了惊人的成绩,CNN直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于"输入-输出"直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。
图像分类是计算机视觉里很基础但又重要的一个领域,其研究成果一直影响着计算机视觉甚至深度学习的发展,图像分类有很多子领域,如多标签分类、细粒度分类等,此处只对单标签图像分类做一个简述。 图像分类是计算机视觉里很基础但又重要的一个领域,其研究成果一直影响着计算机视觉甚至深度学习的发展,图像分类有很多子领域,如多标签分类、细粒度分类等,此处只对单标签图像分类做一个简述。
<a name="1"></a>
## 一、数据集介绍 ## 一、数据集介绍
<a name="1.1"></a>
### 1.1 ImageNet-1k ### 1.1 ImageNet-1k
ImageNet项目是一个大型视觉数据库,用于视觉目标识别软件研究。该项目已手动注释了1400多万张图像,以指出图片中的对象,并在至少100万张图像中提供了边框。ImageNet-1k是ImageNet数据集的子集,其包含1000个类别。训练集包含1281167个图像数据,验证集包含50000个图像数据。2010年以来,ImageNet项目每年举办一次图像分类竞赛,即ImageNet大规模视觉识别挑战赛(ILSVRC)。挑战赛使用的数据集即为ImageNet-1k。到目前为止,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 ### 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张。由于这两个数据集规模较小,因此可以让研究人员快速尝试不同的算法。这两个数据集也是图像分类领域测试模型好坏的常用数据集。 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 数据及其预处理 ### 2.1 数据及其预处理
数据的质量及数量往往可以决定一个模型的好坏。在图像分类领域,数据包括图像及标签。在大部分情形下,带有标签的数据比较匮乏,所以数量很难达到使模型饱和的程度,为了可以使模型学习更多的图像特征,图像数据在进入模型之前要经过很多图像变换或者数据增强,来保证输入图像数据的多样性,从而保证模型有更好的泛化能力。PaddleClas提供了训练ImageNet-1k的标准图像变换,也提供了8中数据增强的方法,相关代码可以[数据处理](../../../ppcls/data/preprocess),配置文件可以参考[数据增强配置文件](../../../ppcls/configs/ImageNet/DataAugment) 数据的质量及数量往往可以决定一个模型的好坏。在图像分类领域,数据包括图像及标签。在大部分情形下,带有标签的数据比较匮乏,所以数量很难达到使模型饱和的程度,为了可以使模型学习更多的图像特征,图像数据在进入模型之前要经过很多图像变换或者数据增强,来保证输入图像数据的多样性,从而保证模型有更好的泛化能力。PaddleClas提供了训练ImageNet-1k的标准图像变换,也提供了8中数据增强的方法,相关代码可以[数据处理](../../../ppcls/data/preprocess),配置文件可以参考[数据增强配置文件](../../../ppcls/configs/ImageNet/DataAugment)
<a name="2.2"></a>
### 2.2 模型准备 ### 2.2 模型准备
在数据确定后,模型往往决定了最终算法精度的上限,在图像分类领域,经典的模型层出不穷,PaddleClas提供了36个系列共175个ImageNet预训练模型。具体的精度、速度等指标请参考[骨干网络和预训练模型库](./ImageNet_models.md) 在数据确定后,模型往往决定了最终算法精度的上限,在图像分类领域,经典的模型层出不穷,PaddleClas提供了36个系列共175个ImageNet预训练模型。具体的精度、速度等指标请参考[骨干网络和预训练模型库](./ImageNet_models.md)
<a name="2.3"></a>
### 2.3 模型训练 ### 2.3 模型训练
在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas提供了一些列的[训练调优方法](../models/Tricks.md),可以快速助你获得高精度的模型。 在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas提供了一些列的[训练调优方法](../models/Tricks.md),可以快速助你获得高精度的模型。
<a name="2.4"></a>
### 2.4 模型评估 ### 2.4 模型评估
当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是Top1-Acc或者Top5-Acc,该指标越高往往代表模型性能越好。 当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是Top1-Acc或者Top5-Acc,该指标越高往往代表模型性能越好。
<a name="3"></a>
## 三、主要算法简介 ## 三、主要算法简介
- LeNet:Yan LeCun等人于上个世纪九十年代第一次将卷积神经网络应用到图像分类任务上,创造性的提出了LeNet,在手写数字识别任务上取得了巨大的成功。 - LeNet:Yan LeCun等人于上个世纪九十年代第一次将卷积神经网络应用到图像分类任务上,创造性的提出了LeNet,在手写数字识别任务上取得了巨大的成功。
......
## 模型裁剪、量化算法介绍 # 模型裁剪、量化算法介绍
深度学习因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩、优化加速、异构计算等方法突破瓶颈。模型压缩算法能够有效降低参数冗余,从而减少存储占用、通信带宽和计算复杂度,有助于深度学习的应用部署。其中模型量化、裁剪应用比较广泛。在PaddleClas中,主要应该应用以下两种算法。 深度学习因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩、优化加速、异构计算等方法突破瓶颈。模型压缩算法能够有效降低参数冗余,从而减少存储占用、通信带宽和计算复杂度,有助于深度学习的应用部署。其中模型量化、裁剪应用比较广泛。在PaddleClas中,主要应该应用以下两种算法。
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
其中具体算法参数请参考[PaddeSlim](https://github.com/PaddlePaddle/PaddleSlim/) 其中具体算法参数请参考[PaddeSlim](https://github.com/PaddlePaddle/PaddleSlim/)
### PACT量化方法 ## PACT量化方法
模型量化主要包括两个部分,一是对权重Weight量化,一是针对激活值Activation量化。同时对两部分进行量化,才能获得最大的计算效率收益。权重可以借助网络正则化等手段,让权重分布尽量紧凑,减少离群点、不均匀分布情况发生,而对于激活值还缺乏有效的手段。 模型量化主要包括两个部分,一是对权重Weight量化,一是针对激活值Activation量化。同时对两部分进行量化,才能获得最大的计算效率收益。权重可以借助网络正则化等手段,让权重分布尽量紧凑,减少离群点、不均匀分布情况发生,而对于激活值还缺乏有效的手段。
...@@ -38,7 +38,7 @@ ...@@ -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) 算法具体参数请参考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**认为之前的方法要依赖如下两点 模型剪枝是减小模型大小,提升预测效率的一种非常重要的手段。在之前的网络剪枝文章中一般将网络filter的范数作为其重要性度量,**范数值较小的代表的filter越不重要**,将其从网络中裁剪掉,反之也就越重要。而**FPGM**认为之前的方法要依赖如下两点
......
...@@ -4,7 +4,18 @@ ...@@ -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` 的格式形如: PaddleClas 使用 `txt` 格式文件指定训练集和测试集,以 `ImageNet1k` 数据集为例,其中 `train_list.txt``val_list.txt` 的格式形如:
...@@ -19,11 +30,12 @@ train/n01440764/n01440764_10026.JPEG 0 ...@@ -19,11 +30,12 @@ train/n01440764/n01440764_10026.JPEG 0
val/ILSVRC2012_val_00000001.JPEG 65 val/ILSVRC2012_val_00000001.JPEG 65
... ...
``` ```
<a name="图像分类任务常见数据集介绍"></a>
## 2. 图像分类任务常见数据集介绍 ## 二、 图像分类任务常见数据集介绍
这里整理了常用的图像分类任务数据集,持续更新中,欢迎各位小伙伴补充完善~ 这里整理了常用的图像分类任务数据集,持续更新中,欢迎各位小伙伴补充完善~
<a name="ImageNet1k"></a>
### 2.1 ImageNet1k ### 2.1 ImageNet1k
[ImageNet](https://image-net.org/)项目是一个大型视觉数据库,用于视觉目标识别研究任务,该项目已手动标注了 1400 多万张图像。ImageNet-1k 是 ImageNet 数据集的子集,其包含 1000 个类别。训练集包含 1281167 个图像数据,验证集包含 50000 个图像数据。2010 年以来,ImageNet 项目每年举办一次图像分类竞赛,即 ImageNet 大规模视觉识别挑战赛(ILSVRC)。挑战赛使用的数据集即为 ImageNet-1k。到目前为止,ImageNet-1k 已经成为计算机视觉领域发展的最重要的数据集之一,其促进了整个计算机视觉的发展,很多计算机视觉下游任务的初始化模型都是基于该数据集训练得到的。 [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/ ...@@ -53,6 +65,7 @@ PaddleClas/dataset/ILSVRC2012/
|_ val_list.txt |_ val_list.txt
``` ```
<a name="Flowers102"></a>
### 2.2 Flowers102 ### 2.2 Flowers102
数据集 | 训练集大小 | 测试集大小 | 类别数 | 备注| 数据集 | 训练集大小 | 测试集大小 | 类别数 | 备注|
...@@ -88,18 +101,21 @@ PaddleClas/dataset/flowers102/ ...@@ -88,18 +101,21 @@ PaddleClas/dataset/flowers102/
|_ val_list.txt |_ val_list.txt
``` ```
<a name="CIFAR10/CIFAR100"></a>
### 2.3 CIFAR10 / CIFAR100 ### 2.3 CIFAR10 / CIFAR100
CIFAR-10 数据集由 10 个类的 60000 个彩色图像组成,图像分辨率为 32x32,每个类有 6000 个图像,其中训练集 5000 张,验证集 1000 张,10 个不同的类代表飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、轮船和卡车。CIFAR-100 数据集是CIFAR-10的扩展,由 100 个类的 60000 个彩色图像组成,图像分辨率为 32x32,每个类有 600 个图像,其中训练集 500 张,验证集 100 张。 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 数据集地址:http://www.cs.toronto.edu/~kriz/cifar.html
<a name="MNIST"></a>
### 2.4 MNIST ### 2.4 MNIST
MMNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例。其包含 60000 张图片数据,50000 张作为训练集,10000 张作为验证集,每张图片的大小为 28 * 28。 MMNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例。其包含 60000 张图片数据,50000 张作为训练集,10000 张作为验证集,每张图片的大小为 28 * 28。
数据集地址:http://yann.lecun.com/exdb/mnist/ 数据集地址:http://yann.lecun.com/exdb/mnist/
<a name="NUS-WIDE"></a>
### 2.5 NUS-WIDE ### 2.5 NUS-WIDE
NUS-WIDE 是一个多分类数据集。该数据集包含 269648 张图片, 81 个类别, 每张图片被标记为该 81 个类别中的某一类或某几类。 NUS-WIDE 是一个多分类数据集。该数据集包含 269648 张图片, 81 个类别, 每张图片被标记为该 81 个类别中的某一类或某几类。
......
...@@ -4,7 +4,21 @@ ...@@ -4,7 +4,21 @@
--- ---
## 1. 数据集格式说明
## 目录
- [数据集格式说明](#数据集格式说明)
- [图像识别任务常见数据集介绍](#图像识别任务常见数据集介绍)
- [2.1 通用图像识别数据集](#通用图像识别数据集)
- [2.2 垂类图像识别数据集](#垂类图像识别数据集)
- [2.2.1 动漫人物识别](#动漫人物识别)
- [2.2.2 商品识别](#商品识别)
- [2.2.3 Logo识别](#Logo识别)
- [2.2.3 车辆识别](#车辆识别)
<a name="数据集格式说明"></a>
## 一、数据集格式说明
与分类任务数据集不同,图像检索任务的数据集分为以下三部分: 与分类任务数据集不同,图像检索任务的数据集分为以下三部分:
...@@ -23,14 +37,31 @@ train/99/Ovenbird_0128_93366.jpg 99 6 ...@@ -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。 每行数据使用“空格”分割,三列数据的含义分别是训练数据的路径、训练数据的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 通用图像识别数据集 ### 2.1 通用图像识别数据集
- SOP: SOP数据集是通用识别研究领域、MetricLearning技术研究方向常用的一个商品数据集, 其包含从eBay.com下载的22,634个产品的120,053张图片。其中, 训练集包含图片59551张, 类别数11318; 验证集包含图片60502张,类别数11316个。 - SOP: SOP数据集是通用识别研究领域、MetricLearning技术研究方向常用的一个商品数据集, 其包含从eBay.com下载的22,634个产品的120,053张图片。其中, 训练集包含图片59551张, 类别数11318; 验证集包含图片60502张,类别数11316个。
...@@ -48,8 +79,10 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训 ...@@ -48,8 +79,10 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训
地址: http://mmlab.ie.cuhk.edu.hk/projects/DeepFashion.html 地址: http://mmlab.ie.cuhk.edu.hk/projects/DeepFashion.html
<a name="垂类图像识别数据集"></a>
### 2.2 垂类图像识别数据集 ### 2.2 垂类图像识别数据集
<a name="动漫人物识别"></a>
#### 2.2.1 动漫人物识别 #### 2.2.1 动漫人物识别
+ iCartoonFace: iCartoonFace是由爱奇艺开放的目前全球最大的手工标注卡通人物检测数据集与识别数据集,它包含超过5013个卡通人物、389678张高质量实景图片。相比于其他数据集,它具有大规模、高质量、多样性丰富、挑战难度大等特点,是目前研究动漫人物识别最常用的数据集之一。 + iCartoonFace: iCartoonFace是由爱奇艺开放的目前全球最大的手工标注卡通人物检测数据集与识别数据集,它包含超过5013个卡通人物、389678张高质量实景图片。相比于其他数据集,它具有大规模、高质量、多样性丰富、挑战难度大等特点,是目前研究动漫人物识别最常用的数据集之一。
...@@ -63,7 +96,7 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训 ...@@ -63,7 +96,7 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训
地址: http://cvit.iiit.ac.in/research/projects/cvit-projects/cartoonfaces 地址: http://cvit.iiit.ac.in/research/projects/cvit-projects/cartoonfaces
<a name="商品识别"></a>
#### 2.2.2 商品识别 #### 2.2.2 商品识别
+ AliProduct: AliProduct数据集是目前开源最大的商品数据集,它是一个SKU级别的图像分类数据集, 包含5万类别、300万张商品图像,商品图像的类别和总量均为业界之最。此数据集中涵盖了大量的生活用品、食物等,数据集中没有人工标注,数据较脏,数据分布较不均衡,且有很多相似的商品图片。 + AliProduct: AliProduct数据集是目前开源最大的商品数据集,它是一个SKU级别的图像分类数据集, 包含5万类别、300万张商品图像,商品图像的类别和总量均为业界之最。此数据集中涵盖了大量的生活用品、食物等,数据集中没有人工标注,数据较脏,数据分布较不均衡,且有很多相似的商品图片。
...@@ -75,6 +108,7 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训 ...@@ -75,6 +108,7 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训
+ DeepFashion-Inshop: 同通用图像识别数据集中的In-shop Clothes + DeepFashion-Inshop: 同通用图像识别数据集中的In-shop Clothes
<a name="Logo识别"></a>
### 2.2.3 Logo识别 ### 2.2.3 Logo识别
+ Logo-2K+: Logo-2K+是一个仅用于logo图像识别的数据集,其包含10个大类,2341个小类和167140张图片。 + Logo-2K+: Logo-2K+是一个仅用于logo图像识别的数据集,其包含10个大类,2341个小类和167140张图片。
...@@ -83,7 +117,7 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训 ...@@ -83,7 +117,7 @@ Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训
+ Tsinghua-Tencent 100K: 该数据集是从10万张腾讯街景全景图中创建的一个大型交通标志基准数据集。它提供包含30000个交通标志实例的100000张图像。这些图像涵盖了照度和天气条件的巨大变化。基准测试中的每个交通标志都标注了类别标签、边界框和像素掩码。 它总共包含222个类别 (0 background + 221 traffic signs) + Tsinghua-Tencent 100K: 该数据集是从10万张腾讯街景全景图中创建的一个大型交通标志基准数据集。它提供包含30000个交通标志实例的100000张图像。这些图像涵盖了照度和天气条件的巨大变化。基准测试中的每个交通标志都标注了类别标签、边界框和像素掩码。 它总共包含222个类别 (0 background + 221 traffic signs)
地址: https://cg.cs.tsinghua.edu.cn/traffic-sign/ 地址: https://cg.cs.tsinghua.edu.cn/traffic-sign/
<a name="车辆识别"></a>
### 2.2.4 车辆识别 ### 2.2.4 车辆识别
+ CompCars: 图像主要来自网络和监控数据,其中网络数据包含163个汽车制造商、1716个汽车型号的汽车。共136,726张全车图像,27,618张部分车图像。其中网络汽车数据包含bounding box、视角、5个属性(最大速度、排量、车门数、车座数、汽车类型)。监控数据包含50,000张前视角图像。 + CompCars: 图像主要来自网络和监控数据,其中网络数据包含163个汽车制造商、1716个汽车型号的汽车。共136,726张全车图像,27,618张部分车图像。其中网络汽车数据包含bounding box、视角、5个属性(最大速度、排量、车门数、车座数、汽车类型)。监控数据包含50,000张前视角图像。
......
此差异已折叠。
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
本部分主要从数据集、模型选择和模型训练 3 个方面对该部分内容进行介绍。 本部分主要从数据集、模型选择和模型训练 3 个方面对该部分内容进行介绍。
## 1. 数据集 ## 1. 数据集
在 PaddleClas 的识别任务中,训练主体检测模型时主要用到了以下几个数据集。 在 PaddleClas 的识别任务中,训练主体检测模型时主要用到了以下几个数据集。
......
# 服务器端C++预测 # 服务器端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. 准备环境 ## 1. 准备环境
- Linux 环境,推荐使用 docker。 - Linux 环境,推荐使用 docker。
...@@ -11,6 +28,7 @@ ...@@ -11,6 +28,7 @@
* 该文档主要介绍基于 Linux 环境下的 PaddleClas C++ 预测流程,如果需要在 Windows 环境下使用预测库进行 C++ 预测,具体编译方法请参考 [Windows下编译教程](./cpp_deploy_on_windows.md) * 该文档主要介绍基于 Linux 环境下的 PaddleClas C++ 预测流程,如果需要在 Windows 环境下使用预测库进行 C++ 预测,具体编译方法请参考 [Windows下编译教程](./cpp_deploy_on_windows.md)
<a name="1.1"></a>
### 1.1 编译opencv库 ### 1.1 编译opencv库
* 首先需要从 opencv 官网上下载在 Linux 环境下源码编译的包,以 3.4.7 版本为例,下载及解压缩命令如下: * 首先需要从 opencv 官网上下载在 Linux 环境下源码编译的包,以 3.4.7 版本为例,下载及解压缩命令如下:
...@@ -71,10 +89,12 @@ opencv3/ ...@@ -71,10 +89,12 @@ opencv3/
|-- share |-- share
``` ```
<a name="1.2"></a>
### 1.2 获取 Paddle 预测库 ### 1.2 获取 Paddle 预测库
* 有 2 种方式获取 Paddle 预测库,下面进行详细介绍。 * 有 2 种方式获取 Paddle 预测库,下面进行详细介绍。
<a name="1.2.1"></a>
#### 1.2.1 预测库源码编译 #### 1.2.1 预测库源码编译
如果希望获取最新预测库特性,可以从 GitHub 上克隆 Paddle 最新代码,从源码编译预测库。对于不同平台的编译流程,请参考 [Paddle预测库官网](https://paddleinference.paddlepaddle.org.cn/v2.1/user_guides/source_compile.html) 的说明。编译示例如下: 如果希望获取最新预测库特性,可以从 GitHub 上克隆 Paddle 最新代码,从源码编译预测库。对于不同平台的编译流程,请参考 [Paddle预测库官网](https://paddleinference.paddlepaddle.org.cn/v2.1/user_guides/source_compile.html) 的说明。编译示例如下:
...@@ -118,6 +138,7 @@ build/paddle_inference_install_dir/ ...@@ -118,6 +138,7 @@ build/paddle_inference_install_dir/
|-- version.txt |-- version.txt
``` ```
<a name="1.2.2"></a>
#### 1.2.2 直接下载安装 #### 1.2.2 直接下载安装
[Paddle预测库官网](https://paddleinference.paddlepaddle.org.cn/v2.1/user_guides/download_lib.html#c) 上提供了不同版本的 Paddle 预测库,包括多个操作系统平台和GPU、CPU等多个硬件平台的预编译库,可以在官网查找并选择合适的预测库版本进行下载,建议选择 `2.1.1` 版本。 [Paddle预测库官网](https://paddleinference.paddlepaddle.org.cn/v2.1/user_guides/download_lib.html#c) 上提供了不同版本的 Paddle 预测库,包括多个操作系统平台和GPU、CPU等多个硬件平台的预编译库,可以在官网查找并选择合适的预测库版本进行下载,建议选择 `2.1.1` 版本。
...@@ -135,10 +156,10 @@ tar -xf paddle_inference.tgz ...@@ -135,10 +156,10 @@ tar -xf paddle_inference.tgz
上述命令会在当前目录下生成 `paddle_inference/` 目录。 上述命令会在当前目录下生成 `paddle_inference/` 目录。
## 2. 开始编译 <a name="2"></a>
## 2. 编译
<a name="2.1"></a> <a name="2.1"></a>
### 2.1 编译 PaddleClas C++ 预测 demo ### 2.1 编译 PaddleClas C++ 预测 demo
编译命令如下,其中 Paddle C++ 预测库、OpenCV 等依赖库的路径需要根据机器上的实际位置进行修改。 编译命令如下,其中 Paddle C++ 预测库、OpenCV 等依赖库的路径需要根据机器上的实际位置进行修改。
...@@ -195,6 +216,7 @@ make -j ...@@ -195,6 +216,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`)。 在执行上述命令,编译完成之后,会在当前路径下生成 `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 预测库 ### 2.2 编译 config lib 预测库与 cls lib 预测库
除了可以直接编译 demo,也同样可以仅编译 config lib 和 cls lib 预测库,只需运行如下命令: 除了可以直接编译 demo,也同样可以仅编译 config lib 和 cls lib 预测库,只需运行如下命令:
...@@ -228,8 +250,10 @@ make ...@@ -228,8 +250,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` 指定已有链接库的路径,链接库同样也可用于二次开发。 执行上述命令后,将在目录 `./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 ### 3.1 准备 inference model
首先需要准备 inference model,关于将模型导出为 inference model 的具体步骤,可以参考 [模型导出](./export_model.md) 文档。假设导出的预测模型文件放在 `./inference` 目录下,则目录结构如下。 首先需要准备 inference model,关于将模型导出为 inference model 的具体步骤,可以参考 [模型导出](./export_model.md) 文档。假设导出的预测模型文件放在 `./inference` 目录下,则目录结构如下。
...@@ -242,6 +266,7 @@ inference/ ...@@ -242,6 +266,7 @@ inference/
**注意**:上述文件中,`cls_infer.pdmodel` 文件存储了模型网络结构信息,`cls_infer.pdiparams` 文件存储了模型参数权重信息。在运行预测时,注意两个文件的路径需要分别设置为配置文件 `tools/config.txt` 中的字段 `cls_model_path` 和 `cls_params_path` 的值。 **注意**:上述文件中,`cls_infer.pdmodel` 文件存储了模型网络结构信息,`cls_infer.pdiparams` 文件存储了模型参数权重信息。在运行预测时,注意两个文件的路径需要分别设置为配置文件 `tools/config.txt` 中的字段 `cls_model_path` 和 `cls_params_path` 的值。
<a name="3.2"></a>
### 3.2 运行 demo ### 3.2 运行 demo
首先修改 `tools/config.txt` 中对应字段: 首先修改 `tools/config.txt` 中对应字段:
......
...@@ -4,10 +4,22 @@ PaddlePaddle 支持导出 inference 模型用于部署推理场景,相比于 ...@@ -4,10 +4,22 @@ PaddlePaddle 支持导出 inference 模型用于部署推理场景,相比于
--- ---
## 目录
- [环境准备](#环境准备)
- [分类模型导出](#分类模型导出)
- [主体检测模型导出](#主体检测模型导出)
- [识别模型导出](#识别模型导出)
- [命令参数说明](#命令参数说明])
<a name="环境准备"></a>
## 1. 环境准备 ## 1. 环境准备
首先请参考文档[安装PaddlePaddle](../installation/install_paddle.md)和文档[安装PaddleClas](../installation/install_paddleclas.md)配置运行环境。 首先请参考文档[安装PaddlePaddle](../installation/install_paddle.md)和文档[安装PaddleClas](../installation/install_paddleclas.md)配置运行环境。
<a name="分类模型导出"></a>
## 2. 分类模型导出 ## 2. 分类模型导出
进入 PaddleClas 目录下: 进入 PaddleClas 目录下:
...@@ -31,7 +43,13 @@ python tools/export_model.py \ ...@@ -31,7 +43,13 @@ python tools/export_model.py \
-o Global.save_inference_dir=./deploy/models/class_ResNet50_vd_ImageNet_infer -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 目录下: 进入 PaddleClas 目录下:
...@@ -56,7 +74,8 @@ python3 tools/export_model.py \ ...@@ -56,7 +74,8 @@ python3 tools/export_model.py \
注意,此处保存的 inference 模型在 embedding 特征层做了截断,即导出后模型最终的输出为 n 维 embedding 特征。 注意,此处保存的 inference 模型在 embedding 特征层做了截断,即导出后模型最终的输出为 n 维 embedding 特征。
## 4. 命令参数说明 <a name="命令参数说明"></a>
## 5. 命令参数说明
在上述模型导出命令中,所使用的配置文件需要与该模型的训练文件相同,在配置文件中有以下字段用于配置模型导出参数: 在上述模型导出命令中,所使用的配置文件需要与该模型的训练文件相同,在配置文件中有以下字段用于配置模型导出参数:
...@@ -76,5 +95,5 @@ python3 tools/export_model.py \ ...@@ -76,5 +95,5 @@ python3 tools/export_model.py \
* [C++ 预测](./cpp_deploy.md)(目前仅支持分类模型) * [C++ 预测](./cpp_deploy.md)(目前仅支持分类模型)
* [Python Whl 预测](./whl_deploy.md)(目前仅支持分类模型) * [Python Whl 预测](./whl_deploy.md)(目前仅支持分类模型)
* [PaddleHub Serving 部署](./paddle_hub_serving_deploy.md)(目前仅支持分类模型) * [PaddleHub Serving 部署](./paddle_hub_serving_deploy.md)(目前仅支持分类模型)
* [PaddleServing 部署](./paddle_serving_deploy.md)(目前仅支持分类模型) * [PaddleServing 部署](./paddle_serving_deploy.md)
* [PaddleLite 部署](./paddle_lite_deploy.md)(目前仅支持分类模型) * [PaddleLite 部署](./paddle_lite_deploy.md)(目前仅支持分类模型)
# 基于PaddleHub Serving的服务部署 # 基于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. 简介 ## 1. 简介
hubserving 服务部署配置服务包 `clas` 下包含 3 个必选文件,目录如下: hubserving 服务部署配置服务包 `clas` 下包含 3 个必选文件,目录如下:
...@@ -16,12 +30,16 @@ hubserving/clas/ ...@@ -16,12 +30,16 @@ hubserving/clas/
└─ params.py 参数文件,必选,包含模型路径、前后处理参数等参数 └─ params.py 参数文件,必选,包含模型路径、前后处理参数等参数
``` ```
<a name="2"></a>
## 2. 准备环境 ## 2. 准备环境
```shell ```shell
# 安装paddlehub,请安装2.0版本 # 安装paddlehub,请安装2.0版本
pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
``` ```
<a name="3"></a>
## 3. 下载推理模型 ## 3. 下载推理模型
安装服务模块前,需要准备推理模型并放到正确路径,默认模型路径为: 安装服务模块前,需要准备推理模型并放到正确路径,默认模型路径为:
...@@ -39,6 +57,8 @@ pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/sim ...@@ -39,6 +57,8 @@ pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/sim
* 模型文件(包括 `.pdmodel``.pdiparams`)名称必须为`inference` * 模型文件(包括 `.pdmodel``.pdiparams`)名称必须为`inference`
* 我们也提供了大量基于ImageNet-1k数据集的预训练模型,模型列表及下载地址详见[模型库概览](../models/models_intro.md),也可以使用自己训练转换好的模型。 * 我们也提供了大量基于ImageNet-1k数据集的预训练模型,模型列表及下载地址详见[模型库概览](../models/models_intro.md),也可以使用自己训练转换好的模型。
<a name="4"></a>
## 4. 安装服务模块 ## 4. 安装服务模块
针对 Linux 环境和 Windows 环境,安装命令如下。 针对 Linux 环境和 Windows 环境,安装命令如下。
...@@ -58,8 +78,12 @@ cd PaddleClas\deploy ...@@ -58,8 +78,12 @@ cd PaddleClas\deploy
hub install hubserving\clas\ hub install hubserving\clas\
``` ```
<a name="5"></a>
## 5. 启动服务 ## 5. 启动服务
<a name="5.1"></a>
### 5.1 命令行命令启动 ### 5.1 命令行命令启动
该方式仅支持使用 CPU 预测。启动命令: 该方式仅支持使用 CPU 预测。启动命令:
...@@ -83,6 +107,8 @@ $ hub serving start --modules Module1==Version1 \ ...@@ -83,6 +107,8 @@ $ hub serving start --modules Module1==Version1 \
这样就完成了一个服务化 API 的部署,使用默认端口号 8866。 这样就完成了一个服务化 API 的部署,使用默认端口号 8866。
<a name="5.2"></a>
### 5.2 配置文件启动 ### 5.2 配置文件启动
该方式仅支持使用 CPU 或 GPU 预测。启动命令: 该方式仅支持使用 CPU 或 GPU 预测。启动命令:
...@@ -130,6 +156,7 @@ export CUDA_VISIBLE_DEVICES=3 ...@@ -130,6 +156,7 @@ export CUDA_VISIBLE_DEVICES=3
hub serving start -c hubserving/clas/config.json hub serving start -c hubserving/clas/config.json
``` ```
<a name="6"></a>
## 6. 发送预测请求 ## 6. 发送预测请求
配置好服务端后,可使用以下命令发送预测请求,获取预测结果: 配置好服务端后,可使用以下命令发送预测请求,获取预测结果:
...@@ -167,6 +194,8 @@ list: 返回结果 ...@@ -167,6 +194,8 @@ list: 返回结果
└─ float: 该图分类耗时,单位秒 └─ float: 该图分类耗时,单位秒
``` ```
<a name="7"></a>
## 7. 自定义修改服务模块 ## 7. 自定义修改服务模块
如果需要修改服务逻辑,需要进行以下操作: 如果需要修改服务逻辑,需要进行以下操作:
......
# PaddleLite推理部署 # PaddleLite推理部署
---
本教程将介绍基于[Paddle Lite](https://github.com/PaddlePaddle/Paddle-Lite)在移动端部署 PaddleClas 分类模型的详细步骤。 本教程将介绍基于[Paddle Lite](https://github.com/PaddlePaddle/Paddle-Lite)在移动端部署 PaddleClas 分类模型的详细步骤。识别模型的部署将在近期支持,敬请期待。
Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理能力,并广泛整合跨平台硬件,为端侧部署及应用落地问题提供轻量化的部署方案。 Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理能力,并广泛整合跨平台硬件,为端侧部署及应用落地问题提供轻量化的部署方案。
<!-- TODO(gaotingquan): 下述 benchmark 文档在新文档结构中缺失 --> <!-- TODO(gaotingquan): 下述 benchmark 文档在新文档结构中缺失 -->
...@@ -8,17 +9,32 @@ Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理 ...@@ -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 目前支持以下平台部署:
* 电脑(编译Paddle Lite) * 电脑(编译Paddle Lite)
* 安卓手机(armv7或armv8) * 安卓手机(armv7或armv8)
<a name="1.1"></a>
### 1.1 准备交叉编译环境 ### 1.1 准备交叉编译环境
交叉编译环境用于编译 Paddle Lite 和 PaddleClas 的 C++ demo。 交叉编译环境用于编译 Paddle Lite 和 PaddleClas 的 C++ demo。
支持多种开发环境,关于 Docker、Linux、macOS、Windows 等不同开发环境的编译流程请参考[文档](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html) 支持多种开发环境,关于 Docker、Linux、macOS、Windows 等不同开发环境的编译流程请参考[文档](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html)
<a name="1.2"></a>
### 1.2 准备预测库 ### 1.2 准备预测库
预测库有两种获取方式: 预测库有两种获取方式:
...@@ -74,13 +90,17 @@ inference_lite_lib.android.armv8/ ...@@ -74,13 +90,17 @@ inference_lite_lib.android.armv8/
| `-- java Java 预测库demo | `-- java Java 预测库demo
``` ```
## 2. 开始运行 <a name="2"></a>
## 二、开始运行
<a name="2.1"></a>
### 2.1 模型优化 ### 2.1 模型优化
Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括量化、子图融合、混合精度、Kernel 优选等方法,使用 Paddle-Lite 的 `opt` 工具可以自动对 inference 模型进行优化,目前支持两种优化方式,优化后的模型更轻量,模型运行速度更快。在进行模型优化前,需要先准备 `opt` 优化工具,有以下两种方式。 Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括量化、子图融合、混合精度、Kernel 优选等方法,使用 Paddle-Lite 的 `opt` 工具可以自动对 inference 模型进行优化,目前支持两种优化方式,优化后的模型更轻量,模型运行速度更快。在进行模型优化前,需要先准备 `opt` 优化工具,有以下两种方式。
**注意**:如果已经准备好了 `.nb` 结尾的模型文件,可以跳过此步骤。 **注意**:如果已经准备好了 `.nb` 结尾的模型文件,可以跳过此步骤。
<a name="2.1.1"></a>
#### 2.1.1 [建议]pip安装paddlelite并进行转换 #### 2.1.1 [建议]pip安装paddlelite并进行转换
Python下安装 `paddlelite`,目前最高支持 `Python3.7` Python下安装 `paddlelite`,目前最高支持 `Python3.7`
...@@ -104,6 +124,7 @@ pip install paddlelite==2.8 ...@@ -104,6 +124,7 @@ pip install paddlelite==2.8
`--model_file` 表示 inference 模型的 model 文件地址,`--param_file` 表示 inference 模型的 param 文件地址;`optimize_out` 用于指定输出文件的名称(不需要添加 `.nb` 的后缀)。直接在命令行中运行 `paddle_lite_opt`,也可以查看所有参数及其说明。 `--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工具 #### 2.1.2 源码编译Paddle-Lite生成opt工具
模型优化需要 Paddle-Lite 的 `opt` 可执行文件,可以通过编译 Paddle-Lite 源码获得,编译步骤如下: 模型优化需要 Paddle-Lite 的 `opt` 可执行文件,可以通过编译 Paddle-Lite 源码获得,编译步骤如下:
...@@ -127,7 +148,6 @@ cd build.opt/lite/api/ ...@@ -127,7 +148,6 @@ cd build.opt/lite/api/
`opt` 的使用方式与参数与上面的 `paddle_lite_opt` 完全一致。 `opt` 的使用方式与参数与上面的 `paddle_lite_opt` 完全一致。
<a name="2.1.3"></a> <a name="2.1.3"></a>
#### 2.1.3 转换示例 #### 2.1.3 转换示例
下面以PaddleClas的 `MobileNetV3_large_x1_0` 模型为例,介绍使用 `paddle_lite_opt` 完成预训练模型到inference模型,再到 Paddle-Lite 优化模型的转换。 下面以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 -- ...@@ -148,6 +168,7 @@ paddle_lite_opt --model_file=./MobileNetV3_large_x1_0_infer/inference.pdmodel --
**注意**`--optimize_out` 参数为优化后模型的保存路径,无需加后缀 `.nb``--model_file` 参数为模型结构信息文件的路径,`--param_file` 参数为模型权重信息文件的路径,请注意文件名。 **注意**`--optimize_out` 参数为优化后模型的保存路径,无需加后缀 `.nb``--model_file` 参数为模型结构信息文件的路径,`--param_file` 参数为模型权重信息文件的路径,请注意文件名。
<a name="2.2"></a>
### 2.2 与手机联调 ### 2.2 与手机联调
首先需要进行一些准备工作。 首先需要进行一些准备工作。
...@@ -255,7 +276,8 @@ export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH ...@@ -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"> <img src="../../images/inference_deployment/lite_demo_result.png" width="600">
</div> </div>
## FAQ <a name="3"></a>
## 三、FAQ
Q1:如果想更换模型怎么办,需要重新按照流程走一遍吗? Q1:如果想更换模型怎么办,需要重新按照流程走一遍吗?
A1:如果已经走通了上述步骤,更换模型只需要替换 `.nb` 模型文件即可,同时要注意修改下配置文件中的 `.nb` 文件路径以及类别映射文件(如有必要)。 A1:如果已经走通了上述步骤,更换模型只需要替换 `.nb` 模型文件即可,同时要注意修改下配置文件中的 `.nb` 文件路径以及类别映射文件(如有必要)。
......
...@@ -4,6 +4,14 @@ ...@@ -4,6 +4,14 @@
首先请参考文档[安装PaddlePaddle](../installation/install_paddle.md)和文档[安装PaddleClas](../installation/install_paddleclas.md)配置运行环境。 首先请参考文档[安装PaddlePaddle](../installation/install_paddle.md)和文档[安装PaddleClas](../installation/install_paddleclas.md)配置运行环境。
## 目录
- [图像分类推理](#图像分类推理)
- [主体检测模型推理](#主体检测模型推理)
- [特征提取模型推理](#特征提取模型推理)
- [主体检测、特征提取和向量检索串联](#主体检测、特征提取和向量检索串联)
<a name="图像分类推理"></a>
## 1. 图像分类推理 ## 1. 图像分类推理
首先请参考文档[模型导出](./export_model.md)准备 inference 模型,然后进入 PaddleClas 的 `deploy` 目录下: 首先请参考文档[模型导出](./export_model.md)准备 inference 模型,然后进入 PaddleClas 的 `deploy` 目录下:
...@@ -33,6 +41,7 @@ python python/predict_cls.py -c configs/inference_cls.yaml ...@@ -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` * 如果使用 VisionTransformer 系列模型,如 `DeiT_***_384`, `ViT_***_384` 等,请注意模型的输入数据尺寸,部分模型需要修改参数: `PreProcess.resize_short=384`, `PreProcess.resize=384`
* 如果你希望提升评测模型速度,使用gpu评测时,建议开启TensorRT加速预测,使用cpu评测时,建议开启MKL-DNN加速预测。 * 如果你希望提升评测模型速度,使用gpu评测时,建议开启TensorRT加速预测,使用cpu评测时,建议开启MKL-DNN加速预测。
<a name="主体检测模型推理"></a>
## 2. 主体检测模型推理 ## 2. 主体检测模型推理
进入 PaddleClas 的 `deploy` 目录下: 进入 PaddleClas 的 `deploy` 目录下:
...@@ -60,6 +69,8 @@ python python/predict_det.py -c configs/inference_det.yaml ...@@ -60,6 +69,8 @@ python python/predict_det.py -c configs/inference_det.yaml
* `Global.infer_imgs`:待预测的图片文件路径; * `Global.infer_imgs`:待预测的图片文件路径;
* `Global.use_gpu`: 是否使用 GPU 预测,默认为 `True` * `Global.use_gpu`: 是否使用 GPU 预测,默认为 `True`
<a name="特征提取模型推理"></a>
## 3. 特征提取模型推理 ## 3. 特征提取模型推理
下面以商品特征提取为例,介绍特征提取模型推理。首先进入 PaddleClas 的 `deploy` 目录下: 下面以商品特征提取为例,介绍特征提取模型推理。首先进入 PaddleClas 的 `deploy` 目录下:
...@@ -79,6 +90,7 @@ tar -xf ./models/product_ResNet50_vd_aliproduct_v1.0_infer.tar -C ./models/ ...@@ -79,6 +90,7 @@ tar -xf ./models/product_ResNet50_vd_aliproduct_v1.0_infer.tar -C ./models/
上述预测命令可以得到一个 512 维的特征向量,直接输出在在命令行中。 上述预测命令可以得到一个 512 维的特征向量,直接输出在在命令行中。
<a name="主体检测、特征提取和向量检索串联"></a>
## 4. 主体检测、特征提取和向量检索串联 ## 4. 主体检测、特征提取和向量检索串联
主体检测、特征提取和向量检索的串联预测,可以参考图像识别[快速体验](../quick_start/quick_start_recognition.md) 主体检测、特征提取和向量检索的串联预测,可以参考图像识别[快速体验](../quick_start/quick_start_recognition.md)
...@@ -4,7 +4,23 @@ PaddleClas 支持 Python Whl 包方式进行预测,目前 Whl 包方式仅支 ...@@ -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安装 * pip安装
...@@ -19,8 +35,8 @@ python3 setup.py bdist_wheel ...@@ -19,8 +35,8 @@ python3 setup.py bdist_wheel
pip3 install dist/* pip3 install dist/*
``` ```
<a name="2"></a>
## 2. 快速开始 ## 二、快速开始
* 使用`ResNet50`模型,以下图(`PaddleClas/docs/images/inference_deployment/whl_demo.jpg`)为例进行说明。 * 使用`ResNet50`模型,以下图(`PaddleClas/docs/images/inference_deployment/whl_demo.jpg`)为例进行说明。
<div align="center"> <div align="center">
...@@ -55,7 +71,8 @@ filename: docs/images/inference_deployment/whl_demo.jpg, top-5, class_ids: [8, 7 ...@@ -55,7 +71,8 @@ filename: docs/images/inference_deployment/whl_demo.jpg, top-5, class_ids: [8, 7
Predict complete! Predict complete!
``` ```
## 3. 参数解释 <a name="3"></a>
## 三、参数解释
以下参数可在命令行方式使用中通过参数指定,或在Python代码中实例化PaddleClas对象时作为构造函数的参数使用。 以下参数可在命令行方式使用中通过参数指定,或在Python代码中实例化PaddleClas对象时作为构造函数的参数使用。
* model_name(str): 模型名称,使用PaddleClas提供的基于ImageNet1k的预训练模型。 * model_name(str): 模型名称,使用PaddleClas提供的基于ImageNet1k的预训练模型。
* inference_model_dir(str): 本地模型文件目录,当未指定 `model_name` 时该参数有效。该目录下需包含 `inference.pdmodel``inference.pdiparams` 两个模型文件。 * inference_model_dir(str): 本地模型文件目录,当未指定 `model_name` 时该参数有效。该目录下需包含 `inference.pdmodel``inference.pdiparams` 两个模型文件。
...@@ -86,14 +103,14 @@ from paddleclas import PaddleClas ...@@ -86,14 +103,14 @@ from paddleclas import PaddleClas
clas = PaddleClas(model_name='ViT_base_patch16_384', resize_short=384, crop_size=384) clas = PaddleClas(model_name='ViT_base_patch16_384', resize_short=384, crop_size=384)
``` ```
<a name="4"></a>
## 4. 使用示例 ## 四、使用示例
PaddleClas提供两种使用方式: PaddleClas提供两种使用方式:
1. Python代码中使用; 1. Python代码中使用;
2. 命令行中使用。 2. 命令行中使用。
<a name="4.1"></a>
### 4.1 查看帮助信息 ### 4.1 查看帮助信息
* CLI * CLI
...@@ -101,7 +118,7 @@ PaddleClas提供两种使用方式: ...@@ -101,7 +118,7 @@ PaddleClas提供两种使用方式:
paddleclas -h paddleclas -h
``` ```
<a name="4.2"></a>
### 4.2 使用PaddleClas提供的预训练模型进行预测 ### 4.2 使用PaddleClas提供的预训练模型进行预测
可以使用PaddleClas提供的预训练模型来预测,并通过参数`model_name`指定。此时PaddleClas会根据`model_name`自动下载指定模型,并保存在目录`~/.paddleclas/`下。 可以使用PaddleClas提供的预训练模型来预测,并通过参数`model_name`指定。此时PaddleClas会根据`model_name`自动下载指定模型,并保存在目录`~/.paddleclas/`下。
...@@ -119,7 +136,7 @@ print(next(result)) ...@@ -119,7 +136,7 @@ print(next(result))
paddleclas --model_name='ResNet50' --infer_imgs='docs/images/inference_deployment/whl_demo.jpg' paddleclas --model_name='ResNet50' --infer_imgs='docs/images/inference_deployment/whl_demo.jpg'
``` ```
<a name="4.3"></a>
### 4.3 使用本地模型文件预测 ### 4.3 使用本地模型文件预测
可以使用本地的模型文件进行预测,通过参数`inference_model_dir`指定模型文件目录即可。需要注意,模型文件目录下必须包含`inference.pdmodel``inference.pdiparams`两个文件。 可以使用本地的模型文件进行预测,通过参数`inference_model_dir`指定模型文件目录即可。需要注意,模型文件目录下必须包含`inference.pdmodel``inference.pdiparams`两个文件。
...@@ -137,7 +154,7 @@ print(next(result)) ...@@ -137,7 +154,7 @@ print(next(result))
paddleclas --inference_model_dir='./inference/' --infer_imgs='docs/images/inference_deployment/whl_demo.jpg' paddleclas --inference_model_dir='./inference/' --infer_imgs='docs/images/inference_deployment/whl_demo.jpg'
``` ```
<a name="4.4"></a>
### 4.4 批量预测 ### 4.4 批量预测
当参数 `infer_imgs` 为包含图片文件的目录时,可以对图片进行批量预测,只需通过参数 `batch_size` 指定batch大小。 当参数 `infer_imgs` 为包含图片文件的目录时,可以对图片进行批量预测,只需通过参数 `batch_size` 指定batch大小。
...@@ -156,7 +173,7 @@ for r in result: ...@@ -156,7 +173,7 @@ for r in result:
paddleclas --model_name='ResNet50' --infer_imgs='docs/images/' --batch_size 2 paddleclas --model_name='ResNet50' --infer_imgs='docs/images/' --batch_size 2
``` ```
<a name="4.5"></a>
### 4.5 对网络图片进行预测 ### 4.5 对网络图片进行预测
可以对网络图片进行预测,只需通过参数`infer_imgs`指定图片`url`。此时图片会下载并保存在`~/.paddleclas/images/`目录下。 可以对网络图片进行预测,只需通过参数`infer_imgs`指定图片`url`。此时图片会下载并保存在`~/.paddleclas/images/`目录下。
...@@ -174,7 +191,7 @@ print(next(result)) ...@@ -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' 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`格式数据进行预测 ### 4.6 对`NumPy.ndarray`格式数据进行预测
在Python中,可以对`Numpy.ndarray`格式的图像数据进行预测,只需通过参数`infer_imgs`指定即可。注意该图像数据必须为三通道图像数据。 在Python中,可以对`Numpy.ndarray`格式的图像数据进行预测,只需通过参数`infer_imgs`指定即可。注意该图像数据必须为三通道图像数据。
...@@ -188,7 +205,7 @@ result=clas.predict(infer_imgs) ...@@ -188,7 +205,7 @@ result=clas.predict(infer_imgs)
print(next(result)) print(next(result))
``` ```
<a name="4.7"></a>
### 4.7 保存预测结果 ### 4.7 保存预测结果
可以指定参数`pre_label_out_dir='./output_pre_label/'`,将图片按其top1预测结果保存到`pre_label_out_dir`目录下对应类别的文件夹中。 可以指定参数`pre_label_out_dir='./output_pre_label/'`,将图片按其top1预测结果保存到`pre_label_out_dir`目录下对应类别的文件夹中。
...@@ -206,7 +223,7 @@ print(next(result)) ...@@ -206,7 +223,7 @@ print(next(result))
paddleclas --model_name='ResNet50' --infer_imgs='docs/images/whl/' --save_dir='./output_pre_label/' paddleclas --model_name='ResNet50' --infer_imgs='docs/images/whl/' --save_dir='./output_pre_label/'
``` ```
<a name="4.8"></a>
### 4.8 指定label name ### 4.8 指定label name
可以通过参数`class_id_map_file`指定`class id``lable`的对应关系。PaddleClas默认使用ImageNet1K的label_name(`ppcls/utils/imagenet1k_label_list.txt`)。 可以通过参数`class_id_map_file`指定`class id``lable`的对应关系。PaddleClas默认使用ImageNet1K的label_name(`ppcls/utils/imagenet1k_label_list.txt`)。
......
# PP-LCNet系列 # 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,从而得到一个速度更快、准确率更高的轻量级骨干网络,与此同时,目标检测、语义分割等下游视觉任务的性能也同样得到提升。 在计算机视觉领域中,骨干网络的好坏直接影响到整个视觉任务的结果。在之前的一些工作中,相关的研究者普遍将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模型。与其他模型的对比图如下。 近年来,有很多轻量级的骨干网络问世,尤其最近两年,各种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> <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> <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。下面对这四条策略一一介绍: 我们经过大量的实验发现,在基于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中,我们选用了该激活函数。 自从卷积神经网络使用了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模块是SENet提出的一种通道注意力机制,可以有效提升模型的精度。但是在Intel CPU端,该模块同样会带来较大的延时,如何平衡精度和速度是我们要解决的一个问题。虽然在MobileNetV3等基于NAS搜索的网络中对SE模块的位置进行了搜索,但是并没有得出一般的结论,我们通过实验发现,SE模块越靠近网络的尾部对模型精度的提升越大。下表也展示了我们的一些实验结果:
| SE Location | Top-1 Acc(\%) | Latency(ms) | | SE Location | Top-1 Acc(\%) | Latency(ms) |
|-------------------|---------------|-------------| |-------------------|---------------|-------------|
| 1100000000000 | 61.73 | 2.06 | | 1100000000000 | 61.73 | 2.06 |
...@@ -32,13 +54,15 @@ SE模块是SENet提出的一种通道注意力机制,可以有效提升模型 ...@@ -32,13 +54,15 @@ SE模块是SENet提出的一种通道注意力机制,可以有效提升模型
| <b>0000000000011<b> | <b>63.14<b> | <b>2.05<b> | | <b>0000000000011<b> | <b>63.14<b> | <b>2.05<b> |
| 1111111111111 | 64.27 | 3.80 | | 1111111111111 | 64.27 | 3.80 |
最终,PP-LCNet中的SE模块的位置选用了表格中第三行的方案。 最终,PP-LCNet中的SE模块的位置选用了表格中第三行的方案。
### 更大的卷积核 <a name="3.3"></a>
### 3.3 合适的位置添加更大的卷积核
在MixNet的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种split-concat范式的MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。我们通过实验总结了一些更大的卷积核在不同位置的作用,类似SE模块的位置,更大的卷积核在网络的中后部作用更明显,下表展示了5x5卷积核的位置对精度的影响: 在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 | | 1111111111111 | 63.22 | 2.08 |
| 1111111000000 | 62.70 | 2.07 | | 1111111000000 | 62.70 | 2.07 |
...@@ -46,13 +70,14 @@ SE模块是SENet提出的一种通道注意力机制,可以有效提升模型 ...@@ -46,13 +70,14 @@ SE模块是SENet提出的一种通道注意力机制,可以有效提升模型
实验表明,更大的卷积核放在网络的中后部即可达到放在所有位置的精度,与此同时,获得更快的推理速度。PP-LCNet最终选用了表格中第三行的方案。 实验表明,更大的卷积核放在网络的中后部即可达到放在所有位置的精度,与此同时,获得更快的推理速度。PP-LCNet最终选用了表格中第三行的方案。
### 3.4 GAP后使用更大的1x1卷积层 <a name="3.4"></a>
### 3.4 GAP后使用更大的1x1卷积层
在GoogLeNet之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致GAP后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的1x1卷积层(等同于FC层),GAP后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。 在GoogLeNet之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致GAP后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的1x1卷积层(等同于FC层),GAP后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。
BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步说明了每个方案对结果的影响: 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 | | 0 | 1 | 1 | 1 | 61.93 | 1.94 |
| 1 | 0 | 1 | 1 | 62.51 | 1.87 | | 1 | 0 | 1 | 1 | 62.51 | 1.87 |
...@@ -60,10 +85,11 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步 ...@@ -60,10 +85,11 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步
| 1 | 1 | 1 | 0 | 59.91 | 1.85 | | 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> | | <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%。 图像分类我们选用了ImageNet数据集,相比目前主流的轻量级网络,PP-LCNet在相同精度下可以获得更快的推理速度。当使用百度自研的SSLD蒸馏策略后,精度进一步提升,在Intel cpu端约5ms的推理速度下ImageNet的Top-1 Acc超过了80%。
...@@ -81,7 +107,7 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步 ...@@ -81,7 +107,7 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步
| PP-LCNet-0.25x\* | 3.0 | 161 | 74.39 | 92.09 | 2.46 | | 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 | | PP-LCNet-0.25x\* | 9.0 | 906 | 80.82 | 95.33 | 5.39 |
其中*表示使用SSLD蒸馏后的模型。 其中\*表示使用SSLD蒸馏后的模型。
与其他轻量级网络的性能对比: 与其他轻量级网络的性能对比:
...@@ -100,8 +126,8 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步 ...@@ -100,8 +126,8 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步
| MobileNetV3-small-1.25x | 3.6 | 100 | 70.67 | 89.51 | 3.95 | | 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> | | <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的优势都非常明显。 目标检测的方法我们选用了百度自研的PicoDet,该方法主打轻量级目标检测场景,下表展示了在COCO数据集上、backbone选用PP-LCNet与MobileNetV3的结果的比较,无论在精度还是速度上,PP-LCNet的优势都非常明显。
...@@ -112,8 +138,8 @@ MobileNetV3-large-0.35x | 19.2 | 8.1 | ...@@ -112,8 +138,8 @@ MobileNetV3-large-0.35x | 19.2 | 8.1 |
MobileNetV3-large-0.75x | 25.8 | 11.1 | MobileNetV3-large-0.75x | 25.8 | 11.1 |
<b>PP-LCNet-1x<b> | <b>26.9<b> | <b>7.9<b> | <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的优势同样明显。 语义分割的方法我们选用了DeeplabV3+,下表展示了在Cityscapes数据集上、backbone选用PP-LCNet与MobileNetV3的比较,在精度和速度方面,PP-LCNet的优势同样明显。
...@@ -124,11 +150,13 @@ MobileNetV3-large-0.5x | 55.42 | 135 | ...@@ -124,11 +150,13 @@ MobileNetV3-large-0.5x | 55.42 | 135 |
MobileNetV3-large-0.75x | 64.53 | 151 | MobileNetV3-large-0.75x | 64.53 | 151 |
<b>PP-LCNet-1x<b> | <b>66.03<b> | <b>96<b> | <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在产业界也可以更好的落地和应用。 PP-LCNet没有像学术界那样死扣极致的FLOPs与Params,而是着眼于分析如何添加对Intel CPU友好的模块来提升模型的性能,这样可以更好的平衡准确率和推理时间,其中的实验结论也很适合其他网络结构设计的研究者,同时也为NAS搜索研究者提供了更小的搜索空间和一般结论。最终的PP-LCNet在产业界也可以更好的落地和应用。
## 引用 <a name="6"></a>
## 六、引用
如果你的论文用到了PP-LCNet的方法,请添加如下cite: 如果你的论文用到了PP-LCNet的方法,请添加如下cite:
``` ```
......
...@@ -2,45 +2,79 @@ ...@@ -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) 具体图像分类算法介绍详见[文档](../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 ### 1.1 ImageNet-1k
ImageNet项目是一个大型视觉数据库,用于视觉目标识别软件研究。该项目已手动注释了1400多万张图像,以指出图片中的对象,并在至少100万张图像中提供了边框。ImageNet-1k是ImageNet数据集的子集,其包含1000个类别。训练集包含1281167个图像数据,验证集包含50000个图像数据。2010年以来,ImageNet项目每年举办一次图像分类竞赛,即ImageNet大规模视觉识别挑战赛(ILSVRC)。挑战赛使用的数据集即为ImageNet-1k。到目前为止,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 ### 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张。由于这两个数据集规模较小,因此可以让研究人员快速尝试不同的算法。这两个数据集也是图像分类领域测试模型好坏的常用数据集。 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 数据及其预处理 ### 2.1 数据及其预处理
数据的质量及数量往往可以决定一个模型的好坏。在图像分类领域,数据包括图像及标签。在大部分情形下,带有标签的数据比较匮乏,所以数量很难达到使模型饱和的程度,为了可以使模型学习更多的图像特征,图像数据在进入模型之前要经过很多图像变换或者数据增强,来保证输入图像数据的多样性,从而保证模型有更好的泛化能力。PaddleClas提供了训练ImageNet-1k的标准图像变换,也提供了多种数据增强的方法,相关代码可以[数据处理](../../../ppcls/data/preprocess),配置文件可以参考[数据增强配置文件](../../../ppcls/configs/ImageNet/DataAugment), 相关数据增强算法详见数据[增强介绍文档](../algorithm_introduction/DataAugmentation.md) 数据的质量及数量往往可以决定一个模型的好坏。在图像分类领域,数据包括图像及标签。在大部分情形下,带有标签的数据比较匮乏,所以数量很难达到使模型饱和的程度,为了可以使模型学习更多的图像特征,图像数据在进入模型之前要经过很多图像变换或者数据增强,来保证输入图像数据的多样性,从而保证模型有更好的泛化能力。PaddleClas提供了训练ImageNet-1k的标准图像变换,也提供了多种数据增强的方法,相关代码可以[数据处理](../../../ppcls/data/preprocess),配置文件可以参考[数据增强配置文件](../../../ppcls/configs/ImageNet/DataAugment), 相关数据增强算法详见数据[增强介绍文档](../algorithm_introduction/DataAugmentation.md)
<a name="2.2"></a>
### 2.2 模型准备 ### 2.2 模型准备
在数据确定后,模型往往决定了最终算法精度的上限,在图像分类领域,经典的模型层出不穷,PaddleClas提供了35个系列共164个ImageNet预训练模型。具体的精度、速度等指标请参考[骨干网络和预训练模型库](../algorithm_introduction/ImageNet_models.md) 在数据确定后,模型往往决定了最终算法精度的上限,在图像分类领域,经典的模型层出不穷,PaddleClas提供了35个系列共164个ImageNet预训练模型。具体的精度、速度等指标请参考[骨干网络和预训练模型库](../algorithm_introduction/ImageNet_models.md)
<a name="2.3"></a>
### 2.3 模型训练 ### 2.3 模型训练
在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas提供了一些列的[训练调优方法](./train_strategy.md),可以快速助你获得高精度的模型。 在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas提供了一些列的[训练调优方法](./train_strategy.md),可以快速助你获得高精度的模型。
<a name="2.4"></a>
### 2.4 模型评估 ### 2.4 模型评估
当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是Top1-Acc或者Top5-Acc,该指标越高往往代表模型性能越好。 当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是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目前支持的训练/评估环境如下: PaddleClas目前支持的训练/评估环境如下:
```shell ```shell
...@@ -52,12 +86,13 @@ PaddleClas目前支持的训练/评估环境如下: ...@@ -52,12 +86,13 @@ PaddleClas目前支持的训练/评估环境如下:
└── Linux └── Linux
``` ```
<a name="3.1"></a>
### 3.1 基于CPU/单卡GPU上的训练与评估 ### 3.1 基于CPU/单卡GPU上的训练与评估
在基于CPU/单卡GPU上训练与评估,推荐使用`tools/train.py``tools/eval.py`脚本。关于Linux平台多卡GPU环境下的训练与评估,请参考[3.2. 基于Linux+GPU的模型训练与评估](#3.2) 在基于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 模型训练 #### 3.1.1 模型训练
准备好配置文件之后,可以使用下面的方式启动训练。 准备好配置文件之后,可以使用下面的方式启动训练。
...@@ -96,6 +131,7 @@ python3 tools/train.py \ ...@@ -96,6 +131,7 @@ python3 tools/train.py \
训练期间也可以通过VisualDL实时观察loss变化,详见[VisualDL](../extension/VisualDL.md) 训练期间也可以通过VisualDL实时观察loss变化,详见[VisualDL](../extension/VisualDL.md)
<a name="3.1.2"></a>
#### 3.1.2 模型微调 #### 3.1.2 模型微调
根据自己的数据集路径设置好配置文件后,可以通过加载预训练模型的方式进行微调,如下所示。 根据自己的数据集路径设置好配置文件后,可以通过加载预训练模型的方式进行微调,如下所示。
...@@ -111,8 +147,8 @@ python3 tools/train.py \ ...@@ -111,8 +147,8 @@ python3 tools/train.py \
我们也提供了大量基于`ImageNet-1k`数据集的预训练模型,模型列表及下载地址详见[模型库概览](../algorithm_introduction/ImageNet_models.md) 我们也提供了大量基于`ImageNet-1k`数据集的预训练模型,模型列表及下载地址详见[模型库概览](../algorithm_introduction/ImageNet_models.md)
<a name="3.1.3"></a>
<a name="3.1.3"></a>
#### 3.1.3 模型恢复训练 #### 3.1.3 模型恢复训练
如果训练任务因为其他原因被终止,也可以加载断点权重文件,继续训练: 如果训练任务因为其他原因被终止,也可以加载断点权重文件,继续训练:
...@@ -144,8 +180,8 @@ python3 tools/train.py \ ...@@ -144,8 +180,8 @@ python3 tools/train.py \
. .
``` ```
<a name="3.1.4"></a>
<a name="3.1.4"></a>
#### 3.1.4 模型评估 #### 3.1.4 模型评估
可以通过以下命令进行模型评估。 可以通过以下命令进行模型评估。
...@@ -164,12 +200,13 @@ python3 tools/eval.py \ ...@@ -164,12 +200,13 @@ python3 tools/eval.py \
**注意:** 在加载待评估模型时,需要指定模型文件的路径,但无需包含文件后缀名,PaddleClas会自动补齐`.pdparams`的后缀,如[3.1.3 模型恢复训练](#3.1.3) **注意:** 在加载待评估模型时,需要指定模型文件的路径,但无需包含文件后缀名,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`),可以更方便地启动多卡训练与评估。 如果机器环境为Linux+GPU,那么推荐使用`paddle.distributed.launch`启动模型训练脚本(`tools/train.py`)、评估脚本(`tools/eval.py`),可以更方便地启动多卡训练与评估。
<a name="3.2.1"></a>
#### 3.2.1 模型训练 #### 3.2.1 模型训练
参考如下方式启动模型训练,`paddle.distributed.launch`通过设置`gpus`指定GPU运行卡号: 参考如下方式启动模型训练,`paddle.distributed.launch`通过设置`gpus`指定GPU运行卡号:
...@@ -186,6 +223,7 @@ python3 -m paddle.distributed.launch \ ...@@ -186,6 +223,7 @@ python3 -m paddle.distributed.launch \
输出日志信息的格式同上,详见[3.1.1 模型训练](#3.1.1) 输出日志信息的格式同上,详见[3.1.1 模型训练](#3.1.1)
<a name="3.2.2"></a>
#### 3.2.2 模型微调 #### 3.2.2 模型微调
根据自己的数据集配置好配置文件之后,可以加载预训练模型进行微调,如下所示。 根据自己的数据集配置好配置文件之后,可以加载预训练模型进行微调,如下所示。
...@@ -201,10 +239,10 @@ python3 -m paddle.distributed.launch \ ...@@ -201,10 +239,10 @@ python3 -m paddle.distributed.launch \
其中`Arch.pretrained``True``False`,当然也可以设置加载预训练权重文件的路径,使用时需要换成自己的预训练模型权重文件路径,也可以直接在配置文件中修改该路径。 其中`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 模型恢复训练 #### 3.2.3 模型恢复训练
如果训练任务因为其他原因被终止,也可以加载断点权重文件继续训练。 如果训练任务因为其他原因被终止,也可以加载断点权重文件继续训练。
...@@ -222,6 +260,7 @@ python3 -m paddle.distributed.launch \ ...@@ -222,6 +260,7 @@ python3 -m paddle.distributed.launch \
其中配置文件不需要做任何修改,只需要在训练时设置`Global.checkpoints`参数即可,该参数表示加载的断点权重文件路径,使用该参数会同时加载保存的模型参数权重和学习率、优化器等信息,详见[3.1.3 模型恢复训练](#3.1.3) 其中配置文件不需要做任何修改,只需要在训练时设置`Global.checkpoints`参数即可,该参数表示加载的断点权重文件路径,使用该参数会同时加载保存的模型参数权重和学习率、优化器等信息,详见[3.1.3 模型恢复训练](#3.1.3)
<a name="3.2.4"></a>
#### 3.2.4 模型评估 #### 3.2.4 模型评估
可以通过以下命令进行模型评估。 可以通过以下命令进行模型评估。
...@@ -236,8 +275,8 @@ python3 -m paddle.distributed.launch \ ...@@ -236,8 +275,8 @@ python3 -m paddle.distributed.launch \
参数说明详见[3.1.4 模型评估](#3.1.4) 参数说明详见[3.1.4 模型评估](#3.1.4)
<a name="model_infer"></a>
<a name="3.3"></a>
### 3.3 使用预训练模型进行模型预测 ### 3.3 使用预训练模型进行模型预测
模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测: 模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测:
...@@ -254,7 +293,7 @@ python3 tools/infer.py \ ...@@ -254,7 +293,7 @@ python3 tools/infer.py \
+ `Global.pretrained_model`:模型权重文件路径,如 `./output/MobileNetV3_large_x1_0/best_model` + `Global.pretrained_model`:模型权重文件路径,如 `./output/MobileNetV3_large_x1_0/best_model`
<a name="model_inference"></a> <a name="3.4"></a>
### 3.4 使用inference模型进行模型推理 ### 3.4 使用inference模型进行模型推理
通过导出inference模型,PaddlePaddle支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理: 通过导出inference模型,PaddlePaddle支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理:
...@@ -286,7 +325,7 @@ python3 python/predict_cls.py \ ...@@ -286,7 +325,7 @@ python3 python/predict_cls.py \
-o Global.inference_model_dir=../inference/ \ -o Global.inference_model_dir=../inference/ \
-o PostProcess.Topk.class_id_map_file=None -o PostProcess.Topk.class_id_map_file=None
```
其中: 其中:
+ `Global.infer_imgs`:待预测的图片文件路径。 + `Global.infer_imgs`:待预测的图片文件路径。
+ `Global.inference_model_dir`:inference模型结构文件路径,如 `../inference/inference.pdmodel` + `Global.inference_model_dir`:inference模型结构文件路径,如 `../inference/inference.pdmodel`
...@@ -298,5 +337,5 @@ python3 python/predict_cls.py \ ...@@ -298,5 +337,5 @@ python3 python/predict_cls.py \
注意: 如果使用`Transformer`系列模型,如`DeiT_***_384`, `ViT_***_384`等,请注意模型的输入数据尺寸,需要设置参数`resize_short=384`, `resize=384` 注意: 如果使用`Transformer`系列模型,如`DeiT_***_384`, `ViT_***_384`等,请注意模型的输入数据尺寸,需要设置参数`resize_short=384`, `resize=384`
如果你希望提升评测模型速度,使用gpu评测时,建议开启TensorRT加速预测,使用cpu评测时,建议开启MKL-DNN加速预测。 如果你希望提升评测模型速度,使用gpu评测时,建议开启TensorRT加速预测,使用cpu评测时,建议开启MKLDNN加速预测。
```
...@@ -7,12 +7,35 @@ ...@@ -7,12 +7,35 @@
本文档介绍了PaddleClas配置文件(`ppcls/configs/*.yaml`)中各参数的含义,以便您更快地自定义或修改超参数配置。 本文档介绍了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.分类模型 ### 1.分类模型
此处以`ResNet50_vd``ImageNet-1k`上的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/ImageNet/ResNet/ResNet50_vd.yaml) 此处以`ResNet50_vd``ImageNet-1k`上的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/ImageNet/ResNet/ResNet50_vd.yaml)
<a name="1.1"></a>
#### 1.1 全局配置(Global) #### 1.1 全局配置(Global)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -34,6 +57,7 @@ ...@@ -34,6 +57,7 @@
**注**`pretrained_model`也可以填写存放预训练模型的http地址。 **注**`pretrained_model`也可以填写存放预训练模型的http地址。
<a name="1.2"></a>
#### 1.2 结构(Arch) #### 1.2 结构(Arch)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -44,6 +68,7 @@ ...@@ -44,6 +68,7 @@
**注**:此处的pretrained可以设置为`True`或者`False`,也可以设置权重的路径。另外当`Global.pretrained_model`也设置相应路径时,此处的`pretrained`失效。 **注**:此处的pretrained可以设置为`True`或者`False`,也可以设置权重的路径。另外当`Global.pretrained_model`也设置相应路径时,此处的`pretrained`失效。
<a name="1.3"></a>
#### 1.3 损失函数(Loss) #### 1.3 损失函数(Loss)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -52,7 +77,7 @@ ...@@ -52,7 +77,7 @@
| CELoss.weight | CELoss的在整个Loss中的权重 | 1.0 | float | | CELoss.weight | CELoss的在整个Loss中的权重 | 1.0 | float |
| CELoss.epsilon | CELoss中label_smooth的epsilon值 | 0.1 | float,0-1之间 | | CELoss.epsilon | CELoss中label_smooth的epsilon值 | 0.1 | float,0-1之间 |
<a name="1.4"></a>
#### 1.4 优化器(Optimizer) #### 1.4 优化器(Optimizer)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -77,9 +102,10 @@ ...@@ -77,9 +102,10 @@
添加方法及参数请查看[learning_rate.py](../../../ppcls/optimizer/learning_rate.py) 添加方法及参数请查看[learning_rate.py](../../../ppcls/optimizer/learning_rate.py)
<a name="1.5"></a>
#### 1.5数据读取模块(DataLoader) #### 1.5数据读取模块(DataLoader)
<a name="1.5.1"></a>
##### 1.5.1 dataset ##### 1.5.1 dataset
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -112,6 +138,7 @@ batch_transform_ops中参数的含义: ...@@ -112,6 +138,7 @@ batch_transform_ops中参数的含义:
|:---:|:---:|:---:| |:---:|:---:|:---:|
| MixupOperator | alpha | Mixup参数值,该值越大增强越强 | | MixupOperator | alpha | Mixup参数值,该值越大增强越强 |
<a name="1.5.2"></a>
##### 1.5.2 sampler ##### 1.5.2 sampler
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -121,6 +148,7 @@ batch_transform_ops中参数的含义: ...@@ -121,6 +148,7 @@ batch_transform_ops中参数的含义:
| drop_last | 是否丢掉最后不够batch-size的数据 | False | bool | | drop_last | 是否丢掉最后不够batch-size的数据 | False | bool |
| shuffle | 数据是否做shuffle | True | bool | | shuffle | 数据是否做shuffle | True | bool |
<a name="1.5.3"></a>
##### 1.5.3 loader ##### 1.5.3 loader
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -128,13 +156,14 @@ batch_transform_ops中参数的含义: ...@@ -128,13 +156,14 @@ batch_transform_ops中参数的含义:
| num_workers | 数据读取线程数 | 4 | int | | num_workers | 数据读取线程数 | 4 | int |
| use_shared_memory | 是否使用共享内存 | True | bool | | use_shared_memory | 是否使用共享内存 | True | bool |
<a name="1.6"></a>
#### 1.6 评估指标(Metric) #### 1.6 评估指标(Metric)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| TopkAcc | TopkAcc | [1, 5] | list, int | | TopkAcc | TopkAcc | [1, 5] | list, int |
<a name="1.7"></a>
#### 1.7 预测(Infer) #### 1.7 预测(Infer)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -147,11 +176,12 @@ batch_transform_ops中参数的含义: ...@@ -147,11 +176,12 @@ batch_transform_ops中参数的含义:
**注**:Infer模块的`transforms`的解释参考数据读取模块中的dataset中`transform_ops`的解释。 **注**:Infer模块的`transforms`的解释参考数据读取模块中的dataset中`transform_ops`的解释。
<a name="2"></a>
### 2.蒸馏模型 ### 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)。这里只介绍与分类模型有区别的参数。 **注**:此处以`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) #### 2.1 结构(Arch)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -175,6 +205,7 @@ batch_transform_ops中参数的含义: ...@@ -175,6 +205,7 @@ batch_transform_ops中参数的含义:
``` ```
2.Student的参数情况类似,不再赘述。 2.Student的参数情况类似,不再赘述。
<a name="2.2"></a>
#### 2.2 损失函数(Loss) #### 2.2 损失函数(Loss)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -186,7 +217,7 @@ batch_transform_ops中参数的含义: ...@@ -186,7 +217,7 @@ batch_transform_ops中参数的含义:
| DistillationGTCELos.weight | Loss权重 | 1.0 | float | | DistillationGTCELos.weight | Loss权重 | 1.0 | float |
| DistillationCELoss.model_names | 与真实label作交叉熵的模型名字 | ["Student"] | —— | | DistillationCELoss.model_names | 与真实label作交叉熵的模型名字 | ["Student"] | —— |
<a name="2.3"></a>
#### 2.3 评估指标(Metric) #### 2.3 评估指标(Metric)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -197,10 +228,12 @@ batch_transform_ops中参数的含义: ...@@ -197,10 +228,12 @@ batch_transform_ops中参数的含义:
**注**`DistillationTopkAcc`与普通`TopkAcc`含义相同,只是只用在蒸馏任务中。 **注**`DistillationTopkAcc`与普通`TopkAcc`含义相同,只是只用在蒸馏任务中。
<a name="3"></a>
### 3. 识别模型 ### 3. 识别模型
**注**:此处以`ResNet50``LogoDet-3k`上的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/Logo/ResNet50_ReID.yaml)。这里只介绍与分类模型有区别的参数。 **注**:此处以`ResNet50``LogoDet-3k`上的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/Logo/ResNet50_ReID.yaml)。这里只介绍与分类模型有区别的参数。
<a name="3.1"></a>
#### 3.1 结构(Arch) #### 3.1 结构(Arch)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
...@@ -228,6 +261,7 @@ batch_transform_ops中参数的含义: ...@@ -228,6 +261,7 @@ batch_transform_ops中参数的含义:
3.调用`tools/export_model.py`会将模型的权重转为inference model,其中`infer_add_softmax`参数会控制是否在其后增加`Softmax`激活函数,代码中默认为`True`(分类任务中最后的输出层会接`Softmax`激活函数),识别任务中特征层无须接激活函数,此处要设置为`False` 3.调用`tools/export_model.py`会将模型的权重转为inference model,其中`infer_add_softmax`参数会控制是否在其后增加`Softmax`激活函数,代码中默认为`True`(分类任务中最后的输出层会接`Softmax`激活函数),识别任务中特征层无须接激活函数,此处要设置为`False`
<a name="3.2"></a>
#### 3.2 评估指标(Metric) #### 3.2 评估指标(Metric)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
......
...@@ -11,13 +11,13 @@ ...@@ -11,13 +11,13 @@
其中特征库,需要利用已经标注好的图像数据集提前建立。完整的图像识别系统,如下图所示 其中特征库,需要利用已经标注好的图像数据集提前建立。完整的图像识别系统,如下图所示
<div align="center"> <div align="center">
<img src="../../images/structure.png" width = "400" /> <img src="../../images/structure.jpg" width = "400" />
</div> </div>
体验整体图像识别系统,或查看特征库建立方法,详见[图像识别快速开始文档](../quick_start/quick_start_recognition.md) 。其中,图像识别快速开始文档主要讲解整体流程的使用过程。以下内容,主要对上述三个步骤的训练部分进行介绍。 体验整体图像识别系统,或查看特征库建立方法,详见[图像识别快速开始文档](../quick_start/quick_start_recognition.md) 。其中,图像识别快速开始文档主要讲解整体流程的使用过程。以下内容,主要对上述三个步骤的训练部分进行介绍。
首先,请参考[安装指南](../installation/install_paddleclas.md)配置运行环境。 首先,请参考[安装指南](../installation/install_paddleclas.md)配置运行环境。
具体目录如下: ## 目录
- [主体检测](#主体检测) - [主体检测](#主体检测)
- [特征模型训练](#特征模型训练) - [特征模型训练](#特征模型训练)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册