未验证 提交 6b88819b 编写于 作者: C cuicheng01 提交者: GitHub

Merge pull request #1546 from TingquanGao/2.3/sibo_docs

[cherry-pick] update docs
# 数据增强分类实战 # 数据增强分类实战
--- ---
本节将基于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.1 AutoAugment](#1.1)
- [1.2 RandAugment](#1.2) - [1.2 RandAugment](#1.2)
- [1.3 TimmAutoAugment](#1.3) - [1.3 TimmAutoAugment](#1.3)
...@@ -16,20 +16,20 @@ ...@@ -16,20 +16,20 @@
- [1.7 GridMask](#1.7) - [1.7 GridMask](#1.7)
- [1.8 Mixup](#1.8) - [1.8 Mixup](#1.8)
- [1.9 Cutmix](#1.9) - [1.9 Cutmix](#1.9)
- [1.10 Mixup与Cutmix同时使用](#1.10) - [1.10 Mixup 与 Cutmix 同时使用](#1.10)
- [启动命令](#2) - [2. 启动命令](#2)
- [注意事项](#3) - [3. 注意事项](#3)
- [实验结果](#4) - [4. 实验结果](#4)
<a name="1"></a> <a name="1"></a>
## 一、参数配置 ## 1. 参数配置
由于不同的数据增强方式含有不同的超参数,为了便于理解和使用,我们在`configs/DataAugment`里分别列举了8种训练ResNet50的数据增强方式的参数配置文件,用户可以在`tools/run.sh`里直接替换配置文件的路径即可使用。此处分别挑选了图像变换、图像裁剪、图像混叠中的一个示例展示,其他参数配置用户可以自查配置文件。 由于不同的数据增强方式含有不同的超参数,为了便于理解和使用,我们在 `configs/DataAugment` 里分别列举了 8 种训练 ResNet50 的数据增强方式的参数配置文件,用户可以在 `tools/run.sh` 里直接替换配置文件的路径即可使用。此处分别挑选了图像变换、图像裁剪、图像混叠中的一个示例展示,其他参数配置用户可以自查配置文件。
<a name="1.1"></a> <a name="1.1"></a>
### 1.1 AutoAugment ### 1.1 AutoAugment
`AotoAugment`的图像增广方式的配置如下。`AutoAugment`是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`之前。 `AotoAugment` 的图像增广方式的配置如下。`AutoAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
```yaml ```yaml
transform_ops: transform_ops:
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
<a name="1.2"></a> <a name="1.2"></a>
### 1.2 RandAugment ### 1.2 RandAugment
`RandAugment`的图像增广方式的配置如下,其中用户需要指定其中的参数`num_layers``magnitude`,默认的数值分别是`2``5``RandAugment`是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`之前。 `RandAugment` 的图像增广方式的配置如下,其中用户需要指定其中的参数 `num_layers``magnitude`,默认的数值分别是 `2``5``RandAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
```yaml ```yaml
transform_ops: transform_ops:
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
<a name="1.3"></a> <a name="1.3"></a>
### 1.3 TimmAutoAugment ### 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`)之前。
```yaml ```yaml
transform_ops: transform_ops:
...@@ -100,7 +100,7 @@ ...@@ -100,7 +100,7 @@
<a name="1.4"></a> <a name="1.4"></a>
### 1.4 Cutout ### 1.4 Cutout
`Cutout`的图像增广方式的配置如下,其中用户需要指定其中的参数`n_holes``length`,默认的数值分别是`1``112`。类似其他图像裁剪类的数据增强方式,`Cutout`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`后的数据上操作,此处给出的是在归一化后的操作。 `Cutout` 的图像增广方式的配置如下,其中用户需要指定其中的参数 `n_holes``length`,默认的数值分别是 `1``112`。类似其他图像裁剪类的数据增强方式,`Cutout` 既可以在 uint8 格式的数据上操作,也可以在归一化)(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。
```yaml ```yaml
transform_ops: transform_ops:
...@@ -124,7 +124,7 @@ ...@@ -124,7 +124,7 @@
<a name="1.5"></a> <a name="1.5"></a>
### 1.5 RandomErasing ### 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`)后的数据上操作,此处给出的是在归一化后的操作。
```yaml ```yaml
transform_ops: transform_ops:
...@@ -153,7 +153,7 @@ ...@@ -153,7 +153,7 @@
<a name="1.6"></a> <a name="1.6"></a>
### 1.6 HideAndSeek ### 1.6 HideAndSeek
`HideAndSeek`的图像增广方式的配置如下。类似其他图像裁剪类的数据增强方式,`HideAndSeek`既可以在uint8格式的数据上操作,也可以在归一化(`NormalizeImage`后的数据上操作,此处给出的是在归一化后的操作。 `HideAndSeek` 的图像增广方式的配置如下。类似其他图像裁剪类的数据增强方式,`HideAndSeek` 既可以在 uint8 格式的数据上操作,也可以在归一化(`NormalizeImage`)后的数据上操作,此处给出的是在归一化后的操作。
```yaml ```yaml
transform_ops: transform_ops:
...@@ -173,9 +173,10 @@ ...@@ -173,9 +173,10 @@
``` ```
<a name="1.7"></a> <a name="1.7"></a>
### 1.7 GridMask ### 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`)后的数据上操作,此处给出的是在归一化后的操作。
```yaml ```yaml
transform_ops: transform_ops:
...@@ -202,7 +203,7 @@ ...@@ -202,7 +203,7 @@
<a name="1.8"></a> <a name="1.8"></a>
### 1.8 Mixup ### 1.8 Mixup
`Mixup`的图像增广方式的配置如下,其中用户需要指定其中的参数`alpha`,默认的数值是`0.2`。类似其他图像混合类的数据增强方式,`Mixup`是在图像做完数据处理后将每个batch内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。 `Mixup` 的图像增广方式的配置如下,其中用户需要指定其中的参数 `alpha`,默认的数值是 `0.2`。类似其他图像混合类的数据增强方式,`Mixup` 是在图像做完数据处理后将每个 batch 内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。
```yaml ```yaml
transform_ops: transform_ops:
...@@ -226,7 +227,7 @@ ...@@ -226,7 +227,7 @@
<a name="1.9"></a> <a name="1.9"></a>
### 1.9 Cutmix ### 1.9 Cutmix
`Cutmix`的图像增广方式的配置如下,其中用户需要指定其中的参数`alpha`,默认的数值是`0.2`。类似其他图像混合类的数据增强方式,`Cutmix`是在图像做完数据处理后将每个batch内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。 `Cutmix` 的图像增广方式的配置如下,其中用户需要指定其中的参数 `alpha`,默认的数值是 `0.2`。类似其他图像混合类的数据增强方式,`Cutmix` 是在图像做完数据处理后将每个 batch 内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。
```yaml ```yaml
transform_ops: transform_ops:
...@@ -248,9 +249,10 @@ ...@@ -248,9 +249,10 @@
``` ```
<a name="1.10"></a> <a name="1.10"></a>
### 1.10 Mixup与Cutmix同时使用 ### 1.10 Mixup 与 Cutmix 同时使用
`Mixup``Cutmix` 同时使用的配置如下,其中用户需要指定额外的参数 `prob`,该参数控制不同数据增强的概率,默认为 `0.5`
`Mixup``与Cutmix`同时使用的配置如下,其中用户需要指定额外的参数`prob`,该参数控制不同数据增强的概率,默认为`0.5`
```yaml ```yaml
transform_ops: transform_ops:
- DecodeImage: - DecodeImage:
...@@ -275,11 +277,11 @@ ...@@ -275,11 +277,11 @@
``` ```
<a name="2"></a> <a name="2"></a>
## 二、启动命令 ## 2. 启动命令
当用户配置完训练环境后,类似于训练其他分类任务,只需要将`tools/train.sh`中的配置文件替换成为相应的数据增强方式的配置文件即可。 当用户配置完训练环境后,类似于训练其他分类任务,只需要将 `tools/train.sh` 中的配置文件替换成为相应的数据增强方式的配置文件即可。
其中`train.sh`中的内容如下: 其中 `train.sh` 中的内容如下:
```bash ```bash
...@@ -290,27 +292,27 @@ python3 -m paddle.distributed.launch \ ...@@ -290,27 +292,27 @@ python3 -m paddle.distributed.launch \
-c ./ppcls/configs/ImageNet/DataAugment/ResNet50_Cutout.yaml -c ./ppcls/configs/ImageNet/DataAugment/ResNet50_Cutout.yaml
``` ```
运行`train.sh` 运行 `train.sh`
```bash ```bash
sh tools/train.sh sh tools/train.sh
``` ```
<a name="3"></a> <a name="3"></a>
## 三、注意事项 ## 3. 注意事项
* 由于图像混叠时需对label进行混叠,无法计算训练数据的准确率,所以在训练过程中没有打印训练准确率。 * 由于图像混叠时需对 label 进行混叠,无法计算训练数据的准确率,所以在训练过程中没有打印训练准确率。
* 在使用数据增强后,由于训练数据更难,所以训练损失函数可能较大,训练集的准确率相对较低,但其有拥更好的泛化能力,所以验证集的准确率相对较高。 * 在使用数据增强后,由于训练数据更难,所以训练损失函数可能较大,训练集的准确率相对较低,但其有拥更好的泛化能力,所以验证集的准确率相对较高。
* 在使用数据增强后,模型可能会趋于欠拟合状态,建议可以适当的调小`l2_decay`的值来获得更高的验证集准确率。 * 在使用数据增强后,模型可能会趋于欠拟合状态,建议可以适当的调小 `l2_decay` 的值来获得更高的验证集准确率。
* 几乎每一类图像增强均含有超参数,我们只提供了基于ImageNet-1k的超参数,其他数据集需要用户自己调试超参数,具体超参数的含义用户可以阅读相关的论文,调试方法也可以参考训练技巧的章节。 * 几乎每一类图像增强均含有超参数,我们只提供了基于 ImageNet-1k 的超参数,其他数据集需要用户自己调试超参数,具体超参数的含义用户可以阅读相关的论文,调试方法也可以参考训练技巧的章节。
<a name="4"></a> <a name="4"></a>
## 四、实验结果 ## 4. 实验结果
基于PaddleClas,在ImageNet1k数据集上的分类精度如下。 基于 PaddleClas,在 ImageNet1k 数据集上的分类精度如下。
| 模型 | 初始学习率策略 | l2 decay | batch size | epoch | 数据变化策略 | Top1 Acc | 论文中结论 | | 模型 | 初始学习率策略 | l2 decay | batch size | epoch | 数据变化策略 | Top1 Acc | 论文中结论 |
|-------------|------------------|--------------|------------|-------|----------------|------------|----| |-------------|------------------|--------------|------------|-------|----------------|------------|----|
...@@ -325,5 +327,5 @@ sh tools/train.sh ...@@ -325,5 +327,5 @@ sh tools/train.sh
| ResNet50 | 0.1/cosine_decay | 0.0001 | 256 | 300 | hide and seek | 0.7743 | 0.7720 | | ResNet50 | 0.1/cosine_decay | 0.0001 | 256 | 300 | hide and seek | 0.7743 | 0.7720 |
**注意** **注意**
* 在这里的实验中,为了便于对比,我们将l2 decay固定设置为1e-4,在实际使用中,我们推荐尝试使用更小的l2 decay。结合数据增强,我们发现将l2 decay由1e-4减小为7e-5均能带来至少0.3~0.5%的精度提升。 * 在这里的实验中,为了便于对比,我们将 l2 decay 固定设置为 1e-4,在实际使用中,我们推荐尝试使用更小的 l2 decay。结合数据增强,我们发现将 l2 decay 由 1e-4 减小为 7e-5 均能带来至少 0.3~0.5% 的精度提升。
* 我们目前尚未对不同策略进行组合并验证效果,这一块后续我们会开展更多的对比实验,敬请期待。 * 我们目前尚未对不同策略进行组合并验证效果,这一块后续我们会开展更多的对比实验,敬请期待。
# PaddleClas代码解析 # PaddleClas 代码解析
## 目录 ## 目录
- [整体代码和目录概览](#1) - [1. 整体代码和目录概览](#1)
- [训练模块定义](#2) - [2. 训练模块定义](#2)
- [2.1 数据](#2.1) - [2.1 数据](#2.1)
- [2.2 模型结构](#2.2) - [2.2 模型结构](#2.2)
- [2.3 损失函数](#2.3) - [2.3 损失函数](#2.3)
...@@ -11,39 +11,39 @@ ...@@ -11,39 +11,39 @@
- [2.5 训练时评估](#2.5) - [2.5 训练时评估](#2.5)
- [2.6 模型存储](#2.6) - [2.6 模型存储](#2.6)
- [2.7 模型裁剪与量化](#2.7) - [2.7 模型裁剪与量化](#2.7)
- [预测部署代码和方式](#3) - [3. 预测部署代码和方式](#3)
<a name="1"></a> <a name="1"></a>
## 一、整体代码和目录概览 ## 1. 整体代码和目录概览
PaddleClas主要代码和目录结构如下 PaddleClas 主要代码和目录结构如下
* benchmark: 文件夹下存放了一些shell脚本,主要是为了测试PaddleClas中不同模型的速度指标,如单卡训练速度指标、多卡训练速度指标等。 * benchmark: 文件夹下存放了一些 shell 脚本,主要是为了测试 PaddleClas 中不同模型的速度指标,如单卡训练速度指标、多卡训练速度指标等。
* dataset:文件夹下存放数据集和用于处理数据集的脚本。脚本负责将数据集处理为适合Dataloader处理的格式。 * dataset:文件夹下存放数据集和用于处理数据集的脚本。脚本负责将数据集处理为适合 Dataloader 处理的格式。
* deploy:部署核心代码,文件夹存放的是部署工具,支持 python/cpp inference、Hub Serveing、Paddle Lite、Slim离线量化等多种部署方式。 * deploy:部署核心代码,文件夹存放的是部署工具,支持 python/cpp inference、Hub Serveing、Paddle Lite、Slim 离线量化等多种部署方式。
* ppcls:训练核心代码,文件夹下存放PaddleClas框架主体。配置文件、模型训练、评估、预测、动转静导出等具体代码实现均在这里。 * ppcls:训练核心代码,文件夹下存放 PaddleClas 框架主体。配置文件、模型训练、评估、预测、动转静导出等具体代码实现均在这里。
* tools:训练、评估、预测、模型动转静导出的入口函数和脚本均在该文件下。 * tools:训练、评估、预测、模型动转静导出的入口函数和脚本均在该文件下。
* requirements.txt 文件用于安装 PaddleClas 的依赖项。使用pip进行升级安装使用。 * requirements.txt 文件用于安装 PaddleClas 的依赖项。使用 pip 进行升级安装使用。
* tests:PaddleClas模型从训练到预测的全链路测试,验证各功能是否能够正常使用。 * tests:PaddleClas 模型从训练到预测的全链路测试,验证各功能是否能够正常使用。
<a name="2"></a> <a name="2"></a>
## 二、训练模块定义 ## 2. 训练模块定义
深度学习模型训练过程中,主要包含数据、模型结构、损失函数、优化器和学习率衰减、权重衰减策略等,以下一一解读。 深度学习模型训练过程中,主要包含数据、模型结构、损失函数、优化器和学习率衰减、权重衰减策略等,以下一一解读。
<a name="2.1"></a> <a name="2.1"></a>
## 2.1 数据 ### 2.1 数据
对于有监督任务来说,训练数据一般包含原始数据及其标注。在基于单标签的图像分类任务中,原始数据指的是图像数据,而标注则是该图像数据所属的类比。PaddleClas中,训练时需要提供标签文件,形式如下,每一行包含一条训练样本,分别表示图片路径和类别标签,用分隔符隔开(默认为空格)。 对于有监督任务来说,训练数据一般包含原始数据及其标注。在基于单标签的图像分类任务中,原始数据指的是图像数据,而标注则是该图像数据所属的类比。PaddleClas 中,训练时需要提供标签文件,形式如下,每一行包含一条训练样本,分别表示图片路径和类别标签,用分隔符隔开(默认为空格)。
``` ```
train/n01440764/n01440764_10026.JPEG 0 train/n01440764/n01440764_10026.JPEG 0
train/n01440764/n01440764_10027.JPEG 0 train/n01440764/n01440764_10027.JPEG 0
``` ```
在代码`ppcls/data/dataloader/common_dataset.py`中,包含`CommonDataset`类,继承自`paddle.io.Dataset`,该数据集类可以通过一个键值进行索引并获取指定样本。`ImageNetDataset`, `LogoDataset`, `CommonDataset` 等数据集类都继承自这个类别 在代码 `ppcls/data/dataloader/common_dataset.py` 中,包含 `CommonDataset` 类,继承自 `paddle.io.Dataset`,该数据集类可以通过一个键值进行索引并获取指定样本。`ImageNetDataset`, `LogoDataset`, `CommonDataset` 等数据集类都对这个类别
对于读入的数据,需要通过数据转换,将原始的图像数据进行转换。训练时,标准的数据预处理包含:`DecodeImage`, `RandCropImage`, `RandFlipImage`, `NormalizeImage`, `ToCHWImage`。在配置文件中体现如下,数据预处理主要包含在`transforms`字段中,以列表形式呈现,会按照顺序对数据依次做这些转换。 对于读入的数据,需要通过数据转换,将原始的图像数据进行转换。训练时,标准的数据预处理包含:`DecodeImage`, `RandCropImage`, `RandFlipImage`, `NormalizeImage`, `ToCHWImage`。在配置文件中体现如下,数据预处理主要包含在 `transforms` 字段中,以列表形式呈现,会按照顺序对数据依次做这些转换。
```yaml ```yaml
DataLoader: DataLoader:
...@@ -74,7 +74,7 @@ PaddleClas 中也包含了 `AutoAugment`, `RandAugment` 等数据增广方法, ...@@ -74,7 +74,7 @@ PaddleClas 中也包含了 `AutoAugment`, `RandAugment` 等数据增广方法,
图像分类中,数据后处理主要为 `argmax` 操作,在此不再赘述。 图像分类中,数据后处理主要为 `argmax` 操作,在此不再赘述。
<a name="2.2"></a> <a name="2.2"></a>
## 2.2 模型结构 ### 2.2 模型结构
在配置文件中,模型结构定义如下 在配置文件中,模型结构定义如下
...@@ -86,7 +86,7 @@ Arch: ...@@ -86,7 +86,7 @@ Arch:
use_ssld: False use_ssld: False
``` ```
`Arch.name` 表示模型名称, `Arch.pretrained` 表示是否添加预训练模型,`use_ssld` 表示是否使用基于 `SSLD` 知识蒸馏得到的预训练模型。所有的模型名称均在 `ppcls/arch/backbone/__init__.py` 中定义。 `Arch.name` 表示模型名称,`Arch.pretrained` 表示是否添加预训练模型,`use_ssld` 表示是否使用基于 `SSLD` 知识蒸馏得到的预训练模型。所有的模型名称均在 `ppcls/arch/backbone/__init__.py` 中定义。
对应的,在 `ppcls/arch/__init__.py` 中,通过 `build_model` 方法创建模型对象。 对应的,在 `ppcls/arch/__init__.py` 中,通过 `build_model` 方法创建模型对象。
...@@ -100,9 +100,9 @@ def build_model(config): ...@@ -100,9 +100,9 @@ def build_model(config):
``` ```
<a name="2.3"></a> <a name="2.3"></a>
## 2.3 损失函数 ### 2.3 损失函数
PaddleClas中,包含了 `CELoss` , `JSDivLoss`, `TripletLoss`, `CenterLoss` 等损失函数,均定义在 `ppcls/loss` 中。 PaddleClas 中,包含了 `CELoss`, `JSDivLoss`, `TripletLoss`, `CenterLoss` 等损失函数,均定义在 `ppcls/loss` 中。
`ppcls/loss/__init__.py` 文件中,使用 `CombinedLoss` 来构建及合并损失函数,不同训练策略中所需要的损失函数与计算方法不同,PaddleClas 在构建损失函数过程中,主要考虑了以下几个因素。 `ppcls/loss/__init__.py` 文件中,使用 `CombinedLoss` 来构建及合并损失函数,不同训练策略中所需要的损失函数与计算方法不同,PaddleClas 在构建损失函数过程中,主要考虑了以下几个因素。
...@@ -112,7 +112,7 @@ PaddleClas中,包含了 `CELoss` , `JSDivLoss`, `TripletLoss`, `CenterLoss` ...@@ -112,7 +112,7 @@ PaddleClas中,包含了 `CELoss` , `JSDivLoss`, `TripletLoss`, `CenterLoss`
4. 是否是训练 metric learning 4. 是否是训练 metric learning
用户可以在配置文件中指定损失函数的类型及权重,如在训练中添加 TripletLossV2 ,配置文件如下: 用户可以在配置文件中指定损失函数的类型及权重,如在训练中添加 TripletLossV2,配置文件如下:
```yaml ```yaml
Loss: Loss:
...@@ -125,13 +125,13 @@ Loss: ...@@ -125,13 +125,13 @@ Loss:
``` ```
<a name="2.4"></a> <a name="2.4"></a>
## 2.4 优化器和学习率衰减、权重衰减策略 ### 2.4 优化器和学习率衰减、权重衰减策略
图像分类任务中,`Momentum` 是一种比较常用的优化器, PaddleClas 中提供了 `Momentum``RMSProp``Adam``AdamW`等几种优化器策略。 图像分类任务中,`Momentum` 是一种比较常用的优化器,PaddleClas 中提供了 `Momentum``RMSProp``Adam``AdamW` 等几种优化器策略。
权重衰减策略是一种比较常用的正则化方法,主要用于防止模型过拟合。 PaddleClas 中提供了 `L1Decay``L2Decay` 两种权重衰减策略。 权重衰减策略是一种比较常用的正则化方法,主要用于防止模型过拟合。 PaddleClas 中提供了 `L1Decay``L2Decay` 两种权重衰减策略。
学习率衰减是图像分类任务中必不可少的精度提升训练方法, PaddleClas 目前支持 `Cosine` , `Piecewise`, `Linear` 等学习率衰减策略。 学习率衰减是图像分类任务中必不可少的精度提升训练方法,PaddleClas 目前支持 `Cosine`, `Piecewise`, `Linear` 等学习率衰减策略。
在配置文件中,优化器、权重衰减策略、学习率衰减策略可以通过以下的字段进行配置。 在配置文件中,优化器、权重衰减策略、学习率衰减策略可以通过以下的字段进行配置。
...@@ -180,22 +180,22 @@ def build_optimizer(config, epochs, step_each_epoch, parameters): ...@@ -180,22 +180,22 @@ def build_optimizer(config, epochs, step_each_epoch, parameters):
return optim, lr return optim, lr
``` ```
不同优化器和权重衰减策略均以类的形式实现,具体实现可以参考文件 `ppcls/optimizer/optimizer.py` ;不同的学习率衰减策略可以参考文件 `ppcls/optimizer/learning_rate.py` 不同优化器和权重衰减策略均以类的形式实现,具体实现可以参考文件 `ppcls/optimizer/optimizer.py`;不同的学习率衰减策略可以参考文件 `ppcls/optimizer/learning_rate.py`
<a name="2.5"></a> <a name="2.5"></a>
## 2.5 训练时评估 ### 2.5 训练时评估
模型在训练的时候,可以设置模型保存的间隔,也可以选择每隔若干个epoch对验证集进行评估,从而可以保存在验证集上精度最佳的模型。配置文件中,可以通过下面的字段进行配置。 模型在训练的时候,可以设置模型保存的间隔,也可以选择每隔若干个 epoch 对验证集进行评估,从而可以保存在验证集上精度最佳的模型。配置文件中,可以通过下面的字段进行配置。
```yaml ```yaml
Global: Global:
save_interval: 1 # 模型保存的epoch间隔 save_interval: 1 # 模型保存的 epoch 间隔
eval_during_train: True # 是否进行训练时评估 eval_during_train: True # 是否进行训练时评估
eval_interval: 1 # 评估的epoch间隔 eval_interval: 1 # 评估的 epoch 间隔
``` ```
<a name="2.6"></a> <a name="2.6"></a>
## 2.6 模型存储 ### 2.6 模型存储
模型存储是通过 Paddle 框架的 `paddle.save()` 函数实现的,存储的是模型的动态图版本,以字典的形式存储,便于继续训练。具体实现如下 模型存储是通过 Paddle 框架的 `paddle.save()` 函数实现的,存储的是模型的动态图版本,以字典的形式存储,便于继续训练。具体实现如下
```python ```python
...@@ -217,7 +217,7 @@ def save_model(program, model_path, epoch_id, prefix='ppcls'): ...@@ -217,7 +217,7 @@ def save_model(program, model_path, epoch_id, prefix='ppcls'):
如果想对模型进行压缩训练,则通过下面字段进行配置 如果想对模型进行压缩训练,则通过下面字段进行配置
<a name="2.7"></a> <a name="2.7"></a>
## 2.7 模型裁剪与量化 ### 2.7 模型裁剪与量化
1.模型裁剪: 1.模型裁剪:
...@@ -236,14 +236,14 @@ Slim: ...@@ -236,14 +236,14 @@ Slim:
name: pact name: pact
``` ```
训练方法详见模型[裁剪量化使用介绍](../advanced_tutorials/model_prune_quantization.md) 算法介绍详见[裁剪量化算法介绍](../algorithm_introduction/model_prune_quantization.md) 训练方法详见模型[裁剪量化使用介绍](../advanced_tutorials/model_prune_quantization.md),算法介绍详见[裁剪量化算法介绍](../algorithm_introduction/model_prune_quantization.md)
<a name="3"></a> <a name="3"></a>
## 三、预测部署代码和方式 ## 3. 预测部署代码和方式
* 如果希望将对分类模型进行离线量化,可以参考 [模型量化裁剪教程](../advanced_tutorials/model_prune_quantization.md) 中离线量化部分。 * 如果希望将对分类模型进行离线量化,可以参考 [模型量化裁剪教程](../advanced_tutorials/model_prune_quantization.md) 中离线量化部分。
* 如果希望在服务端使用 python 进行部署,可以参考 [python inference 预测教程](../inference_deployment/python_deploy.md) * 如果希望在服务端使用 python 进行部署,可以参考 [python inference 预测教程](../inference_deployment/python_deploy.md)
* 如果希望在服务端使用 cpp 进行部署,可以参考 [cpp inference 预测教程](../inference_deployment/cpp_deploy.md) * 如果希望在服务端使用 cpp 进行部署,可以参考 [cpp inference 预测教程](../inference_deployment/cpp_deploy.md)
* 如果希望将分类模型部署为服务,可以参考 [hub serving 预测部署教程](../inference_deployment/paddle_hub_serving_deploy.md) * 如果希望将分类模型部署为服务,可以参考 [hub serving 预测部署教程](../inference_deployment/paddle_hub_serving_deploy.md)
* 如果希望在移动端使用分类模型进行预测,可以参考 [PaddleLite 预测部署教程](../inference_deployment/paddle_lite_deploy.md) * 如果希望在移动端使用分类模型进行预测,可以参考 [PaddleLite 预测部署教程](../inference_deployment/paddle_lite_deploy.md)
* 如果希望使用whl包对分类模型进行预测,可以参考 [whl包预测](../inference_deployment/whl_deploy.md) * 如果希望使用 whl 包对分类模型进行预测,可以参考 [whl 包预测](../inference_deployment/whl_deploy.md)
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
## 目录 ## 目录
- [如何贡献代码](#1) - [1. 如何贡献代码](#1)
- [1.1 PaddleClas 分支说明](#1.1) - [1.1 PaddleClas 分支说明](#1.1)
- [1.2 PaddleClas 代码提交流程与规范](#1.2) - [1.2 PaddleClas 代码提交流程与规范](#1.2)
- [1.2.1 fork 和 clone 代码](#1.2.1) - [1.2.1 fork 和 clone 代码](#1.2.1)
...@@ -12,28 +12,28 @@ ...@@ -12,28 +12,28 @@
- [1.2.4 使用 pre-commit 勾子](#1.2.4) - [1.2.4 使用 pre-commit 勾子](#1.2.4)
- [1.2.5 修改与提交代码](#1.2.5) - [1.2.5 修改与提交代码](#1.2.5)
- [1.2.6 保持本地仓库最新](#1.2.6) - [1.2.6 保持本地仓库最新](#1.2.6)
- [1.2.7 push到远程仓库](#1.2.7) - [1.2.7 push 到远程仓库](#1.2.7)
- [1.2.8 提交Pull Request](#1.2.8) - [1.2.8 提交 Pull Request](#1.2.8)
- [1.2.9 签署 CLA 协议和通过单元测试](#1.2.9) - [1.2.9 签署 CLA 协议和通过单元测试](#1.2.9)
- [1.2.10 删除分支](#1.2.10) - [1.2.10 删除分支](#1.2.10)
- [1.2.11 提交代码的一些约定](#1.2.11) - [1.2.11 提交代码的一些约定](#1.2.11)
- [总结](#2) - [2. 总结](#2)
- [参考文献](#3) - [3. 参考文献](#3)
<a name="1"></a> <a name="1"></a>
## 一、如何贡献代码 ## 1. 如何贡献代码
<a name="1.1"></a> <a name="1.1"></a>
### 1.1 PaddleClas 分支说明 ### 1.1 PaddleClas 分支说明
PaddleClas 未来将维护 2 种分支,分别为: PaddleClas 未来将维护 2 种分支,分别为:
* release/x.x 系列分支:为稳定的发行版本分支,会适时打 tag 发布版本,适配 Paddle 的 release 版本。当前最新的分支为 release/2.3 分支,是当前默认分支,适配 Paddle v2.1.0 。随着版本迭代, release/x.x 系列分支会越来越多,默认维护最新版本的 release 分支,前 1 个版本分支会修复 bug ,其他的分支不再维护。 * release/x.x 系列分支:为稳定的发行版本分支,会适时打 tag 发布版本,适配 Paddle 的 release 版本。当前最新的分支为 release/2.3 分支,是当前默认分支,适配 Paddle v2.1.0 。随着版本迭代, release/x.x 系列分支会越来越多,默认维护最新版本的 release 分支,前 1 个版本分支会修复 bug,其他的分支不再维护。
* develop 分支:为开发分支,适配 Paddle 的 develop 版本,主要用于开发新功能。如果有同学需要进行二次开发,请选择 develop 分支。为了保证 develop 分支能在需要的时候拉出 release/x.x 分支, develop 分支的代码只能使用 Paddle 最新 release 分支中有效的 api 。也就是说,如果 Paddle develop 分支中开发了新的 api,但尚未出现在 release 分支代码中,那么请不要在 PaddleClas 中使用。除此之外,对于不涉及 api 的性能优化、参数调整、策略更新等,都可以正常进行开发。 * develop 分支:为开发分支,适配 Paddle 的 develop 版本,主要用于开发新功能。如果有同学需要进行二次开发,请选择 develop 分支。为了保证 develop 分支能在需要的时候拉出 release/x.x 分支, develop 分支的代码只能使用 Paddle 最新 release 分支中有效的 api 。也就是说,如果 Paddle develop 分支中开发了新的 api,但尚未出现在 release 分支代码中,那么请不要在 PaddleClas 中使用。除此之外,对于不涉及 api 的性能优化、参数调整、策略更新等,都可以正常进行开发。
PaddleClas 的历史分支,未来将不再维护。考虑到一些同学可能仍在使用,这些分支还会继续保留: PaddleClas 的历史分支,未来将不再维护。考虑到一些同学可能仍在使用,这些分支还会继续保留:
* release/static 分支:这个分支曾用于静态图的开发与测试,目前兼容 >=1.7 版本的 Paddle 。如果有特殊需求,要适配旧版本的 Paddle ,那还可以使用这个分支,但除了修复 bug 外不再更新代码。 * release/static 分支:这个分支曾用于静态图的开发与测试,目前兼容 >=1.7 版本的 Paddle 。如果有特殊需求,要适配旧版本的 Paddle,那还可以使用这个分支,但除了修复 bug 外不再更新代码。
* dygraph-dev 分支:这个分支将不再维护,也不再接受新的代码,请使用的同学尽快迁移到 develop 分支。 * dygraph-dev 分支:这个分支将不再维护,也不再接受新的代码,请使用的同学尽快迁移到 develop 分支。
...@@ -45,7 +45,7 @@ PaddleClas 欢迎大家向 repo 中积极贡献代码,下面给出一些贡献 ...@@ -45,7 +45,7 @@ PaddleClas 欢迎大家向 repo 中积极贡献代码,下面给出一些贡献
<a name="1.2.1"></a> <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`
<div align="center"> <div align="center">
...@@ -56,7 +56,7 @@ PaddleClas 欢迎大家向 repo 中积极贡献代码,下面给出一些贡献 ...@@ -56,7 +56,7 @@ PaddleClas 欢迎大家向 repo 中积极贡献代码,下面给出一些贡献
* 将远程仓库 clone 到本地 * 将远程仓库 clone 到本地
```shell ```shell
# 拉取develop分支的代码 # 拉取 develop 分支的代码
git clone https://github.com/USERNAME/PaddleClas.git -b develop git clone https://github.com/USERNAME/PaddleClas.git -b develop
cd PaddleClas cd PaddleClas
``` ```
...@@ -77,7 +77,7 @@ origin https://github.com/USERNAME/PaddleClas.git (fetch) ...@@ -77,7 +77,7 @@ origin https://github.com/USERNAME/PaddleClas.git (fetch)
origin https://github.com/USERNAME/PaddleClas.git (push) origin https://github.com/USERNAME/PaddleClas.git (push)
``` ```
上面的信息只包含了 clone 的远程仓库的信息,也就是自己用户名下的 PaddleClas ,接下来我们创建一个原始 PaddleClas 仓库的远程主机,命名为 upstream 。 上面的信息只包含了 clone 的远程仓库的信息,也就是自己用户名下的 PaddleClas,接下来我们创建一个原始 PaddleClas 仓库的远程主机,命名为 upstream 。
```shell ```shell
git remote add upstream https://github.com/PaddlePaddle/PaddleClas.git git remote add upstream https://github.com/PaddlePaddle/PaddleClas.git
...@@ -92,7 +92,7 @@ upstream https://github.com/PaddlePaddle/PaddleClas.git (fetch) ...@@ -92,7 +92,7 @@ upstream https://github.com/PaddlePaddle/PaddleClas.git (fetch)
upstream https://github.com/PaddlePaddle/PaddleClas.git (push) upstream https://github.com/PaddlePaddle/PaddleClas.git (push)
``` ```
这主要是为了后续在提交 pull request (PR) 时,始终保持本地仓库最新。 这主要是为了后续在提交 pull request(PR)时,始终保持本地仓库最新。
<a name="1.2.3"></a> <a name="1.2.3"></a>
#### 1.2.3 创建本地分支 #### 1.2.3 创建本地分支
...@@ -106,10 +106,10 @@ git checkout -b new_branch ...@@ -106,10 +106,10 @@ git checkout -b new_branch
也可以基于远程或者上游的分支创建新的分支,命令如下。 也可以基于远程或者上游的分支创建新的分支,命令如下。
```shell ```shell
# 基于用户远程仓库(origin)的develop创建new_branch分支 # 基于用户远程仓库(origin)的 develop 创建 new_branch 分支
git checkout -b new_branch origin/develop git checkout -b new_branch origin/develop
# 基于上游远程仓库(upstream)的develop创建new_branch分支 # 基于上游远程仓库(upstream)的 develop 创建 new_branch 分支
# 如果需要从upstream创建新的分支,需要首先使用git fetch upstream获取上游代码 # 如果需要从 upstream 创建新的分支,需要首先使用 git fetch upstream 获取上游代码
git checkout -b new_branch upstream/develop git checkout -b new_branch upstream/develop
``` ```
...@@ -123,9 +123,9 @@ Switched to a new branch 'new_branch' ...@@ -123,9 +123,9 @@ Switched to a new branch 'new_branch'
<a name="1.2.4"></a> <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 中不要添加大文件等)。
pre-commit 测试是 Travis-CI 中单元测试的一部分,不满足钩子的 PR 不能被提交到 PaddleClas ,首先安装并在当前目录运行它: pre-commit 测试是 Travis-CI 中单元测试的一部分,不满足钩子的 PR 不能被提交到 PaddleClas,首先安装并在当前目录运行它:
```shell ```shell
pip install pre-commit pip install pre-commit
...@@ -168,21 +168,21 @@ git commit -m "your commit info" ...@@ -168,21 +168,21 @@ git commit -m "your commit info"
```shell ```shell
git fetch upstream git fetch upstream
# 如果是希望提交到其他分支,则需要从upstream的其他分支pull代码,这里是develop # 如果是希望提交到其他分支,则需要从 upstream 的其他分支 pull 代码,这里是 develop
git pull upstream develop git pull upstream develop
``` ```
<a name="1.2.7"></a> <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> <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 中的对应分支即可。
<div align="center"> <div align="center">
<img src="../../images/quick_start/community/004_create_pr.png" width = "600" /> <img src="../../images/quick_start/community/004_create_pr.png" width = "600" />
...@@ -192,10 +192,10 @@ git push origin new_branch ...@@ -192,10 +192,10 @@ git push origin new_branch
#### 1.2.9 签署 CLA 协议和通过单元测试 #### 1.2.9 签署 CLA 协议和通过单元测试
* 签署 CLA * 签署 CLA
在首次向 PaddlePaddle 提交 Pull Request 时,您需要您签署一次 CLA (Contributor License Agreement) 协议,以保证您的代码可以被合入,具体签署方式如下: 在首次向 PaddlePaddle 提交 Pull Request 时,您需要您签署一次 CLA(Contributor License Agreement)协议,以保证您的代码可以被合入,具体签署方式如下:
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> <a name="1.2.10"></a>
#### 1.2.10 删除分支 #### 1.2.10 删除分支
...@@ -214,10 +214,10 @@ git push origin :new_branch ...@@ -214,10 +214,10 @@ git push origin :new_branch
* 删除本地分支 * 删除本地分支
```shell ```shell
# 切换到develop分支,否则无法删除当前分支 # 切换到 develop 分支,否则无法删除当前分支
git checkout develop git checkout develop
# 删除new_branch分支 # 删除 new_branch 分支
git branch -D new_branch git branch -D new_branch
``` ```
...@@ -228,17 +228,17 @@ git branch -D new_branch ...@@ -228,17 +228,17 @@ git branch -D new_branch
1)请保证 Travis-CI 中单元测试能顺利通过。如果没过,说明提交的代码存在问题,官方维护人员一般不做评审。 1)请保证 Travis-CI 中单元测试能顺利通过。如果没过,说明提交的代码存在问题,官方维护人员一般不做评审。
2)提交 Pull Request前: 2)提交 Pull Request 前:
请注意 commit 的数量。 请注意 commit 的数量。
原因:如果仅仅修改一个文件但提交了十几个 commit ,每个 commit 只做了少量的修改,这会给评审人带来很大困扰。评审人需要逐一查看每个 commit 才能知道做了哪些修改,且不排除 commit 之间的修改存在相互覆盖的情况。 原因:如果仅仅修改一个文件但提交了十几个 commit,每个 commit 只做了少量的修改,这会给评审人带来很大困扰。评审人需要逐一查看每个 commit 才能知道做了哪些修改,且不排除 commit 之间的修改存在相互覆盖的情况。
建议:每次提交时,保持尽量少的 commit ,可以通过 `git commit --amend` 补充上次的 commit 。对已经 Push 到远程仓库的多个 commit ,可以参考 [squash commits after push](https://stackoverflow.com/questions/5667884/how-to-squash-commits-in-git-after-they-have-been-pushed) 建议:每次提交时,保持尽量少的 commit,可以通过 `git commit --amend` 补充上次的 commit 。对已经 Push 到远程仓库的多个 commit,可以参考 [squash commits after push](https://stackoverflow.com/questions/5667884/how-to-squash-commits-in-git-after-they-have-been-pushed)
请注意每个 commit 的名称:应能反映当前 commit 的内容,不能太随意。 请注意每个 commit 的名称:应能反映当前 commit 的内容,不能太随意。
3)如果解决了某个 Issue 的问题,请在该 Pull Request 的第一个评论框中加上: `fix #issue_number` ,这样当该 Pull Request 被合并后,会自动关闭对应的 Issue 。关键词包括: close, closes, closed, fix, fixes, fixed, resolve, resolves, resolved ,请选择合适的词汇。详细可参考 [Closing issues via commit messages](https://help.github.com/articles/closing-issues-via-commit-messages) 3)如果解决了某个 Issue 的问题,请在该 Pull Request 的第一个评论框中加上: `fix #issue_number`,这样当该 Pull Request 被合并后,会自动关闭对应的 Issue 。关键词包括: close, closes, closed, fix, fixes, fixed, resolve, resolves, resolved,请选择合适的词汇。详细可参考 [Closing issues via commit messages](https://help.github.com/articles/closing-issues-via-commit-messages)
此外,在回复评审人意见时,请您遵守以下约定: 此外,在回复评审人意见时,请您遵守以下约定:
...@@ -253,11 +253,11 @@ git branch -D new_branch ...@@ -253,11 +253,11 @@ git branch -D new_branch
- 请采用 `start a review` 进行回复,而非直接回复的方式。原因是每个回复都会发送一封邮件,会造成邮件灾难。 - 请采用 `start a review` 进行回复,而非直接回复的方式。原因是每个回复都会发送一封邮件,会造成邮件灾难。
<a name="2"></a> <a name="2"></a>
## 二、总结 ## 2. 总结
* 开源社区依赖于众多开发者与用户的贡献和反馈,在这里感谢与期待大家向 PaddleClas 提出宝贵的意见与 Pull Request ,希望我们可以一起打造一个领先实用全面的图像识别代码仓库! * 开源社区依赖于众多开发者与用户的贡献和反馈,在这里感谢与期待大家向 PaddleClas 提出宝贵的意见与 Pull Request,希望我们可以一起打造一个领先实用全面的图像识别代码仓库!
<a name="3"></a> <a name="3"></a>
## 三、参考文献 ## 3. 参考文献
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)
...@@ -2,42 +2,41 @@ ...@@ -2,42 +2,41 @@
# 知识蒸馏 # 知识蒸馏
## 目录 ## 目录
- [1. 模型压缩与知识蒸馏方法简介](#1)
- [模型压缩与知识蒸馏方法简介](#1) - [2. SSLD 蒸馏策略](#2)
- [SSLD 蒸馏策略](#2)
- [2.1 简介](#2.1) - [2.1 简介](#2.1)
- [2.2 数据选择](#2.2) - [2.2 数据选择](#2.2)
- [实验](#3) - [3. 实验](#3)
- [3.1 教师模型的选择](#3.1) - [3.1 教师模型的选择](#3.1)
- [3.2 大数据蒸馏](#3.2) - [3.2 大数据蒸馏](#3.2)
- [3.3 ImageNet1k 训练集 finetune](#3.3) - [3.3 ImageNet1k 训练集 finetune](#3.3)
- [3.4 数据增广以及基于 Fix 策略的微调](#3.4) - [3.4 数据增广以及基于 Fix 策略的微调](#3.4)
- [3.5 实验过程中的一些问题](#3.5) - [3.5 实验过程中的一些问题](#3.5)
- [蒸馏模型的应用](#4) - [4. 蒸馏模型的应用](#4)
- [4.1 使用方法](#4.1) - [4.1 使用方法](#4.1)
- [4.2 迁移学习 finetune](#4.2) - [4.2 迁移学习 finetune](#4.2)
- [4.3 目标检测](#4.3) - [4.3 目标检测](#4.3)
- [SSLD实战](#5) - [5. SSLD 实战](#5)
- [5.1 参数配置](#5.1) - [5.1 参数配置](#5.1)
- [5.2 启动命令](#5.2) - [5.2 启动命令](#5.2)
- [5.3 注意事项](#5.3) - [5.3 注意事项](#5.3)
- [参考文献](#6) - [6. 参考文献](#6)
<a name="1"></a> <a name="1"></a>
## 一、模型压缩与知识蒸馏方法简介 ## 1. 模型压缩与知识蒸馏方法简介
近年来,深度神经网络在计算机视觉、自然语言处理等领域被验证是一种极其有效的解决问题的方法。通过构建合适的神经网络,加以训练,最终网络模型的性能指标基本上都会超过传统算法。 近年来,深度神经网络在计算机视觉、自然语言处理等领域被验证是一种极其有效的解决问题的方法。通过构建合适的神经网络,加以训练,最终网络模型的性能指标基本上都会超过传统算法。
在数据量足够大的情况下,通过合理构建网络模型的方式增加其参数量,可以显著改善模型性能,但是这又带来了模型复杂度急剧提升的问题。大模型在实际场景中使用的成本较高。 在数据量足够大的情况下,通过合理构建网络模型的方式增加其参数量,可以显著改善模型性能,但是这又带来了模型复杂度急剧提升的问题。大模型在实际场景中使用的成本较高。
深度神经网络一般有较多的参数冗余,目前有几种主要的方法对模型进行压缩,减小其参数量。如裁剪、量化、知识蒸馏等,其中知识蒸馏是指使用教师模型 (teacher model) 去指导学生模型 (student model) 学习特定任务,保证小模型在参数量不变的情况下,得到比较大的性能提升,甚至获得与大模型相似的精度指标 [1]。 PaddleClas 融合已有的蒸馏方法 [2,3] ,提供了一种简单的半监督标签知识蒸馏方案 (SSLD,Simple Semi-supervised Label Distillation) ,基于 ImageNet1k 分类数据集,在 ResNet_vd 以及 MobileNet 系列上的精度均有超过 3% 的绝对精度提升,具体指标如下图所示。 深度神经网络一般有较多的参数冗余,目前有几种主要的方法对模型进行压缩,减小其参数量。如裁剪、量化、知识蒸馏等,其中知识蒸馏是指使用教师模型(teacher model)去指导学生模型(student model)学习特定任务,保证小模型在参数量不变的情况下,得到比较大的性能提升,甚至获得与大模型相似的精度指标 [1]。 PaddleClas 融合已有的蒸馏方法 [2,3],提供了一种简单的半监督标签知识蒸馏方案(SSLD,Simple Semi-supervised Label Distillation),基于 ImageNet1k 分类数据集,在 ResNet_vd 以及 MobileNet 系列上的精度均有超过 3% 的绝对精度提升,具体指标如下图所示。
<div align="center"> <div align="center">
<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> <a name="2"></a>
## 二、SSLD 蒸馏策略 ## 2. SSLD 蒸馏策略
<a name="2.1"></a> <a name="2.1"></a>
### 2.1 简介 ### 2.1 简介
...@@ -48,17 +47,17 @@ SSLD 的流程图如下图所示。 ...@@ -48,17 +47,17 @@ SSLD 的流程图如下图所示。
<img src="../../images/distillation/ppcls_distillation.png" width = "600" /> <img src="../../images/distillation/ppcls_distillation.png" width = "600" />
</div> </div>
首先,我们从 ImageNet22k 中挖掘出了近400万张图片,同时与 ImageNet-1k 训练集整合在一起,得到了一个新的包含 500 万张图片的数据集。然后,我们将学生模型与教师模型组合成一个新的网络,该网络分别输出学生模型和教师模型的预测分布,与此同时,固定教师模型整个网络的梯度,而学生模型可以做正常的反向传播。最后,我们将两个模型的 logits 经过 softmax 激活函数转换为 soft label ,并将二者的 soft label 做 JS 散度作为损失函数,用于蒸馏模型训练。下面以 MobileNetV3 (该模型直接训练,精度为 75.3%) 的知识蒸馏为例,介绍该方案的核心关键点( baseline 为 79.12% 的 ResNet50_vd 模型蒸馏 MobileNetV3 ,训练集为 ImageNet1k 训练集, loss 为 cross entropy loss ,迭代轮数为 120epoch ,精度指标为 75.6% )。 首先,我们从 ImageNet22k 中挖掘出了近 400 万张图片,同时与 ImageNet-1k 训练集整合在一起,得到了一个新的包含 500 万张图片的数据集。然后,我们将学生模型与教师模型组合成一个新的网络,该网络分别输出学生模型和教师模型的预测分布,与此同时,固定教师模型整个网络的梯度,而学生模型可以做正常的反向传播。最后,我们将两个模型的 logits 经过 softmax 激活函数转换为 soft label,并将二者的 soft label 做 JS 散度作为损失函数,用于蒸馏模型训练。下面以 MobileNetV3(该模型直接训练,精度为 75.3%)的知识蒸馏为例,介绍该方案的核心关键点(baseline 为 79.12% 的 ResNet50_vd 模型蒸馏 MobileNetV3,训练集为 ImageNet1k 训练集,loss 为 cross entropy loss,迭代轮数为 120epoch,精度指标为 75.6%)。
* 教师模型的选择。在进行知识蒸馏时,如果教师模型与学生模型的结构差异太大,蒸馏得到的结果反而不会有太大收益。相同结构下,精度更高的教师模型对结果也有很大影响。相比于 79.12% 的 ResNet50_vd 教师模型,使用 82.4% 的 ResNet50_vd 教师模型可以带来 0.4% 的绝对精度收益( `75.6%->76.0%` )。 * 教师模型的选择。在进行知识蒸馏时,如果教师模型与学生模型的结构差异太大,蒸馏得到的结果反而不会有太大收益。相同结构下,精度更高的教师模型对结果也有很大影响。相比于 79.12% 的 ResNet50_vd 教师模型,使用 82.4% 的 ResNet50_vd 教师模型可以带来 0.4% 的绝对精度收益(`75.6%->76.0%`)。
* 改进 loss 计算方法。分类 loss 计算最常用的方法就是 cross entropy loss ,我们经过实验发现,在使用 soft label 进行训练时,相对于 cross entropy loss , KL div loss 对模型性能提升几乎无帮助,但是使用具有对称特性的 JS div loss 时,在多个蒸馏任务上相比 cross entropy loss 均有 0.2% 左右的收益( `76.0%->76.2%` ), SSLD 中也基于 JS div loss 展开实验。 * 改进 loss 计算方法。分类 loss 计算最常用的方法就是 cross entropy loss,我们经过实验发现,在使用 soft label 进行训练时,相对于 cross entropy loss,KL div loss 对模型性能提升几乎无帮助,但是使用具有对称特性的 JS div loss 时,在多个蒸馏任务上相比 cross entropy loss 均有 0.2% 左右的收益(`76.0%->76.2%`),SSLD 中也基于 JS div loss 展开实验。
* 更多的迭代轮数。蒸馏的 baseline 实验只迭代了 120 个 epoch 。实验发现,迭代轮数越多,蒸馏效果越好,最终我们迭代了 360epoch ,精度指标可以达到 77.1%(`76.2%->77.1%`) * 更多的迭代轮数。蒸馏的 baseline 实验只迭代了 120 个 epoch 。实验发现,迭代轮数越多,蒸馏效果越好,最终我们迭代了 360 epoch,精度指标可以达到 77.1%(`76.2%->77.1%`)
* 无需数据集的真值标签,很容易扩展训练集。 SSLD 的 loss 在计算过程中,仅涉及到教师和学生模型对于相同图片的处理结果(经过 softmax 激活函数处理之后的 soft label ),因此即使图片数据不包含真值标签,也可以用来进行训练并提升模型性能。该蒸馏方案的无标签蒸馏策略也大大提升了学生模型的性能上限( `77.1%->78.5%` * 无需数据集的真值标签,很容易扩展训练集。 SSLD 的 loss 在计算过程中,仅涉及到教师和学生模型对于相同图片的处理结果(经过 softmax 激活函数处理之后的 soft label),因此即使图片数据不包含真值标签,也可以用来进行训练并提升模型性能。该蒸馏方案的无标签蒸馏策略也大大提升了学生模型的性能上限(`77.1%->78.5%`)
* 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> <a name="2.2"></a>
...@@ -72,13 +71,13 @@ SSLD 的流程图如下图所示。 ...@@ -72,13 +71,13 @@ SSLD 的流程图如下图所示。
</div> </div>
* 大数据集 soft label 获取,对于去重后的 ImageNet22k 数据集,我们使用 `ResNeXt101_32x16d_wsl` 模型进行预测,得到每张图片的 soft label 。 * 大数据集 soft label 获取,对于去重后的 ImageNet22k 数据集,我们使用 `ResNeXt101_32x16d_wsl` 模型进行预测,得到每张图片的 soft label 。
* Top-k 数据选择, ImageNet1k 数据共有 1000 类,对于每一类,找出属于该类并且得分最高的 `k` 张图片,最终得到一个数据量不超过`1000*k`的数据集(某些类上得到的图片数量可能少于 `k` 张)。 * Top-k 数据选择,ImageNet1k 数据共有 1000 类,对于每一类,找出属于该类并且得分最高的 `k` 张图片,最终得到一个数据量不超过 `1000*k` 的数据集(某些类上得到的图片数量可能少于 `k` 张)。
* 将该数据集与 ImageNet1k 的训练集融合组成最终蒸馏模型所使用的数据集,数据量为 500 万。 * 将该数据集与 ImageNet1k 的训练集融合组成最终蒸馏模型所使用的数据集,数据量为 500 万。
<a name="3"></a> <a name="3"></a>
## 三、实验 ## 3. 实验
* PaddleClas 的蒸馏策略为`大数据集训练 + ImageNet1k 蒸馏 finetune`的策略。选择合适的教师模型,首先在挑选得到的 500 万数据集上进行训练,然后在 ImageNet1k 训练集上进行 finetune,最终得到蒸馏后的学生模型。 * PaddleClas 的蒸馏策略为`大数据集训练 + ImageNet1k 蒸馏 finetune` 的策略。选择合适的教师模型,首先在挑选得到的 500 万数据集上进行训练,然后在 ImageNet1k 训练集上进行 finetune,最终得到蒸馏后的学生模型。
<a name="3.1"></a> <a name="3.1"></a>
### 3.1 教师模型的选择 ### 3.1 教师模型的选择
...@@ -99,7 +98,7 @@ SSLD 的流程图如下图所示。 ...@@ -99,7 +98,7 @@ SSLD 的流程图如下图所示。
> 教师模型与学生模型的模型大小差异不宜过大,否则反而会影响蒸馏结果的精度。 > 教师模型与学生模型的模型大小差异不宜过大,否则反而会影响蒸馏结果的精度。
因此最终在蒸馏实验中,对于ResNet系列学生模型,我们使用 `ResNeXt101_32x16d_wsl` 作为教师模型;对于 MobileNet 系列学生模型,我们使用蒸馏得到的 `ResNet50_vd` 作为教师模型。 因此最终在蒸馏实验中,对于 ResNet 系列学生模型,我们使用 `ResNeXt101_32x16d_wsl` 作为教师模型;对于 MobileNet 系列学生模型,我们使用蒸馏得到的 `ResNet50_vd` 作为教师模型。
<a name="3.2"></a> <a name="3.2"></a>
### 3.2 大数据蒸馏 ### 3.2 大数据蒸馏
...@@ -138,15 +137,15 @@ SSLD 的流程图如下图所示。 ...@@ -138,15 +137,15 @@ SSLD 的流程图如下图所示。
<a name="3.4"></a> <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% 。
* 对于图像分类任务,在测试的时候,测试尺度为训练尺度的 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> <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 。
|Teacher Model | Teacher Top1 | Student Model | Student Top1| |Teacher Model | Teacher Top1 | Student Model | Student Top1|
|- |:-: |:-: | :-: | |- |:-: |:-: | :-: |
...@@ -154,22 +153,22 @@ SSLD 的流程图如下图所示。 ...@@ -154,22 +153,22 @@ SSLD 的流程图如下图所示。
| 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"></a>
## 四、蒸馏模型的应用 ## 4. 蒸馏模型的应用
<a name="4.1"></a> <a name="4.1"></a>
### 4.1 使用方法 ### 4.1 使用方法
* 中间层学习率调整。蒸馏得到的模型的中间层特征图更加精细化,因此将蒸馏模型预训练应用到其他任务中时,如果采取和之前相同的学习率,容易破坏中间层特征。而如果降低整体模型训练的学习率,则会带来训练收敛速度慢的问题。因此我们使用了中间层学习率调整的策略。具体地: * 中间层学习率调整。蒸馏得到的模型的中间层特征图更加精细化,因此将蒸馏模型预训练应用到其他任务中时,如果采取和之前相同的学习率,容易破坏中间层特征。而如果降低整体模型训练的学习率,则会带来训练收敛速度慢的问题。因此我们使用了中间层学习率调整的策略。具体地:
* 针对 ResNet50_vd ,我们设置一个学习率倍数列表, res block 之前的 3 个 conv2d 卷积参数具有统一的学习率倍数, 4 个 res block 的 conv2d 分别有一个学习率参数,共需设置 5 个学习率倍数的超参。在实验中发现。用于迁移学习finetune分类模型时, `[0.1,0.1,0.2,0.2,0.3]` 的中间层学习率倍数设置在绝大多数的任务中都性能更好;而在目标检测任务中, `[0.05,0.05,0.05,0.1,0.15]` 的中间层学习率倍数设置能够带来更大的精度收益。 * 针对 ResNet50_vd,我们设置一个学习率倍数列表,res block 之前的 3 个 conv2d 卷积参数具有统一的学习率倍数,4 个 res block 的 conv2d 分别有一个学习率参数,共需设置 5 个学习率倍数的超参。在实验中发现。用于迁移学习 finetune 分类模型时,`[0.1,0.1,0.2,0.2,0.3]` 的中间层学习率倍数设置在绝大多数的任务中都性能更好;而在目标检测任务中,`[0.05,0.05,0.05,0.1,0.15]` 的中间层学习率倍数设置能够带来更大的精度收益。
* 对于 MoblileNetV3_large_x1_0 ,由于其包含 15 个 block ,我们设置每 3 个 block 共享一个学习率倍数参数,因此需要共 5 个学习率倍数的参数,最终发现在分类和检测任务中, `[0.25,0.25,0.5,0.5,0.75]` 的中间层学习率倍数能够带来更大的精度收益。 * 对于 MoblileNetV3_large_x1_0,由于其包含 15 个 block,我们设置每 3 个 block 共享一个学习率倍数参数,因此需要共 5 个学习率倍数的参数,最终发现在分类和检测任务中,`[0.25,0.25,0.5,0.5,0.75]` 的中间层学习率倍数能够带来更大的精度收益。
* 适当的 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> <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 和蒸馏模型的精度对比。
| Dataset | Model | Baseline Top1 Acc | Distillation Model Finetune | | Dataset | Model | Baseline Top1 Acc | Distillation Model Finetune |
...@@ -194,7 +193,7 @@ SSLD 的流程图如下图所示。 ...@@ -194,7 +193,7 @@ SSLD 的流程图如下图所示。
* ResNet50_vd * ResNet50_vd
设置训练与评测的尺度均为 640x640 ,最终 COCO 上检测指标如下。 设置训练与评测的尺度均为 640x640,最终 COCO 上检测指标如下。
| Model | train/test scale | pretrain top1 acc | feature map lr | coco mAP | | Model | train/test scale | pretrain top1 acc | feature map lr | coco mAP |
|- |:-: |:-: | :-: | :-: | |- |:-: |:-: | :-: | :-: |
...@@ -205,14 +204,14 @@ SSLD 的流程图如下图所示。 ...@@ -205,14 +204,14 @@ 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> <a name="5"></a>
## 五、SSLD实战 ## 5. SSLD 实战
本节将基于 ImageNet-1K 的数据集详细介绍 SSLD 蒸馏实验,如果想快速体验此方法,可以参考 [**30分钟玩转PaddleClas(进阶版)**](../quick_start/quick_start_classification_professional.md) 中基于 CIFAR100 的 SSLD 蒸馏实验。 本节将基于 ImageNet-1K 的数据集详细介绍 SSLD 蒸馏实验,如果想快速体验此方法,可以参考 [**30 分钟玩转 PaddleClas(进阶版)**](../quick_start/quick_start_classification_professional.md)中基于 CIFAR100 的 SSLD 蒸馏实验。
<a name="5.1"></a> <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` 里直接替换配置文件的路径即可使用。
```yaml ```yaml
Arch: Arch:
...@@ -235,7 +234,7 @@ Arch: ...@@ -235,7 +234,7 @@ Arch:
infer_model_name: "Student" infer_model_name: "Student"
``` ```
在参数配置中,`freeze_params_list` 中需要指定模型是否需要冻结参数, `models` 中需要指定 Teacher 模型和 Student 模型,其中 Teacher 模型需要加载预训练模型。用户可以直接在此处更改模型。 在参数配置中,`freeze_params_list` 中需要指定模型是否需要冻结参数,`models` 中需要指定 Teacher 模型和 Student 模型,其中 Teacher 模型需要加载预训练模型。用户可以直接在此处更改模型。
<a name="5.2"></a> <a name="5.2"></a>
### 5.2 启动命令 ### 5.2 启动命令
...@@ -271,7 +270,7 @@ sh tools/train.sh ...@@ -271,7 +270,7 @@ sh tools/train.sh
* 若用户准备添加无标签的训练数据,只需要将新的训练数据放置在原本训练数据的路径下,生成新的数据 list 即可,另外,新生成的数据 list 需要将无标签的数据添加伪标签(只是为了统一读数据)。 * 若用户准备添加无标签的训练数据,只需要将新的训练数据放置在原本训练数据的路径下,生成新的数据 list 即可,另外,新生成的数据 list 需要将无标签的数据添加伪标签(只是为了统一读数据)。
<a name="6"></a> <a name="6"></a>
## 六、参考文献 ## 6. 参考文献
[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.
......
...@@ -4,32 +4,34 @@ ...@@ -4,32 +4,34 @@
复杂的模型有利于提高模型的性能,但也导致模型中存在一定冗余。此部分提供精简模型的功能,包括两部分:模型量化(量化训练、离线量化)、模型剪枝。 复杂的模型有利于提高模型的性能,但也导致模型中存在一定冗余。此部分提供精简模型的功能,包括两部分:模型量化(量化训练、离线量化)、模型剪枝。
其中模型量化将全精度缩减到定点数减少这种冗余,达到减少模型计算复杂度,提高模型推理性能的目的。 其中模型量化将全精度缩减到定点数减少这种冗余,达到减少模型计算复杂度,提高模型推理性能的目的。
模型量化可以在基本不损失模型的精度的情况下,将FP32精度的模型参数转换为Int8精度,减小模型参数大小并加速计算,使用量化后的模型在移动端等部署时更具备速度优势。 模型量化可以在基本不损失模型的精度的情况下,将 FP32 精度的模型参数转换为 Int8 精度,减小模型参数大小并加速计算,使用量化后的模型在移动端等部署时更具备速度优势。
模型剪枝将CNN中不重要的卷积核裁剪掉,减少模型参数量,从而降低模型计算复杂度。 模型剪枝将 CNN 中不重要的卷积核裁剪掉,减少模型参数量,从而降低模型计算复杂度。
本教程将介绍如何使用飞桨模型压缩库PaddleSlim做PaddleClas模型的压缩,即裁剪、量化功能。 本教程将介绍如何使用飞桨模型压缩库 PaddleSlim 做 PaddleClas 模型的压缩,即裁剪、量化功能。
[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) 集成了模型剪枝、量化(包括量化训练和离线量化)、蒸馏和神经网络搜索等多种业界常用且领先的模型压缩功能,如果您感兴趣,可以关注并了解。 [PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim)集成了模型剪枝、量化(包括量化训练和离线量化)、蒸馏和神经网络搜索等多种业界常用且领先的模型压缩功能,如果您感兴趣,可以关注并了解。
在开始本教程之前,建议先了解[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)
- [1.1 安装PaddleSlim](#1.1) - [1.1 安装 PaddleSlim](#1.1)
- [1.2 准备训练好的模型](#1.2) - [1.2 准备训练好的模型](#1.2)
- [快速开始](#2) - [2. 快速开始](#2)
- [2.1 模型量化](#2.1) - [2.1 模型量化](#2.1)
- [2.1.1 在线量化训练](#2.1.1) - [2.1.1 在线量化训练](#2.1.1)
- [2.1.2 离线量化](#2.1.2) - [2.1.2 离线量化](#2.1.2)
- [2.2 模型剪枝](#2.2) - [2.2 模型剪枝](#2.2)
- [导出模型](#3) - [3. 导出模型](#3)
- [模型部署](#4) - [4. 模型部署](#4)
- [训练超参数建议](#5) - [5. 训练超参数建议](#5)
<a name="1"></a> <a name="1"></a>
## 一、准备环境 ## 1. 准备环境
当训练出一个模型后,如果希望进一步的压缩模型大小并加速预测,可使用量化或者剪枝的方法压缩模型。 当训练出一个模型后,如果希望进一步的压缩模型大小并加速预测,可使用量化或者剪枝的方法压缩模型。
模型压缩主要包括五个步骤: 模型压缩主要包括五个步骤:
...@@ -40,15 +42,15 @@ ...@@ -40,15 +42,15 @@
5. 量化模型预测部署 5. 量化模型预测部署
<a name="1.1"></a> <a name="1.1"></a>
### 1.1 安装PaddleSlim ### 1.1 安装 PaddleSlim
* 可以通过pip install的方式进行安装。 * 可以通过 pip install 的方式进行安装。
```bash ```bash
pip install paddleslim -i https://pypi.tuna.tsinghua.edu.cn/simple pip install paddleslim -i https://pypi.tuna.tsinghua.edu.cn/simple
``` ```
* 如果获取PaddleSlim的最新特性,可以从源码安装。 * 如果获取 PaddleSlim 的最新特性,可以从源码安装。
```bash ```bash
git clone https://github.com/PaddlePaddle/PaddleSlim.git git clone https://github.com/PaddlePaddle/PaddleSlim.git
...@@ -59,18 +61,18 @@ python3.7 setup.py install ...@@ -59,18 +61,18 @@ python3.7 setup.py install
<a name="1.2"></a> <a name="1.2"></a>
### 1.2 准备训练好的模型 ### 1.2 准备训练好的模型
PaddleClas提供了一系列训练好的[模型](../models/models_intro.md),如果待量化的模型不在列表中,需要按照[常规训练](../models_training/classification.md)方法得到训练好的模型。 PaddleClas 提供了一系列训练好的[模型](../models/models_intro.md),如果待量化的模型不在列表中,需要按照[常规训练](../models_training/classification.md)方法得到训练好的模型。
<a name="2"></a> <a name="2"></a>
## 二、 快速开始 ## 2. 快速开始
进入PaddleClas根目录 进入 PaddleClas 根目录
```bash ```bash
cd PaddleClas cd PaddleClas
``` ```
`slim`训练相关代码已经集成到`ppcls/engine/`下,离线量化代码位于`deploy/slim/quant_post_static.py` `slim` 训练相关代码已经集成到 `ppcls/engine/` 下,离线量化代码位于 `deploy/slim/quant_post_static.py`
<a name="2.1"></a> <a name="2.1"></a>
### 2.1 模型量化 ### 2.1 模型量化
...@@ -82,15 +84,15 @@ cd PaddleClas ...@@ -82,15 +84,15 @@ cd PaddleClas
训练指令如下: 训练指令如下:
* CPU/单卡GPU * CPU/单卡 GPU
CPU为例,若使用GPU,则将命令中改成`cpu`改成`gpu` CPU 为例,若使用 GPU,则将命令中改成 `cpu` 改成 `gpu`
```bash ```bash
python3.7 tools/train.py -c ppcls/configs/slim/ResNet50_vd_quantization.yaml -o Global.device=cpu python3.7 tools/train.py -c ppcls/configs/slim/ResNet50_vd_quantization.yaml -o Global.device=cpu
``` ```
其中`yaml`文件解析详见[参考文档](../models_training/config_description.md)。为了保证精度,`yaml`文件中已经使用`pretrained model`. 其中 `yaml` 文件解析详见[参考文档](../models_training/config_description.md)。为了保证精度,`yaml` 文件中已经使用 `pretrained model`.
* 单机多卡/多机多卡启动 * 单机多卡/多机多卡启动
...@@ -106,28 +108,28 @@ python3.7 -m paddle.distributed.launch \ ...@@ -106,28 +108,28 @@ python3.7 -m paddle.distributed.launch \
<a name="2.1.2"></a> <a name="2.1.2"></a>
#### 2.1.2 离线量化 #### 2.1.2 离线量化
**注意**:目前离线量化,必须使用已经训练好的模型,导出的`inference model`进行量化。一般模型导出`inference model`可参考[教程](../inference_deployment/export_model.md). **注意**:目前离线量化,必须使用已经训练好的模型,导出的 `inference model` 进行量化。一般模型导出 `inference model` 可参考[教程](../inference_deployment/export_model.md).
一般来说,离线量化损失模型精度较多。 一般来说,离线量化损失模型精度较多。
生成`inference model`后,离线量化运行方式如下 生成 `inference model` 后,离线量化运行方式如下
```bash ```bash
python3.7 deploy/slim/quant_post_static.py -c ppcls/configs/ImageNet/ResNet/ResNet50_vd.yaml -o Global.save_inference_dir=./deploy/models/class_ResNet50_vd_ImageNet_infer python3.7 deploy/slim/quant_post_static.py -c ppcls/configs/ImageNet/ResNet/ResNet50_vd.yaml -o Global.save_inference_dir=./deploy/models/class_ResNet50_vd_ImageNet_infer
``` ```
`Global.save_inference_dir``inference model`存放的目录。 `Global.save_inference_dir``inference model` 存放的目录。
执行成功后,在`Global.save_inference_dir`的目录下,生成`quant_post_static_model`文件夹,其中存储生成的离线量化模型,其可以直接进行预测部署,无需再重新导出模型。 执行成功后,在 `Global.save_inference_dir` 的目录下,生成 `quant_post_static_model` 文件夹,其中存储生成的离线量化模型,其可以直接进行预测部署,无需再重新导出模型。
<a name="2.2"></a> <a name="2.2"></a>
### 2.2 模型剪枝 ### 2.2 模型剪枝
训练指令如下: 训练指令如下:
- CPU/单卡GPU - CPU/单卡 GPU
CPU为例,若使用GPU,则将命令中改成`cpu`改成`gpu` CPU 为例,若使用 GPU,则将命令中改成 `cpu` 改成 `gpu`
```bash ```bash
python3.7 tools/train.py -c ppcls/configs/slim/ResNet50_vd_prune.yaml -o Global.device=cpu python3.7 tools/train.py -c ppcls/configs/slim/ResNet50_vd_prune.yaml -o Global.device=cpu
...@@ -144,9 +146,9 @@ python3.7 -m paddle.distributed.launch \ ...@@ -144,9 +146,9 @@ python3.7 -m paddle.distributed.launch \
``` ```
<a name="3"></a> <a name="3"></a>
## 三、导出模型 ## 3. 导出模型
在得到在线量化训练、模型剪枝保存的模型后,可以将其导出为inference model,用于预测部署,以模型剪枝为例: 在得到在线量化训练、模型剪枝保存的模型后,可以将其导出为 inference model,用于预测部署,以模型剪枝为例:
```bash ```bash
python3.7 tools/export.py \ python3.7 tools/export.py \
...@@ -156,16 +158,16 @@ python3.7 tools/export.py \ ...@@ -156,16 +158,16 @@ python3.7 tools/export.py \
``` ```
<a name="4"></a> <a name="4"></a>
## 四、模型部署 ## 4. 模型部署
上述步骤导出的模型可以直接使用inferecne进行部署,参考[inference部署](../inference_deployment/) 上述步骤导出的模型可以直接使用 inferecne 进行部署,参考 [inference 部署](../inference_deployment/)
也通过PaddleLite的opt模型转换工具,完成inference模型到移动端模型转换,用于移动端的模型部署。 也通过 PaddleLite 的 opt 模型转换工具,完成 inference 模型到移动端模型转换,用于移动端的模型部署。
移动端模型部署的可参考 [移动端模型部署](../inference_deployment/paddle_lite_deploy.md) 移动端模型部署的可参考 [移动端模型部署](../inference_deployment/paddle_lite_deploy.md)
<a name="5"></a> <a name="5"></a>
## 五、训练超参数建议 ## 5. 训练超参数建议
* 量化、裁剪训练时,建议加载常规训练得到的预训练模型,加速量化训练收敛。 * 量化、裁剪训练时,建议加载常规训练得到的预训练模型,加速量化训练收敛。
* 量化训练时,建议初始学习率修改为常规训练的`1/20~1/10`,同时将训练epoch数修改为常规训练的`1/5~1/2`,学习率策略方面,加上Warmup,其他配置信息不建议修改。 * 量化训练时,建议初始学习率修改为常规训练的 `1/20~1/10`,同时将训练 epoch 数修改为常规训练的 `1/5~1/2`,学习率策略方面,加上 Warmup,其他配置信息不建议修改。
* 裁剪训练时,建议超参数配置与普通训练一致。 * 裁剪训练时,建议超参数配置与普通训练一致。
# 一、数据增强 ## 目录
在图像分类任务中,图像数据的增广是一种常用的正则化方法,常用于数据量不足或者模型参数较多的场景。在本章节中,我们将对除 ImageNet 分类任务标准数据增强外的8种数据增强方式进行简单的介绍和对比,用户也可以将这些增广方法应用到自己的任务中,以获得模型精度的提升。这8种数据增强方式在ImageNet上的精度指标如下所示。 - [1. 数据增强](#1)
- [2. 常用数据增强方法](#2)
- [3. 图像变换类](#3)
- [3.1 AutoAugment](#3.1)
- [3.2 RandAugment](#3.2)
- [3.3 TimmAutoAugment](#3.3)
- [4. 图像裁剪类](#4)
- [4.1 Cutout](#4.1)
- [4.2 RandomErasing](#4.2)
- [4.3 HideAndSeek](#4.3)
- [4.4 GridMask](#4.4)
- [5. 图像混叠](#5)
- [5.1 Mixup](#5.1)
- [5.2 Cutmix](#5.2)
<a name="1"></a>
## 1. 数据增强
在图像分类任务中,图像数据的增广是一种常用的正则化方法,常用于数据量不足或者模型参数较多的场景。在本章节中,我们将对除 ImageNet 分类任务标准数据增强外的 8 种数据增强方式进行简单的介绍和对比,用户也可以将这些增广方法应用到自己的任务中,以获得模型精度的提升。这 8 种数据增强方式在 ImageNet 上的精度指标如下所示。
![](../../images/image_aug/main_image_aug.png) ![](../../images/image_aug/main_image_aug.png)
<a name="2"></a>
# 二、常用数据增强方法 ## 2. 常用数据增强方法
如果没有特殊说明,本章节中所有示例为 ImageNet 分类,并且假设最终输入网络的数据维度为:`[batch-size, 3, 224, 224]` 如果没有特殊说明,本章节中所有示例为 ImageNet 分类,并且假设最终输入网络的数据维度为:`[batch-size, 3, 224, 224]`
...@@ -20,7 +38,7 @@ ...@@ -20,7 +38,7 @@
相比于上述标准的图像增广方法,研究者也提出了很多改进的图像增广策略,这些策略均是在标准增广方法的不同阶段插入一定的操作,基于这些策略操作所处的不同阶段,我们将其分为了三类: 相比于上述标准的图像增广方法,研究者也提出了很多改进的图像增广策略,这些策略均是在标准增广方法的不同阶段插入一定的操作,基于这些策略操作所处的不同阶段,我们将其分为了三类:
1.`RandCrop` 后的 224 的图像进行一些变换: AutoAugment,RandAugment 1.`RandCrop` 后的 224 的图像进行一些变换: AutoAugment,RandAugment
2.`Transpose` 后的 224 的图像进行一些裁剪: CutOut,RandErasing,HideAndSeek,GridMask 2. `Transpose` 后的 224 的图像进行一些裁剪: CutOut,RandErasing,HideAndSeek,GridMask
3.`Batch` 后的数据进行混合: Mixup,Cutmix 3.`Batch` 后的数据进行混合: Mixup,Cutmix
增广后的可视化效果如下所示。 增广后的可视化效果如下所示。
...@@ -43,35 +61,35 @@ ...@@ -43,35 +61,35 @@
| **Process** | (N, 3, 224, 224)<br>float32 | (N, 3, 224, 224)<br>float32 | \- | \- | \- | \- | \- | \- | Y | Y | | **Process** | (N, 3, 224, 224)<br>float32 | (N, 3, 224, 224)<br>float32 | \- | \- | \- | \- | \- | \- | Y | Y |
PaddleClas中集成了上述所有的数据增强策略,每种数据增强策略的参考论文与参考开源代码均在下面的介绍中列出。下文将介绍这些策略的原理与使用方法,并以下图为例,对变换后的效果进行可视化。为了说明问题,本章节中将 `RandCrop` 替换为 `Resize` PaddleClas 中集成了上述所有的数据增强策略,每种数据增强策略的参考论文与参考开源代码均在下面的介绍中列出。下文将介绍这些策略的原理与使用方法,并以下图为例,对变换后的效果进行可视化。为了说明问题,本章节中将 `RandCrop` 替换为 `Resize`
![][test_baseline] ![][test_baseline]
<a name="3"></a>
# 三、图像变换类 ## 3. 图像变换类
图像变换类指的是对 `RandCrop` 后的 224 的图像进行一些变换,主要包括 图像变换类指的是对 `RandCrop` 后的 224 的图像进行一些变换,主要包括
+ AutoAugment + AutoAugment
+ RandAugment + RandAugment
+ TimmAutoAugment + TimmAutoAugment
<a name="3.1"></a>
## 3.1 AutoAugment ### 3.1 AutoAugment
论文地址:[https://arxiv.org/abs/1805.09501v1](https://arxiv.org/abs/1805.09501v1) 论文地址:[https://arxiv.org/abs/1805.09501v1](https://arxiv.org/abs/1805.09501v1)
开源代码github地址:[https://github.com/DeepVoltaire/AutoAugment](https://github.com/DeepVoltaire/AutoAugment) 开源代码 github 地址:[https://github.com/DeepVoltaire/AutoAugment](https://github.com/DeepVoltaire/AutoAugment)
不同于常规的人工设计图像增广方式,AutoAugment 是在一系列图像增广子策略的搜索空间中通过搜索算法找到的适合特定数据集的图像增广方案。针对 ImageNet 数据集,最终搜索出来的数据增强方案包含 25 个子策略组合,每个子策略中都包含两种变换,针对每幅图像都随机的挑选一个子策略组合,然后以一定的概率来决定是否执行子策略中的每种变换。 不同于常规的人工设计图像增广方式,AutoAugment 是在一系列图像增广子策略的搜索空间中通过搜索算法找到的适合特定数据集的图像增广方案。针对 ImageNet 数据集,最终搜索出来的数据增强方案包含 25 个子策略组合,每个子策略中都包含两种变换,针对每幅图像都随机的挑选一个子策略组合,然后以一定的概率来决定是否执行子策略中的每种变换。
经过AutoAugment数据增强后结果如下图所示。 经过 AutoAugment 数据增强后结果如下图所示。
![][test_autoaugment] ![][test_autoaugment]
<a name="3.2"></a>
## 3.2 RandAugment ### 3.2 RandAugment
论文地址:[https://arxiv.org/pdf/1909.13719.pdf](https://arxiv.org/pdf/1909.13719.pdf) 论文地址:[https://arxiv.org/pdf/1909.13719.pdf](https://arxiv.org/pdf/1909.13719.pdf)
开源代码github地址:[https://github.com/heartInsert/randaugment](https://github.com/heartInsert/randaugment) 开源代码 github 地址:[https://github.com/heartInsert/randaugment](https://github.com/heartInsert/randaugment)
`AutoAugment` 的搜索方法比较暴力,直接在数据集上搜索针对该数据集的最优策略,其计算量很大。在 `RandAugment` 文章中作者发现,一方面,针对越大的模型,越大的数据集,使用 `AutoAugment` 方式搜索到的增广方式产生的收益也就越小;另一方面,这种搜索出的最优策略是针对该数据集的,其迁移能力较差,并不太适合迁移到其他数据集上。 `AutoAugment` 的搜索方法比较暴力,直接在数据集上搜索针对该数据集的最优策略,其计算量很大。在 `RandAugment` 文章中作者发现,一方面,针对越大的模型,越大的数据集,使用 `AutoAugment` 方式搜索到的增广方式产生的收益也就越小;另一方面,这种搜索出的最优策略是针对该数据集的,其迁移能力较差,并不太适合迁移到其他数据集上。
...@@ -79,84 +97,84 @@ PaddleClas中集成了上述所有的数据增强策略,每种数据增强策 ...@@ -79,84 +97,84 @@ PaddleClas中集成了上述所有的数据增强策略,每种数据增强策
`RandAugment` 中,作者提出了一种随机增广的方式,不再像 `AutoAugment` 中那样使用特定的概率确定是否使用某种子策略,而是所有的子策略都会以同样的概率被选择到,论文中的实验也表明这种数据增强方式即使在大模型的训练中也具有很好的效果。 `RandAugment` 中,作者提出了一种随机增广的方式,不再像 `AutoAugment` 中那样使用特定的概率确定是否使用某种子策略,而是所有的子策略都会以同样的概率被选择到,论文中的实验也表明这种数据增强方式即使在大模型的训练中也具有很好的效果。
经过RandAugment数据增强后结果如下图所示。 经过 RandAugment 数据增强后结果如下图所示。
![][test_randaugment] ![][test_randaugment]
<a name="3.3"></a>
### 3.3 TimmAutoAugment
## 3.3 TimmAutoAugment 开源代码 github 地址:[https://github.com/rwightman/pytorch-image-models/blob/master/timm/data/auto_augment.py](https://github.com/rwightman/pytorch-image-models/blob/master/timm/data/auto_augment.py)
开源代码github地址:[https://github.com/rwightman/pytorch-image-models/blob/master/timm/data/auto_augment.py](https://github.com/rwightman/pytorch-image-models/blob/master/timm/data/auto_augment.py)
`TimmAutoAugment`是开源作者对AutoAugment和RandAugment的改进,事实证明,其在很多视觉任务上有更好的表现,目前绝大多数VisionTransformer模型都是基于TimmAutoAugment去实现的。
`TimmAutoAugment` 是开源作者对 AutoAugment 和 RandAugment 的改进,事实证明,其在很多视觉任务上有更好的表现,目前绝大多数 VisionTransformer 模型都是基于 TimmAutoAugment 去实现的。
# 四、图像裁剪类 <a name="4"></a>
## 4. 图像裁剪类
图像裁剪类主要是对`Transpose` 后的 224 的图像进行一些裁剪,并将裁剪区域的像素值置为特定的常数(默认为0),主要包括: 图像裁剪类主要是对 `Transpose` 后的 224 的图像进行一些裁剪,并将裁剪区域的像素值置为特定的常数(默认为 0),主要包括:
+ CutOut + CutOut
+ RandErasing + RandErasing
+ HideAndSeek + HideAndSeek
+ GridMask + GridMask
图像裁剪的这些增广并非一定要放在归一化之后,也有不少实现是放在归一化之前的,也就是直接对 uint8 的图像进行操作,两种方式的差别是:如果直接对 uint8 的图像进行操作,那么再经过归一化之后被裁剪的区域将不再是纯黑或纯白(减均值除方差之后像素值不为0)。而对归一后之后的数据进行操作,裁剪的区域会是纯黑或纯白。 图像裁剪的这些增广并非一定要放在归一化之后,也有不少实现是放在归一化之前的,也就是直接对 uint8 的图像进行操作,两种方式的差别是:如果直接对 uint8 的图像进行操作,那么再经过归一化之后被裁剪的区域将不再是纯黑或纯白(减均值除方差之后像素值不为 0)。而对归一后之后的数据进行操作,裁剪的区域会是纯黑或纯白。
上述的裁剪变换思路是相同的,都是为了解决训练出的模型在有遮挡数据上泛化能力较差的问题,不同的是他们的裁剪方式、区域不太一样。 上述的裁剪变换思路是相同的,都是为了解决训练出的模型在有遮挡数据上泛化能力较差的问题,不同的是他们的裁剪方式、区域不太一样。
<a name="4.1"></a>
## 4.1 Cutout ### 4.1 Cutout
论文地址:[https://arxiv.org/abs/1708.04552](https://arxiv.org/abs/1708.04552) 论文地址:[https://arxiv.org/abs/1708.04552](https://arxiv.org/abs/1708.04552)
开源代码github地址:[https://github.com/uoguelph-mlrg/Cutout](https://github.com/uoguelph-mlrg/Cutout) 开源代码 github 地址:[https://github.com/uoguelph-mlrg/Cutout](https://github.com/uoguelph-mlrg/Cutout)
Cutout 可以理解为 Dropout 的一种扩展操作,不同的是 Dropout 是对图像经过网络后生成的特征进行遮挡,而 Cutout 是直接对输入的图像进行遮挡,相对于Dropout对噪声的鲁棒性更好。作者在论文中也进行了说明,这样做法有以下两点优势:(1) 通过 Cutout 可以模拟真实场景中主体被部分遮挡时的分类场景;(2) 可以促进模型充分利用图像中更多的内容来进行分类,防止网络只关注显著性的图像区域,从而发生过拟合。 Cutout 可以理解为 Dropout 的一种扩展操作,不同的是 Dropout 是对图像经过网络后生成的特征进行遮挡,而 Cutout 是直接对输入的图像进行遮挡,相对于 Dropout 对噪声的鲁棒性更好。作者在论文中也进行了说明,这样做法有以下两点优势:(1)通过 Cutout 可以模拟真实场景中主体被部分遮挡时的分类场景;(2)可以促进模型充分利用图像中更多的内容来进行分类,防止网络只关注显著性的图像区域,从而发生过拟合。
经过RandAugment数据增强后结果如下图所示。 经过 RandAugment 数据增强后结果如下图所示。
![][test_cutout] ![][test_cutout]
<a name="4.2"></a>
## 4.2 RandomErasing ### 4.2 RandomErasing
论文地址:[https://arxiv.org/pdf/1708.04896.pdf](https://arxiv.org/pdf/1708.04896.pdf) 论文地址:[https://arxiv.org/pdf/1708.04896.pdf](https://arxiv.org/pdf/1708.04896.pdf)
开源代码github地址:[https://github.com/zhunzhong07/Random-Erasing](https://github.com/zhunzhong07/Random-Erasing) 开源代码 github 地址:[https://github.com/zhunzhong07/Random-Erasing](https://github.com/zhunzhong07/Random-Erasing)
`RandomErasing``Cutout` 方法类似,同样是为了解决训练出的模型在有遮挡数据上泛化能力较差的问题,作者在论文中也指出,随机裁剪的方式与随机水平翻转具有一定的互补性。作者也在行人再识别(REID)上验证了该方法的有效性。与`Cutout`不同的是,在`RandomErasing`中,图片以一定的概率接受该种预处理方法,生成掩码的尺寸大小与长宽比也是根据预设的超参数随机生成。 `RandomErasing``Cutout` 方法类似,同样是为了解决训练出的模型在有遮挡数据上泛化能力较差的问题,作者在论文中也指出,随机裁剪的方式与随机水平翻转具有一定的互补性。作者也在行人再识别(REID)上验证了该方法的有效性。与 `Cutout` 不同的是,在 `RandomErasing` 中,图片以一定的概率接受该种预处理方法,生成掩码的尺寸大小与长宽比也是根据预设的超参数随机生成。
PaddleClas`RandomErasing`的使用方法如下所示。 PaddleClas`RandomErasing` 的使用方法如下所示。
经过RandomErasing数据增强后结果如下图所示。 经过 RandomErasing 数据增强后结果如下图所示。
![][test_randomerassing] ![][test_randomerassing]
<a name="4.3"></a>
## 4.3 HideAndSeek ### 4.3 HideAndSeek
论文地址:[https://arxiv.org/pdf/1811.02545.pdf](https://arxiv.org/pdf/1811.02545.pdf) 论文地址:[https://arxiv.org/pdf/1811.02545.pdf](https://arxiv.org/pdf/1811.02545.pdf)
开源代码github地址:[https://github.com/kkanshul/Hide-and-Seek](https://github.com/kkanshul/Hide-and-Seek) 开源代码 github 地址:[https://github.com/kkanshul/Hide-and-Seek](https://github.com/kkanshul/Hide-and-Seek)
`HideAndSeek`论文将图像分为若干块区域(patch),对于每块区域,都以一定的概率生成掩码,不同区域的掩码含义如下图所示。 `HideAndSeek` 论文将图像分为若干块区域(patch),对于每块区域,都以一定的概率生成掩码,不同区域的掩码含义如下图所示。
![][hide_and_seek_mask_expanation] ![][hide_and_seek_mask_expanation]
PaddleClas`HideAndSeek`的使用方法如下所示。 PaddleClas`HideAndSeek` 的使用方法如下所示。
经过HideAndSeek数据增强后结果如下图所示。 经过 HideAndSeek 数据增强后结果如下图所示。
![][test_hideandseek] ![][test_hideandseek]
<a name="4.4"></a>
## 4.4 GridMask ### 4.4 GridMask
论文地址:[https://arxiv.org/abs/2001.04086](https://arxiv.org/abs/2001.04086) 论文地址:[https://arxiv.org/abs/2001.04086](https://arxiv.org/abs/2001.04086)
开源代码github地址:[https://github.com/akuxcw/GridMask](https://github.com/akuxcw/GridMask) 开源代码 github 地址:[https://github.com/akuxcw/GridMask](https://github.com/akuxcw/GridMask)
作者在论文中指出,此前存在的基于对图像 crop 的方法存在两个问题,如下图所示: 作者在论文中指出,此前存在的基于对图像 crop 的方法存在两个问题,如下图所示:
...@@ -169,21 +187,21 @@ PaddleClas中`HideAndSeek`的使用方法如下所示。 ...@@ -169,21 +187,21 @@ PaddleClas中`HideAndSeek`的使用方法如下所示。
因此如果避免过度删除或过度保留成为需要解决的核心问题。 因此如果避免过度删除或过度保留成为需要解决的核心问题。
`GridMask`是通过生成一个与原图分辨率相同的掩码,并将掩码进行随机翻转,与原图相乘,从而得到增广后的图像,通过超参数控制生成的掩码网格的大小。 `GridMask` 是通过生成一个与原图分辨率相同的掩码,并将掩码进行随机翻转,与原图相乘,从而得到增广后的图像,通过超参数控制生成的掩码网格的大小。
在训练过程中,有两种以下使用方法: 在训练过程中,有两种以下使用方法:
1. 设置一个概率p,从训练开始就对图片以概率p使用`GridMask`进行增广。 1. 设置一个概率 p,从训练开始就对图片以概率 p 使用 `GridMask` 进行增广。
2. 一开始设置增广概率为0,随着迭代轮数增加,对训练图片进行`GridMask`增广的概率逐渐增大,最后变为p。 2. 一开始设置增广概率为 0,随着迭代轮数增加,对训练图片进行 `GridMask` 增广的概率逐渐增大,最后变为 p。
论文中验证上述第二种方法的训练效果更好一些。 论文中验证上述第二种方法的训练效果更好一些。
经过GridMask数据增强后结果如下图所示。 经过 GridMask 数据增强后结果如下图所示。
![][test_gridmask] ![][test_gridmask]
<a name="5"></a>
# 五、图像混叠 ## 5. 图像混叠
图像混叠主要对 `Batch` 后的数据进行混合,包括: 图像混叠主要对 `Batch` 后的数据进行混合,包括:
...@@ -191,38 +209,38 @@ PaddleClas中`HideAndSeek`的使用方法如下所示。 ...@@ -191,38 +209,38 @@ PaddleClas中`HideAndSeek`的使用方法如下所示。
+ Cutmix + Cutmix
前文所述的图像变换与图像裁剪都是针对单幅图像进行的操作,而图像混叠是对两幅图像进行融合,生成一幅图像,两种方法的主要区别为混叠的方式不太一样。 前文所述的图像变换与图像裁剪都是针对单幅图像进行的操作,而图像混叠是对两幅图像进行融合,生成一幅图像,两种方法的主要区别为混叠的方式不太一样。
<a name="5.1"></a>
## 5.1 Mixup ### 5.1 Mixup
论文地址:[https://arxiv.org/pdf/1710.09412.pdf](https://arxiv.org/pdf/1710.09412.pdf) 论文地址:[https://arxiv.org/pdf/1710.09412.pdf](https://arxiv.org/pdf/1710.09412.pdf)
开源代码github地址:[https://github.com/facebookresearch/mixup-cifar10](https://github.com/facebookresearch/mixup-cifar10) 开源代码 github 地址:[https://github.com/facebookresearch/mixup-cifar10](https://github.com/facebookresearch/mixup-cifar10)
Mixup 是最先提出的图像混叠增广方案,其原理简单、方便实现,不仅在图像分类上,在目标检测上也取得了不错的效果。为了便于实现,通常只对一个 batch 内的数据进行混叠,在 `Cutmix` 中也是如此。 Mixup 是最先提出的图像混叠增广方案,其原理简单、方便实现,不仅在图像分类上,在目标检测上也取得了不错的效果。为了便于实现,通常只对一个 batch 内的数据进行混叠,在 `Cutmix` 中也是如此。
如下是 `imaug` 中的实现,需要指出的是,下述实现会出现对同一幅进行相加的情况,也就是最终得到的图和原图一样,随着 `batch-size` 的增加这种情况出现的概率也会逐渐减小。 如下是 `imaug` 中的实现,需要指出的是,下述实现会出现对同一幅进行相加的情况,也就是最终得到的图和原图一样,随着 `batch-size` 的增加这种情况出现的概率也会逐渐减小。
经过Mixup数据增强结果如下图所示。 经过 Mixup 数据增强结果如下图所示。
![][test_mixup] ![][test_mixup]
<a name="5.2"></a>
## 5.2 Cutmix ### 5.2 Cutmix
论文地址:[https://arxiv.org/pdf/1905.04899v2.pdf](https://arxiv.org/pdf/1905.04899v2.pdf) 论文地址:[https://arxiv.org/pdf/1905.04899v2.pdf](https://arxiv.org/pdf/1905.04899v2.pdf)
开源代码github地址:[https://github.com/clovaai/CutMix-PyTorch](https://github.com/clovaai/CutMix-PyTorch) 开源代码 github 地址:[https://github.com/clovaai/CutMix-PyTorch](https://github.com/clovaai/CutMix-PyTorch)
`Mixup` 直接对两幅图进行相加不一样,`Cutmix` 是从一幅图中随机裁剪出一个 `ROI`,然后覆盖当前图像中对应的区域,代码实现如下所示: `Mixup` 直接对两幅图进行相加不一样,`Cutmix` 是从一幅图中随机裁剪出一个 `ROI`,然后覆盖当前图像中对应的区域,代码实现如下所示:
经过Cutmix数据增强后结果如下图所示。 经过 Cutmix 数据增强后结果如下图所示。
![][test_cutmix] ![][test_cutmix]
关于数据增强相关的实战部分实参考[数据增强实战](../advanced_tutorials/DataAugmentation.md) 关于数据增强相关的实战部分实参考[数据增强实战](../advanced_tutorials/DataAugmentation.md)
# 参考文献 ## 参考文献
[1] Cubuk E D, Zoph B, Mane D, et al. Autoaugment: Learning augmentation strategies from data[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2019: 113-123. [1] Cubuk E D, Zoph B, Mane D, et al. Autoaugment: Learning augmentation strategies from data[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2019: 113-123.
......
<!-- 简体中文 | [English](../../en/algorithm_introduction/ImageNet_models.md) --> <!-- 简体中文 | [English](../../en/algorithm_introduction/ImageNet_models.md) -->
## ImageNet预训练模型库 # ImageNet 预训练模型库
### 目录 ## 目录
- [模型库概览图](#模型库概览图) - [1. 模型库概览图](#1)
- [SSLD知识蒸馏预训练模型](#模型库概览图) - [2. SSLD 知识蒸馏预训练模型](#2)
- [服务器端知识蒸馏模型](#服务器端知识蒸馏模型) - [2.1 服务器端知识蒸馏模型](#2.1)
- [移动端知识蒸馏模型](#移动端知识蒸馏模型) - [2.2 移动端知识蒸馏模型](#2.2)
- [Intel CPU端知识蒸馏模型](#Intel-CPU端知识蒸馏模型) - [2.3 Intel CPU 端知识蒸馏模型](#2.3)
- [PP-LCNet系列](#PP-LCNet系列) - [3. PP-LCNet 系列](#3)
- [ResNet系列](#ResNet系列) - [4. ResNet 系列](#4)
- [移动端系列](#移动端系列) - [5. 移动端系列](#5)
- [SEResNeXt与Res2Net系列](#SEResNeXt与Res2Net系列) - [6. SEResNeXt 与 Res2Net 系列](#6)
- [DPN与DenseNet系列](#DPN与DenseNet系列) - [7. DPN 与 DenseNet 系列](#7)
- [HRNet系列](#HRNet系列) - [8. HRNet 系列](#8)
- [Inception系列](#Inception系列) - [9. Inception 系列](#9)
- [EfficientNet与ResNeXt101_wsl系列](#EfficientNet与ResNeXt101_wsl系列) - [10. EfficientNet 与 ResNeXt101_wsl 系列](#10)
- [ResNeSt与RegNet系列](#ResNeSt与RegNet系列) - [11. ResNeSt 与 RegNet 系列](#11)
- [ViT_and_DeiT系列](#ViT_and_DeiT系列) - [12. ViT_and_DeiT 系列](#12)
- [RepVGG系列](#RepVGG系列) - [13. RepVGG 系列](#13)
- [MixNet系列](#MixNet系列) - [14. MixNet 系列](#14)
- [SwinTransformer系列](#SwinTransformer系列) - [15. ReXNet 系列](#15)
- [LeViT系列](#LeViT系列) - [16. SwinTransformer 系列](#16)
- [HarDNet系列](#HarDNet系列) - [17. LeViT 系列](#17)
- [DLA系列](#DLA系列) - [18. Twins 系列](#18)
- [RedNet系列](#RedNet系列) - [19. HarDNet 系列](#19)
- [TNT系列](#TNT系列) - [20. DLA 系列](#20)
- [其他模型](#其他模型) - [21. RedNet 系列](#21)
- [22. TNT 系列](#22)
- [23. 其他模型](#23)
<a name="模型库概览图"></a>
### 模型库概览图 <a name="1"></a>
基于ImageNet1k分类数据集,PaddleClas支持36个系列分类网络结构以及对应的175个图像分类预训练模型,训练技巧、每个系列网络结构的简单介绍和性能评估将在相应章节展现,下面所有的速度指标评估环境如下: ## 1. 模型库概览图
* Arm CPU的评估环境基于骁龙855(SD855)。
* Intel CPU的评估环境基于Intel(R) Xeon(R) Gold 6148。 基于 ImageNet1k 分类数据集,PaddleClas 支持 37 个系列分类网络结构以及对应的 217 个图像分类预训练模型,训练技巧、每个系列网络结构的简单介绍和性能评估将在相应章节展现,下面所有的速度指标评估环境如下:
* GPU评估环境基于T4机器,在FP32+TensorRT配置下运行500次测得(去除前10次的warmup时间)。 * Arm CPU 的评估环境基于骁龙 855(SD855)。
* Intel CPU 的评估环境基于 Intel(R) Xeon(R) Gold 6148。
* GPU 评估环境基于 T4 机器,在 FP32+TensorRT 配置下运行 500 次测得(去除前 10 次的 warmup 时间)。
* FLOPs 与 Params 通过 `paddle.flops()` 计算得到(PaddlePaddle 版本为 2.2)
常见服务器端模型的精度指标与其预测耗时的变化曲线如下图所示。 常见服务器端模型的精度指标与其预测耗时的变化曲线如下图所示。
...@@ -50,13 +53,14 @@ ...@@ -50,13 +53,14 @@
![](../../images/models/mobile_arm_top1.png) ![](../../images/models/mobile_arm_top1.png)
<a name="2"></a>
<a name="SSLD知识蒸馏系列"></a> ## 2. SSLD 知识蒸馏预训练模型
### SSLD知识蒸馏预训练模型 基于 SSLD 知识蒸馏的预训练模型列表如下所示,更多关于 SSLD 知识蒸馏方案的介绍可以参考:[SSLD 知识蒸馏文档](./knowledge_distillation.md)
基于SSLD知识蒸馏的预训练模型列表如下所示,更多关于SSLD知识蒸馏方案的介绍可以参考:[SSLD知识蒸馏文档](./knowledge_distillation.md)
<a name="服务器端知识蒸馏模型"></a> <a name="2.1"></a>
#### 服务器端知识蒸馏模型
### 2.1 服务器端知识蒸馏模型
| 模型 | 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) | 下载地址 |
|---------------------|-----------|-----------|---------------|----------------|-----------|----------|-----------|-----------------------------------| |---------------------|-----------|-----------|---------------|----------------|-----------|----------|-----------|-----------------------------------|
...@@ -70,8 +74,9 @@ ...@@ -70,8 +74,9 @@
| 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> <a name="2.2"></a>
#### 移动端知识蒸馏模型
### 2.2 移动端知识蒸馏模型
| 模型 | 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) | 下载地址 |
|---------------------|-----------|-----------|---------------|----------------|-----------|----------|-----------|-----------------------------------| |---------------------|-----------|-----------|---------------|----------------|-----------|----------|-----------|-----------------------------------|
...@@ -82,9 +87,9 @@ ...@@ -82,9 +87,9 @@
| 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="2.3"></a>
<a name="Intel-CPU端知识蒸馏模型"></a> ### 2.3 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) | 下载地址 |
|---------------------|-----------|-----------|---------------|----------------|----------|-----------|-----------------------------------| |---------------------|-----------|-----------|---------------|----------------|----------|-----------|-----------------------------------|
...@@ -95,12 +100,13 @@ ...@@ -95,12 +100,13 @@
* 注: `Reference Top-1 Acc`表示PaddleClas基于ImageNet1k数据集训练得到的预训练模型精度。 * 注: `Reference Top-1 Acc` 表示 PaddleClas 基于 ImageNet1k 数据集训练得到的预训练模型精度。
<a name="PP-LCNet系列"></a> <a name="3"></a>
### PP-LCNet系列
PP-LCNet系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[PP-LCNet系列模型文档](../models/PP-LCNet.md) ## 3. PP-LCNet 系列
PP-LCNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[PP-LCNet 系列模型文档](../models/PP-LCNet.md)
| 模型 | Top-1 Acc | Top-5 Acc | Intel-Xeon-Gold-6148 time(ms)<br>bs=1 | FLOPs(M) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | Intel-Xeon-Gold-6148 time(ms)<br>bs=1 | FLOPs(M) | Params(M) | 下载地址 |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -113,11 +119,11 @@ PP-LCNet系列模型的精度、速度指标如下表所示,更多关于该系 ...@@ -113,11 +119,11 @@ PP-LCNet系列模型的精度、速度指标如下表所示,更多关于该系
| PPLCNet_x2_0 |0.7518 | 0.9227 | 4.27 | 590 | 6.5 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x2_0_pretrained.pdparams) | | PPLCNet_x2_0 |0.7518 | 0.9227 | 4.27 | 590 | 6.5 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x2_0_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) | | 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="4"></a>
<a name="ResNet系列"></a> ## 4. ResNet 系列
### ResNet系列
ResNet及其Vd系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNet及其Vd系列模型文档](../models/ResNet_and_vd.md) ResNet 及其 Vd 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNet 及其 Vd 系列模型文档](../models/ResNet_and_vd.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
|---------------------|-----------|-----------|-----------------------|----------------------|----------|-----------|----------------------------------------------------------------------------------------------| |---------------------|-----------|-----------|-----------------------|----------------------|----------|-----------|----------------------------------------------------------------------------------------------|
...@@ -137,9 +143,9 @@ ResNet及其Vd系列模型的精度、速度指标如下表所示,更多关于 ...@@ -137,9 +143,9 @@ ResNet及其Vd系列模型的精度、速度指标如下表所示,更多关于
| ResNet50_vd_<br>ssld | 0.8300 | 0.9640 | 3.53131 | 8.09057 | 8.67 | 25.58 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/ResNet50_vd_ssld_pretrained.pdparams) | | ResNet50_vd_<br>ssld | 0.8300 | 0.9640 | 3.53131 | 8.09057 | 8.67 | 25.58 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/ResNet50_vd_ssld_pretrained.pdparams) |
| ResNet101_vd_<br>ssld | 0.8373 | 0.9669 | 6.11704 | 13.76222 | 16.1 | 44.57 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/ResNet101_vd_ssld_pretrained.pdparams) | | ResNet101_vd_<br>ssld | 0.8373 | 0.9669 | 6.11704 | 13.76222 | 16.1 | 44.57 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/ResNet101_vd_ssld_pretrained.pdparams) |
<a name="5"></a>
<a name="移动端系列"></a> ## 5. 移动端系列
### 移动端系列
移动端系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[移动端系列模型文档](../models/Mobile.md) 移动端系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[移动端系列模型文档](../models/Mobile.md)
...@@ -186,11 +192,11 @@ ResNet及其Vd系列模型的精度、速度指标如下表所示,更多关于 ...@@ -186,11 +192,11 @@ ResNet及其Vd系列模型的精度、速度指标如下表所示,更多关于
| ESNet_x0_75 | 72.24 | 90.45 || 0.124 | 3.87 | 15 |[下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/ESNet_x0_75_pretrained.pdparams) | | ESNet_x0_75 | 72.24 | 90.45 || 0.124 | 3.87 | 15 |[下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/ESNet_x0_75_pretrained.pdparams) |
| ESNet_x1_0 | 73.92 | 91.40 || 0.197 | 4.64 | 18 |[下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/ESNet_x1_0_pretrained.pdparams) | | ESNet_x1_0 | 73.92 | 91.40 || 0.197 | 4.64 | 18 |[下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/ESNet_x1_0_pretrained.pdparams) |
<a name="6"></a>
<a name="SEResNeXt与Res2Net系列"></a> ## 6. SEResNeXt 与 Res2Net 系列
### SEResNeXt与Res2Net系列
SEResNeXt与Res2Net系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[SEResNeXt与Res2Net系列模型文档](../models/SEResNext_and_Res2Net.md) SEResNeXt 与 Res2Net 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[SEResNeXt 与 Res2Net 系列模型文档](../models/SEResNext_and_Res2Net.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
...@@ -221,11 +227,11 @@ SEResNeXt与Res2Net系列模型的精度、速度指标如下表所示,更多 ...@@ -221,11 +227,11 @@ SEResNeXt与Res2Net系列模型的精度、速度指标如下表所示,更多
| SE_ResNeXt101_<br>32x4d | 0.7939 | 0.9443 | 18.82604 | 25.31814 | 15.02 | 46.28 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNeXt101_32x4d_pretrained.pdparams) | | SE_ResNeXt101_<br>32x4d | 0.7939 | 0.9443 | 18.82604 | 25.31814 | 15.02 | 46.28 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNeXt101_32x4d_pretrained.pdparams) |
| SENet154_vd | 0.8140 | 0.9548 | 53.79794 | 66.31684 | 45.83 | 114.29 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SENet154_vd_pretrained.pdparams) | | SENet154_vd | 0.8140 | 0.9548 | 53.79794 | 66.31684 | 45.83 | 114.29 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SENet154_vd_pretrained.pdparams) |
<a name="7"></a>
<a name="DPN与DenseNet系列"></a> ## 7. DPN 与 DenseNet 系列
### DPN与DenseNet系列
DPN与DenseNet系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[DPN与DenseNet系列模型文档](../models/DPN_DenseNet.md) DPN 与 DenseNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[DPN 与 DenseNet 系列模型文档](../models/DPN_DenseNet.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
...@@ -243,10 +249,11 @@ DPN与DenseNet系列模型的精度、速度指标如下表所示,更多关于 ...@@ -243,10 +249,11 @@ DPN与DenseNet系列模型的精度、速度指标如下表所示,更多关于
<a name="HRNet系列"></a> <a name="8"></a>
### HRNet系列
## 8. HRNet 系列
HRNet系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[HRNet系列模型文档](../models/HRNet.md) HRNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[HRNet 系列模型文档](../models/HRNet.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
...@@ -262,11 +269,11 @@ HRNet系列模型的精度、速度指标如下表所示,更多关于该系列 ...@@ -262,11 +269,11 @@ HRNet系列模型的精度、速度指标如下表所示,更多关于该系列
| HRNet_W64_C | 0.7930 | 0.9461 | 17.57527 | 47.9533 | 57.83 | 128.06 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/HRNet_W64_C_pretrained.pdparams) | | HRNet_W64_C | 0.7930 | 0.9461 | 17.57527 | 47.9533 | 57.83 | 128.06 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/HRNet_W64_C_pretrained.pdparams) |
| SE_HRNet_W64_C_ssld | 0.8475 | 0.9726 | 31.69770 | 94.99546 | 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.8475 | 0.9726 | 31.69770 | 94.99546 | 57.83 | 128.97 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/SE_HRNet_W64_C_ssld_pretrained.pdparams) |
<a name="9"></a>
<a name="Inception系列"></a> ## 9. Inception 系列
### Inception系列
Inception系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[Inception系列模型文档](../models/Inception.md) Inception 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[Inception 系列模型文档](../models/Inception.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
|--------------------|-----------|-----------|-----------------------|----------------------|----------|-----------|---------------------------------------------------------------------------------------------| |--------------------|-----------|-----------|-----------------------|----------------------|----------|-----------|---------------------------------------------------------------------------------------------|
...@@ -279,11 +286,11 @@ Inception系列模型的精度、速度指标如下表所示,更多关于该 ...@@ -279,11 +286,11 @@ Inception系列模型的精度、速度指标如下表所示,更多关于该
| InceptionV3 | 0.7914 | 0.9459 | 6.64054 | 13.53630 | 11.46 | 23.83 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/InceptionV3_pretrained.pdparams) | | InceptionV3 | 0.7914 | 0.9459 | 6.64054 | 13.53630 | 11.46 | 23.83 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/InceptionV3_pretrained.pdparams) |
| InceptionV4 | 0.8077 | 0.9526 | 12.99342 | 25.23416 | 24.57 | 42.68 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/InceptionV4_pretrained.pdparams) | | InceptionV4 | 0.8077 | 0.9526 | 12.99342 | 25.23416 | 24.57 | 42.68 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/InceptionV4_pretrained.pdparams) |
<a name="10"></a>
<a name="EfficientNet与ResNeXt101_wsl系列"></a> ## 10. EfficientNet 与 ResNeXt101_wsl 系列
### EfficientNet与ResNeXt101_wsl系列
EfficientNet与ResNeXt101_wsl系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[EfficientNet与ResNeXt101_wsl系列模型文档](../models/EfficientNet_and_ResNeXt101_wsl.md) EfficientNet 与 ResNeXt101_wsl 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[EfficientNet 与 ResNeXt101_wsl 系列模型文档](../models/EfficientNet_and_ResNeXt101_wsl.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
...@@ -303,11 +310,11 @@ EfficientNet与ResNeXt101_wsl系列模型的精度、速度指标如下表所示 ...@@ -303,11 +310,11 @@ EfficientNet与ResNeXt101_wsl系列模型的精度、速度指标如下表所示
| EfficientNetB7 | 0.8430 | 0.9689 | 53.93823 | - | 72.35 | 64.92 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB7_pretrained.pdparams) | | EfficientNetB7 | 0.8430 | 0.9689 | 53.93823 | - | 72.35 | 64.92 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB7_pretrained.pdparams) |
| EfficientNetB0_<br>small | 0.7580 | 0.9258 | 2.3076 | 4.71886 | 0.72 | 4.65 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB0_small_pretrained.pdparams) | | EfficientNetB0_<br>small | 0.7580 | 0.9258 | 2.3076 | 4.71886 | 0.72 | 4.65 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB0_small_pretrained.pdparams) |
<a name="11"></a>
<a name="ResNeSt与RegNet系列"></a> ## 11. ResNeSt 与 RegNet 系列
### ResNeSt与RegNet系列
ResNeSt与RegNet系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNeSt与RegNet系列模型文档](../models/ResNeSt_RegNet.md) ResNeSt 与 RegNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNeSt 与 RegNet 系列模型文档](../models/ResNeSt_RegNet.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
...@@ -316,11 +323,11 @@ ResNeSt与RegNet系列模型的精度、速度指标如下表所示,更多关 ...@@ -316,11 +323,11 @@ ResNeSt与RegNet系列模型的精度、速度指标如下表所示,更多关
| ResNeSt50 | 0.8083 | 0.9542 | 6.69042 | 8.01664 | 10.78 | 27.5 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeSt50_pretrained.pdparams) | | ResNeSt50 | 0.8083 | 0.9542 | 6.69042 | 8.01664 | 10.78 | 27.5 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeSt50_pretrained.pdparams) |
| RegNetX_4GF | 0.785 | 0.9416 | 6.46478 | 11.19862 | 8 | 22.1 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RegNetX_4GF_pretrained.pdparams) | | RegNetX_4GF | 0.785 | 0.9416 | 6.46478 | 11.19862 | 8 | 22.1 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RegNetX_4GF_pretrained.pdparams) |
<a name="12"></a>
<a name="ViT_and_DeiT系列"></a> ## 12. ViT_and_DeiT 系列
### ViT_and_DeiT系列
ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列模型的精度、速度指标如下表所示. 更多关于该系列模型的介绍可以参考: [ViT_and_DeiT系列模型文档](../models/ViT_and_DeiT.md) ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模型的精度、速度指标如下表所示. 更多关于该系列模型的介绍可以参考: [ViT_and_DeiT 系列模型文档](../models/ViT_and_DeiT.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
...@@ -346,11 +353,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -346,11 +353,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| DeiT_base_<br>distilled_patch16_224 | 0.831 | 0.964 | - | - | | 87 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_base_distilled_patch16_224_pretrained.pdparams) | | DeiT_base_<br>distilled_patch16_224 | 0.831 | 0.964 | - | - | | 87 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_base_distilled_patch16_224_pretrained.pdparams) |
| DeiT_base_<br>distilled_patch16_384 | 0.851 | 0.973 | - | - | | 88 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_base_distilled_patch16_384_pretrained.pdparams) | | DeiT_base_<br>distilled_patch16_384 | 0.851 | 0.973 | - | - | | 88 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_base_distilled_patch16_384_pretrained.pdparams) |
<a name="13"></a>
<a name="RepVGG系列"></a> ## 13. RepVGG 系列
### RepVGG系列
关于RepVGG系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RepVGG系列模型文档](../models/RepVGG.md) 关于 RepVGG 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RepVGG 系列模型文档](../models/RepVGG.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
...@@ -366,10 +373,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -366,10 +373,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| RepVGG_B2g4 | 0.7881 | 0.9448 | | | | | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_B2g4_pretrained.pdparams) | | RepVGG_B2g4 | 0.7881 | 0.9448 | | | | | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_B2g4_pretrained.pdparams) |
| 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="14"></a>
### MixNet系列
关于MixNet系列模型的精度、速度指标如下表所示,更多介绍可以参考:[MixNet系列模型文档](../models/MixNet.md) ## 14. MixNet 系列
关于 MixNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[MixNet 系列模型文档](../models/MixNet.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(M) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(M) | Params(M) | 下载地址 |
| -------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | | -------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ |
...@@ -377,10 +385,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -377,10 +385,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| MixNet_M | 0.7767 | 0.9364 | | | 357.119 | 5.065 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixNet_M_pretrained.pdparams) | | MixNet_M | 0.7767 | 0.9364 | | | 357.119 | 5.065 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixNet_M_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) | | 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="15"></a>
### ReXNet系列
## 15. ReXNet 系列
关于ReXNet系列模型的精度、速度指标如下表所示,更多介绍可以参考:[ReXNet系列模型文档](../models/ReXNet.md) 关于 ReXNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[ReXNet 系列模型文档](../models/ReXNet.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
| ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ |
...@@ -390,10 +399,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -390,10 +399,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| ReXNet_2_0 | 0.8122 | 0.9536 | | | 1.561 | 16.449 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_2_0_pretrained.pdparams) | | ReXNet_2_0 | 0.8122 | 0.9536 | | | 1.561 | 16.449 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_2_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) | | 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="16"></a>
### SwinTransformer系列
## 16. SwinTransformer 系列
关于SwinTransformer系列模型的精度、速度指标如下表所示,更多介绍可以参考:[SwinTransformer系列模型文档](../models/SwinTransformer.md) 关于 SwinTransformer 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[SwinTransformer 系列模型文档](../models/SwinTransformer.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
| ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ |
...@@ -406,12 +416,13 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -406,12 +416,13 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| SwinTransformer_large_patch4_window7_224<sup>[1]</sup> | 0.8596 | 0.9783 | | | 34.5 | 197 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_large_patch4_window7_224_22kto1k_pretrained.pdparams) | | SwinTransformer_large_patch4_window7_224<sup>[1]</sup> | 0.8596 | 0.9783 | | | 34.5 | 197 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_large_patch4_window7_224_22kto1k_pretrained.pdparams) |
| SwinTransformer_large_patch4_window12_384<sup>[1]</sup> | 0.8719 | 0.9823 | | | 103.9 | 197 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_large_patch4_window12_384_22kto1k_pretrained.pdparams) | | SwinTransformer_large_patch4_window12_384<sup>[1]</sup> | 0.8719 | 0.9823 | | | 103.9 | 197 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_large_patch4_window12_384_22kto1k_pretrained.pdparams) |
[1]:基于ImageNet22k数据集预训练,然后在ImageNet1k数据集迁移学习得到。 [1]:基于 ImageNet22k 数据集预训练,然后在 ImageNet1k 数据集迁移学习得到。
<a name="LeViT系列"></a> <a name="17"></a>
### LeViT系列
关于LeViT系列模型的精度、速度指标如下表所示,更多介绍可以参考:[LeViT系列模型文档](../models/LeViT.md) ## 17. LeViT 系列
关于 LeViT 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[LeViT 系列模型文档](../models/LeViT.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(M) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(M) | Params(M) | 下载地址 |
| ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ |
...@@ -421,12 +432,13 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -421,12 +432,13 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| LeViT_256 | 0.8085 | 0.9497 | | | 1120 | 19 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_256_pretrained.pdparams) | | LeViT_256 | 0.8085 | 0.9497 | | | 1120 | 19 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_256_pretrained.pdparams) |
| LeViT_384 | 0.8191 | 0.9551 | | | 2353 | 39 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_384_pretrained.pdparams) | | LeViT_384 | 0.8191 | 0.9551 | | | 2353 | 39 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_384_pretrained.pdparams) |
**注**:与Reference的精度差异源于数据预处理不同及未使用蒸馏的head作为输出。 **注**:与 Reference 的精度差异源于数据预处理不同及未使用蒸馏的 head 作为输出。
<a name="18"></a>
<a name="Twins系列"></a> ## 18. Twins 系列
### Twins系列
关于Twins系列模型的精度、速度指标如下表所示,更多介绍可以参考:[Twins系列模型文档](../models/Twins.md) 关于 Twins 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[Twins 系列模型文档](../models/Twins.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
| ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ |
...@@ -437,12 +449,13 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -437,12 +449,13 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| alt_gvt_base | 0.8294 | 0.9621 | | | 8.3 | 56 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/alt_gvt_base_pretrained.pdparams) | | alt_gvt_base | 0.8294 | 0.9621 | | | 8.3 | 56 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/alt_gvt_base_pretrained.pdparams) |
| alt_gvt_large | 0.8331 | 0.9642 | | | 14.8 | 99.2 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/alt_gvt_large_pretrained.pdparams) | | alt_gvt_large | 0.8331 | 0.9642 | | | 14.8 | 99.2 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/alt_gvt_large_pretrained.pdparams) |
**注**:与Reference的精度差异源于数据预处理不同。 **注**:与 Reference 的精度差异源于数据预处理不同。
<a name="HarDNet系列"></a> <a name="19"></a>
### HarDNet系列
关于HarDNet系列模型的精度、速度指标如下表所示,更多介绍可以参考:[HarDNet系列模型文档](../models/HarDNet.md) ## 19. HarDNet 系列
关于 HarDNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[HarDNet 系列模型文档](../models/HarDNet.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
| ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ |
...@@ -451,10 +464,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -451,10 +464,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| HarDNet68| 0.7546 | 0.9265 | | | 4.3 | 17.6 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet68_pretrained.pdparams) | | HarDNet68| 0.7546 | 0.9265 | | | 4.3 | 17.6 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet68_pretrained.pdparams) |
| HarDNet85 | 0.7744 | 0.9355 | | | 9.1 | 36.7 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet85_pretrained.pdparams) | | HarDNet85 | 0.7744 | 0.9355 | | | 9.1 | 36.7 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet85_pretrained.pdparams) |
<a name="DLA系列"></a> <a name="20"></a>
### DLA系列
## 20. DLA 系列
关于 DLA系列模型的精度、速度指标如下表所示,更多介绍可以参考:[DLA系列模型文档](../models/DLA.md) 关于 DLA 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[DLA 系列模型文档](../models/DLA.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
| ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ |
...@@ -468,10 +482,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -468,10 +482,11 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| DLA60x_c | 0.6645 | 0.8754 | | | 0.6 | 1.3 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA60x_c_pretrained.pdparams) | | DLA60x_c | 0.6645 | 0.8754 | | | 0.6 | 1.3 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA60x_c_pretrained.pdparams) |
| DLA60x | 0.7753 | 0.9378 | | | 3.5 | 17.4 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA60x_pretrained.pdparams) | | DLA60x | 0.7753 | 0.9378 | | | 3.5 | 17.4 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA60x_pretrained.pdparams) |
<a name="RedNet系列"></a> <a name="21"></a>
### RedNet系列
关于RedNet系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RedNet系列模型文档](../models/RedNet.md) ## 21. RedNet 系列
关于 RedNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RedNet 系列模型文档](../models/RedNet.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
| ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ |
...@@ -481,21 +496,23 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列 ...@@ -481,21 +496,23 @@ ViT(Vision Transformer)与DeiT(Data-efficient Image Transformers)系列
| RedNet101 | 0.7894 | 0.9436 | | | 4.7 | 25.7 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RedNet101_pretrained.pdparams) | | RedNet101 | 0.7894 | 0.9436 | | | 4.7 | 25.7 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RedNet101_pretrained.pdparams) |
| RedNet152 | 0.7917 | 0.9440 | | | 6.8 | 34.0 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RedNet152_pretrained.pdparams) | | RedNet152 | 0.7917 | 0.9440 | | | 6.8 | 34.0 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RedNet152_pretrained.pdparams) |
<a name="TNT系列"></a> <a name="22"></a>
### TNT系列
## 22. TNT 系列
关于TNT系列模型的精度、速度指标如下表所示,更多介绍可以参考:[TNT系列模型文档](../models/TNT.md) 关于 TNT 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[TNT 系列模型文档](../models/TNT.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
| ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ |
| TNT_small | 0.8121 |0.9563 | | | 5.2 | 23.8 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/TNT_small_pretrained.pdparams) | | | TNT_small | 0.8121 |0.9563 | | | 5.2 | 23.8 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/TNT_small_pretrained.pdparams) | |
**注**:TNT模型的数据预处理部分`NormalizeImage`中的`mean``std`均为0.5。 **注**:TNT 模型的数据预处理部分 `NormalizeImage` 中的 `mean``std` 均为 0.5。
<a name="23"></a>
<a name="其他模型"></a> ## 23. 其他模型
### 其他模型
关于AlexNet、SqueezeNet系列、VGG系列、DarkNet53等模型的精度、速度指标如下表所示,更多介绍可以参考:[其他模型文档](../models/Others.md) 关于 AlexNet、SqueezeNet 系列、VGG 系列、DarkNet53 等模型的精度、速度指标如下表所示,更多介绍可以参考:[其他模型文档](../models/Others.md)
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
......
# 图像分类
---
------
## 目录 ## 目录
- [数据集介绍](#1)
- [1. 数据集介绍](#1)
- [1.1 ImageNet-1k](#1.1) - [1.1 ImageNet-1k](#1.1)
- [1.2 CIFAR-10/CIFAR-100](#1.2) - [1.2 CIFAR-10/CIFAR-100](#1.2)
- [图像分类的流程](#2) - [2. 图像分类的流程](#2)
- [2.1 数据及其预处理](#2.1) - [2.1 数据及其预处理](#2.1)
- [2.2 模型准备](#2.2) - [2.2 模型准备](#2.2)
- [2.3 模型训练](#2.3) - [2.3 模型训练](#2.3)
- [2.4 模型评估](#2.4) - [2.4 模型评估](#2.4)
- [主要算法简介](#3) - [3. 主要算法简介](#3)
图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析等,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等。 图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析等,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等。
一般来说,图像分类通过手工特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。在深度学习算法之前使用较多的是基于词袋(Bag of Words)模型的物体分类方法。而基于深度学习的图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN)近年来在图像领域取得了惊人的成绩,CNN直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于"输入-输出"直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。 一般来说,图像分类通过手工特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。在深度学习算法之前使用较多的是基于词袋(Bag of Words)模型的物体分类方法。而基于深度学习的图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN)近年来在图像领域取得了惊人的成绩,CNN 直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于"输入-输出"直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。
图像分类是计算机视觉里很基础但又重要的一个领域,其研究成果一直影响着计算机视觉甚至深度学习的发展,图像分类有很多子领域,如多标签分类、细粒度分类等,此处只对单标签图像分类做一个简述。 图像分类是计算机视觉里很基础但又重要的一个领域,其研究成果一直影响着计算机视觉甚至深度学习的发展,图像分类有很多子领域,如多标签分类、细粒度分类等,此处只对单标签图像分类做一个简述。
<a name="1"></a> <a name="1"></a>
## 一、数据集介绍 ## 1. 数据集介绍
<a name="1.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> <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"></a>
## 二、图像分类的流程 ## 2. 图像分类的流程
将准备好的训练数据做相应的数据预处理后经过图像分类模型,模型的输出与真实标签做交叉熵损失函数,该损失函数描述了模型的收敛方向,遍历所有的图片数据输入模型,对最终损失函数通过某些优化器做相应的梯度下降,将梯度信息回传到模型中,更新模型的权重,如此循环往复遍历多次数据,即可得到一个图像分类的模型。 将准备好的训练数据做相应的数据预处理后经过图像分类模型,模型的输出与真实标签做交叉熵损失函数,该损失函数描述了模型的收敛方向,遍历所有的图片数据输入模型,对最终损失函数通过某些优化器做相应的梯度下降,将梯度信息回传到模型中,更新模型的权重,如此循环往复遍历多次数据,即可得到一个图像分类的模型。
<a name="2.1"></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> <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> <a name="2.3"></a>
### 2.3 模型训练 ### 2.3 模型训练
在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas提供了一些列的[训练调优方法](../models/Tricks.md),可以快速助你获得高精度的模型。 在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas 提供了一些列的[训练调优方法](../models/Tricks.md),可以快速助你获得高精度的模型。
<a name="2.4"></a> <a name="2.4"></a>
### 2.4 模型评估 ### 2.4 模型评估
当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是Top1-Acc或者Top5-Acc,该指标越高往往代表模型性能越好。 当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是 Top1-Acc 或者 Top5-Acc,该指标越高往往代表模型性能越好。
<a name="3"></a> <a name="3"></a>
## 三、主要算法简介 ## 3. 主要算法简介
- LeNet:Yan LeCun等人于上个世纪九十年代第一次将卷积神经网络应用到图像分类任务上,创造性的提出了LeNet,在手写数字识别任务上取得了巨大的成功。 - LeNet:Yan LeCun 等人于上个世纪九十年代第一次将卷积神经网络应用到图像分类任务上,创造性的提出了 LeNet,在手写数字识别任务上取得了巨大的成功。
- AlexNet:Alex Krizhevsky等人在2012年提出了AlexNet,并应用于ImageNet上,获得了2012年ImageNet分类比赛的冠军,从此,掀起了深度学习的热潮。 - AlexNet:Alex Krizhevsky 等人在 2012 年提出了 AlexNet,并应用于 ImageNet 上,获得了 2012 年 ImageNet 分类比赛的冠军,从此,掀起了深度学习的热潮。
- VGG:Simonyan和Zisserman于2014年提出了VGG网络结构,该网络结构使用了更小的卷积核堆叠整个网络,在ImageNet分类上取得了更好的性能,也为之后的网络结构设计提供了新的思路。 - VGG:Simonyan 和 Zisserman 于 2014 年提出了 VGG 网络结构,该网络结构使用了更小的卷积核堆叠整个网络,在 ImageNet 分类上取得了更好的性能,也为之后的网络结构设计提供了新的思路。
- GoogLeNet:Christian Szegedy等人在2014年提出了GoogLeNet,该网络使用了多分支结构和全局平均池化层(GAP),在保持模型精度的同时,模型存储和计算量大大缩减。该网络取得了2014年ImageNet分类比赛的冠军。 - GoogLeNet:Christian Szegedy 等人在 2014 年提出了 GoogLeNet,该网络使用了多分支结构和全局平均池化层(GAP),在保持模型精度的同时,模型存储和计算量大大缩减。该网络取得了 2014 年 ImageNet 分类比赛的冠军。
- ResNet:Kaiming He等人在2015年提出了ResNet,通过引入残差模块加深了网络的深度,最终该网络将ImageNet分类的识别错误率降低到了3.6\%,首次超出正常人眼的识别精度。 - ResNet:Kaiming He 等人在 2015 年提出了 ResNet,通过引入残差模块加深了网络的深度,最终该网络将 ImageNet 分类的识别错误率降低到了 3.6\%,首次超出正常人眼的识别精度。
- DenseNet:Huang Gao等人在2017年提出了DenseNet,该网络设计了一种更稠密连接的block,在更小的参数量上获得了更高的性能。 - DenseNet:Huang Gao 等人在 2017 年提出了 DenseNet,该网络设计了一种更稠密连接的 block,在更小的参数量上获得了更高的性能。
- EfficientNet:Mingxing Tan等人在2019年提出了EfficientNet,该网络平衡了网络的宽度、网络的深度、以及输入图片的分辨率,在同样FLOPS与参数量的情况下,精度达到了state-of-the-art的效果。 - EfficientNet:Mingxing Tan 等人在 2019 年提出了 EfficientNet,该网络平衡了网络的宽度、网络的深度、以及输入图片的分辨率,在同样 FLOPS 与参数量的情况下,精度达到了 state-of-the-art 的效果。
关于更多的算法介绍,请参考[算法介绍](../models) 关于更多的算法介绍,请参考[算法介绍](../models)
# 知识蒸馏 # 知识蒸馏
---
## 目录
* [1. 模型压缩和知识蒸馏方法简介](#1)
* [2. 知识蒸馏应用](#2)
* [3. 知识蒸馏算法介绍](#3)
* [3.1 Response based distillation](#3.1)
* [3.2 Feature based distillation](#3.2)
* [3.3 Relation based distillation](#3.3)
* [4. 参考文献](#4)
<a name='1'></a>
## 1. 模型压缩和知识蒸馏方法简介 ## 1. 模型压缩和知识蒸馏方法简介
近年来,深度神经网络在计算机视觉、自然语言处理等领域被验证是一种极其有效的解决问题的方法。通过构建合适的神经网络,加以训练,最终网络模型的性能指标基本上都会超过传统算法。 近年来,深度神经网络在计算机视觉、自然语言处理等领域被验证是一种极其有效的解决问题的方法。通过构建合适的神经网络,加以训练,最终网络模型的性能指标基本上都会超过传统算法。
...@@ -15,7 +24,7 @@ ...@@ -15,7 +24,7 @@
* Feature based distillation:教师模型对学生模型的中间层 feature map 进行监督。 * Feature based distillation:教师模型对学生模型的中间层 feature map 进行监督。
* Relation based distillation:对于不同的样本,使用教师模型和学生模型同时计算样本之间 feature map 的相关性,使得学生模型和教师模型得到的相关性矩阵尽可能一致。 * Relation based distillation:对于不同的样本,使用教师模型和学生模型同时计算样本之间 feature map 的相关性,使得学生模型和教师模型得到的相关性矩阵尽可能一致。
<a name='2'></a>
## 2. 知识蒸馏应用 ## 2. 知识蒸馏应用
...@@ -24,25 +33,25 @@ ...@@ -24,25 +33,25 @@
此外,对于相同的模型结构,使用知识蒸馏训练得到的预训练模型精度往往更高,这些预训练模型往往也可以提升下游任务的模型精度。比如在图像分类任务中,基于知识蒸馏算法得到的精度更高的预训练模型,也能够在目标检测、图像分割、OCR、视频分类等任务中获得明显的精度收益。 此外,对于相同的模型结构,使用知识蒸馏训练得到的预训练模型精度往往更高,这些预训练模型往往也可以提升下游任务的模型精度。比如在图像分类任务中,基于知识蒸馏算法得到的精度更高的预训练模型,也能够在目标检测、图像分割、OCR、视频分类等任务中获得明显的精度收益。
<a name='3'></a>
## 3. 知识蒸馏算法介绍 ## 3. 知识蒸馏算法介绍
<a name='3.1'></a>
### 3.1 Response based distillation ### 3.1 Response based distillation
最早的知识蒸馏算法KD,由Hinton提出,训练的损失函数中除了 gt loss 之外,还引入了学生模型与教师模型输出的 KL 散度,最终精度超过单纯使用 gt loss 训练的精度。这里需要注意的是,在训练的时候,需要首先训练得到一个更大的教师模型,来指导学生模型的训练过程。 最早的知识蒸馏算法 KD,由 Hinton 提出,训练的损失函数中除了 gt loss 之外,还引入了学生模型与教师模型输出的 KL 散度,最终精度超过单纯使用 gt loss 训练的精度。这里需要注意的是,在训练的时候,需要首先训练得到一个更大的教师模型,来指导学生模型的训练过程。
PaddleClas 中提出了一种简单使用的 SSLD 知识蒸馏算法 [6],在训练的时候去除了对 gt label 的依赖,结合大量无标注数据,最终蒸馏训练得到的预训练模型在 15 个模型上的精度提升平均高达 3%。 PaddleClas 中提出了一种简单使用的 SSLD 知识蒸馏算法 [6],在训练的时候去除了对 gt label 的依赖,结合大量无标注数据,最终蒸馏训练得到的预训练模型在 15 个模型上的精度提升平均高达 3%。
上述标准的蒸馏方法是通过一个大模型作为教师模型来指导学生模型提升效果,而后来又发展出 DML (Deep Mutual Learning) 互学习蒸馏方法 [7],即通过两个结构相同的模型互相学习。具体的。相比于 KD 等依赖于大的教师模型的知识蒸馏算法,DML 脱离了对大的教师模型的依赖,蒸馏训练的流程更加简单,模型产出效率也要更高一些。 上述标准的蒸馏方法是通过一个大模型作为教师模型来指导学生模型提升效果,而后来又发展出 DML(Deep Mutual Learning)互学习蒸馏方法 [7],即通过两个结构相同的模型互相学习。具体的。相比于 KD 等依赖于大的教师模型的知识蒸馏算法,DML 脱离了对大的教师模型的依赖,蒸馏训练的流程更加简单,模型产出效率也要更高一些。
<a name='3.2'></a>
### 3.2 Feature based distillation ### 3.2 Feature based distillation
Heo 等人提出了 OverHaul [8], 计算学生模型与教师模型的 feature map distance,作为蒸馏的 loss,在这里使用了学生模型、教师模型的转移,来保证二者的 feature map 可以正常地进行 distance 的计算。 Heo 等人提出了 OverHaul [8], 计算学生模型与教师模型的 feature map distance,作为蒸馏的 loss,在这里使用了学生模型、教师模型的转移,来保证二者的 feature map 可以正常地进行 distance 的计算。
基于 feature map distance 的知识蒸馏方法也能够和 `3.1章节` 中的基于 response 的知识蒸馏算法融合在一起,同时对学生模型的输出结果和中间层 feature map 进行监督。而对于 DML 方法来说,这种融合过程更为简单,因为不需要对学生和教师模型的 feature map 进行转换,便可以完成对齐 (alignment) 过程。PP-OCRv2 系统中便使用了这种方法,最终大幅提升了 OCR 文字识别模型的精度。 基于 feature map distance 的知识蒸馏方法也能够和 `3.1 章节` 中的基于 response 的知识蒸馏算法融合在一起,同时对学生模型的输出结果和中间层 feature map 进行监督。而对于 DML 方法来说,这种融合过程更为简单,因为不需要对学生和教师模型的 feature map 进行转换,便可以完成对齐(alignment)过程。PP-OCRv2 系统中便使用了这种方法,最终大幅提升了 OCR 文字识别模型的精度。
<a name='3.3'></a>
### 3.3 Relation based distillation ### 3.3 Relation based distillation
 
...@@ -51,9 +60,9 @@ Heo 等人提出了 OverHaul [8], 计算学生模型与教师模型的 feature m ...@@ -51,9 +60,9 @@ Heo 等人提出了 OverHaul [8], 计算学生模型与教师模型的 feature m
Park 等人提出了 RKD [10],基于关系的知识蒸馏算法,RKD 中进一步考虑个体输出之间的关系,使用 2 种损失函数,二阶的距离损失(distance-wise)和三阶的角度损失(angle-wise) Park 等人提出了 RKD [10],基于关系的知识蒸馏算法,RKD 中进一步考虑个体输出之间的关系,使用 2 种损失函数,二阶的距离损失(distance-wise)和三阶的角度损失(angle-wise)
本论文提出的算法关系知识蒸馏(RKD)迁移教师模型得到的输出结果间的结构化关系给学生模型,不同于之前的只关注个体输出结果,RKD 算法使用两种损失函数:二阶的距离损失 (distance-wise) 和三阶的角度损失 (angle-wise)。在最终计算蒸馏损失函数的时候,同时考虑KD loss 和 RKD loss。最终精度优于单独使用 KD loss 蒸馏得到的模型精度。 本论文提出的算法关系知识蒸馏(RKD)迁移教师模型得到的输出结果间的结构化关系给学生模型,不同于之前的只关注个体输出结果,RKD 算法使用两种损失函数:二阶的距离损失(distance-wise)和三阶的角度损失(angle-wise)。在最终计算蒸馏损失函数的时候,同时考虑 KD loss 和 RKD loss。最终精度优于单独使用 KD loss 蒸馏得到的模型精度。
<a name='4'></a>
## 4. 参考文献 ## 4. 参考文献
[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.
......
# Metric Learning # Metric Learning
----
## 目录
## 简介 * [1. 简介](#1)
在机器学习中,我们经常会遇到度量数据间距离的问题。一般来说,对于可度量的数据,我们可以直接通过欧式距离(Euclidean Distance),向量内积(Inner Product)或者是余弦相似度(Cosine Similarity)来进行计算。但对于非结构化数据来说,我们却很难进行这样的操作,如计算一段视频和一首音乐的匹配程度。由于数据格式的不同,我们难以直接进行上述的向量运算,但先验知识告诉我们ED(laugh_video, laugh_music) < ED(laugh_video, blue_music), 如何去有效得表征这种”距离”关系呢? 这就是Metric Learning所要研究的课题。 * [2. 应用](#2)
* [3. 算法](#3)
* [3.1 Classification based](#3.1)
* [3.2 Pairwise based](#3.2)
Metric learning全称是 Distance Metric Learning,它是通过机器学习的形式,根据训练数据,自动构造出一种基于特定任务的度量函数。Metric Learning的目标是学习一个变换函数(线性非线性均可)L,将数据点从原始的向量空间映射到一个新的向量空间,在新的向量空间里相似点的距离更近,非相似点的距离更远,使得度量更符合任务的要求,如下图所示。 Deep Metric Learning,就是用深度神经网络来拟合这个变换函数。 <a name='1'></a>
![example](../../images/ml_illustration.jpg) ## 1. 简介
在机器学习中,我们经常会遇到度量数据间距离的问题。一般来说,对于可度量的数据,我们可以直接通过欧式距离(Euclidean Distance),向量内积(Inner Product)或者是余弦相似度(Cosine Similarity)来进行计算。但对于非结构化数据来说,我们却很难进行这样的操作,如计算一段视频和一首音乐的匹配程度。由于数据格式的不同,我们难以直接进行上述的向量运算,但先验知识告诉我们 ED(laugh_video, laugh_music) < ED(laugh_video, blue_music), 如何去有效得表征这种”距离”关系呢? 这就是 Metric Learning 所要研究的课题。
Metric learning 全称是 Distance Metric Learning,它是通过机器学习的形式,根据训练数据,自动构造出一种基于特定任务的度量函数。Metric Learning 的目标是学习一个变换函数(线性非线性均可)L,将数据点从原始的向量空间映射到一个新的向量空间,在新的向量空间里相似点的距离更近,非相似点的距离更远,使得度量更符合任务的要求,如下图所示。 Deep Metric Learning,就是用深度神经网络来拟合这个变换函数。
![example](../../images/ml_illustration.jpg)
## 应用 <a name='2'></a>
Metric Learning技术在生活实际中应用广泛,如我们耳熟能详的人脸识别(Face Recognition)、行人重识别(Person ReID)、图像检索(Image Retrieval)、细粒度分类(Fine-gained classification)等. 随着深度学习在工业实践中越来越广泛的应用,目前大家研究的方向基本都偏向于Deep Metric Learning(DML). ## 2. 应用
Metric Learning 技术在生活实际中应用广泛,如我们耳熟能详的人脸识别(Face Recognition)、行人重识别(Person ReID)、图像检索(Image Retrieval)、细粒度分类(Fine-gained classification)等。随着深度学习在工业实践中越来越广泛的应用,目前大家研究的方向基本都偏向于 Deep Metric Learning(DML).
一般来说, DML包含三个部分: 特征提取网络来map embedding, 一个采样策略来将一个mini-batch里的样本组合成很多个sub-set, 最后loss function在每个sub-set上计算loss. 如下图所示: 一般来说, DML 包含三个部分: 特征提取网络来 map embedding, 一个采样策略来将一个 mini-batch 里的样本组合成很多个 sub-set, 最后 loss function 在每个 sub-set 上计算 loss. 如下图所示:
![image](../../images/ml_pipeline.jpg) ![image](../../images/ml_pipeline.jpg)
<a name='3'></a>
## 算法 ## 3. 算法
Metric Learning主要有如下两种学习范式: Metric Learning 主要有如下两种学习范式:
### 1. Classification based: <a name='3.1'></a>
这是一类基于分类标签的Metric Learning方法。这类方法通过将每个样本分类到正确的类别中,来学习有效的特征表示,学习过程中需要每个样本的显式标签参与Loss计算。常见的算法有[L2-Softmax](https://arxiv.org/abs/1703.09507), [Large-margin Softmax](https://arxiv.org/abs/1612.02295), [Angular Softmax](https://arxiv.org/pdf/1704.08063.pdf), [NormFace](https://arxiv.org/abs/1704.06369), [AM-Softmax](https://arxiv.org/abs/1801.05599), [CosFace](https://arxiv.org/abs/1801.09414), [ArcFace](https://arxiv.org/abs/1801.07698)等。 ### 3.1 Classification based:
这类方法也被称作是proxy-based, 因为其本质上优化的是样本和一堆proxies之间的相似度。 这是一类基于分类标签的 Metric Learning 方法。这类方法通过将每个样本分类到正确的类别中,来学习有效的特征表示,学习过程中需要每个样本的显式标签参与 Loss 计算。常见的算法有 [L2-Softmax](https://arxiv.org/abs/1703.09507), [Large-margin Softmax](https://arxiv.org/abs/1612.02295), [Angular Softmax](https://arxiv.org/pdf/1704.08063.pdf), [NormFace](https://arxiv.org/abs/1704.06369), [AM-Softmax](https://arxiv.org/abs/1801.05599), [CosFace](https://arxiv.org/abs/1801.09414), [ArcFace](https://arxiv.org/abs/1801.07698)等。
### 2. Pairwise based: 这类方法也被称作是 proxy-based, 因为其本质上优化的是样本和一堆 proxies 之间的相似度。
<a name='3.2'></a>
### 3.2 Pairwise based:
这是一类基于样本对的学习范式。他以样本对作为输入,通过直接学习样本对之间的相似度来得到有效的特征表示,常见的算法包括:[Contrastive loss](http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf), [Triplet loss](https://arxiv.org/abs/1503.03832), [Lifted-Structure loss](https://arxiv.org/abs/1511.06452), [N-pair loss](https://papers.nips.cc/paper/2016/file/6b180037abbebea991d8b1232f8a8ca9-Paper.pdf), [Multi-Similarity loss](https://arxiv.org/pdf/1904.06627.pdf) 这是一类基于样本对的学习范式。他以样本对作为输入,通过直接学习样本对之间的相似度来得到有效的特征表示,常见的算法包括:[Contrastive loss](http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf), [Triplet loss](https://arxiv.org/abs/1503.03832), [Lifted-Structure loss](https://arxiv.org/abs/1511.06452), [N-pair loss](https://papers.nips.cc/paper/2016/file/6b180037abbebea991d8b1232f8a8ca9-Paper.pdf), [Multi-Similarity loss](https://arxiv.org/pdf/1904.06627.pdf)
2020年发表的[CircleLoss](https://arxiv.org/abs/2002.10857),从一个全新的视角统一了两种学习范式,让研究人员和从业者对Metric Learning问题有了更进一步的思考。 2020 年发表的[CircleLoss](https://arxiv.org/abs/2002.10857),从一个全新的视角统一了两种学习范式,让研究人员和从业者对 Metric Learning 问题有了更进一步的思考。
# 模型裁剪、量化算法介绍 # 模型裁剪、量化算法介绍
深度学习因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩、优化加速、异构计算等方法突破瓶颈。模型压缩算法能够有效降低参数冗余,从而减少存储占用、通信带宽和计算复杂度,有助于深度学习的应用部署。其中模型量化、裁剪应用比较广泛。在PaddleClas中,主要应该应用以下两种算法。 深度学习因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩、优化加速、异构计算等方法突破瓶颈。模型压缩算法能够有效降低参数冗余,从而减少存储占用、通信带宽和计算复杂度,有助于深度学习的应用部署。其中模型量化、裁剪应用比较广泛。在 PaddleClas 中,主要应该应用以下两种算法。
- 量化方法:PACT量化 - 量化方法:PACT 量化
- 裁剪:FPGM裁剪 - 裁剪:FPGM 裁剪
其中具体算法参数请参考[PaddeSlim](https://github.com/PaddlePaddle/PaddleSlim/) 其中具体算法参数请参考 [PaddeSlim](https://github.com/PaddlePaddle/PaddleSlim/)
## PACT量化方法 ## 目录
模型量化主要包括两个部分,一是对权重Weight量化,一是针对激活值Activation量化。同时对两部分进行量化,才能获得最大的计算效率收益。权重可以借助网络正则化等手段,让权重分布尽量紧凑,减少离群点、不均匀分布情况发生,而对于激活值还缺乏有效的手段。 * [1. PACT 量化方法](#1)
* [2. FPGM 裁剪](#2)
**PACT量化(PArameterized Clipping acTivation**是一种新的量化方法,该方法通过在量化激活值之前去掉一些离群点,将模型量化带来的精度损失降到最低,甚至比原模型准确率更高。提出方法的背景是作者发现:“在运用权重量化方案来量化activation时,激活值的量化结果和全精度结果相差较大”。作者发现,activation的量化可能引起的误差很大(相较于weight基本在 0到1范围内,activation的值的范围是无限大的,这是RELU的结果),所以提出**截断式RELU** 的激活函数。该截断的上界,即$α$ 是可学习的参数,这保证了每层能够通过训练学习到不一样的量化范围,最大程度降低量化带来的舍入误差。其中量化的示意图如下图所示,**PACT**解决问题的方法是,不断裁剪激活值范围,使得激活值分布收窄,从而降低量化映射损失。**PACT**通过对激活数值做裁剪,从而减少激活分布中的离群点,使量化模型能够得到一个更合理的量化scale,降低量化损失。 <a name='1'></a>
## 1. PACT 量化方法
模型量化主要包括两个部分,一是对权重 Weight 量化,一是针对激活值 Activation 量化。同时对两部分进行量化,才能获得最大的计算效率收益。权重可以借助网络正则化等手段,让权重分布尽量紧凑,减少离群点、不均匀分布情况发生,而对于激活值还缺乏有效的手段。
**PACT 量化(PArameterized Clipping acTivation**是一种新的量化方法,该方法通过在量化激活值之前去掉一些离群点,将模型量化带来的精度损失降到最低,甚至比原模型准确率更高。提出方法的背景是作者发现:“在运用权重量化方案来量化 activation 时,激活值的量化结果和全精度结果相差较大”。作者发现,activation 的量化可能引起的误差很大(相较于 weight 基本在 0 到 1 范围内,activation 的值的范围是无限大的,这是 RELU 的结果),所以提出**截断式 RELU** 的激活函数。该截断的上界,即$α$ 是可学习的参数,这保证了每层能够通过训练学习到不一样的量化范围,最大程度降低量化带来的舍入误差。其中量化的示意图如下图所示,**PACT** 解决问题的方法是,不断裁剪激活值范围,使得激活值分布收窄,从而降低量化映射损失。**PACT** 通过对激活数值做裁剪,从而减少激活分布中的离群点,使量化模型能够得到一个更合理的量化 scale,降低量化损失。
<div align="center"> <div align="center">
<img src="../../images/algorithm_introduction/quantization.jpg" width = "600" /> <img src="../../images/algorithm_introduction/quantization.jpg" width = "600" />
</div> </div>
**PACT**量化公式如下: **PACT** 量化公式如下:
<div align="center"> <div align="center">
<img src="../../images/algorithm_introduction/quantization_formula.png" width = "800" height="100"/> <img src="../../images/algorithm_introduction/quantization_formula.png" width = "800" height="100"/>
...@@ -26,7 +32,7 @@ ...@@ -26,7 +32,7 @@
可以看出PACT思想是用上述量化代替*ReLU*函数,对大于零的部分进行一个截断操作,截断阈值为$a$。但是在*PaddleSlim*中对上述公式做了进一步的改进,其改进如下: 可以看出 PACT 思想是用上述量化代替 *ReLU* 函数,对大于零的部分进行一个截断操作,截断阈值为$a$。但是在*PaddleSlim*中对上述公式做了进一步的改进,其改进如下:
<div align="center"> <div align="center">
<img src="../../images/algorithm_introduction/quantization_formula_slim.png" width = "550" height="120"/> <img src="../../images/algorithm_introduction/quantization_formula_slim.png" width = "550" height="120"/>
...@@ -34,18 +40,19 @@ ...@@ -34,18 +40,19 @@
经过如上改进后,在激活值和待量化的OP(卷积,全连接等)之间插入*PACT*预处理,不只对大于0的分布进行截断,同时也对小于0的部分做同样的限制,从而更好地得到待量化的范围,降低量化损失。同时,截断阈值是一个可训练的参数,在量化训练过程中,模型会自动的找到一个合理的截断阈值,从而进一步降低量化精度损失。 经过如上改进后,在激活值和待量化的 OP(卷积,全连接等)之间插入 *PACT* 预处理,不只对大于 0 的分布进行截断,同时也对小于 0 的部分做同样的限制,从而更好地得到待量化的范围,降低量化损失。同时,截断阈值是一个可训练的参数,在量化训练过程中,模型会自动的找到一个合理的截断阈值,从而进一步降低量化精度损失。
算法具体参数请参考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裁剪 <a name='2'></a>
## FPGM 裁剪
模型剪枝是减小模型大小,提升预测效率的一种非常重要的手段。在之前的网络剪枝文章中一般将网络filter的范数作为其重要性度量,**范数值较小的代表的filter越不重要**,将其从网络中裁剪掉,反之也就越重要。而**FPGM**认为之前的方法要依赖如下两点 模型剪枝是减小模型大小,提升预测效率的一种非常重要的手段。在之前的网络剪枝文章中一般将网络 filter 的范数作为其重要性度量,**范数值较小的代表的 filter 越不重要**,将其从网络中裁剪掉,反之也就越重要。而**FPGM**认为之前的方法要依赖如下两点
- filter的范数偏差应该比较大,这样重要和非重要的filter才可以很好区分开 - filter 的范数偏差应该比较大,这样重要和非重要的 filter 才可以很好区分开
- 不重要的filter的范数应该足够的小 - 不重要的 filter 的范数应该足够的小
基于此,**FPGM**利用层中filter的几何中心特性,由于那些靠近中心的filter可以被其它的表达,因而可以将其剔除,从而避免了上面提到的两点剪枝条件,从信息的冗余度出发,而不是选择范数少的进行剪枝。下图展示了**FPGM**方法与之前方法的不同,具体细节请详看[论文](https://openaccess.thecvf.com/content_CVPR_2019/papers/He_Filter_Pruning_via_Geometric_Median_for_Deep_Convolutional_Neural_Networks_CVPR_2019_paper.pdf) 基于此,**FPGM**利用层中 filter 的几何中心特性,由于那些靠近中心的 filter 可以被其它的表达,因而可以将其剔除,从而避免了上面提到的两点剪枝条件,从信息的冗余度出发,而不是选择范数少的进行剪枝。下图展示了 **FPGM** 方法与之前方法的不同,具体细节请详看[论文](https://openaccess.thecvf.com/content_CVPR_2019/papers/He_Filter_Pruning_via_Geometric_Median_for_Deep_Convolutional_Neural_Networks_CVPR_2019_paper.pdf)
<div align="center"> <div align="center">
<img src="../../images/algorithm_introduction/fpgm.png" width = "600" /> <img src="../../images/algorithm_introduction/fpgm.png" width = "600" />
...@@ -54,4 +61,4 @@ ...@@ -54,4 +61,4 @@
算法具体参数请参考PaddleSlim[参数介绍](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/dygraph/pruners/fpgm_filter_pruner.rst#fpgmfilterpruner) 算法具体参数请参考 PaddleSlim [参数介绍](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/dygraph/pruners/fpgm_filter_pruner.rst#fpgmfilterpruner)
...@@ -6,36 +6,36 @@ ...@@ -6,36 +6,36 @@
## 目录 ## 目录
- [数据集格式说明](#数据集格式说明) - [1. 数据集格式说明](#1)
- [图像分类任务常见数据集介绍](#图像分类任务常见数据集介绍) - [2. 图像分类任务常见数据集介绍](#2)
- [2.1 ImageNet1k](#ImageNet1k) - [2.1 ImageNet1k](#2.1)
- [2.2 Flowers102](#Flowers102) - [2.2 Flowers102](#2.2)
- [2.3 CIFAR10 / CIFAR100](#CIFAR10/CIFAR100) - [2.3 CIFAR10 / CIFAR100](#2.3)
- [2.4 MNIST](#MNIST) - [2.4 MNIST](#2.4)
- [2.5 NUS-WIDE](#NUS-WIDE) - [2.5 NUS-WIDE](#2.5)
<a name="数据集格式说明"></a> <a name="1"></a>
## 一、数据集格式说明 ## 1. 数据集格式说明
PaddleClas 使用 `txt` 格式文件指定训练集和测试集,以 `ImageNet1k` 数据集为例,其中 `train_list.txt``val_list.txt` 的格式形如: PaddleClas 使用 `txt` 格式文件指定训练集和测试集,以 `ImageNet1k` 数据集为例,其中 `train_list.txt``val_list.txt` 的格式形如:
```shell ```shell
# 每一行采用"空格"分隔图像路径与标注 # 每一行采用"空格"分隔图像路径与标注
# 下面是train_list.txt中的格式样例 # 下面是 train_list.txt 中的格式样例
train/n01440764/n01440764_10026.JPEG 0 train/n01440764/n01440764_10026.JPEG 0
... ...
# 下面是val_list.txt中的格式样例 # 下面是 val_list.txt 中的格式样例
val/ILSVRC2012_val_00000001.JPEG 65 val/ILSVRC2012_val_00000001.JPEG 65
... ...
``` ```
<a name="图像分类任务常见数据集介绍"></a> <a name="2"></a>
## 二、 图像分类任务常见数据集介绍 ## 2. 图像分类任务常见数据集介绍
这里整理了常用的图像分类任务数据集,持续更新中,欢迎各位小伙伴补充完善~ 这里整理了常用的图像分类任务数据集,持续更新中,欢迎各位小伙伴补充完善~
<a name="ImageNet1k"></a> <a name="2.1"></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 已经成为计算机视觉领域发展的最重要的数据集之一,其促进了整个计算机视觉的发展,很多计算机视觉下游任务的初始化模型都是基于该数据集训练得到的。
...@@ -65,7 +65,7 @@ PaddleClas/dataset/ILSVRC2012/ ...@@ -65,7 +65,7 @@ PaddleClas/dataset/ILSVRC2012/
|_ val_list.txt |_ val_list.txt
``` ```
<a name="Flowers102"></a> <a name="2.2"></a>
### 2.2 Flowers102 ### 2.2 Flowers102
数据集 | 训练集大小 | 测试集大小 | 类别数 | 备注| 数据集 | 训练集大小 | 测试集大小 | 类别数 | 备注|
...@@ -101,23 +101,23 @@ PaddleClas/dataset/flowers102/ ...@@ -101,23 +101,23 @@ PaddleClas/dataset/flowers102/
|_ val_list.txt |_ val_list.txt
``` ```
<a name="CIFAR10/CIFAR100"></a> <a name="2.3"></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> <a name="2.4"></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> <a name="2.5"></a>
### 2.5 NUS-WIDE ### 2.5 NUS-WIDE
NUS-WIDE 是一个多分类数据集。该数据集包含 269648 张图片, 81 个类别, 每张图片被标记为该 81 个类别中的某一类或某几类。 NUS-WIDE 是一个多分类数据集。该数据集包含 269648 张图片, 81 个类别,每张图片被标记为该 81 个类别中的某一类或某几类。
数据集地址:https://lms.comp.nus.edu.sg/wp-content/uploads/2019/research/nuswide/NUS-WIDE.html 数据集地址:https://lms.comp.nus.edu.sg/wp-content/uploads/2019/research/nuswide/NUS-WIDE.html
...@@ -7,18 +7,18 @@ ...@@ -7,18 +7,18 @@
## 目录 ## 目录
- [数据集格式说明](#数据集格式说明) - [1. 数据集格式说明](#1)
- [图像识别任务常见数据集介绍](#图像识别任务常见数据集介绍) - [2. 图像识别任务常见数据集介绍](#2)
- [2.1 通用图像识别数据集](#通用图像识别数据集) - [2.1 通用图像识别数据集](#2.1)
- [2.2 垂类图像识别数据集](#垂类图像识别数据集) - [2.2 垂类图像识别数据集](#2.2)
- [2.2.1 动漫人物识别](#动漫人物识别) - [2.2.1 动漫人物识别](#2.2.1)
- [2.2.2 商品识别](#商品识别) - [2.2.2 商品识别](#2.2.2)
- [2.2.3 Logo识别](#Logo识别) - [2.2.3 Logo 识别](#2.2.3)
- [2.2.4 车辆识别](#车辆识别) - [2.2.4 车辆识别](#2.2.4)
<a name="数据集格式说明"></a> <a name="1"></a>
## 一、数据集格式说明 ## 1. 数据集格式说明
与分类任务数据集不同,图像检索任务的数据集分为以下三部分: 与分类任务数据集不同,图像检索任务的数据集分为以下三部分:
...@@ -37,7 +37,7 @@ train/99/Ovenbird_0128_93366.jpg 99 6 ...@@ -37,7 +37,7 @@ train/99/Ovenbird_0128_93366.jpg 99 6
... ...
``` ```
验证数据集(`CUB_200_2011`中既是gallery dataset,也是query dataset) `test_list.txt` 文件内容格式如下所示: 验证数据集(`CUB_200_2011` 中既是 gallery dataset,也是 query dataset)`test_list.txt` 文件内容格式如下所示:
```shell ```shell
# 采用"空格"作为分隔符号 # 采用"空格"作为分隔符号
...@@ -48,85 +48,85 @@ test/200/Common_Yellowthroat_0114_190501.jpg 200 6 ...@@ -48,85 +48,85 @@ test/200/Common_Yellowthroat_0114_190501.jpg 200 6
... ...
``` ```
每行数据使用“空格”分割,三列数据的含义分别是训练数据的路径、训练数据的label信息、训练数据的unique id。 每行数据使用“空格”分割,三列数据的含义分别是训练数据的路径、训练数据的 label 信息、训练数据的 unique id。
**注意** **注意**
1.gallery dataset和query dataset相同时,为了去掉检索得到的第一个数据(检索图片本身无须评估),每个数据需要对应一个unique id(每张图片的id不同即可,可以用行号来表示unique id),用于后续评测mAP、recall@1等指标。yaml配置文件的数据集选用`VeriWild` 1. gallery dataset 和 query dataset 相同时,为了去掉检索得到的第一个数据(检索图片本身无须评估),每个数据需要对应一个 unique id(每张图片的 id 不同即可,可以用行号来表示 unique id),用于后续评测 mAP、recall@1 等指标。yaml 配置文件的数据集选用 `VeriWild`
2.gallery dataset和query dataset不同时,无需增加unique id,`query_list.txt``gallery_list.txt` 均为两列,分别是训练数据的路径、训练数据的label信息。yaml配置文件的数据集选用`ImageNetDataset` 2. gallery dataset 和 query dataset 不同时,无需增加 unique id,`query_list.txt``gallery_list.txt` 均为两列,分别是训练数据的路径、训练数据的 label 信息。yaml 配置文件的数据集选用 `ImageNetDataset`
<a name="图像识别任务常见数据集介绍"></a> <a name="2"></a>
## 二、图像识别任务常见数据集介绍 ## 2. 图像识别任务常见数据集介绍
这里整理了常用的图像识别任务数据集,持续更新中,欢迎各位小伙伴补充完善~ 这里整理了常用的图像识别任务数据集,持续更新中,欢迎各位小伙伴补充完善~
<a name="通用图像识别数据集"></a> <a name="2.1"></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 个。
地址: https://cvgl.stanford.edu/projects/lifted_struct/ 地址: https://cvgl.stanford.edu/projects/lifted_struct/
- Cars196: - Cars196:
Cars数据集包含了196类汽车的16185张图像。数据被分成8144张训练图像和8041张测试图像,每个类大致以50-50的比例分割。级别通常是在制造,模型,年,例如2012特斯拉模型S或2012宝马M3双门跑车。 Cars 数据集包含了 196 类汽车的 16185 张图像。数据被分成 8144 张训练图像和 8041 张测试图像,每个类大致以 50-50 的比例分割。级别通常是在制造,模型,年,例如 2012 特斯拉模型 S 或 2012 宝马 M3 双门跑车。
地址: https://ai.stanford.edu/~jkrause/cars/car_dataset.html 地址: https://ai.stanford.edu/~jkrause/cars/car_dataset.html
- CUB_200_2011: CUB_200_2011数据集是由加州理工学院在2010年提出的细粒度数据集,也是目前细粒度分类识别研究的基准图像数据集。该数据集共有11788张鸟类图像,包含200类鸟类子类,其中训练数据集有5994张图像,测试集有5794张图像,每张图像均提供了图像类标记信息,图像中鸟的bounding box,鸟的关键part信息,以及鸟类的属性信息,数据集如下图所示。 - CUB_200_2011: CUB_200_2011 数据集是由加州理工学院在 2010 年提出的细粒度数据集,也是目前细粒度分类识别研究的基准图像数据集。该数据集共有 11788 张鸟类图像,包含 200 类鸟类子类,其中训练数据集有 5994 张图像,测试集有 5794 张图像,每张图像均提供了图像类标记信息,图像中鸟的 bounding box,鸟的关键 part 信息,以及鸟类的属性信息,数据集如下图所示。
地址: http://www.vision.caltech.edu/visipedia/CUB-200-2011.html 地址: http://www.vision.caltech.edu/visipedia/CUB-200-2011.html
- In-shop Clothes: In-shop Clothes 是DeepFashion数据集的4个子集之一, 它是一个卖家秀图片集,每个商品id,有多张不同角度的卖家秀,放在同一个文件夹内。该数据集共包含7982件商品,共52712张图像,每张图片都有463中属性,Bbox,landmarks,以及店铺描述。 - In-shop Clothes: In-shop Clothes 是 DeepFashion 数据集的 4 个子集之一, 它是一个卖家秀图片集,每个商品 id,有多张不同角度的卖家秀,放在同一个文件夹内。该数据集共包含 7982 件商品,共 52712 张图像,每张图片都有 463 中属性,Bbox,landmarks,以及店铺描述。
地址: http://mmlab.ie.cuhk.edu.hk/projects/DeepFashion.html 地址: http://mmlab.ie.cuhk.edu.hk/projects/DeepFashion.html
<a name="垂类图像识别数据集"></a> <a name="2.2"></a>
### 2.2 垂类图像识别数据集 ### 2.2 垂类图像识别数据集
<a name="动漫人物识别"></a> <a name="2.2.1"></a>
#### 2.2.1 动漫人物识别 #### 2.2.1 动漫人物识别
+ iCartoonFace: iCartoonFace是由爱奇艺开放的目前全球最大的手工标注卡通人物检测数据集与识别数据集,它包含超过5013个卡通人物、389678张高质量实景图片。相比于其他数据集,它具有大规模、高质量、多样性丰富、挑战难度大等特点,是目前研究动漫人物识别最常用的数据集之一。 + iCartoonFace: iCartoonFace 是由爱奇艺开放的目前全球最大的手工标注卡通人物检测数据集与识别数据集,它包含超过 5013 个卡通人物、389678 张高质量实景图片。相比于其他数据集,它具有大规模、高质量、多样性丰富、挑战难度大等特点,是目前研究动漫人物识别最常用的数据集之一。
地址: http://challenge.ai.iqiyi.com/detail?raceId=5def69ace9fcf68aef76a75d 地址: http://challenge.ai.iqiyi.com/detail?raceId=5def69ace9fcf68aef76a75d
+ Manga109: Manga109是2020.5月发布的一个用于研究卡通人物检测和识别的数据集,其包含21142张图片,官方不允许用于商用。该数据集旗下的子集Manga109-s,可以供工业使用, 主要用于文本检测、基于线稿的任务检索、角色图像生成等任务。 + Manga109: Manga109 是 2020.5 月发布的一个用于研究卡通人物检测和识别的数据集,其包含 21142 张图片,官方不允许用于商用。该数据集旗下的子集 Manga109-s,可以供工业使用,主要用于文本检测、基于线稿的任务检索、角色图像生成等任务。
地址:http://www.manga109.org/en/ 地址:http://www.manga109.org/en/
+ IIT-CFW:IIF-CFW数据集共包含8928个带有标注的明星人物卡通头像,覆盖100个人物形象,每个人卡通头像数不等。 另外,其还提供了1000张真实人脸照(100个公众人物,每个人10张真实头像)。该数据集既可以用于研究动漫人物识别,也经常被用于研究跨模态的检索任务。 + IIT-CFW:IIF-CFW 数据集共包含 8928 个带有标注的明星人物卡通头像,覆盖 100 个人物形象,每个人卡通头像数不等。 另外,其还提供了 1000 张真实人脸照(100 个公众人物,每个人 10 张真实头像)。该数据集既可以用于研究动漫人物识别,也经常被用于研究跨模态的检索任务。
地址: http://cvit.iiit.ac.in/research/projects/cvit-projects/cartoonfaces 地址: http://cvit.iiit.ac.in/research/projects/cvit-projects/cartoonfaces
<a name="商品识别"></a> <a name="2.2.2"></a>
#### 2.2.2 商品识别 #### 2.2.2 商品识别
+ AliProduct: AliProduct数据集是目前开源最大的商品数据集,它是一个SKU级别的图像分类数据集, 包含5万类别、300万张商品图像,商品图像的类别和总量均为业界之最。此数据集中涵盖了大量的生活用品、食物等,数据集中没有人工标注,数据较脏,数据分布较不均衡,且有很多相似的商品图片。 + AliProduct: AliProduct 数据集是目前开源最大的商品数据集,它是一个 SKU 级别的图像分类数据集,包含 5 万类别、300 万张商品图像,商品图像的类别和总量均为业界之最。此数据集中涵盖了大量的生活用品、食物等,数据集中没有人工标注,数据较脏,数据分布较不均衡,且有很多相似的商品图片。
地址: https://retailvisionworkshop.github.io/recognition_challenge_2020/ 地址: https://retailvisionworkshop.github.io/recognition_challenge_2020/
+ Product-10k: Products-10k数据集中的所有图片均来自京东商城。数据集中共包含1万个经常购买的SKU。所有SKU组织成一个层次结构。总共有近19万张图片。在实际应用场景中,图像量的分布是不均衡的。所有图像都由生产专家团队手工检查/标记。 + Product-10k: Products-10k 数据集中的所有图片均来自京东商城。数据集中共包含 1 万个经常购买的 SKU。所有 SKU 组织成一个层次结构。总共有近 19 万张图片。在实际应用场景中,图像量的分布是不均衡的。所有图像都由生产专家团队手工检查/标记。
地址:https://www.kaggle.com/c/products-10k/data?select=train.csv 地址:https://www.kaggle.com/c/products-10k/data?select=train.csv
+ DeepFashion-Inshop: 同通用图像识别数据集中的In-shop Clothes + DeepFashion-Inshop: 同通用图像识别数据集中的 In-shop Clothes
<a name="Logo识别"></a> <a name="2.2.3"></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 张图片。
地址: https://github.com/msn199959/Logo-2k-plus-Dataset 地址: https://github.com/msn199959/Logo-2k-plus-Dataset
+ 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> <a name="2.2.4"></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 张前视角图像。
地址: http://mmlab.ie.cuhk.edu.hk/datasets/comp_cars/ 地址: http://mmlab.ie.cuhk.edu.hk/datasets/comp_cars/
+ BoxCars: 此数据集共包含21250辆车、63750张图像、27个汽车制造商、148个细类别,此数据集全部来自监控数据。 + BoxCars: 此数据集共包含 21250 辆车、63750 张图像、27 个汽车制造商、148 个细类别,此数据集全部来自监控数据。
地址: https://github.com/JakubSochor/BoxCars 地址: https://github.com/JakubSochor/BoxCars
+ PKU-VD Dataset:该数据集包含了两个大型车辆数据集(VD1和VD2),它们分别从两个城市的真实世界不受限制的场景拍摄图像。其中VD1是从高分辨率交通摄像头获得的,VD2中的图像则是从监视视频中获取的。作者对原始数据执行车辆检测,以确保每个图像仅包含一辆车辆。由于隐私保护的限制,所有车牌号码都已被黑色覆盖遮挡。所有车辆图像均从前视图进行拍摄。 数据集中为每个图像提供了多样化的属性注释,包括身份编号,精确的车辆模型和车辆颜色。VD1原先包含1097649张图像,1232种车俩模型,11种车辆颜色,但删除图像里面有多辆车辆以及从车辆后方拍摄的图片,该数据集仅剩846358张图像,141756辆车辆。 VD2包含807260张图像,79763辆车辆,1112种车辆模型,11种车辆颜色。 + PKU-VD Dataset:该数据集包含了两个大型车辆数据集(VD1 和 VD2),它们分别从两个城市的真实世界不受限制的场景拍摄图像。其中 VD1 是从高分辨率交通摄像头获得的,VD2 中的图像则是从监视视频中获取的。作者对原始数据执行车辆检测,以确保每个图像仅包含一辆车辆。由于隐私保护的限制,所有车牌号码都已被黑色覆盖遮挡。所有车辆图像均从前视图进行拍摄。 数据集中为每个图像提供了多样化的属性注释,包括身份编号,精确的车辆模型和车辆颜色。VD1 原先包含 1097649 张图像,1232 种车俩模型,11 种车辆颜色,但删除图像里面有多辆车辆以及从车辆后方拍摄的图片,该数据集仅剩 846358 张图像,141756 辆车辆。 VD2 包含 807260 张图像,79763 辆车辆,1112 种车辆模型,11 种车辆颜色。
地址: https://pkuml.org/resources/pku-vds.html 地址: https://pkuml.org/resources/pku-vds.html
# 图像分类常见问题汇总 - 2020 第1 # 图像分类常见问题汇总 - 2020 第 1
## 目录 ## 目录
* [第1期](#第1期)(2020.11.03) * [1. 第 1 期](#1)(2020.11.03)
* [第2期](#第2期)(2020.11.11) * [2. 第 2 期](#2)(2020.11.11)
* [第3期](#第3期)(2020.11.18) * [3. 第 3 期](#3)(2020.11.18)
* [第4期](#第4期)(2020.12.07) * [4. 第 4 期](#4)(2020.12.07)
* [第5期](#第5期)(2020.12.17) * [5. 第 5 期](#5)(2020.12.17)
* [第6期](#第6期)(2020.12.30) * [6. 第 6 期](#6)(2020.12.30)
<a name="第1期"></a> <a name="1"></a>
## 第1 ## 第 1
### Q1.1: PaddleClas可以用来做什么? ### Q1.1: PaddleClas 可以用来做什么?
**A**:PaddleClas是飞桨为工业界和学术界所准备的一个图像分类任务的工具集,助力使用者训练出更好的视觉模型和应用落地。PaddleClas提供了基于图像分类的模型训练、评估、预测、部署全流程的服务,方便大家更加高效地学习图像分类。具体地,PaddleClas中包含如下一些特性。 **A**:PaddleClas 是飞桨为工业界和学术界所准备的一个图像分类任务的工具集,助力使用者训练出更好的视觉模型和应用落地。PaddleClas 提供了基于图像分类的模型训练、评估、预测、部署全流程的服务,方便大家更加高效地学习图像分类。具体地,PaddleClas 中包含如下一些特性。
* PaddleClas提供了36个系列的分类网络结构(ResNet, ResNet_vd, MobileNetV3, Res2Net, HRNet等)和训练配置,175个预训练模型和性能评估与预测,供大家选择并使用。 * PaddleClas 提供了 36 个系列的分类网络结构(ResNet, ResNet_vd, MobileNetV3, Res2Net, HRNet 等)和训练配置,175 个预训练模型和性能评估与预测,供大家选择并使用。
* PaddleClas提供了TensorRT预测、python inference、c++ inference、Paddle-Lite预测部署、PaddleServing、PaddleHub等多种预测部署推理方案,在方便在多种环境中进行部署推理。 * PaddleClas 提供了 TensorRT 预测、python inference、c++ inference、Paddle-Lite 预测部署、PaddleServing、PaddleHub 等多种预测部署推理方案,在方便在多种环境中进行部署推理。
* PaddleClas提供了一种简单的SSLD知识蒸馏方案,基于该方案蒸馏模型的识别准确率普遍提升3%以上。 * PaddleClas 提供了一种简单的 SSLD 知识蒸馏方案,基于该方案蒸馏模型的识别准确率普遍提升 3% 以上。
* PaddleClas支持AutoAugment、Cutout、Cutmix等8种数据增广算法详细介绍、代码复现和在统一实验环境下的效果评估。 * PaddleClas 支持 AutoAugment、Cutout、Cutmix 等 8 种数据增广算法详细介绍、代码复现和在统一实验环境下的效果评估。
* PaddleClas支持在Windows/Linux/MacOS环境中基于CPU/GPU进行使用。 * PaddleClas 支持在 Windows/Linux/MacOS 环境中基于 CPU/GPU 进行使用。
### Q1.2: ResNet系列模型是什么?有哪些模型?为什么在服务器端如此推荐ResNet系列模型? ### Q1.2: ResNet 系列模型是什么?有哪些模型?为什么在服务器端如此推荐 ResNet 系列模型?
**A**: ResNet中创新性地引入了残差结构,通过堆叠多个残差结构从而构建了ResNet网络。实验表明使用残差块可以有效地提升收敛速度和精度,PaddleClas中,ResNet从小到达,依次有包含18、34、50、101、152、200层的ResNet结构,ResNet系列模型于2015年被提出,在不同的应用场景中,如分类、检测、分割等,都已经验证过其有效性,业界也早已对其进行了大量优化,该系列模型在速度和精度方面都有着非常明显的优势,对基于TensorRT以及FP16的预测支持得也很好,因而推荐大家使用ResNet系列模型;由于其模型所占存储相对较大,因此常用于服务器端。更多关于ResNet模型的介绍可以参考论文[Deep Residual Learning for Image Recognition](https://arxiv.org/abs/1512.03385) **A**: ResNet 中创新性地引入了残差结构,通过堆叠多个残差结构从而构建了 ResNet 网络。实验表明使用残差块可以有效地提升收敛速度和精度,PaddleClas 中,ResNet 从小到达,依次有包含 18、34、50、101、152、200 层的 ResNet 结构,ResNet 系列模型于 2015 年被提出,在不同的应用场景中,如分类、检测、分割等,都已经验证过其有效性,业界也早已对其进行了大量优化,该系列模型在速度和精度方面都有着非常明显的优势,对基于 TensorRT 以及 FP16 的预测支持得也很好,因而推荐大家使用 ResNet 系列模型;由于其模型所占存储相对较大,因此常用于服务器端。更多关于 ResNet 模型的介绍可以参考论文 [Deep Residual Learning for Image Recognition](https://arxiv.org/abs/1512.03385)
### Q1.3: ResNet_vd和ResNet、ResNet_vc结构有什么区别呢? ### Q1.3: ResNet_vd 和 ResNet、ResNet_vc 结构有什么区别呢?
**A**: **A**:
ResNet_va至vd的结构如下图所示,ResNet最早提出时为va结构,在降采样残差模块这个部分,在左边的特征变换通路中(Path A),第一个1x1卷积部分就行了降采样,从而导致信息丢失(卷积的kernel size为1,stride为2,输入特征图中 有部分特征没有参与卷积的计算);在vb结构中,把降采样的步骤从最开始的第一个1x1卷积调整到中间的3x3卷积中,从而避免了信息丢失的问题,PaddleClas中的ResNet模型默认就是ResNet_vb;vc结构则是将最开始这个7x7的卷积变成3个3x3的卷积,在感受野不变的情况下,计算量和存储大小几乎不变,而且实验证明精度相对于vb结构有所提升;vd结构是修改了降采样残差模块右边的特征通路(Path B)。把降采样的过程由平均池化这个操作去替代了,这一系列的改进(va->vd),几乎没有带来新增的预测耗时,结合适当的训练策略,比如说标签平滑以及mixup数据增广,精度可以提升高达2.7%。 ResNet_va 至 vd 的结构如下图所示,ResNet 最早提出时为 va 结构,在降采样残差模块这个部分,在左边的特征变换通路中(Path A),第一个 1x1 卷积部分就行了降采样,从而导致信息丢失(卷积的 kernel size 为 1,stride 为 2,输入特征图中 有部分特征没有参与卷积的计算);在 vb 结构中,把降采样的步骤从最开始的第一个 1x1 卷积调整到中间的 3x3 卷积中,从而避免了信息丢失的问题,PaddleClas 中的 ResNet 模型默认就是 ResNet_vb;vc 结构则是将最开始这个 7x7 的卷积变成 3 个 3x3 的卷积,在感受野不变的情况下,计算量和存储大小几乎不变,而且实验证明精度相对于 vb 结构有所提升;vd 结构是修改了降采样残差模块右边的特征通路(Path B)。把降采样的过程由平均池化这个操作去替代了,这一系列的改进(va->vd),几乎没有带来新增的预测耗时,结合适当的训练策略,比如说标签平滑以及 mixup 数据增广,精度可以提升高达 2.7%。
<div align="center"> <div align="center">
<img src="../../images/faq/ResNet_vabcd_structure.png" width="800"> <img src="../../images/faq/ResNet_vabcd_structure.png" width="800">
</div> </div>
### Q1.4 如果确定使用ResNet系列模型,怎么根据实际的场景需求选用不同的模型呢? ### Q1.4 如果确定使用 ResNet 系列模型,怎么根据实际的场景需求选用不同的模型呢?
**A**: **A**:
ResNet系列模型中,相比于其他模型,ResNet_vd模型在预测速度几乎不变的情况下,精度有非常明显的提升,因此推荐大家使用ResNet_vd系列模型。 ResNet 系列模型中,相比于其他模型,ResNet_vd 模型在预测速度几乎不变的情况下,精度有非常明显的提升,因此推荐大家使用 ResNet_vd 系列模型。
[ResNet及其vd系列模型文档](../models/ResNet_and_vd.md)中给出了batch size=4的情况下,在T4 GPU上,不同模型的的预测耗时、FLOPs、Params与精度的变化曲线,可以根据自己自己的实际部署场景中的需求,去选择合适的模型,如果希望模型存储大小尽可能小或者预测速度尽可能快,则可以使用ResNet18_vd模型,如果希望获得尽可能高的精度,则建议使用ResNet152_vd或者ResNet200_vd模型。更多关于ResNet系列模型的介绍可以参考文档:[ResNet及其vd系列模型文档](../models/ResNet_and_vd.md) [ResNet 及其 vd 系列模型文档](../models/ResNet_and_vd.md)中给出了 batch size=4 的情况下,在 T4 GPU 上,不同模型的的预测耗时、FLOPs、Params 与精度的变化曲线,可以根据自己自己的实际部署场景中的需求,去选择合适的模型,如果希望模型存储大小尽可能小或者预测速度尽可能快,则可以使用 ResNet18_vd 模型,如果希望获得尽可能高的精度,则建议使用 ResNet152_vd 或者 ResNet200_vd 模型。更多关于 ResNet 系列模型的介绍可以参考文档:[ResNet 及其 vd 系列模型文档](../models/ResNet_and_vd.md)
* 精度-预测速度变化曲线 * 精度-预测速度变化曲线
...@@ -44,97 +44,97 @@ ResNet系列模型中,相比于其他模型,ResNet_vd模型在预测速度 ...@@ -44,97 +44,97 @@ ResNet系列模型中,相比于其他模型,ResNet_vd模型在预测速度
<img src="../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.png" width="800"> <img src="../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.png" width="800">
</div> </div>
* 精度-params变化曲线 * 精度-params 变化曲线
<div align="center"> <div align="center">
<img src="../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.params.png" width="800"> <img src="../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.params.png" width="800">
</div> </div>
* 精度-flops变化曲线 * 精度-flops 变化曲线
<div align="center"> <div align="center">
<img src="../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.flops.png" width="800"> <img src="../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.flops.png" width="800">
</div> </div>
### Q1.5 在网络中的block里conv-bn-relu是固定的形式吗? ### Q1.5 在网络中的 block 里 conv-bn-relu 是固定的形式吗?
**A**: 在batch-norm出现之前,主流的卷积神经网络的固定形式是conv-relu。在现阶段的卷积神经网络中,conv-bn-relu是大部分网络中block的固定形式,这样的设计是相对鲁棒的结构,此外,DenseNet中的block选用的是bn-relu-conv的形式,ResNet-V2中也使用的是这种组合方式。在MobileNetV2中,为了不丢失信息,部分block中间的层没有使用relu激活函数,选用的是conv-bn的形式。 **A**: 在 batch-norm 出现之前,主流的卷积神经网络的固定形式是 conv-relu。在现阶段的卷积神经网络中,conv-bn-relu 是大部分网络中 block 的固定形式,这样的设计是相对鲁棒的结构,此外,DenseNet 中的 block 选用的是 bn-relu-conv 的形式,ResNet-V2 中也使用的是这种组合方式。在 MobileNetV2 中,为了不丢失信息,部分 block 中间的层没有使用 relu 激活函数,选用的是 conv-bn 的形式。
### Q1.6 ResNet34与ResNet50的区别? ### Q1.6 ResNet34 与 ResNet50 的区别?
**A**: ResNet系列中有两种不同的block,分别是basic-block和bottleneck-block,堆叠较多这样的block组成了ResNet网络。basic-block是带有shortcut的两个3x3的卷积核的堆叠,bottleneck-block是带有shortcut的1x1卷积核、3x3卷积核、1x1卷积核的堆叠,所以basic-block中有两层,bottleneck-block有三层。ResNet34和ResNet50中堆叠的block数相同,但是堆叠的种类分别是basic-block和bottleneck-block。 **A**: ResNet 系列中有两种不同的 block,分别是 basic-block 和 bottleneck-block,堆叠较多这样的 block 组成了 ResNet 网络。basic-block 是带有 shortcut 的两个 3x3 的卷积核的堆叠,bottleneck-block 是带有 shortcut 的 1x1 卷积核、3x3 卷积核、1x1 卷积核的堆叠,所以 basic-block 中有两层,bottleneck-block 有三层。ResNet34 和 ResNet50 中堆叠的 block 数相同,但是堆叠的种类分别是 basic-block 和 bottleneck-block。
### Q1.7 大卷积核一定可以带来正向收益吗? ### Q1.7 大卷积核一定可以带来正向收益吗?
**A**: 不一定,将网络中的所有卷积核都增大未必会带来性能的提升,甚至会有有损性能,在论文[MixConv: Mixed Depthwise Convolutional Kernels](https://arxiv.org/abs/1907.09595) **A**: 不一定,将网络中的所有卷积核都增大未必会带来性能的提升,甚至会有有损性能,在论文 [MixConv: Mixed Depthwise Convolutional Kernels](https://arxiv.org/abs/1907.09595)
中指出,在一定范围内提升卷积核大小对精度的提升有正向作用,但是超出后会有损精度。所以考虑到模型的大小、计算量等问题,一般不选用大的卷积核去设计网络。同时,在[PP-LCNet](../models/PP-LCNet.md)文章中,也有关于大卷积核的实验。 中指出,在一定范围内提升卷积核大小对精度的提升有正向作用,但是超出后会有损精度。所以考虑到模型的大小、计算量等问题,一般不选用大的卷积核去设计网络。同时,在 [PP-LCNet](../models/PP-LCNet.md) 文章中,也有关于大卷积核的实验。
<a name="第2期"></a> <a name="2"></a>
## 第2 ## 第 2
### Q2.1: PaddleClas如何训练自己的backbone? ### Q2.1: PaddleClas 如何训练自己的 backbone?
**A**:具体流程如下: **A**:具体流程如下:
* 首先在ppcls/arch/backbone/model_zoo/文件夹下新建一个自己的模型结构文件,即你自己的backbone,模型搭建可以参考resnet.py; * 首先在 ppcls/arch/backbone/model_zoo/ 文件夹下新建一个自己的模型结构文件,即你自己的 backbone,模型搭建可以参考 resnet.py;
* 然后在ppcls/arch/backbone/\_\_init\_\_.py中添加自己设计的backbone的类; * 然后在 ppcls/arch/backbone/\_\_init\_\_.py 中添加自己设计的 backbone 的类;
* 其次配置训练的yaml文件,此处可以参考ppcls/configs/ImageNet/ResNet/ResNet50.yaml; * 其次配置训练的 yaml 文件,此处可以参考 ppcls/configs/ImageNet/ResNet/ResNet50.yaml;
* 最后启动训练即可。 * 最后启动训练即可。
### Q2.2: 如何利用已有的模型和权重对自己的分类任务进行迁移? ### Q2.2: 如何利用已有的模型和权重对自己的分类任务进行迁移?
**A**: 具体流程如下: **A**: 具体流程如下:
* 首先,好的预训练模型往往会有更好的迁移效果,所以建议选用精度较高的预训练模型,PaddleClas提供了一系列业界领先的预训练模型,建议使用; * 首先,好的预训练模型往往会有更好的迁移效果,所以建议选用精度较高的预训练模型,PaddleClas 提供了一系列业界领先的预训练模型,建议使用;
* 其次,要根据迁移的数据集的规模来确定训练超参数,一般超参数需要调试才可以寻找到一个局部最优值,如果没有相关经验,建议先从learning rate开始调起,一般来说,规模较小的数据集使用较小的learning rate,如0.001,另外,建议学习率使用warmup策略,避免过大的学习率破坏预训练模型的权重。在迁移过程中,也可以设置backbone中不同层的学习率,往往从网络的头部到尾补学习率逐渐减小效果较好。在数据集规模较小的时候,也可以使用数据增强策略,PaddleClas提供了8中强有力的数据增强策略,为更高的精度保驾护航。 * 其次,要根据迁移的数据集的规模来确定训练超参数,一般超参数需要调试才可以寻找到一个局部最优值,如果没有相关经验,建议先从 learning rate 开始调起,一般来说,规模较小的数据集使用较小的 learning rate,如 0.001,另外,建议学习率使用 warmup 策略,避免过大的学习率破坏预训练模型的权重。在迁移过程中,也可以设置 backbone 中不同层的学习率,往往从网络的头部到尾补学习率逐渐减小效果较好。在数据集规模较小的时候,也可以使用数据增强策略,PaddleClas 提供了 8 中强有力的数据增强策略,为更高的精度保驾护航。
* 训练结束后,可以反复迭代上述过程,直到寻找到局部最优值。 * 训练结束后,可以反复迭代上述过程,直到寻找到局部最优值。
### Q2.3: PaddleClas中configs下的默认参数适合任何一个数据集吗? ### Q2.3: PaddleClas 中 configs 下的默认参数适合任何一个数据集吗?
**A**: PaddleClas中的ppcls/configs/ImageNet/下的配置文件默认参数是ImageNet-1k的训练参数,这个参数并不适合所有的数据集,具体数据集需要在此基础上进一步调试。 **A**: PaddleClas 中的 ppcls/configs/ImageNet/下的配置文件默认参数是 ImageNet-1k 的训练参数,这个参数并不适合所有的数据集,具体数据集需要在此基础上进一步调试。
### Q2.4 PaddleClas中的不同的模型使用了不同的分辨率,标配的应该是多少呢? ### Q2.4 PaddleClas 中的不同的模型使用了不同的分辨率,标配的应该是多少呢?
**A**: PaddleClas严格遵循了论文作者的使用的分辨率。自2012年AlexNet以来,大多数的卷积神经网络在ImageNet上训练的分辨率为224x224,Google在设计InceptionV3的时候为了适应网络结构将分辨率调至299x299,之后其推出的Xception、InceptionV4也是使用的该分辨率。此外,在EfficeintNet中,作者分析了不同规模的网络应该使用不同的分辨率,所以该系列网络中每个不同大小的网络都使用了不同的分辨率。在实际使用场景中,推荐使用默认的分辨率,当然,层数较深或者宽度较大的网络也可以尝试使用更大的分辨率。 **A**: PaddleClas 严格遵循了论文作者的使用的分辨率。自 2012 年 AlexNet 以来,大多数的卷积神经网络在 ImageNet 上训练的分辨率为 224x224,Google 在设计 InceptionV3 的时候为了适应网络结构将分辨率调至 299x299,之后其推出的 Xception、InceptionV4 也是使用的该分辨率。此外,在 EfficeintNet 中,作者分析了不同规模的网络应该使用不同的分辨率,所以该系列网络中每个不同大小的网络都使用了不同的分辨率。在实际使用场景中,推荐使用默认的分辨率,当然,层数较深或者宽度较大的网络也可以尝试使用更大的分辨率。
### Q2.5 PaddleClas中提供了很多ssld模型,其应用的价值是? ### Q2.5 PaddleClas 中提供了很多 ssld 模型,其应用的价值是?
**A**: PaddleClas中提供了很多ssld预训练模型,其通过半监督知识蒸馏的方法获得了更好的预训练权重,在迁移任务或者下游视觉任务中,无须替换结构文件、只需要替换精度更高的ssld预训练模型即可提升精度,如在PaddleSeg中,[HRNet](https://github.com/PaddlePaddle/PaddleSeg/blob/release/v0.7.0/docs/model_zoo.md)使用了ssld预训练模型的权重后,精度大幅度超越业界同样的模型的精度,在PaddleDetection中,[PP-YOLO](https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.4/configs/ppyolo/README_cn.md)使用了ssld预训练权重后,在较高的baseline上仍有进一步的提升。使用ssld预训练权重做分类的迁移表现也很抢眼,在[SSLD蒸馏策略](../advanced_tutorials/knowledge_distillation.md)部分介绍了知识蒸馏对于分类任务迁移的收益。 **A**: PaddleClas 中提供了很多 ssld 预训练模型,其通过半监督知识蒸馏的方法获得了更好的预训练权重,在迁移任务或者下游视觉任务中,无须替换结构文件、只需要替换精度更高的 ssld 预训练模型即可提升精度,如在 PaddleSeg 中,[HRNet](https://github.com/PaddlePaddle/PaddleSeg/blob/release/v0.7.0/docs/model_zoo.md) 使用了 ssld 预训练模型的权重后,精度大幅度超越业界同样的模型的精度,在 PaddleDetection 中,[PP-YOLO](https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.4/configs/ppyolo/README_cn.md) 使用了 ssld 预训练权重后,在较高的 baseline 上仍有进一步的提升。使用 ssld 预训练权重做分类的迁移表现也很抢眼,在 [SSLD 蒸馏策略](../advanced_tutorials/knowledge_distillation.md) 部分介绍了知识蒸馏对于分类任务迁移的收益。
<a name="第3期"></a> <a name="3"></a>
## 第3 ## 第 3
### Q3.1: DenseNet模型相比于ResNet有什么改进呢?有哪些特点或者应用场景呢? ### Q3.1: DenseNet 模型相比于 ResNet 有什么改进呢?有哪些特点或者应用场景呢?
**A**: DenseNet相比于ResNet,设计了一个更激进的密集连接机制,通过考虑特征重用和旁路的设置,进一步减少了参数量,而且从一定程度上缓解了梯度弥散的问题,因为引入了更加密集的连接,因此模型更容易训练,而且具有一定的正则化效果。在数据量不是很多的图像分类场景中,DenseNet是一个不错的选择。更多关于DenseNet的介绍与系列模型可以参考[DenseNet模型文档](../models/DPN_DenseNet.md) **A**: DenseNet 相比于 ResNet,设计了一个更激进的密集连接机制,通过考虑特征重用和旁路的设置,进一步减少了参数量,而且从一定程度上缓解了梯度弥散的问题,因为引入了更加密集的连接,因此模型更容易训练,而且具有一定的正则化效果。在数据量不是很多的图像分类场景中,DenseNet 是一个不错的选择。更多关于 DenseNet 的介绍与系列模型可以参考 [DenseNet 模型文档](../models/DPN_DenseNet.md)
### Q3.2: DPN网络相比于DenseNet有哪些改进呢? ### Q3.2: DPN 网络相比于 DenseNet 有哪些改进呢?
**A**:DPN的全称是Dual Path Networks,即双通道网络。该网络是由DenseNet和ResNeXt结合的一个网络,其证明了DenseNet能从靠前的层级中提取到新的特征,而ResNeXt本质上是对之前层级中已提取特征的复用。作者进一步分析发现,ResNeXt对特征有高复用率,但冗余度低,DenseNet能创造新特征,但冗余度高。结合二者结构的优势,作者设计了DPN网络。最终DPN网络在同样FLOPS和参数量下,取得了比ResNeXt与DenseNet更好的结果。更多关于DPN的介绍与系列模型可以参考[DPN模型文档](../models/DPN_DenseNet.md) **A**:DPN 的全称是 Dual Path Networks,即双通道网络。该网络是由 DenseNet 和 ResNeXt 结合的一个网络,其证明了 DenseNet 能从靠前的层级中提取到新的特征,而 ResNeXt 本质上是对之前层级中已提取特征的复用。作者进一步分析发现,ResNeXt 对特征有高复用率,但冗余度低,DenseNet 能创造新特征,但冗余度高。结合二者结构的优势,作者设计了 DPN 网络。最终 DPN 网络在同样 FLOPS 和参数量下,取得了比 ResNeXt 与 DenseNet 更好的结果。更多关于 DPN 的介绍与系列模型可以参考 [DPN 模型文档](../models/DPN_DenseNet.md)
### Q3.3: 怎么使用多个模型进行预测融合呢? ### Q3.3: 怎么使用多个模型进行预测融合呢?
**A** 使用多个模型进行预测的时候,建议首先将预训练模型导出为inference模型,这样可以摆脱对网络结构定义的依赖,可以参考[模型导出脚本](../../../tools/export_model.py)进行模型导出,之后再参考[inference模型预测脚本](../../../deploy/python/predict_cls.py)进行预测即可,在这里需要根据自己使用模型的数量创建多个predictor。 **A** 使用多个模型进行预测的时候,建议首先将预训练模型导出为 inference 模型,这样可以摆脱对网络结构定义的依赖,可以参考[模型导出脚本](../../../tools/export_model.py)进行模型导出,之后再参考 [inference 模型预测脚本](../../../deploy/python/predict_cls.py)进行预测即可,在这里需要根据自己使用模型的数量创建多个 predictor。
### Q3.4: PaddleClas中怎么增加自己的数据增广方法呢? ### Q3.4: PaddleClas 中怎么增加自己的数据增广方法呢?
**A** **A**
* 对于单张图像的增广,可以参考[基于单张图片的数据增广脚本](../../../ppcls/data/preprocess/ops),参考`ResizeImage`或者`CropImage`等数据算子的写法,创建一个新的类,然后在`__call__`中,实现对应的增广方法即可。 * 对于单张图像的增广,可以参考[基于单张图片的数据增广脚本](../../../ppcls/data/preprocess/ops),参考 `ResizeImage `或者 `CropImage` 等数据算子的写法,创建一个新的类,然后在 `__call__` 中,实现对应的增广方法即可。
* 对于一个batch图像的增广,可以参考[基于batch数据的数据增广脚本](../../../ppcls/data/preprocess/batch_ops),参考`MixupOperator`或者`CutmixOperator`等数据算子的写法,创建一个新的类,然后在`__call__`中,实现对应的增广方法即可。 * 对于一个 batch 图像的增广,可以参考[基于 batch 数据的数据增广脚本](../../../ppcls/data/preprocess/batch_ops),参考 `MixupOperator` 或者 `CutmixOperator` 等数据算子的写法,创建一个新的类,然后在 `__call__` 中,实现对应的增广方法即可。
## Q3.5: 怎么进一步加速模型训练过程呢? ## Q3.5: 怎么进一步加速模型训练过程呢?
**A** **A**
* 可以使用自动混合精度进行训练,这在精度几乎无损的情况下,可以有比较明显的速度收益,以ResNet50为例,PaddleClas中使用自动混合精度训练的配置文件可以参考:[ResNet50_fp16.yml](../../../ppcls/configs/ImageNet/ResNet/ResNet50_fp16.yaml),主要就是需要在标准的配置文件中添加以下几行 * 可以使用自动混合精度进行训练,这在精度几乎无损的情况下,可以有比较明显的速度收益,以 ResNet50 为例,PaddleClas 中使用自动混合精度训练的配置文件可以参考:[ResNet50_fp16.yml](../../../ppcls/configs/ImageNet/ResNet/ResNet50_fp16.yaml),主要就是需要在标准的配置文件中添加以下几行
``` ```
# mixed precision training # mixed precision training
...@@ -144,34 +144,34 @@ AMP: ...@@ -144,34 +144,34 @@ AMP:
use_pure_fp16: &use_pure_fp16 True use_pure_fp16: &use_pure_fp16 True
``` ```
* 可以开启dali,将数据预处理方法放在GPU上运行,在模型比较小时(reader耗时占比更高一些),开启dali会带来比较明显的训练速度收益,在训练的时候,添加`-o Global.use_dali=True`即可使用dali进行训练,更多关于 dali 安装与介绍可以参考:[dali安装教程](https://docs.nvidia.com/deeplearning/dali/user-guide/docs/installation.html#nightly-builds) * 可以开启 dali,将数据预处理方法放在 GPU 上运行,在模型比较小时(reader 耗时占比更高一些),开启 dali 会带来比较明显的训练速度收益,在训练的时候,添加 `-o Global.use_dali=True` 即可使用 dali 进行训练,更多关于 dali 安装与介绍可以参考:[dali 安装教程](https://docs.nvidia.com/deeplearning/dali/user-guide/docs/installation.html#nightly-builds)
<a name="第4期"></a> <a name="4"></a>
## 第4 ## 第 4
### Q4.1: PaddlePaddle 的模型文件都有哪几种? ### Q4.1: PaddlePaddle 的模型文件都有哪几种?
**A**: **A**:
* PaddlePaddle保存的模型相关文件有两类: * PaddlePaddle 保存的模型相关文件有两类:
* 一类是用于*推理部署*的文件,包括后缀名为`pdiparams`”、“`model`”的文件,其中“`pdiparams`”文件存储了模型参数信息,“`model`”文件存储了模型网络结构信息,对于推理部署文件,使用`paddle.jit.save``paddle.jit.load`接口进行保存、加载。 * 一类是用于*推理部署*的文件,包括后缀名为`pdiparams`”、“`model`” 的文件,其中 “`pdiparams`” 文件存储了模型参数信息,“`model`” 文件存储了模型网络结构信息,对于推理部署文件,使用 `paddle.jit.save``paddle.jit.load` 接口进行保存、加载。
* 另一类模型相关文件则是用于*训练调优*过程中,包括后缀名为`pdparams`”和“`pdopt`”的文件,其中“`pdparams`”文件存储了训练过程中的模型参数信息,“`pdopt`”文件存储了模型训练过程中的优化器信息,对于训练调优文件,使用`paddle.save``paddle.load`接口进行保存、加载。 * 另一类模型相关文件则是用于*训练调优*过程中,包括后缀名为`pdparams`” 和 “`pdopt`” 的文件,其中 “`pdparams`” 文件存储了训练过程中的模型参数信息,“`pdopt`” 文件存储了模型训练过程中的优化器信息,对于训练调优文件,使用 `paddle.save``paddle.load` 接口进行保存、加载。
* 利用推理部署文件,即可构建模型网络结构并加载模型参数,用于预测,利用训练调优文件,即可加载模型参数、优化器信息,用于恢复训练过程。 * 利用推理部署文件,即可构建模型网络结构并加载模型参数,用于预测,利用训练调优文件,即可加载模型参数、优化器信息,用于恢复训练过程。
### Q4.2: HRNet的创新点体现在哪里? ### Q4.2: HRNet 的创新点体现在哪里?
**A**: **A**:
* 在图像分类领域,大部分神经网络的设计思想是提取图像的高维特征,具体来说,通常输入图像的空间分辨率较高,通过多层卷积、池化,可以逐步得到空间分辨率更低,但是维度更高的特征图,然后可用于分类等场景。 * 在图像分类领域,大部分神经网络的设计思想是提取图像的高维特征,具体来说,通常输入图像的空间分辨率较高,通过多层卷积、池化,可以逐步得到空间分辨率更低,但是维度更高的特征图,然后可用于分类等场景。
* 然而*HRNet*的作者认为这种逐步降低空间分辨率的设计思想并不适合目标检测(图像区域层次的分类任务)、语义分割(图像像素层次的分类任务)等场景,因为空间分辨率在逐步降低的过程中,会丢失很多信息,最终学习得到的特征难以表达原始图像在高空间分辨率的信息,而区域层次分类任务和像素层次分类任务都对空间精度十分敏感。 * 然而 *HRNet* 的作者认为这种逐步降低空间分辨率的设计思想并不适合目标检测(图像区域层次的分类任务)、语义分割(图像像素层次的分类任务)等场景,因为空间分辨率在逐步降低的过程中,会丢失很多信息,最终学习得到的特征难以表达原始图像在高空间分辨率的信息,而区域层次分类任务和像素层次分类任务都对空间精度十分敏感。
* 因此*HRNet*的作者提出了并联不同空间分辨率特征图的思想,与此相对,*VGG*等神经网络则是通过不同的卷积池化层来串联不同空间分辨率的特征图。并且,*HRNet*通过连接同等深度、不同空间分辨率的特征图,使得不同空间分辨率特征图的信息可以得到充分交换,具体的网络结构如下图所示。 * 因此 *HRNet* 的作者提出了并联不同空间分辨率特征图的思想,与此相对,*VGG* 等神经网络则是通过不同的卷积池化层来串联不同空间分辨率的特征图。并且,*HRNet* 通过连接同等深度、不同空间分辨率的特征图,使得不同空间分辨率特征图的信息可以得到充分交换,具体的网络结构如下图所示。
<div align="center"> <div align="center">
<img src="../../images/faq/HRNet.png" width="800"> <img src="../../images/faq/HRNet.png" width="800">
</div> </div>
### Q4.3: 在HRNet中,对于不同空间分辨率的特征图之间,是如何建立连接的? ### Q4.3: 在 HRNet 中,对于不同空间分辨率的特征图之间,是如何建立连接的?
**A**: **A**:
* 首先,在*HRNet*中,对特征图使用*stride**2**3 × 3*卷积,可以得到低空间分辨率但是为度更高的特征图;而对低空间分辨率特征图先使用*1 × 1*卷积进行通道数匹配,再使用最近邻插值的方式进行上采样,即可得到与高空间分辨率特征图相同空间分辨率、通道数的特征图;而对于相同空间分辨率的特征图,直接进行恒等映射即可。具体如下图所示。 * 首先,在 *HRNet* 中,对特征图使用 *stride**2**3 × 3* 卷积,可以得到低空间分辨率但是为度更高的特征图;而对低空间分辨率特征图先使用 *1 × 1* 卷积进行通道数匹配,再使用最近邻插值的方式进行上采样,即可得到与高空间分辨率特征图相同空间分辨率、通道数的特征图;而对于相同空间分辨率的特征图,直接进行恒等映射即可。具体如下图所示。
<div align="center"> <div align="center">
<img src="../../images/faq/HRNet_block.png" width="800"> <img src="../../images/faq/HRNet_block.png" width="800">
...@@ -180,121 +180,121 @@ AMP: ...@@ -180,121 +180,121 @@ AMP:
### Q4.4: 模型中的“SE”表示什么意思? ### Q4.4: 模型中的“SE”表示什么意思?
**A**: **A**:
* SE表示该模型使用了SE结构。SE结构来自于2017年ImageNet分类比赛的冠军方案*Squeeze-and-Excitation Networks(SENet)**SENet*提出的SE结构可以迁移到任何其他网络中。其创新点是通过额外学习*scale*向量作为权重作用到特征图上,*scale*向量维度与特征图通道数相同,学习到的*scale*向量中每个维度上的数值表示对该维度特征通道的增强或减弱的大小,以此达到对重要的特征通道进行增强,不重要特征通道减弱的效果,从而让提取的特征指向性更强。 * SE 表示该模型使用了 SE 结构。SE 结构来自于 2017 年 ImageNet 分类比赛的冠军方案 *Squeeze-and-Excitation Networks(SENet)**SENet* 提出的 SE 结构可以迁移到任何其他网络中。其创新点是通过额外学习 *scale* 向量作为权重作用到特征图上, *scale* 向量维度与特征图通道数相同,学习到的 *scale* 向量中每个维度上的数值表示对该维度特征通道的增强或减弱的大小,以此达到对重要的特征通道进行增强,不重要特征通道减弱的效果,从而让提取的特征指向性更强。
### Q4.5: SE结构具体如何实现的? ### Q4.5: SE 结构具体如何实现的?
<div align="center"> <div align="center">
<img src="../../images/faq/SE_structure.png" width="800"> <img src="../../images/faq/SE_structure.png" width="800">
</div> </div>
**A**: **A**:
* *SE*结构具体如上图所示,首先,*Ftr*表示常规的卷积操作,*X**U*则是*Ftr*的输入与输出的特征图,在得到特征图*U*后,使用*Fsq**Fex*操作求得*scale*向量,*scale*向量维度为*C*,与*U*通道数相同,因此可以通过乘积的方式作用到*U*上,进而得到*X~* * *SE*结构具体如上图所示,首先,*Ftr* 表示常规的卷积操作,*X**U* 则是 *Ftr* 的输入与输出的特征图,在得到特征图*U*后,使用 *Fsq**Fex* 操作求得 *scale* 向量,*scale* 向量维度为 *C*,与 *U* 通道数相同,因此可以通过乘积的方式作用到 *U* 上,进而得到 *X~*
* 具体地,*Fsq**Global Average Pooling*操作,*SENet*作者将其称之为*Squeeze*,因为该操作可以将*U**C × H × W*压缩到*C × 1 × 1*,对*Fsq*的输出再做*Fex*操作。 * 具体地,*Fsq**Global Average Pooling* 操作,*SENet* 作者将其称之为 *Squeeze*,因为该操作可以将 *U**C × H × W* 压缩到 *C × 1 × 1*,对 *Fsq* 的输出再做 *Fex* 操作。
* *Fex*操作表示两次全连接,作者将该操作称为*Excitation*。其中第一次全连接将向量的维度从*1 × 1 × C*压缩到*1 × 1 × C/r*,然后使用*RELU*,再通过第二次全连接将向量的维度恢复到*C*,这样操作的目的是为了减小计算量,*SENet*作者通过实验得出结论:在*r=16*时可以获得增益与计算量之间的平衡。 * *Fex*操作表示两次全连接,作者将该操作称为 *Excitation*。其中第一次全连接将向量的维度从 *1 × 1 × C* 压缩到 *1 × 1 × C/r*,然后使用 *RELU*,再通过第二次全连接将向量的维度恢复到 *C*,这样操作的目的是为了减小计算量,*SENet* 作者通过实验得出结论:在 *r=16* 时可以获得增益与计算量之间的平衡。
* 对于*Fsq*部分,关键是求得*C*维的向量,因此不局限于使用*Global Average Pooling*操作,*SENet*作者认为,最终求得的*scale*是按通道分别作用于*U*的,因此需要基于对应通道的信息计算对应的*scale*,故使用了最简单的*Global Average Pooling*操作,最终求得的*scale*向量表示了不同通道之间的分布关系,而忽略了同一个通道中的分布关系。 * 对于*Fsq*部分,关键是求得 *C* 维的向量,因此不局限于使用 *Global Average Pooling* 操作,*SENet* 作者认为,最终求得的 *scale* 是按通道分别作用于 *U* 的,因此需要基于对应通道的信息计算对应的 *scale*,故使用了最简单的 *Global Average Pooling* 操作,最终求得的 *scale* 向量表示了不同通道之间的分布关系,而忽略了同一个通道中的分布关系。
* 对于*Fex*部分,其作用是为了在每一个*mini batch*上的训练来求得基于所有训练数据的分布。因为我们的训练是在*mini batch*上进行的,而基于全部训练数据求得的*scale*才是最佳的,使用*Fex*部分,可以通过在每个*mini batch*上的训练来求得更为逼近全部训练数据的*scale* * 对于 *Fex* 部分,其作用是为了在每一个 *mini batch* 上的训练来求得基于所有训练数据的分布。因为我们的训练是在*mini batch*上进行的,而基于全部训练数据求得的 *scale* 才是最佳的,使用 *Fex* 部分,可以通过在每个 *mini batch* 上的训练来求得更为逼近全部训练数据的 *scale*
<a name="第5期"></a> <a name="5"></a>
## 第5 ## 第 5
### Q5.1 如何选择优化器? ### Q5.1 如何选择优化器?
**A**:自深度学习发展以来,就有很多关于优化器的研究者工作,优化器的目的是为了让损失函数尽可能的小,从而找到合适的权重来完成某项任务。目前业界主要用到的优化器有SGD、RMSProp、Adam、AdaDelt等,其中由于带momentum的SGD优化器广泛应用于学术界和工业界(此处仅限于分类任务),所以我们发布的模型也大都使用该优化器来实现损失函数的梯度下降。带momentum的SGD优化器有两个劣势,其一是收敛速度慢,其二是初始学习率的设置需要依靠大量的经验,然而如果初始学习率设置得当并且迭代轮数充足,该优化器也会在众多的优化器中脱颖而出,使得其在验证集上获得更高的准确率。一些自适应学习率的优化器如Adam、RMSProp等,收敛速度往往比较快,但是最终的收敛精度会稍差一些。如果追求更快的收敛速度,我们推荐使用这些自适应学习率的优化器,如果追求更高的收敛精度,我们推荐使用带momentum的SGD优化器。具体到数据集来说: **A**:自深度学习发展以来,就有很多关于优化器的研究者工作,优化器的目的是为了让损失函数尽可能的小,从而找到合适的权重来完成某项任务。目前业界主要用到的优化器有 SGD、RMSProp、Adam、AdaDelt 等,其中由于带 momentum 的 SGD 优化器广泛应用于学术界和工业界(此处仅限于分类任务),所以我们发布的模型也大都使用该优化器来实现损失函数的梯度下降。带 momentum 的 SGD 优化器有两个劣势,其一是收敛速度慢,其二是初始学习率的设置需要依靠大量的经验,然而如果初始学习率设置得当并且迭代轮数充足,该优化器也会在众多的优化器中脱颖而出,使得其在验证集上获得更高的准确率。一些自适应学习率的优化器如 Adam、RMSProp 等,收敛速度往往比较快,但是最终的收敛精度会稍差一些。如果追求更快的收敛速度,我们推荐使用这些自适应学习率的优化器,如果追求更高的收敛精度,我们推荐使用带 momentum 的 SGD 优化器。具体到数据集来说:
- ImageNet-1k: 建议只使用带momentum的SGD优化器。 - ImageNet-1k: 建议只使用带 momentum 的 SGD 优化器。
- 其他数据集(默认加载ImageNet-1k预训练): 加载预训练模型的时候可以考虑使用Adam等优化器(效果可能会更好),但使用带momentum的SGD优化器是绝对是比较不错的方案。 - 其他数据集(默认加载 ImageNet-1k 预训练): 加载预训练模型的时候可以考虑使用 Adam 等优化器(效果可能会更好),但使用带 momentum 的 SGD 优化器是绝对是比较不错的方案。
另外,为了进一步加速训练,Lookahead优化器也是一个不错的选择,在ImageNet-1k上,其可以保证在更快的收敛速度下拥有相同的收敛精度,但在部分数据集上表现不太稳定,需要进一步调参。 另外,为了进一步加速训练,Lookahead 优化器也是一个不错的选择,在 ImageNet-1k 上,其可以保证在更快的收敛速度下拥有相同的收敛精度,但在部分数据集上表现不太稳定,需要进一步调参。
### Q5.2 如何设置初始学习率以及学习率下降策略? ### Q5.2 如何设置初始学习率以及学习率下降策略?
**A**:学习率的选择往往和优化器以及数据和任务有关系。学习率决定了网络种权重更新的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。 **A**:学习率的选择往往和优化器以及数据和任务有关系。学习率决定了网络种权重更新的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。
在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数下降较快,所以可以设置一个较大的学习率。在训练后期,由于权重已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。至于学习率下降策略,很多研究者或者从业人员使用的学习率下降方式是piecewise_decay(step_decay),即阶梯式下降学习率,此外,很多研究者也提出了学习率的其他下降方式,如polynomial_decay(多项式下降)、exponential_decay(指数下降),cosine_decay(余弦下降)等,其中cosine_decay无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。 在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数下降较快,所以可以设置一个较大的学习率。在训练后期,由于权重已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。至于学习率下降策略,很多研究者或者从业人员使用的学习率下降方式是 piecewise_decay(step_decay),即阶梯式下降学习率,此外,很多研究者也提出了学习率的其他下降方式,如 polynomial_decay(多项式下降)、exponential_decay(指数下降),cosine_decay(余弦下降)等,其中 cosine_decay 无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。
Cosine_decay和piecewise_decay的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较peicewise_decay更好一些。 Cosine_decay 和 piecewise_decay 的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay 都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较 peicewise_decay 更好一些。
![](../../images/models/lr_decay.jpeg) ![](../../images/models/lr_decay.jpeg)
另外,从图中我们也可以看到,cosine_decay中只有少数轮数使用了较小的学习率,这样会影响到最终的精度,所以为了使得cosine_decay发挥更好的效果,建议迭代更多的轮数。 另外,从图中我们也可以看到,cosine_decay 中只有少数轮数使用了较小的学习率,这样会影响到最终的精度,所以为了使得 cosine_decay 发挥更好的效果,建议迭代更多的轮数。
最后,如果使用较大的batch_size训练神经网络时,建议您使用warmup策略。Warmup策略顾名思义就是让学习率先预热一下,在训练初期不直接使用最大的学习率,而是用一个逐渐增大的学习率去训练网络,当学习率增大到最高点时,再去衰减学习率的值。实验表明,在batch_size较大时,warmup可以稳定提升模型的精度。具体到数据集来说: 最后,如果使用较大的 batch_size 训练神经网络时,建议您使用 warmup 策略。Warmup 策略顾名思义就是让学习率先预热一下,在训练初期不直接使用最大的学习率,而是用一个逐渐增大的学习率去训练网络,当学习率增大到最高点时,再去衰减学习率的值。实验表明,在 batch_size 较大时,warmup 可以稳定提升模型的精度。具体到数据集来说:
- ImageNet-1k:建议batch-size大小为256、初始学习率为0.1,cosine-decay下降学习率。 - ImageNet-1k:建议 batch-size 大小为 256、初始学习率为 0.1,cosine-decay 下降学习率。
- 其他数据集(默认加载ImageNet-1k预训练): 数据集规模越大,初始学习率也越大,但最好不要超过0.1(batch-size为256时候),数据集规模越小,初始学习率也越小,当数据集较小时,使用warmup也会带来一定的精度提升,学习率下降策略仍旧推荐cosine-decay。 - 其他数据集(默认加载 ImageNet-1k 预训练): 数据集规模越大,初始学习率也越大,但最好不要超过 0.1(batch-size 为 256 时候),数据集规模越小,初始学习率也越小,当数据集较小时,使用 warmup 也会带来一定的精度提升,学习率下降策略仍旧推荐 cosine-decay。
### Q5.3 如何设置batch-size的大小? ### Q5.3 如何设置 batch-size 的大小?
**A**:Batch_size是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络中训练。之前有研究者通过实验发现,当batch_size的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练ImageNet-1k数据时,大部分的神经网络选择的初始学习率为0.1,batch_size是256。具体到数据集来说: **A**:Batch_size 是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络中训练。之前有研究者通过实验发现,当 batch_size 的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练 ImageNet-1k 数据时,大部分的神经网络选择的初始学习率为 0.1,batch_size 是 256。具体到数据集来说:
- ImageNet-1k: 学习率设置为0.1\*k,batch_size设置为256\*k。 - ImageNet-1k: 学习率设置为 0.1\*k,batch_size 设置为 256\*k。
- 其他数据集(默认加载ImageNet-1k预训练): 可以根据实际情况设置(如更小的学习率),但在调整学习率或者batch-size时,要同时调整另外一个值。 - 其他数据集(默认加载 ImageNet-1k 预训练): 可以根据实际情况设置(如更小的学习率),但在调整学习率或者 batch-size 时,要同时调整另外一个值。
### Q5.4 weight_decay是什么?怎么设置? ### Q5.4 weight_decay 是什么?怎么设置?
**A**:过拟合是机器学习中常见的一个名词,简单理解即为模型在训练数据上表现很好,但在测试数据上表现较差,在图像分类问题中,同样存在过拟合的问题,为了避免过拟合,很多正则方式被提出,其中,weight_decay是其中一个广泛使用的避免过拟合的方式。当使用SGD优化器时, weight_decay等价于在最终的损失函数后添加L2正则化,L2正则化使得网络的权重倾向于选择更小的值,最终整个网络中的参数值更趋向于0,模型的泛化性能相应提高。在各大深度学习框架的实现中,该值表达的含义是L2正则前的系数,在飞桨框架中,该值的名称是L2Decay,所以以下都称其为L2Decay。该系数越大,表示加入的正则越强,模型越趋于欠拟合状态。具体到数据集来说: **A**:过拟合是机器学习中常见的一个名词,简单理解即为模型在训练数据上表现很好,但在测试数据上表现较差,在图像分类问题中,同样存在过拟合的问题,为了避免过拟合,很多正则方式被提出,其中,weight_decay 是其中一个广泛使用的避免过拟合的方式。当使用 SGD 优化器时,weight_decay 等价于在最终的损失函数后添加 L2 正则化,L2 正则化使得网络的权重倾向于选择更小的值,最终整个网络中的参数值更趋向于 0,模型的泛化性能相应提高。在各大深度学习框架的实现中,该值表达的含义是 L2 正则前的系数,在飞桨框架中,该值的名称是 L2Decay,所以以下都称其为 L2Decay。该系数越大,表示加入的正则越强,模型越趋于欠拟合状态。具体到数据集来说:
- ImageNet-1k:大多数的网络将该参数值设置为1e-4,在一些小的网络如MobileNet系列网络中,为了避免网络欠拟合,该值设置为1e-5~4e-5之间。下表展示了MobileNetV1_x0_25在ImageNet-1k上使用不同L2Decay的精度情况。由于MobileNetV1_x0_25是一个比较小的网络,所以L2Decay过大会使网络趋向于欠拟合状态,所以在该网络中,相对1e-4,3e-5是更好的选择。 - ImageNet-1k:大多数的网络将该参数值设置为 1e-4,在一些小的网络如 MobileNet 系列网络中,为了避免网络欠拟合,该值设置为 1e-5~4e-5 之间。下表展示了 MobileNetV1_x0_25 在 ImageNet-1k 上使用不同 L2Decay 的精度情况。由于 MobileNetV1_x0_25 是一个比较小的网络,所以 L2Decay 过大会使网络趋向于欠拟合状态,所以在该网络中,相对 1e-4,3e-5 是更好的选择。
| 模型 | L2Decay | Train acc1/acc5 | Test acc1/acc5 | | 模型 | L2Decay | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| MobileNetV1_x0_25 | 1e-4 | 43.79%/67.61% | 50.41%/74.70% | | MobileNetV1_x0_25 | 1e-4 | 43.79%/67.61% | 50.41%/74.70% |
| MobileNetV1_x0_25 | 3e-5 | 47.38%/70.83% | 51.45%/75.45% | | MobileNetV1_x0_25 | 3e-5 | 47.38%/70.83% | 51.45%/75.45% |
另外,该值的设置也和训练过程中是否使用其他正则化有关系。如果训练过程中的数据预处理比较复杂,相当于训练任务变的更难,可以将该值适当减小,下表展示了在ImageNet-1k上,ResNet50在使用RandAugment预处理方式后使用不同L2Decay的精度。容易观察到,在任务变难后,使用更小的l2_decay有助于模型精度的提升。 另外,该值的设置也和训练过程中是否使用其他正则化有关系。如果训练过程中的数据预处理比较复杂,相当于训练任务变的更难,可以将该值适当减小,下表展示了在 ImageNet-1k 上,ResNet50 在使用 RandAugment 预处理方式后使用不同 L2Decay 的精度。容易观察到,在任务变难后,使用更小的 l2_decay 有助于模型精度的提升。
| 模型 | L2Decay | Train acc1/acc5 | Test acc1/acc5 | | 模型 | L2Decay | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| ResNet50 | 1e-4 | 75.13%/90.42% | 77.65%/93.79% | | ResNet50 | 1e-4 | 75.13%/90.42% | 77.65%/93.79% |
| ResNet50 | 7e-5 | 75.56%/90.55% | 78.04%/93.74% | | ResNet50 | 7e-5 | 75.56%/90.55% | 78.04%/93.74% |
- 其他数据集(默认加载ImageNet-1k预训练):在做迁移任务的时候,最好不要改变训练ImageNet-1k时的L2Decay的值(即训练得到预训练时的L2Decay值,每个backbone对应的L2Decay值都在相应的训练yaml配置文件中),一般的数据集只改变学习率足够。 - 其他数据集(默认加载 ImageNet-1k 预训练):在做迁移任务的时候,最好不要改变训练 ImageNet-1k 时的 L2Decay 的值(即训练得到预训练时的 L2Decay 值,每个 backbone 对应的 L2Decay 值都在相应的训练 yaml 配置文件中),一般的数据集只改变学习率足够。
### Q5.5 是否使用label_smoothing,如何设置其中的参数值? ### Q5.5 是否使用 label_smoothing,如何设置其中的参数值?
**A**:Label_smoothing是深度学习中的一种正则化方法,其全称是 Label Smoothing Regularization(LSR),即标签平滑正则化。在传统的分类任务计算损失函数时,是将真实的one hot标签与神经网络的输出做相应的交叉熵计算,而label_smoothing是将真实的one hot标签做一个标签平滑的处理,使得网络学习的标签不再是一个hard label,而是一个有概率值的soft label,其中在类别对应的位置的概率最大,其他位置概率是一个非常小的数。在label_smoothing中,epsilon参数描述了将标签软化的程度,该值越大,经过label smoothing后的标签向量的标签概率值越小,标签越平滑,反之,标签越趋向于hard label。具体到数据集来说: **A**:Label_smoothing 是深度学习中的一种正则化方法,其全称是 Label Smoothing Regularization(LSR),即标签平滑正则化。在传统的分类任务计算损失函数时,是将真实的 one hot 标签与神经网络的输出做相应的交叉熵计算,而 label_smoothing 是将真实的 one hot 标签做一个标签平滑的处理,使得网络学习的标签不再是一个 hard label,而是一个有概率值的 soft label,其中在类别对应的位置的概率最大,其他位置概率是一个非常小的数。在 label_smoothing 中,epsilon 参数描述了将标签软化的程度,该值越大,经过 label smoothing 后的标签向量的标签概率值越小,标签越平滑,反之,标签越趋向于 hard label。具体到数据集来说:
- ImageNet-1k:在训练ImageNet-1k的实验里通常将该值设置为0.1,ResNet50大小级别及其以上的模型在使用label_smooting后,精度有稳定的提升。下表展示了ResNet50_vd在使用label_smoothing前后的精度指标。 - ImageNet-1k:在训练 ImageNet-1k 的实验里通常将该值设置为 0.1,ResNet50 大小级别及其以上的模型在使用 label_smooting 后,精度有稳定的提升。下表展示了 ResNet50_vd 在使用 label_smoothing 前后的精度指标。
| 模型 | Use_label_smoothing(0.1) | Test acc1 | | 模型 | Use_label_smoothing(0.1) | Test acc1 |
|:--:|:--:|:--:| |:--:|:--:|:--:|
| ResNet50_vd | 0 | 77.9% | | ResNet50_vd | 0 | 77.9% |
| ResNet50_vd | 1 | 78.4% | | ResNet50_vd | 1 | 78.4% |
同时,由于label_smoohing相当于一种正则方式,在相对较小的模型上,精度提升不明显甚至会有所下降,下表展示了ResNet18在ImageNet-1k上使用label_smoothing前后的精度指标。可以明显看到,在使用label_smoothing后,精度有所下降。 同时,由于 label_smoohing 相当于一种正则方式,在相对较小的模型上,精度提升不明显甚至会有所下降,下表展示了 ResNet18 在 ImageNet-1k 上使用 label_smoothing 前后的精度指标。可以明显看到,在使用 label_smoothing 后,精度有所下降。
| 模型 | Use_label_smoohing(0.1) | Train acc1/acc5 | Test acc1/acc5 | | 模型 | Use_label_smoohing(0.1) | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| ResNet18 | 0 | 69.81%/87.70% | 70.98%/89.92% | | ResNet18 | 0 | 69.81%/87.70% | 70.98%/89.92% |
| ResNet18 | 1 | 68.00%/86.56% | 70.81%/89.89% | | ResNet18 | 1 | 68.00%/86.56% | 70.81%/89.89% |
如何在较小的模型中也可以让label-smoothing有效,这里有一个技巧,即在Global-Average-Pool后接一个1000-2000大小的全连接层,该技巧可以与label-smoothing同时作用,发挥更好的效果。 如何在较小的模型中也可以让 label-smoothing 有效,这里有一个技巧,即在 Global-Average-Pool 后接一个 1000-2000 大小的全连接层,该技巧可以与 label-smoothing 同时作用,发挥更好的效果。
- 其他数据集(默认加载ImageNet-1k预训练):使用label-smooth之后往往都会提升精度,规模越小的数据集epsilon值可以越大,在一些规模较小的细粒度图像中,最佳模型通常是在该值设置到0.4-0.5时获得的。 - 其他数据集(默认加载 ImageNet-1k 预训练):使用 label-smooth 之后往往都会提升精度,规模越小的数据集 epsilon 值可以越大,在一些规模较小的细粒度图像中,最佳模型通常是在该值设置到 0.4-0.5 时获得的。
### Q5.6 默认的图像预处理中random-crop还可以调整吗?怎么调整? ### Q5.6 默认的图像预处理中 random-crop 还可以调整吗?怎么调整?
**A**:在ImageNet-1k数据的标准预处理中,random_crop函数中定义了scale和ratio两个值,两个值分别确定了图片crop的大小和图片的拉伸程度,其中scale的默认取值范围是0.08-1(lower_scale-upper_scale),ratio的默认取值范围是3/4-4/3(lower_ratio-upper_ratio)。在非常小的网络训练中,此类数据增强会使得网络欠拟合,导致精度有所下降。为了提升网络的精度,可以使其数据增强变的更弱,即增大图片的crop区域或者减弱图片的拉伸变换程度。可以分别通过增大lower_scale的值或缩小lower_ratio与upper_scale的差距来实现更弱的图片变换。具体到数据集来说: **A**:在 ImageNet-1k 数据的标准预处理中,random_crop 函数中定义了 scale 和 ratio 两个值,两个值分别确定了图片 crop 的大小和图片的拉伸程度,其中 scale 的默认取值范围是 0.08-1(lower_scale-upper_scale),ratio 的默认取值范围是 3/4-4/3(lower_ratio-upper_ratio)。在非常小的网络训练中,此类数据增强会使得网络欠拟合,导致精度有所下降。为了提升网络的精度,可以使其数据增强变的更弱,即增大图片的 crop 区域或者减弱图片的拉伸变换程度。可以分别通过增大 lower_scale 的值或缩小 lower_ratio 与 upper_scale 的差距来实现更弱的图片变换。具体到数据集来说:
- ImageNet-1k:不是特别小的网络建议只用默认值,特别小的网络可以调大lower_scale的值(增大crop区域面积)或者缩小ratio值的范围(减弱图像伸缩变换),特别大的网络可以调小lower_scale的值(减小crop面积)或者增大ratio值的范围(增强图像伸缩变换)。下表列出了使用不同lower_scale训练MobileNetV2_x0_25的精度,可以看到,增大图片的crop区域面积后训练精度和验证精度均有提升。 - ImageNet-1k:不是特别小的网络建议只用默认值,特别小的网络可以调大 lower_scale 的值(增大 crop 区域面积)或者缩小 ratio 值的范围(减弱图像伸缩变换),特别大的网络可以调小 lower_scale 的值(减小 crop 面积)或者增大 ratio 值的范围(增强图像伸缩变换)。下表列出了使用不同 lower_scale 训练 MobileNetV2_x0_25 的精度,可以看到,增大图片的 crop 区域面积后训练精度和验证精度均有提升。
| 模型 | Scale取值范围 | Train_acc1/acc5 | Test_acc1/acc5 | | 模型 | Scale 取值范围 | Train_acc1/acc5 | Test_acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| MobileNetV2_x0_25 | [0.08,1] | 50.36%/72.98% | 52.35%/75.65% | | MobileNetV2_x0_25 | [0.08,1] | 50.36%/72.98% | 52.35%/75.65% |
| MobileNetV2_x0_25 | [0.2,1] | 54.39%/77.08% | 53.18%/76.14% | | MobileNetV2_x0_25 | [0.2,1] | 54.39%/77.08% | 53.18%/76.14% |
- 其他数据集(默认加载ImageNet-1k预训练):建议使用默认值,如果过拟合较严重,可以考虑调小lower_scale的值(减小crop面积)或者增大ratio值的范围(增强图像伸缩变换)。 - 其他数据集(默认加载 ImageNet-1k 预训练):建议使用默认值,如果过拟合较严重,可以考虑调小 lower_scale 的值(减小 crop 面积)或者增大 ratio 值的范围(增强图像伸缩变换)。
### Q5.7 目前常用数据增广有哪些?如何选择? ### Q5.7 目前常用数据增广有哪些?如何选择?
**A**:一般来说,数据集的规模对性能影响至关重要,但是图片的标注往往比较昂贵,所以有标注的图片数量往往比较稀少,在这种情况下,数据的增广尤为重要。在训练ImageNet-1k的标准数据增广中,主要使用了Random_Crop与Random_Flip两种数据增广方式,然而,近些年,越来越多的数据增广方式被提出,如cutout、mixup、cutmix、AutoAugment等。实验表明,这些数据的增广方式可以有效提升模型的精度。具体到数据集来说: **A**:一般来说,数据集的规模对性能影响至关重要,但是图片的标注往往比较昂贵,所以有标注的图片数量往往比较稀少,在这种情况下,数据的增广尤为重要。在训练 ImageNet-1k 的标准数据增广中,主要使用了 Random_Crop 与 Random_Flip 两种数据增广方式,然而,近些年,越来越多的数据增广方式被提出,如 cutout、mixup、cutmix、AutoAugment 等。实验表明,这些数据的增广方式可以有效提升模型的精度。具体到数据集来说:
- ImageNet-1k:下表列出了ResNet50在8种不同的数据增广方式的表现,可以看出,相比baseline,所有的数据增广方式均有收益,其中cutmix是目前最有效的数据增广。更多数据增广的介绍请参考[**数据增广章节**](../advanced_tutorials/DataAugmentation.md) - ImageNet-1k:下表列出了 ResNet50 在 8 种不同的数据增广方式的表现,可以看出,相比 baseline,所有的数据增广方式均有收益,其中 cutmix 是目前最有效的数据增广。更多数据增广的介绍请参考[**数据增广章节**](../advanced_tutorials/DataAugmentation.md)
| 模型 | 数据增广方式 | Test top-1 | | 模型 | 数据增广方式 | Test top-1 |
|:--:|:--:|:--:| |:--:|:--:|:--:|
...@@ -308,57 +308,57 @@ Cosine_decay和piecewise_decay的学习率变化曲线如下图所示,容易 ...@@ -308,57 +308,57 @@ Cosine_decay和piecewise_decay的学习率变化曲线如下图所示,容易
| ResNet50 | Random-Erasing | 77.91% | | ResNet50 | Random-Erasing | 77.91% |
| ResNet50 | Hide-and-Seek | 77.43% | | ResNet50 | Hide-and-Seek | 77.43% |
- 其他数据集(默认加载ImageNet-1k预训练):在其他数据集中除了使用Auto-Augment,一般都会有精度的提升,Auto-Augment会针对每一个数据集搜索的独立超参数,该超参数决定了数据如何处理,所以默认的ImageNet-1k的超参数并不适合所有的数据集,当然您可以使用Random-Augment来替代Auto-Augment。其他策略可以正常使用,对于比较难的任务或者比较小的网络,建议不要使用较强的数据增广。 - 其他数据集(默认加载 ImageNet-1k 预训练):在其他数据集中除了使用 Auto-Augment,一般都会有精度的提升,Auto-Augment 会针对每一个数据集搜索的独立超参数,该超参数决定了数据如何处理,所以默认的 ImageNet-1k 的超参数并不适合所有的数据集,当然您可以使用 Random-Augment 来替代 Auto-Augment。其他策略可以正常使用,对于比较难的任务或者比较小的网络,建议不要使用较强的数据增广。
此外,多种数据增广也可以叠加使用,当数据集较为简单或数据规模较小时,叠加数据增广可以进一步提升精度。 此外,多种数据增广也可以叠加使用,当数据集较为简单或数据规模较小时,叠加数据增广可以进一步提升精度。
### Q5.8 如何通过train_acc和test_acc确定调优策略? ### Q5.8 如何通过 train_acc 和 test_acc 确定调优策略?
**A**:在训练网络的过程中,通常会打印每一个epoch的训练集准确率和验证集准确率,二者刻画了该模型在两个数据集上的表现。通常来说,训练集的准确率反映了经过Random-Crop后的数据的精度,由于数据经过Random-Crop后,数据往往较难,所以训练集的准确率和验证集的准确率往往不是一个概念。 **A**:在训练网络的过程中,通常会打印每一个 epoch 的训练集准确率和验证集准确率,二者刻画了该模型在两个数据集上的表现。通常来说,训练集的准确率反映了经过 Random-Crop 后的数据的精度,由于数据经过 Random-Crop 后,数据往往较难,所以训练集的准确率和验证集的准确率往往不是一个概念。
- ImageNet-1k:通常来说,训练集准确率比验证集准确率微高或者二者相当是比较不错的状态。如果发现训练集的准确率比验证集高很多,说明在这个任务上已经过拟合,需要在训练过程中加入更多的正则,如增大L2Decay的值,加入更多的数据增广策略,加入label_smoothing策略等;如果发现训练集的准确率比验证集低一些,说明在这个任务上可能欠拟合,需要在训练过程中减弱正则效果,如减小L2Decay的值,减少数据增广方式,增大图片crop区域面积,减弱图片拉伸变换,去除label_smoothing等。 - ImageNet-1k:通常来说,训练集准确率比验证集准确率微高或者二者相当是比较不错的状态。如果发现训练集的准确率比验证集高很多,说明在这个任务上已经过拟合,需要在训练过程中加入更多的正则,如增大 L2Decay 的值,加入更多的数据增广策略,加入 label_smoothing 策略等;如果发现训练集的准确率比验证集低一些,说明在这个任务上可能欠拟合,需要在训练过程中减弱正则效果,如减小 L2Decay 的值,减少数据增广方式,增大图片 crop 区域面积,减弱图片拉伸变换,去除 label_smoothing 等。
- 其他数据集(默认加载ImageNet-1k预训练):基本和训练ImageNet-1k的调整策略相当,此外,在其他数据集上如果模型趋向于过拟合(train acc远大于test acc)状态,也可以使用更优的预训练权重,PaddleClas为常用的网络提供了SSLD的蒸馏预训练权重,其比ImageNet-1k的权重更优,您可以优先选择。 - 其他数据集(默认加载 ImageNet-1k 预训练):基本和训练 ImageNet-1k 的调整策略相当,此外,在其他数据集上如果模型趋向于过拟合(train acc 远大于 test acc)状态,也可以使用更优的预训练权重,PaddleClas 为常用的网络提供了 SSLD 的蒸馏预训练权重,其比 ImageNet-1k 的权重更优,您可以优先选择。
- **【备注】** 不太建议根据loss来重新调整训练策略,在使用不同的数据增广后,train loss的大小差异较大,如使用Cutmix或者RandAugment后,train loss会大于test loss,当数据增广策略减弱后,train loss会小于test loss,所以较难调整。 - **【备注】** 不太建议根据 loss 来重新调整训练策略,在使用不同的数据增广后,train loss 的大小差异较大,如使用 Cutmix 或者 RandAugment 后,train loss 会大于 test loss,当数据增广策略减弱后,train loss 会小于 test loss,所以较难调整。
### Q5.9 如何通过预训练模型提升自己的数据集的精度? ### Q5.9 如何通过预训练模型提升自己的数据集的精度?
**A**:在现阶段图像识别领域中,加载预训练模型来训练自己的任务已成为普遍的做法,相比从随机初始化开始训练,加载预训练模型往往可以提升特定任务的精度。一般来说,业界广泛使用的预训练模型是通过训练128万张图片1000类的ImageNet-1k数据集得到的,该预训练模型的fc层权重是是一个k\*1000的矩阵,其中k是fc层以前的神经元数,在加载预训练权重时,无需加载fc层的权重。在学习率方面,如果您的任务训练的数据集特别小(如小于1千张),我们建议你使用较小的初始学习率,如0.001(batch_size:256,下同),以免较大的学习率破坏预训练权重。如果您的训练数据集规模相对较大(大于10万),我们建议你尝试更大的初始学习率,如0.01或者更大。如果目标数据集较小,也可以冻结一些浅层的权重。此外,如果训练一个特定垂类的小数据集,也可以先在相关的大的数据集上训练一个预训练权重,再在该权重上用较小的学习率微调模型。 **A**:在现阶段图像识别领域中,加载预训练模型来训练自己的任务已成为普遍的做法,相比从随机初始化开始训练,加载预训练模型往往可以提升特定任务的精度。一般来说,业界广泛使用的预训练模型是通过训练 128 万张图片 1000 类的 ImageNet-1k 数据集得到的,该预训练模型的 fc 层权重是是一个 k\*1000 的矩阵,其中 k 是 fc 层以前的神经元数,在加载预训练权重时,无需加载 fc 层的权重。在学习率方面,如果您的任务训练的数据集特别小(如小于 1 千张),我们建议你使用较小的初始学习率,如 0.001(batch_size:256,下同),以免较大的学习率破坏预训练权重。如果您的训练数据集规模相对较大(大于 10 万),我们建议你尝试更大的初始学习率,如 0.01 或者更大。如果目标数据集较小,也可以冻结一些浅层的权重。此外,如果训练一个特定垂类的小数据集,也可以先在相关的大的数据集上训练一个预训练权重,再在该权重上用较小的学习率微调模型。
### Q5.10 现有的策略已经让模型的精度趋于饱和,如何进一步提升特定模型的精度? ### Q5.10 现有的策略已经让模型的精度趋于饱和,如何进一步提升特定模型的精度?
**A**:如果现有的策略不能进一步提升模型的精度,说明在现有数据集和现有的策略下,模型几乎到达饱和状态,这里提供两种进一步提升模型精度的方法。 **A**:如果现有的策略不能进一步提升模型的精度,说明在现有数据集和现有的策略下,模型几乎到达饱和状态,这里提供两种进一步提升模型精度的方法。
- 挖掘相关数据:用在现有数据集上训练饱和的模型去对相关的数据做预测,将置信度较高的数据打label后加入训练集进一步训练,如此循环操作,可进一步提升模型的精度。 - 挖掘相关数据:用在现有数据集上训练饱和的模型去对相关的数据做预测,将置信度较高的数据打 label 后加入训练集进一步训练,如此循环操作,可进一步提升模型的精度。
- 知识蒸馏:可以先使用一个较大的模型在该数据集上训练一个精度较高的teacher model,然后使用该teacher model去教导一个Student model,其中,Student model即为目标模型。PaddleClas提供了百度自研的SSLD知识蒸馏方案,即使在ImageNet-1k这么有挑战的分类任务上,其也能稳定提升3%以上。SSLD知识蒸馏的的章节请参考[**SSLD知识蒸馏**](../advanced_tutorials/knowledge_distillation.md) - 知识蒸馏:可以先使用一个较大的模型在该数据集上训练一个精度较高的 teacher model,然后使用该 teacher model 去教导一个 Student model,其中,Student model 即为目标模型。PaddleClas 提供了百度自研的 SSLD 知识蒸馏方案,即使在 ImageNet-1k 这么有挑战的分类任务上,其也能稳定提升 3% 以上。SSLD 知识蒸馏的的章节请参考 [**SSLD 知识蒸馏**](../advanced_tutorials/knowledge_distillation.md)
<a name="第6期"></a> <a name="6"></a>
## 第6 ## 第 6
### Q6.1: PaddleClas的几个分支有什么区别?应该如何选择? ### Q6.1: PaddleClas 的几个分支有什么区别?应该如何选择?
**A**: PaddleClas目前共有3种分支: **A**: PaddleClas 目前共有 3 种分支:
* 开发分支:develop分支是PaddleClas的开发分支,也是更新最快的分支。所有的新功能、新改动都会先在develop分支上进行。如果想追踪PaddleClas的最新进展,可以关注这个分支。这个分支主要支持动态图,会跟着paddlepaddle的版本一起更新。 * 开发分支:develop 分支是 PaddleClas 的开发分支,也是更新最快的分支。所有的新功能、新改动都会先在 develop 分支上进行。如果想追踪 PaddleClas 的最新进展,可以关注这个分支。这个分支主要支持动态图,会跟着 paddlepaddle 的版本一起更新。
* 稳定版本分支(如release/2.1.3):快速更新能够让关注者了解最新进展,但也会带来不稳定性。因此在一些关键的时间点,我们会从develop分支中拉出分支,提供稳定的版本,最新的稳定版分支也是默认分支。需要注意,无特殊情况,我们只会维护最新的release稳定分支,并且一般只会修复bug,而不更新新的特性和模型。 * 稳定版本分支(如 release/2.1.3):快速更新能够让关注者了解最新进展,但也会带来不稳定性。因此在一些关键的时间点,我们会从 develop 分支中拉出分支,提供稳定的版本,最新的稳定版分支也是默认分支。需要注意,无特殊情况,我们只会维护最新的 release 稳定分支,并且一般只会修复 bug,而不更新新的特性和模型。
* 静态图分支(static):static分支是使用静态图版本的分支,主要用来支持一些老用户的使用,也只进行一些简单维护,不会更新新的特性和模型。不建议新用户使用静态图分支。老用户如果有条件,也建议迁到动态图分支或稳定版本分支。 * 静态图分支(static):static 分支是使用静态图版本的分支,主要用来支持一些老用户的使用,也只进行一些简单维护,不会更新新的特性和模型。不建议新用户使用静态图分支。老用户如果有条件,也建议迁到动态图分支或稳定版本分支。
总的来说,如果想跟进PaddleClas的最新进展,建议选择develop分支,如果需要稳定版本,建议选择最新的稳定版本分支。 总的来说,如果想跟进 PaddleClas 的最新进展,建议选择 develop 分支,如果需要稳定版本,建议选择最新的稳定版本分支。
### Q6.2: 什么是静态图模式? ### Q6.2: 什么是静态图模式?
**A**: 静态图模式即为声明式编程模式。许多深度学习框架如tensorflow,mxnet等最初都使用这种模式。在静态图模式中,需要先定义好模型结构,之后框架会根据模型结构进行编译和优化,构建"计算图"。可以简单的理解为,静态图模式是"计算图"静态不变的模式。静态图的优势在于编译器一般只需要构建一次计算图,效率相对较高,缺点在于不够灵活,调试麻烦。例如在paddle中运行一次静态图模型,需要完整所有的运算,之后根据特定的key来提取输出,无法实时得到结果。 **A**: 静态图模式即为声明式编程模式。许多深度学习框架如 tensorflow,mxnet 等最初都使用这种模式。在静态图模式中,需要先定义好模型结构,之后框架会根据模型结构进行编译和优化,构建"计算图"。可以简单的理解为,静态图模式是"计算图"静态不变的模式。静态图的优势在于编译器一般只需要构建一次计算图,效率相对较高,缺点在于不够灵活,调试麻烦。例如在 paddle 中运行一次静态图模型,需要完整所有的运算,之后根据特定的 key 来提取输出,无法实时得到结果。
### Q6.3: 什么是动态图模式? ### Q6.3: 什么是动态图模式?
**A**: 动态图模式即为命令式编程模式,用户无需预先定义网络结构,每行代码都可以直接运行得到结果。相比静态图模式,动态图模式对用户更加友好,调试也更方便。此外,动态图模式的结构设计也更加灵活,可以在运行过程中随时调整结构。 **A**: 动态图模式即为命令式编程模式,用户无需预先定义网络结构,每行代码都可以直接运行得到结果。相比静态图模式,动态图模式对用户更加友好,调试也更方便。此外,动态图模式的结构设计也更加灵活,可以在运行过程中随时调整结构。
PaddleClas目前持续更新的develop分支和稳定版本的release分支,主要采用动态图模式。如果您是新用户,建议使用动态图模式来进行开发和训练。如果推理预测时有性能需求,可以在训练完成后,将动态图模型转为静态图模型提高效率。 PaddleClas 目前持续更新的 develop 分支和稳定版本的 release 分支,主要采用动态图模式。如果您是新用户,建议使用动态图模式来进行开发和训练。如果推理预测时有性能需求,可以在训练完成后,将动态图模型转为静态图模型提高效率。
### Q6.5: 构建分类数据集时,如何构建"背景"类别的数据? ### Q6.5: 构建分类数据集时,如何构建"背景"类别的数据?
......
# 图像分类常见问题汇总 - 2021 第1 # 图像分类常见问题汇总 - 2021 第 1
## 目录 ## 目录
* [第1期](#第1期)(2021.01.05) * [1. 第 1 期](#1)(2021.01.05)
* [第2期](#第2期)(2021.01.14) * [2. 第 2 期](#2)(2021.01.14)
* [第3期](#第3期)(2020.01.21) * [3. 第 3 期](#3)(2020.01.21)
* [第4期](#第4期)(2021.01.28) * [4. 第 4 期](#4)(2021.01.28)
* [第5期](#第5期)(2021.02.03) * [5. 第 5 期](#5)(2021.02.03)
<a name="第1期"></a> <a name="1"></a>
## 第1 ## 第 1
### Q1.1: 在模型导出时,发现导出的inference model预测精度很低,这块是为什么呢? ### Q1.1: 在模型导出时,发现导出的 inference model 预测精度很低,这块是为什么呢?
**A**:可以从以下几个方面排查 **A**:可以从以下几个方面排查
* 需要先排查下预训练模型路径是否正确。 * 需要先排查下预训练模型路径是否正确。
* 模型导出时,默认的类别数为1000,如果预训练模型是自定义的类别数,则在导出的时候需要指定参数`--class_num=k`,k是自定义的类别数。 * 模型导出时,默认的类别数为 1000,如果预训练模型是自定义的类别数,则在导出的时候需要指定参数 `--class_num=k`,k 是自定义的类别数。
* 可以对比下`tools/infer/infer.py``tools/infer/predict.py`针对相同输入的输出class id与score,如果完全相同,则可能是预训练模型自身的精度很差。 * 可以对比下 `tools/infer/infer.py``tools/infer/predict.py` 针对相同输入的输出 class id 与 score,如果完全相同,则可能是预训练模型自身的精度很差。
### Q1.2: 训练样本的类别不均衡,这个该怎么处理呢? ### Q1.2: 训练样本的类别不均衡,这个该怎么处理呢?
**A**:有以下几种比较常用的处理方法。 **A**:有以下几种比较常用的处理方法。
* 从采样的角度出发的话 * 从采样的角度出发的话
* 可以对样本根据类别进行动态采样,每个类别都设置不同的采样概率,保证不同类别的图片在同一个minibatch或者同一个epoch内,不同类别的训练样本数量基本一致或者符合自己期望的比例。 * 可以对样本根据类别进行动态采样,每个类别都设置不同的采样概率,保证不同类别的图片在同一个 minibatch 或者同一个 epoch 内,不同类别的训练样本数量基本一致或者符合自己期望的比例。
* 可以使用过采样的方法,对图片数量较少的类别进行过采样。 * 可以使用过采样的方法,对图片数量较少的类别进行过采样。
* 从损失函数的角度出发的话 * 从损失函数的角度出发的话
* 可以使用OHEM(online hard example miniing)的方法,对根据样本的loss进行筛选,筛选出hard example用于模型的梯度反传和参数更新。 * 可以使用 OHEM(online hard example miniing)的方法,对根据样本的 loss 进行筛选,筛选出 hard example 用于模型的梯度反传和参数更新。
* 可以使用Focal loss的方法,对一些比较容易的样本的loss赋予较小的权重,对于难样本的loss赋予较大的权重,从而让容易样本的loss对网络整体的loss有贡献,但是又不会主导loss。 * 可以使用 Focal loss 的方法,对一些比较容易的样本的 loss 赋予较小的权重,对于难样本的 loss 赋予较大的权重,从而让容易样本的 loss 对网络整体的 loss 有贡献,但是又不会主导 loss。
### Q1.3 在docker中训练的时候,数据路径和配置均没问题,但是一直报错`SystemError: (Fatal) Blocking queue is killed because the data reader raises an exception`,这是为什么呢? ### Q1.3 在 docker 中训练的时候,数据路径和配置均没问题,但是一直报错 `SystemError: (Fatal) Blocking queue is killed because the data reader raises an exception`,这是为什么呢?
**A**:这可能是因为docker中共享内存太小导致的。创建docker的时候,`/dev/shm`的默认大小为64M,如果使用多进程读取数据,共享内存可能不够,因此需要给`/dev/shm`分配更大的空间,在创建docker的时候,传入`--shm-size=8g`表示给`/dev/shm`分配8g的空间,一般是够用的。 **A**:这可能是因为 docker 中共享内存太小导致的。创建 docker 的时候,`/dev/shm` 的默认大小为 64M,如果使用多进程读取数据,共享内存可能不够,因此需要给 `/dev/shm` 分配更大的空间,在创建 docker 的时候,传入 `--shm-size=8g` 表示给 `/dev/shm` 分配 8G 的空间,一般是够用的。
### Q1.4 PaddleClas提供的10W类图像分类预训练模型在哪里下载,应该怎么使用呢? ### Q1.4 PaddleClas 提供的 10W 类图像分类预训练模型在哪里下载,应该怎么使用呢?
**A**:基于ResNet50_vd, 百度开源了自研的大规模分类预训练模型,其中训练数据为10万个类别,4300万张图片。10万类预训练模型的下载地址:[下载地址](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_10w_pretrained.tar),在这里需要注意的是,该预训练模型没有提供最后的FC层参数,因此无法直接拿来预测;但是可以使用它作为预训练模型,在自己的数据集上进行微调。经过验证,该预训练模型相比于基于ImageNet1k数据集的ResNet50_vd预训练模型,在不同的数据集上均有比较明显的精度收益,最多可达30%。 **A**:基于 ResNet50_vd, 百度开源了自研的大规模分类预训练模型,其中训练数据为 10 万个类别,4300 万张图片。10 万类预训练模型的下载地址:[下载地址](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_10w_pretrained.tar),在这里需要注意的是,该预训练模型没有提供最后的 FC 层参数,因此无法直接拿来预测;但是可以使用它作为预训练模型,在自己的数据集上进行微调。经过验证,该预训练模型相比于基于 ImageNet1k 数据集的 ResNet50_vd 预训练模型,在不同的数据集上均有比较明显的精度收益,最多可达 30%。
<!-- TODO(gaotingquan): --> <!-- TODO(gaotingquan): -->
<!-- ,更多的对比实验可以参考:[图像分类迁移学习教程](../application/transfer_learning.md)。 --> <!-- ,更多的对比实验可以参考:[图像分类迁移学习教程](../application/transfer_learning.md)。 -->
### Q1.5 使用C++进行预测部署的时候怎么进行加速呢? ### Q1.5 使用 C++ 进行预测部署的时候怎么进行加速呢?
**A**:可以从以下几个方面加速预测过程。 **A**:可以从以下几个方面加速预测过程。
1. 如果是CPU预测的话,可以开启mkldnn进行预测,同时适当增大运算的线程数(cpu_math_library_num_threads,在`tools/config.txt`中),一般设置为6~10比较有效。 1. 如果是 CPU 预测的话,可以开启 mkldnn 进行预测,同时适当增大运算的线程数(cpu_math_library_num_threads,在 `tools/config.txt` 中),一般设置为 6~10 比较有效。
2. 如果是GPU预测的话,在硬件条件允许的情况下,可以开启TensorRT预测以及FP16预测,这可以进一步加快预测速度。 2. 如果是 GPU 预测的话,在硬件条件允许的情况下,可以开启 TensorRT 预测以及 FP16 预测,这可以进一步加快预测速度。
3. 在内存或者显存足够的情况下,可以增大预测的batch size。 3. 在内存或者显存足够的情况下,可以增大预测的 batch size。
4. 可以将图像预处理的逻辑(主要设计resize、crop、normalize等)放在GPU上运行,这可以进一步加速预测过程。 4. 可以将图像预处理的逻辑(主要设计 resize、crop、normalize 等)放在 GPU 上运行,这可以进一步加速预测过程。
更多的预测部署加速技巧,也欢迎大家补充。 更多的预测部署加速技巧,也欢迎大家补充。
<a name="第2期"></a> <a name="2"></a>
## 第2 ## 第 2
### Q2.1: PaddleClas在设置标签的时候必须从0开始吗?class_num必须等于数据集的类别数吗? ### Q2.1: PaddleClas 在设置标签的时候必须从 0 开始吗?class_num 必须等于数据集的类别数吗?
**A**:在PaddleClas中,标签默认是从0开始,所以,尽量从0开始设置标签,当然,从其他值开始设置也可以,这样会导致设置的class_num增大,进而导致分类的FC层参数量较大,权重文件会占用更多的存储空间。在数据集类别连续的情况下,设置的class_num要等于数据集类别数(当然大于数据集类别数也可以,在很多数据集上甚至可以获得更高的精度,但同样会使FC层参数量较大),在数据集类别数不连续的情况下,设置的class_num要等于数据集中最大的class_id+1。 **A**:在 PaddleClas 中,标签默认是从 0 开始,所以,尽量从 0 开始设置标签,当然,从其他值开始设置也可以,这样会导致设置的 class_num 增大,进而导致分类的 FC 层参数量较大,权重文件会占用更多的存储空间。在数据集类别连续的情况下,设置的 class_num 要等于数据集类别数(当然大于数据集类别数也可以,在很多数据集上甚至可以获得更高的精度,但同样会使 FC 层参数量较大),在数据集类别数不连续的情况下,设置的 class_num 要等于数据集中最大的 class_id+1。
### Q2.2: 当类别数特别多的时候,最后的FC特别大,导致权重文件占用较大的存储空间,该怎么解决? ### Q2.2: 当类别数特别多的时候,最后的 FC 特别大,导致权重文件占用较大的存储空间,该怎么解决?
**A**:最终的FC的权重是一个大的矩阵,大小为C*class_num,其中C为FC前一层的神经单元个数,如ResNet50中的C为2048,可以通过降低C的值来进一步减小FC权重的大小,比如,可以在GAP之后加一层维数较小的FC层,这样可以大大缩小最终分类层的权重大小。 **A**:最终的 FC 的权重是一个大的矩阵,大小为 C*class_num,其中 C 为 FC 前一层的神经单元个数,如 ResNet50 中的 C 为 2048,可以通过降低 C 的值来进一步减小 FC 权重的大小,比如,可以在 GAP 之后加一层维数较小的 FC 层,这样可以大大缩小最终分类层的权重大小。
### Q2.3: 为什么使用PaddleClas在自定义的数据集上训练ssld蒸馏没有达到预期? ### Q2.3: 为什么使用 PaddleClas 在自定义的数据集上训练 ssld 蒸馏没有达到预期?
首先,需要确保Teacher模型的精度是否存在问题,其次,需要确保Student模型是否成功加载了ImageNet-1k的预训练权重以及Teacher模型是否成功加载了训练自定义数据集的权重,最后,要确保初次学习率不应太大,至少保证初始学习率不要超过训练ImageNet-1k的值。 首先,需要确保 Teacher 模型的精度是否存在问题,其次,需要确保 Student 模型是否成功加载了 ImageNet-1k 的预训练权重以及 Teacher 模型是否成功加载了训练自定义数据集的权重,最后,要确保初次学习率不应太大,至少保证初始学习率不要超过训练 ImageNet-1k 的值。
### Q2.4: 移动端或嵌入式端上哪些网络具有优势? ### Q2.4: 移动端或嵌入式端上哪些网络具有优势?
建议使用移动端系列的网络,网络详情可以参考[移动端系列网络结构介绍](../models/Mobile.md)。如果任务的速度更重要,可以考虑MobileNetV3系列,如果模型大小更重要,可以根据移动端系列网络结构介绍中的StorageSize-Accuracy来确定具体的结构。 建议使用移动端系列的网络,网络详情可以参考[移动端系列网络结构介绍](../models/Mobile.md)。如果任务的速度更重要,可以考虑 MobileNetV3 系列,如果模型大小更重要,可以根据移动端系列网络结构介绍中的 StorageSize-Accuracy 来确定具体的结构。
### Q2.5: 既然移动端网络非常快,为什么还要使用诸如ResNet这样参数量和计算量较大的网络? ### Q2.5: 既然移动端网络非常快,为什么还要使用诸如 ResNet 这样参数量和计算量较大的网络?
不同的网络结构在不同的设备上运行速度优势不同。在移动端,移动端系列的网络比服务器端的网络运行速度更快,但是在服务器端,相同精度下,ResNet等经过特定优化后的网络具有更大的优势,所以需要根据具体情况来选择具体的网络结构。 不同的网络结构在不同的设备上运行速度优势不同。在移动端,移动端系列的网络比服务器端的网络运行速度更快,但是在服务器端,相同精度下,ResNet 等经过特定优化后的网络具有更大的优势,所以需要根据具体情况来选择具体的网络结构。
<a name="第3期"></a> <a name="3"></a>
## 第3 ## 第 3
### Q3.1: 双(多)分支结构与Plain结构,各自有什么特点? ### Q3.1: 双(多)分支结构与 Plain 结构,各自有什么特点?
**A** **A**
VGG为代表的Plain网络,发展到以ResNet系列(带有残差模块)、Inception系列(多卷积核并行)为代表的的多分支网络结构,人们发现多分支结构在模型训练阶段更为友好,更大的网络宽度可以带来更强的特征拟合能力,而残差结构则可以避免深度网络梯度消失的问题,但是在推理阶段,带有多分支结构的模型在速度上并无优势,即使多分支结构模型的FLOPs要更低,但多分支结构的模型计算密度也更低。例如VGG16模型的FLOPs远远大于EfficientNetB3,但是VGG16模型的推理速度却显著快于EfficientNetB3,因此多分支结构在模型训练阶段更为友好,而Plain结构模型则更适合于推理阶段,那么以此为出发点,可以在训练阶段使用多分支网络结构,以更大的训练时间成本换取特征拟合能力更强的模型,而在推理阶段,将多分支结构转为Plain结构,从而换取更短的推理时间。实现多分支结构到Plain结构的转换,可以通过结构重参数化(structural re-parameterization)技术实现。 VGG 为代表的 Plain 网络,发展到以 ResNet 系列(带有残差模块)、Inception 系列(多卷积核并行)为代表的的多分支网络结构,人们发现多分支结构在模型训练阶段更为友好,更大的网络宽度可以带来更强的特征拟合能力,而残差结构则可以避免深度网络梯度消失的问题,但是在推理阶段,带有多分支结构的模型在速度上并无优势,即使多分支结构模型的 FLOPs 要更低,但多分支结构的模型计算密度也更低。例如 VGG16 模型的 FLOPs 远远大于 EfficientNetB3,但是 VGG16 模型的推理速度却显著快于 EfficientNetB3,因此多分支结构在模型训练阶段更为友好,而 Plain 结构模型则更适合于推理阶段,那么以此为出发点,可以在训练阶段使用多分支网络结构,以更大的训练时间成本换取特征拟合能力更强的模型,而在推理阶段,将多分支结构转为 Plain 结构,从而换取更短的推理时间。实现多分支结构到 Plain 结构的转换,可以通过结构重参数化(structural re-parameterization)技术实现。
另外,Plain结构对于剪枝操作也更为友好。 另外,Plain 结构对于剪枝操作也更为友好。
注:“Plain结构”与“结构重参数化(structural re-parameterization)技术”出自论文“RepVGG: Making VGG-style ConvNets Great Again”。Plain结构网络模型指整个网络不存在分支结构,也即网络中第`i`层layer的输入为第`i-1`层layer的输出,第`i`层layer的输出为第`i+1`层layer的输入。 注:“Plain 结构”与“结构重参数化(structural re-parameterization)技术”出自论文“RepVGG: Making VGG-style ConvNets Great Again”。Plain 结构网络模型指整个网络不存在分支结构,也即网络中第 `i` 层 layer 的输入为第 `i-1` 层 layer 的输出,第 `i` 层 layer 的输出为第 `i+1` 层 layer 的输入。
### Q3.2: ACNet的创新点主要在哪里? ### Q3.2: ACNet 的创新点主要在哪里?
**A** **A**
ACNet意为“Asymmetric Convolution Block”,即为非对称卷积模块,该思想出自论文“ACNet: Strengthening the Kernel Skeletons for Powerful CNN via Asymmetric Convolution Blocks”,文章提出了以“ACB”结构的三个CNN卷积核为一组,用来在训练阶段替代现有卷积神经网络中的传统方形卷积核。 ACNet 意为“Asymmetric Convolution Block”,即为非对称卷积模块,该思想出自论文“ACNet: Strengthening the Kernel Skeletons for Powerful CNN via Asymmetric Convolution Blocks”,文章提出了以“ACB”结构的三个 CNN 卷积核为一组,用来在训练阶段替代现有卷积神经网络中的传统方形卷积核。
方形卷积核的尺寸为假设为`d*d`,即宽、高相等均为`d`,则用于替换该卷积核的ACB结构是尺寸为`d*d``1*d``d*1`的三个卷积核,然后再将三个卷积核的输出直接相加,可以得到与原有方形卷积核相同尺寸的计算结果。 方形卷积核的尺寸为假设为 `d*d`,即宽、高相等均为 `d`,则用于替换该卷积核的 ACB 结构是尺寸为 `d*d``1*d``d*1` 的三个卷积核,然后再将三个卷积核的输出直接相加,可以得到与原有方形卷积核相同尺寸的计算结果。
而在训练完成后,将ACB结构换回原有的方形卷积核,方形卷积核的参数则为ACB结构的三个卷积核的参数直接相加(见`Q3.4`,因此还是使用与之前相同的模型结构用于推理,ACB结构只是在训练阶段使用。 而在训练完成后,将 ACB 结构换回原有的方形卷积核,方形卷积核的参数则为 ACB 结构的三个卷积核的参数直接相加(见 `Q3.4`,因此还是使用与之前相同的模型结构用于推理,ACB 结构只是在训练阶段使用。
在训练中,通过ACB结构,模型的网络宽度得到了提高,利用`1*d``d*1`的两个非对称卷积核提取得到更多的特征用于丰富`d*d`卷积核提取的特征图的信息。而在推理阶段,这种设计思想并没有带来额外的参数与计算开销。如下图所示,分别是用于训练阶段和部署推理阶段的卷积核形式。 在训练中,通过 ACB 结构,模型的网络宽度得到了提高,利用 `1*d``d*1` 的两个非对称卷积核提取得到更多的特征用于丰富 `d*d` 卷积核提取的特征图的信息。而在推理阶段,这种设计思想并没有带来额外的参数与计算开销。如下图所示,分别是用于训练阶段和部署推理阶段的卷积核形式。
<div align="center"> <div align="center">
<img src="../../images/faq/TrainingtimeACNet.png" width="400"> <img src="../../images/faq/TrainingtimeACNet.png" width="400">
...@@ -106,64 +106,64 @@ ACNet意为“Asymmetric Convolution Block”,即为非对称卷积模块, ...@@ -106,64 +106,64 @@ ACNet意为“Asymmetric Convolution Block”,即为非对称卷积模块,
<img src="../../images/faq/DeployedACNet.png" width="400"> <img src="../../images/faq/DeployedACNet.png" width="400">
</div> </div>
文章作者的实验表明,通过在原有网络模型训练中使用ACNet结构可以显著提高模型能力,原作者对此有如下解释: 文章作者的实验表明,通过在原有网络模型训练中使用 ACNet 结构可以显著提高模型能力,原作者对此有如下解释:
1. 实验表明,对于一个`d*d`的卷积核,相对于消除卷积核角落位置(如上图中卷积核的`corners`位置)的参数而言,消除骨架位置(如上图中卷积核的`skeleton`位置)的参数会给模型精度带来更大的影响,因此卷积核骨架位置的参数要更为重要,而ACB结构中的两个非对称卷积核增强了方形卷积核骨架位置参数的权重,使之作用更为显著。这种相加是否会因正负数抵消作用而减弱骨架位置的参数作用,作者通过实验发现,网络的训练总是会向着提高骨架位置参数作用的方向发展,并没有出现正负数抵消而减弱的现象。 1. 实验表明,对于一个 `d*d` 的卷积核,相对于消除卷积核角落位置(如上图中卷积核的 `corners` 位置)的参数而言,消除骨架位置(如上图中卷积核的 `skeleton` 位置)的参数会给模型精度带来更大的影响,因此卷积核骨架位置的参数要更为重要,而 ACB 结构中的两个非对称卷积核增强了方形卷积核骨架位置参数的权重,使之作用更为显著。这种相加是否会因正负数抵消作用而减弱骨架位置的参数作用,作者通过实验发现,网络的训练总是会向着提高骨架位置参数作用的方向发展,并没有出现正负数抵消而减弱的现象。
2. 非对称卷积核对于翻转的图像具有更强的鲁棒性,如下图所示,水平的非对称卷积核对于上下翻转的图像具有更强的鲁棒性。对于翻转前后图像中语义上的同一位置,非对称卷积核提取的特征图是相同的,这一点要强于方形卷积核。 2. 非对称卷积核对于翻转的图像具有更强的鲁棒性,如下图所示,水平的非对称卷积核对于上下翻转的图像具有更强的鲁棒性。对于翻转前后图像中语义上的同一位置,非对称卷积核提取的特征图是相同的,这一点要强于方形卷积核。
<div align="center"> <div align="center">
<img src="../../images/faq/HorizontalKernel.png" width="400"> <img src="../../images/faq/HorizontalKernel.png" width="400">
</div> </div>
### Q3.3: RepVGG的创新点主要在哪里? ### Q3.3: RepVGG 的创新点主要在哪里?
**A** **A**
通过Q3.1与Q3.2,我们可以大胆想到,是否可以借鉴ACNet将训练阶段与推理阶段解耦,并且训练阶段使用多分支结构,推理阶段使用Plain结构,这也就是RepVGG的创新点。下图为ResNet、RepVGG训练和推理阶段网络结构的对比。 通过 Q3.1 与 Q3.2,我们可以大胆想到,是否可以借鉴 ACNet 将训练阶段与推理阶段解耦,并且训练阶段使用多分支结构,推理阶段使用 Plain 结构,这也就是 RepVGG 的创新点。下图为 ResNet、RepVGG 训练和推理阶段网络结构的对比。
<div align="center"> <div align="center">
<img src="../../images/faq/RepVGG.png" width="400"> <img src="../../images/faq/RepVGG.png" width="400">
</div> </div>
首先训练阶段的RepVGG采用多分支结构,可以看作是在传统VGG网络的基础上,增加了`1*1`卷积和恒等映射的残差结构,而推理阶段的RepVGG则退化为VGG结构。训练阶段RepVGG到推理阶段RepVGG的网络结构转换使用“结构重参数化”技术实现。 首先训练阶段的 RepVGG 采用多分支结构,可以看作是在传统 VGG 网络的基础上,增加了 `1*1` 卷积和恒等映射的残差结构,而推理阶段的 RepVGG 则退化为 VGG 结构。训练阶段 RepVGG 到推理阶段 RepVGG 的网络结构转换使用“结构重参数化”技术实现。
对于恒等映射,可将其视为参数均为`1``1*1`卷积核作用在输入特征图的输出结果,因此训练阶段的RepVGG的卷积模块可以视为两个`1*1`卷积和一个`3*3`卷积,而`1*1`卷积的参数又可以直接相加到`3*3`卷积核中心位置的参数上(该操作类似于ACNet中,非对称卷积核参数相加到方形卷积核骨架位置参数的操作),通过上述操作,即可在推理阶段,将网络结构中的恒等映射、`1*1`卷积、`3*3`卷积三个分支合并为一个`3*3`卷积,详见`Q3.4` 对于恒等映射,可将其视为参数均为 `1``1*1` 卷积核作用在输入特征图的输出结果,因此训练阶段的 RepVGG 的卷积模块可以视为两个 `1*1` 卷积和一个 `3*3` 卷积,而 `1*1` 卷积的参数又可以直接相加到 `3*3` 卷积核中心位置的参数上(该操作类似于 ACNet 中,非对称卷积核参数相加到方形卷积核骨架位置参数的操作),通过上述操作,即可在推理阶段,将网络结构中的恒等映射、`1*1 `卷积、`3*3` 卷积三个分支合并为一个 `3*3` 卷积,详见 `Q3.4`
### Q3.4: ACNet与RepVGG中的struct re-parameters有何异同? ### Q3.4: ACNet 与 RepVGG 中的 struct re-parameters 有何异同?
**A** **A**
通过上面的了解,可以简单理解RepVGG是更为极端的ACNet。ACNet中的re-parameters操作如下图所示: 通过上面的了解,可以简单理解 RepVGG 是更为极端的 ACNet。ACNet 中的 re-parameters 操作如下图所示:
<div align="center"> <div align="center">
<img src="../../images/faq/ACNetReParams.png" width="400"> <img src="../../images/faq/ACNetReParams.png" width="400">
</div> </div>
观察上图,以其中的`conv2`为例,该非对称卷积可以视为`3*3`的方形卷积核,只不过该方形卷积核的上下六个参数为`0``conv3`同理。并且,`conv1``conv2``conv3`的结果相加,等同于三个卷积核相加再做卷积,以`Conv`表示卷积操作,`+`表示矩阵的加法操作,则:`Conv1(A)+Conv2(A)+Conv3(A) == Convk(A)`,其中`Conv1``Conv2``Conv3`的卷积核分别为`Kernel1``kernel2``kernel3`,而`Convk`的卷积核为`Kernel1 + kernel2 + kernel3` 观察上图,以其中的 `conv2` 为例,该非对称卷积可以视为 `3*3` 的方形卷积核,只不过该方形卷积核的上下六个参数为 `0``conv3` 同理。并且,`conv1``conv2``conv3` 的结果相加,等同于三个卷积核相加再做卷积,以 `Conv` 表示卷积操作,`+`表示矩阵的加法操作,则:`Conv1(A)+Conv2(A)+Conv3(A) == Convk(A)`,其中 `Conv1``Conv2``Conv3` 的卷积核分别为 `Kernel1``kernel2``kernel3`,而 `Convk` 的卷积核为 `Kernel1 + kernel2 + kernel3`
RepVGG网络与ACNet同理,只不过ACNet的`1*d`非对称卷积变成了`1*1`卷积,`1*1`卷积相加的位置变成了`3*3`卷积的中心。 RepVGG 网络与 ACNet 同理,只不过 ACNet 的 `1*d` 非对称卷积变成了 `1*1` 卷积,`1*1` 卷积相加的位置变成了 `3*3` 卷积的中心。
### Q3.5: 影响模型计算速度的因素都有哪些?参数量越大的模型计算速度一定更慢吗? ### Q3.5: 影响模型计算速度的因素都有哪些?参数量越大的模型计算速度一定更慢吗?
**A** **A**
影响模型计算速度的因素有很多,参数量只是其中之一。具体来说,在不考虑硬件差异的前提下,模型的计算速度可以参考以下几个方面: 影响模型计算速度的因素有很多,参数量只是其中之一。具体来说,在不考虑硬件差异的前提下,模型的计算速度可以参考以下几个方面:
1. 参数量:用于衡量模型的参数数量,模型的参数量越大,模型在计算时对内存(显存)的容量要求一般也更高。但内存(显存)占用大小不完全取决于参数量。如下图中,假设输入特征图内存占用大小为`1`个单位,对于左侧的残差结构而言,由于需要记录两个分支的运算结果,然后再相加,因此该结构在计算时的内存峰值占用是右侧Plain结构的两倍。 1. 参数量:用于衡量模型的参数数量,模型的参数量越大,模型在计算时对内存(显存)的容量要求一般也更高。但内存(显存)占用大小不完全取决于参数量。如下图中,假设输入特征图内存占用大小为 `1` 个单位,对于左侧的残差结构而言,由于需要记录两个分支的运算结果,然后再相加,因此该结构在计算时的内存峰值占用是右侧 Plain 结构的两倍。
<div align="center"> <div align="center">
<img src="../../images/faq/MemoryOccupation.png" width="400"> <img src="../../images/faq/MemoryOccupation.png" width="400">
</div> </div>
2. 浮点运算数量(FLOPs):注意与每秒浮点运算次数(FLOPS)相区分。FLOPs可以简单理解为计算量,通常用来衡量一个模型的计算复杂度。 2. 浮点运算数量(FLOPs):注意与每秒浮点运算次数(FLOPS)相区分。FLOPs 可以简单理解为计算量,通常用来衡量一个模型的计算复杂度。
以常见的卷积操作为例,在不考虑batch size、激活函数、stride操作、bias的前提下,假设input future map尺寸为`Min*Min`,通道数为`Cin`,output future map尺寸为`Mout*Mout`,通道数为`Cout`,conv kernel尺寸为`K*K`,则进行一次卷积的FLOPs可以通过下述方式计算: 以常见的卷积操作为例,在不考虑 batch size、激活函数、stride 操作、bias 的前提下,假设 input future map 尺寸为 `Min*Min`,通道数为 `Cin`,output future map 尺寸为 `Mout*Mout`,通道数为 `Cout`,conv kernel 尺寸为 `K*K`,则进行一次卷积的 FLOPs 可以通过下述方式计算:
1. 输出特征图包含特征点的数量为:`Cout * Mout * Mout` 1. 输出特征图包含特征点的数量为:`Cout * Mout * Mout`
2. 对于输出特征图中的每一个特征点的卷积操作而言: 2. 对于输出特征图中的每一个特征点的卷积操作而言:
乘法计算数量为:`Cin * K * K` 乘法计算数量为:`Cin * K * K`
加法计算数量为:`Cin * K * K - 1` 加法计算数量为:`Cin * K * K - 1`
3. 因此计算总量为:`Cout * Mout * Mout * (Cin * K * K + Cin * K * K - 1)`,也即`Cout * Mout * Mout * (2Cin * K * K - 1)` 3. 因此计算总量为:`Cout * Mout * Mout * (Cin * K * K + Cin * K * K - 1)`,也即 `Cout * Mout * Mout * (2Cin * K * K - 1)`
3. Memory Access Cost(MAC):内存访问成本,由于计算机在对数据进行运算(例如乘法、加法)前,需要将运算的数据从内存(此处泛指内存,包括显存)读取到运算器的Cache中,而内存的访问是十分耗时的。以分组卷积为例,假设分为`g`组,虽然分组后模型的参数量和FLOPs没有变化,但是分组卷积的内存访问次数成为之前的`g`倍(此处只是简单计算,未考虑多级Cache),因此MAC显著提高,模型的计算速度也相应变慢。 3. Memory Access Cost(MAC):内存访问成本,由于计算机在对数据进行运算(例如乘法、加法)前,需要将运算的数据从内存(此处泛指内存,包括显存)读取到运算器的 Cache 中,而内存的访问是十分耗时的。以分组卷积为例,假设分为 `g` 组,虽然分组后模型的参数量和 FLOPs 没有变化,但是分组卷积的内存访问次数成为之前的 `g` 倍(此处只是简单计算,未考虑多级 Cache),因此 MAC 显著提高,模型的计算速度也相应变慢。
4. 并行度:常说的并行度包括数据并行和模型并行两部分,此处是指模型并行。以卷积操作为例,一个卷积层的参数量通常十分庞大,如果将卷积层中的矩阵做分块处理,然后分别交由多个GPU进行运算,即可达到加速的目的。甚至有的网络层参数量过大,单张GPU显存无法容纳时,也可能将该层分由多个GPU计算,但是能否分由多个GPU并行运算,不仅取决于硬件条件,也受特定的运算形式所限制。当然,并行度越高的模型,其运行速度也越快。 4. 并行度:常说的并行度包括数据并行和模型并行两部分,此处是指模型并行。以卷积操作为例,一个卷积层的参数量通常十分庞大,如果将卷积层中的矩阵做分块处理,然后分别交由多个 GPU 进行运算,即可达到加速的目的。甚至有的网络层参数量过大,单张 GPU 显存无法容纳时,也可能将该层分由多个 GPU 计算,但是能否分由多个 GPU 并行运算,不仅取决于硬件条件,也受特定的运算形式所限制。当然,并行度越高的模型,其运行速度也越快。
<a name="第4期"></a> <a name="4"></a>
## 第4 ## 第 4
### Q4.1: 图像分类任务中,有一部分合成数据,这一部分合成数据是否需要使用样本均衡? ### Q4.1: 图像分类任务中,有一部分合成数据,这一部分合成数据是否需要使用样本均衡?
...@@ -173,97 +173,97 @@ RepVGG网络与ACNet同理,只不过ACNet的`1*d`非对称卷积变成了`1*1` ...@@ -173,97 +173,97 @@ RepVGG网络与ACNet同理,只不过ACNet的`1*d`非对称卷积变成了`1*1`
2. 如果是有的类别是合成而有的类别半合成半真实,只要数量在一个量级可不做均衡,并尝试训练一下,测试该合成类别样本是否能够准确识别。 2. 如果是有的类别是合成而有的类别半合成半真实,只要数量在一个量级可不做均衡,并尝试训练一下,测试该合成类别样本是否能够准确识别。
3. 如果不同来源数据的类别因合成数据增大问题,造成性能衰减,需要考虑合成数据集是否有噪声或者难例样本,也可适当增加该类别权重,获得该类别更好的识别性能。 3. 如果不同来源数据的类别因合成数据增大问题,造成性能衰减,需要考虑合成数据集是否有噪声或者难例样本,也可适当增加该类别权重,获得该类别更好的识别性能。
### Q4.2: 学术界将Vision Transformer(ViT)引入图像分类领域,将对图像分类带来什么新的机遇和挑战?相比于CNN的优势? ### Q4.2: 学术界将 Vision Transformer(ViT)引入图像分类领域,将对图像分类带来什么新的机遇和挑战?相比于 CNN 的优势?
论文地址[AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE](https://openreview.net/pdf?id=YicbFdNTTy) 论文地址[AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE](https://openreview.net/pdf?id=YicbFdNTTy)
**A**: **A**:
1. 图像对CNN的依赖是不必要的,利用Transformer的计算效率和可伸缩性,可以训练很大模型,当模型和数据集增大的情形下,仍然不会存在饱和的情况。受到Transformer在NLP上的启发,在图像分类任务中使用时,将图片分成顺序排列的patches,并将这些patches输入一个线性单元嵌入到embedding作为transformer的输入。 1. 图像对 CNN 的依赖是不必要的,利用 Transformer 的计算效率和可伸缩性,可以训练很大模型,当模型和数据集增大的情形下,仍然不会存在饱和的情况。受到 Transformer 在 NLP 上的启发,在图像分类任务中使用时,将图片分成顺序排列的 patches,并将这些 patches 输入一个线性单元嵌入到 embedding 作为 transformer 的输入。
2. 在中等规模数据集中如ImageNet1k,ImageNet21k,视觉Transformer模型低于相同规模尺寸的ResNet几个百分点。猜测这是因为transformer缺少CNN所具有的局部性(Locality)和空间不变性(Spatial Invariance)的特点,而在数据量不够大的时候,难以超越卷积网络,不过对于这一问题,[DeiT](https://arxiv.org/abs/2012.12877)使用数据增强的方式在一定程度上解决了Vision Transformer依赖超大规模数据集训练的问题。 2. 在中等规模数据集中如 ImageNet1k,ImageNet21k,视觉 Transformer 模型低于相同规模尺寸的 ResNet 几个百分点。猜测这是因为 transformer 缺少 CNN 所具有的局部性(Locality)和空间不变性(Spatial Invariance)的特点,而在数据量不够大的时候,难以超越卷积网络,不过对于这一问题,[DeiT](https://arxiv.org/abs/2012.12877) 使用数据增强的方式在一定程度上解决了 Vision Transformer 依赖超大规模数据集训练的问题。
3. 在超大规模数据集14M-300M训练时,这种方式可以越过局部信息,建模更加长距离的依赖关系,而CNN能较好关注局部信息全局信息捕获能力较弱。 3. 在超大规模数据集 14M-300M 训练时,这种方式可以越过局部信息,建模更加长距离的依赖关系,而 CNN 能较好关注局部信息全局信息捕获能力较弱。
4. Transformer一度在NLP领域一统江湖,也一度被质疑不适用于CV领域,当前出来的几片视觉领域的文章,性能也是直逼CNN的SOTA。相信在未来能够提出Vision-Language联合或者多模态的模型,能够一并解决视觉和语言问题。 4. Transformer 一度在 NLP 领域一统江湖,也一度被质疑不适用于 CV 领域,当前出来的几片视觉领域的文章,性能也是直逼 CNN 的 SOTA。相信在未来能够提出 Vision-Language 联合或者多模态的模型,能够一并解决视觉和语言问题。
### Q4.3: 对于Vision Transformer模型,是如何将图像转换成序列信息传给Encoder? ### Q4.3: 对于 Vision Transformer 模型,是如何将图像转换成序列信息传给 Encoder?
**A**: **A**:
1. 使用Transformer模型,主要是使用其中的注意力方法。我们希望构想一个适用语义embedding信息的场景,但是图像分类与序列的语义信息关联性不大,因此Vision Transformer有其独特的设计。ViT的目标也正是希望使用注意力机制来代替CNN。 1. 使用 Transformer 模型,主要是使用其中的注意力方法。我们希望构想一个适用语义 embedding 信息的场景,但是图像分类与序列的语义信息关联性不大,因此 Vision Transformer 有其独特的设计。ViT 的目标也正是希望使用注意力机制来代替 CNN。
2. 考虑Transformer中Encoder编码器的输入形式,如下图: 2. 考虑 Transformer 中 Encoder 编码器的输入形式,如下图:
* (1)不定长度的顺序输入,因为它是RNN结构,一句话,单词数不一样。如果是NLP场景,换词的顺序不太过于影响语义,但是图像换了不同区域的位置,不同区域连接顺序不同,将造成极大理解偏差。 * (1)不定长度的顺序输入,因为它是 RNN 结构,一句话,单词数不一样。如果是 NLP 场景,换词的顺序不太过于影响语义,但是图像换了不同区域的位置,不同区域连接顺序不同,将造成极大理解偏差。
* (2)单个patch位置信息通过变换成一个维度固定的向量,Encoder输入是patch像素信息embedding,与一些固定位置的向量concate, 合成一个维度固定的向量和位置信息在其中。 * (2)单个 patch 位置信息通过变换成一个维度固定的向量,Encoder 输入是 patch 像素信息 embedding,与一些固定位置的向量 concate,合成一个维度固定的向量和位置信息在其中。
<div align="center"> <div align="center">
<img src="../../images/faq/Transformer_input.png" width="400"> <img src="../../images/faq/Transformer_input.png" width="400">
</div> </div>
3. 考虑以下问题:怎样将一张图片传给encoder? 3. 考虑以下问题:怎样将一张图片传给 encoder?
* 如下图所示。假设输入图片是[224,224,3],按照顺序从左到右,从上到下,切分成很多个patch,patch大小可以为[p,p,3](p取值可以是16,32),对其使用Linear Projection of Flattened Patches模块转成特征向量,并concat一个位置向量,传入Encoder中。 * 如下图所示。假设输入图片是[224,224,3],按照顺序从左到右,从上到下,切分成很多个 patch,patch 大小可以为[p,p,3](p 取值可以是 16,32),对其使用 Linear Projection of Flattened Patches 模块转成特征向量,并 concat 一个位置向量,传入 Encoder 中。
<div align="center"> <div align="center">
<img src="../../images/faq/ViT_structure.png" width="400"> <img src="../../images/faq/ViT_structure.png" width="400">
</div> </div>
4. 如上图,给定一个`H×W×C`的图像以及区块大小P,可以把图像划分为`N``P×P×C`的区块,`N=H×W/(P×P)`。得到区块后要使用线性变换转为D维特征向量,再加上位置编码向量即可。和BERT类似,ViT 在序列之前也加入了一个分类标志位,记为`[CLS]`。ViT输入序列`z`如下面的公式所示,其中`x`表示一个图像区块。 4. 如上图,给定一个 `H×W×C` 的图像以及区块大小 P,可以把图像划分为 `N``P×P×C` 的区块,`N=H×W/(P×P)`。得到区块后要使用线性变换转为 D 维特征向量,再加上位置编码向量即可。和 BERT 类似,ViT 在序列之前也加入了一个分类标志位,记为 `[CLS]`。ViT 输入序列 `z` 如下面的公式所示,其中 `x` 表示一个图像区块。
<div align="center"> <div align="center">
<img src="../../images/faq/ViT.png" width="400"> <img src="../../images/faq/ViT.png" width="400">
</div> </div>
5. ViT 模型和 Transformer 基本一样,输入序列传入 ViT,然后利用`[CLS]`标志位的最终输出特征进行分类。ViT主要由MSA(多头自注意力)和MLP(两层使用GELU激活函数的全连接网络) 组成,在MSA和MLP之前加上LayerNorm和残差连接。 5. ViT 模型和 Transformer 基本一样,输入序列传入 ViT,然后利用 `[CLS]` 标志位的最终输出特征进行分类。ViT 主要由 MSA(多头自注意力)和 MLP(两层使用 GELU 激活函数的全连接网络)组成,在 MSA 和 MLP 之前加上 LayerNorm 和残差连接。
### Q4.4: 如何理解归纳偏置Inductive Bias? ### Q4.4: 如何理解归纳偏置 Inductive Bias?
**A**: **A**:
1. 在机器学习中,会对算需要应用的问题做一些假设,这个假设就称为归纳偏好。在现实生活中观察得到的现象中归纳出一定的先验规则,然后对模型做一定的约束,从而起到模型选择的作用。在CNN中,假设特征具有局部性(Locality)和空间不变性(Spatial Invariance)的特点,即把相邻的特征有联系而远离的没有,将相邻特征融合在一起,更会容易产生“解”;还有attention机制,也是从人的直觉、生活经验归纳的规则。 1. 在机器学习中,会对算需要应用的问题做一些假设,这个假设就称为归纳偏好。在现实生活中观察得到的现象中归纳出一定的先验规则,然后对模型做一定的约束,从而起到模型选择的作用。在 CNN 中,假设特征具有局部性(Locality)和空间不变性(Spatial Invariance)的特点,即把相邻的特征有联系而远离的没有,将相邻特征融合在一起,更会容易产生“解”;还有 attention 机制,也是从人的直觉、生活经验归纳的规则。
2. Vision Transformer利用的归纳偏置是有序列能力Sequentiality和时间不变性Time Invariance,即序列顺序上的时间间隔的联系,因此也能得出在更大规模数据集上比CNN类的模型有更好的性能。文章Conclusion里的“Unlike prior works using self-attention in computer vision, we do not introduce any image-specific inductive biases into the architecture”和Introduction里的“We find that large scale training trumps inductive bias”,可以得出直观上inductive bias在大量数据的情况中的产生是衰减性能,应该尽可能丢弃。 2. Vision Transformer 利用的归纳偏置是有序列能力 Sequentiality 和时间不变性 Time Invariance,即序列顺序上的时间间隔的联系,因此也能得出在更大规模数据集上比 CNN 类的模型有更好的性能。文章 Conclusion 里的“Unlike prior works using self-attention in computer vision, we do not introduce any image-specific inductive biases into the architecture”和 Introduction 里的“We find that large scale training trumps inductive bias”,可以得出直观上 inductive bias 在大量数据的情况中的产生是衰减性能,应该尽可能丢弃。
### Q4.5: ViT为什么要增加一个[CLS]标志位? 为什么将[CLS]标志位对应的向量作为整个序列的语义表示? ### Q4.5: ViT 为什么要增加一个[CLS]标志位? 为什么将[CLS]标志位对应的向量作为整个序列的语义表示?
**A**: **A**:
1.BERT相类似,ViT在第一个patch前添加一个`[CLS]`标志位,最后一个结束标志位对应的向量可以作为整个图像的语义表示,从而用于下游的分类任务等。从而使得整个embedding组可以表征该图像不同位置的特征。 1. BERT 相类似,ViT 在第一个 patch 前添加一个`[CLS]`标志位,最后一个结束标志位对应的向量可以作为整个图像的语义表示,从而用于下游的分类任务等。从而使得整个 embedding 组可以表征该图像不同位置的特征。
2.`[CLS]`标志位对应的向量作为整个图像的语义表示,是因为与图像中已有的其它patch块图像相比,这个无明显语义信息的符号会更“公平”地融合图像中各个patch的语义信息,从而更好的表示整个图像的语义。 2. `[CLS]` 标志位对应的向量作为整个图像的语义表示,是因为与图像中已有的其它 patch 块图像相比,这个无明显语义信息的符号会更“公平”地融合图像中各个 patch 的语义信息,从而更好的表示整个图像的语义。
<a name="第5期"></a> <a name="5"></a>
## 第5 ## 第 5
### Q5.1: PaddleClas训练配置文件中都包含了哪些内容?训练模型时如何进行修改? ### Q5.1: PaddleClas 训练配置文件中都包含了哪些内容?训练模型时如何进行修改?
**A**: **A**:
PaddleClas的模型包含6大模块的配置,分别为:全局配置,网络结构(ARCHITECTURE),学习率(LEARNING_RATE),优化器(OPTIMIZER),训练(TRAIN)和验证(VALID)。 PaddleClas 的模型包含 6 大模块的配置,分别为:全局配置,网络结构(ARCHITECTURE),学习率(LEARNING_RATE),优化器(OPTIMIZER),训练(TRAIN)和验证(VALID)。
全局配置主要包含了任务的配置信息,例如类别的数量,训练集内的数据量,训练的epoch数量,网络输入的尺寸等等。如果要训练自定义的任务,或是使用自己的训练集,需要关注这个部分。 全局配置主要包含了任务的配置信息,例如类别的数量,训练集内的数据量,训练的 epoch 数量,网络输入的尺寸等等。如果要训练自定义的任务,或是使用自己的训练集,需要关注这个部分。
网络结构的配置定义了要使用的网络。在实际使用时,首先要选择合适的配置文件,所以通常不会修改这部分配置。只有在自定义网络结构,或者对任务有特殊要求时才进行修改。 网络结构的配置定义了要使用的网络。在实际使用时,首先要选择合适的配置文件,所以通常不会修改这部分配置。只有在自定义网络结构,或者对任务有特殊要求时才进行修改。
学习率和优化器的配置建议优先使用默认配置,这些参数是我们已经调过的。如果任务的改动比较大,也可以做微调。 学习率和优化器的配置建议优先使用默认配置,这些参数是我们已经调过的。如果任务的改动比较大,也可以做微调。
训练和预测两个配置包含了batch_size,数据集,数据预处理(transforms),读数据进程数(num_workers)等比较重要的配置,这部分要根据实际环境适度修改。要注意的是,paddleclas中的batch_size是单卡配置,如果是多卡训练,则总的batch_size是配置文件中所设置的倍数,例如配置文件中设置batch_size为64,4卡训练,总batch_size也就是4*64=256。而num_workers定义的是单卡的进程数,即如果num_workers是8,并且使用4卡训练,则实际有32个worker。 训练和预测两个配置包含了 batch_size,数据集,数据预处理(transforms),读数据进程数(num_workers)等比较重要的配置,这部分要根据实际环境适度修改。要注意的是,paddleclas 中的 batch_size 是单卡配置,如果是多卡训练,则总的 batch_size 是配置文件中所设置的倍数,例如配置文件中设置 batch_size 为 64,4 卡训练,总 batch_size 也就是 4*64=256。而 num_workers 定义的是单卡的进程数,即如果 num_workers 是 8,并且使用 4 卡训练,则实际有 32 个 worker.
### Q5.2: 如何在命令行中快速的修改配置? ### Q5.2: 如何在命令行中快速的修改配置?
**A**: **A**:
在训练中,我们常常需要对个别配置不断进行微调,而不希望频繁的修改配置文件。这时可以使用-o来调整,修改是要先按层级写出要改的配置名称,层级之间用点分割,再写出要修改的值。例如我们想要修改batch_size,可以在训练的命令后加上-o DataLoader.TRAIN.sampler.batch_size=512。 在训练中,我们常常需要对个别配置不断进行微调,而不希望频繁的修改配置文件。这时可以使用 -o 来调整,修改是要先按层级写出要改的配置名称,层级之间用点分割,再写出要修改的值。例如我们想要修改 batch_size,可以在训练的命令后加上-o DataLoader.TRAIN.sampler.batch_size=512。
### Q5.3: 如何根据PaddleClas的精度曲线选择合适的模型? ### Q5.3: 如何根据 PaddleClas 的精度曲线选择合适的模型?
**A**: **A**:
PaddleClas提供了多个模型的benchmark,并绘制了性能曲线,主要有三种:准确率-预测时间曲线,准确率-参数量曲线和准确率-FLOPS曲线,纵轴为准确率,横轴分别为预测时间、参数量、FLOPS。一般来说,不同模型在三个图上的表现是一致的。同一个系列的模型在图上采用相同的符号来表示,并且用曲线连接。 PaddleClas 提供了多个模型的 benchmark,并绘制了性能曲线,主要有三种:准确率-预测时间曲线,准确率-参数量曲线和准确率-FLOPS 曲线,纵轴为准确率,横轴分别为预测时间、参数量、FLOPS。一般来说,不同模型在三个图上的表现是一致的。同一个系列的模型在图上采用相同的符号来表示,并且用曲线连接。
以准确率-预测时间曲线为例,点越靠上表明准确率越高,约靠左表明速度越快。例如左上区域的模型为又快又准的模型,而最左侧贴近纵轴的点则为轻量级的模型。使用时,可以综合考虑准确率和时间因素,选择合适的模型。举个例子,我们希望模型的运行时间在10ms以下,选择最准确的模型。首先,在横轴的10ms出画一条垂直的线,之后在这条线的左侧找到最高的点,就是符合要求的模型。 以准确率-预测时间曲线为例,点越靠上表明准确率越高,约靠左表明速度越快。例如左上区域的模型为又快又准的模型,而最左侧贴近纵轴的点则为轻量级的模型。使用时,可以综合考虑准确率和时间因素,选择合适的模型。举个例子,我们希望模型的运行时间在 10ms 以下,选择最准确的模型。首先,在横轴的 10ms 出画一条垂直的线,之后在这条线的左侧找到最高的点,就是符合要求的模型。
实际使用中,模型的参数量和FLOPS是稳定不变的,而运算时间在不同的软硬件条件下均会有所变化。如果想更准确的选择模型,那么可以在自己的环境中运行测试,得到该环境下的性能图。 实际使用中,模型的参数量和 FLOPS 是稳定不变的,而运算时间在不同的软硬件条件下均会有所变化。如果想更准确的选择模型,那么可以在自己的环境中运行测试,得到该环境下的性能图。
### Q5.4: 想在imagenet中增加两个类,能不能把现有全连接层的参数固定,只训练新的两个类别? ### Q5.4: 想在 imagenet 中增加两个类,能不能把现有全连接层的参数固定,只训练新的两个类别?
**A**: **A**:
这个想法理论上可行,但效果恐怕不会太好。如果只是固定全连接层,而前面的卷积层参数发生了变化,那么这些全连接层的作用也无法保证与开始一样。而如果保持整个网络的参数都不变,只训练全连接层的新增两个类别,也比较难训练处理想的结果。 这个想法理论上可行,但效果恐怕不会太好。如果只是固定全连接层,而前面的卷积层参数发生了变化,那么这些全连接层的作用也无法保证与开始一样。而如果保持整个网络的参数都不变,只训练全连接层的新增两个类别,也比较难训练处理想的结果。
如果实际使用中确实需要原有的1000个类别依然很准确,那么可以将新类别的数据加入到原有训练集中,再用预训练模型进行finetune。如果只需要1000个类中的几个类别,那么可以把这部分的数据挑出来,和新增数据混合再finetune。 如果实际使用中确实需要原有的 1000 个类别依然很准确,那么可以将新类别的数据加入到原有训练集中,再用预训练模型进行 finetune。如果只需要 1000 个类中的几个类别,那么可以把这部分的数据挑出来,和新增数据混合再 finetune。
### Q5.5: 使用分类模型做其他任务的预训练模型时,应该选择哪些层作为feature? ### Q5.5: 使用分类模型做其他任务的预训练模型时,应该选择哪些层作为 feature?
**A**: **A**:
使用分类模型做其他任务的backbone有很多策略,这里介绍一种较为基础的方法。首先,去掉最后的全连接层,这一层主要包含的是原始任务的分类信息。如果任务比较简单,只要将前一层的输出作为featuremap,并在此基础上添加与任务对应的结构即可。如果任务涉及多尺度,需要选取不同尺度的anchor,例如某些检测模型,那么可以选取每次下采样之前一层的输出作为featuremap。 使用分类模型做其他任务的 backbone 有很多策略,这里介绍一种较为基础的方法。首先,去掉最后的全连接层,这一层主要包含的是原始任务的分类信息。如果任务比较简单,只要将前一层的输出作为 featuremap,并在此基础上添加与任务对应的结构即可。如果任务涉及多尺度,需要选取不同尺度的 anchor,例如某些检测模型,那么可以选取每次下采样之前一层的输出作为 featuremap。
# PaddleClas 相关常见问题汇总 - 2021 第2 # PaddleClas 相关常见问题汇总 - 2021 第 2
## 写在前面 ## 写在前面
* 我们收集整理了开源以来在issues和用户群中的常见问题并且给出了简要解答,旨在为广大用户提供一些参考,也希望帮助大家少走一些弯路。 * 我们收集整理了开源以来在 issues 和用户群中的常见问题并且给出了简要解答,旨在为广大用户提供一些参考,也希望帮助大家少走一些弯路。
* 图像分类、识别、检索领域大佬众多,模型和论文更新速度也很快,本文档回答主要依赖有限的项目实践,难免挂一漏万,如有遗漏和不足,也希望有识之士帮忙补充和修正,万分感谢。 * 图像分类、识别、检索领域大佬众多,模型和论文更新速度也很快,本文档回答主要依赖有限的项目实践,难免挂一漏万,如有遗漏和不足,也希望有识之士帮忙补充和修正,万分感谢。
## 目录 ## 目录
* [近期更新](#近期更新)(2021.09.08) * [近期更新](#近期更新)(2021.09.08)
* [精选](#精选) * [精选](#精选)
* [1. 理论篇](#1.理论篇) * [1. 理论篇](#1)
* [1.1 PaddleClas基础知识](#1.1PaddleClas基础知识) * [1.1 PaddleClas 基础知识](#1.1)
* [1.2 骨干网络和预训练模型库](#1.2骨干网络和预训练模型库) * [1.2 骨干网络和预训练模型库](#1.2)
* [1.3 图像分类](#1.3图像分类) * [1.3 图像分类](#1.3)
* [1.4 通用检测模块](#1.4通用检测模块) * [1.4 通用检测模块](#1.4)
* [1.5 图像识别模块](#1.5图像识别模块) * [1.5 图像识别模块](#1.5)
* [1.6 检索模块](#1.6检索模块) * [1.6 检索模块](#1.6)
* [2. 实战篇](#2.实战篇) * [2. 实战篇](#2)
* [2.1 训练与评估共性问题](#2.1训练与评估共性问题) * [2.1 训练与评估共性问题](#2.1)
* [2.2 图像分类](#2.2图像分类) * [2.2 图像分类](#2.2)
* [2.3 通用检测模块](#2.3通用检测模块) * [2.3 通用检测模块](#2.3)
* [2.4 图像识别模块](#2.4图像识别模块) * [2.4 图像识别模块](#2.4)
* [2.5 检索模块](#2.5检索模块) * [2.5 检索模块](#2.5)
* [2.6 模型预测部署](#2.6模型预测部署) * [2.6 模型预测部署](#2.6)
<a name="近期更新"></a> <a name="近期更新"></a>
## 近期更新 ## 近期更新
...@@ -34,15 +34,15 @@ ...@@ -34,15 +34,15 @@
**A** **A**
* `Mixup` 的使用方法请参考 [Mixup](../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Mixup.yaml#L63-L65)`Cuxmix` 请参考 [Cuxmix](../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L63-L65) * `Mixup` 的使用方法请参考 [Mixup](../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Mixup.yaml#L63-L65)`Cuxmix` 请参考 [Cuxmix](../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L63-L65)
* 使用 `Mixup``Cutmix` 做训练时无法计算训练的精度(Acc)指标,因此需要在配置文件中取消 `Metric.Train.TopkAcc` 字段,可参考 [Metric.Train.TopkAcc](../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L125-L128) * 使用 `Mixup``Cutmix` 做训练时无法计算训练的精度(Acc)指标,因此需要在配置文件中取消 `Metric.Train.TopkAcc` 字段,可参考 [Metric.Train.TopkAcc](../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L125-L128)
#### Q2.1.9: 训练配置yaml文件中,字段 `Global.pretrain_model` 和 `Global.checkpoints` 分别用于配置什么呢? #### Q2.1.9: 训练配置 yaml 文件中,字段 `Global.pretrain_model` 和 `Global.checkpoints` 分别用于配置什么呢?
**A** **A**
* 当需要 `fine-tune` 时,可以通过字段 `Global.pretrain_model` 配置预训练模型权重文件的路径,预训练模型权重文件后缀名通常为 `.pdparams` * 当需要 `fine-tune` 时,可以通过字段 `Global.pretrain_model` 配置预训练模型权重文件的路径,预训练模型权重文件后缀名通常为 `.pdparams`
* 在训练过程中,训练程序会自动保存每个epoch结束时的断点信息,包括优化器信息 `.pdopt` 和模型权重信息 `.pdparams`。在训练过程意外中断等情况下,需要恢复训练时,可以通过字段 `Global.checkpoints` 配置训练过程中保存的断点信息文件,例如通过配置 `checkpoints: ./output/ResNet18/epoch_18` 即可恢复18epoch训练结束时的断点信息,PaddleClas将自动加载 `epoch_18.pdopt``epoch_18.pdparams`,从19epoch继续训练。 * 在训练过程中,训练程序会自动保存每个 epoch 结束时的断点信息,包括优化器信息 `.pdopt` 和模型权重信息 `.pdparams`。在训练过程意外中断等情况下,需要恢复训练时,可以通过字段 `Global.checkpoints` 配置训练过程中保存的断点信息文件,例如通过配置 `checkpoints: ./output/ResNet18/epoch_18` 即可恢复 18 epoch 训练结束时的断点信息,PaddleClas 将自动加载 `epoch_18.pdopt``epoch_18.pdparams`,从 19 epoch 继续训练。
#### Q2.6.3: 如何将模型转为 `ONNX` 格式? #### Q2.6.3: 如何将模型转为 `ONNX` 格式?
**A**:Paddle支持两种转ONNX格式模型的方式,且依赖于 `paddle2onnx` 工具,首先需要安装 `paddle2onnx` **A**:Paddle 支持两种转 ONNX 格式模型的方式,且依赖于 `paddle2onnx` 工具,首先需要安装 `paddle2onnx`
```shell ```shell
pip install paddle2onnx pip install paddle2onnx
...@@ -62,7 +62,7 @@ pip install paddle2onnx ...@@ -62,7 +62,7 @@ pip install paddle2onnx
关于静态图导出的非 `combined` 格式的 inference model(通常包含文件 `__model__` 和多个参数文件)转换模型格式,以及更多参数说明请参考 paddle2onnx 官方文档 [paddle2onnx](https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/README_zh.md#%E5%8F%82%E6%95%B0%E9%80%89%E9%A1%B9)。 关于静态图导出的非 `combined` 格式的 inference model(通常包含文件 `__model__` 和多个参数文件)转换模型格式,以及更多参数说明请参考 paddle2onnx 官方文档 [paddle2onnx](https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/README_zh.md#%E5%8F%82%E6%95%B0%E9%80%89%E9%A1%B9)。
* 直接从模型组网代码导出ONNX格式模型: * 直接从模型组网代码导出 ONNX 格式模型:
以动态图模型组网代码为例,模型类为继承于 `paddle.nn.Layer` 的子类,代码如下所示: 以动态图模型组网代码为例,模型类为继承于 `paddle.nn.Layer` 的子类,代码如下所示:
...@@ -87,19 +87,19 @@ pip install paddle2onnx ...@@ -87,19 +87,19 @@ pip install paddle2onnx
需要注意,`paddlepaddle` 版本需大于 `2.0.0`。关于 `paddle.onnx.export()` 函数的更多参数说明请参考[paddle.onnx.export](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/onnx/export_cn.html#export)。 需要注意,`paddlepaddle` 版本需大于 `2.0.0`。关于 `paddle.onnx.export()` 函数的更多参数说明请参考[paddle.onnx.export](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/onnx/export_cn.html#export)。
#### Q2.5.4: 在 build 检索底库时,参数 `pq_size` 应该如何设置? #### Q2.5.4: 在 build 检索底库时,参数 `pq_size` 应该如何设置?
**A**`pq_size`PQ检索算法的参数。PQ检索算法可以简单理解为“分层”检索算法,`pq_size` 是每层的“容量”,因此该参数的设置会影响检索性能,不过,在底库总数据量不太大(小于10000张)的情况下,这个参数对性能的影响很小,因此对于大多数使用场景而言,在构建底库时无需修改该参数。关于PQ检索算法的更多内容,可以查看相关[论文](https://lear.inrialpes.fr/pubs/2011/JDS11/jegou_searching_with_quantization.pdf) **A**`pq_size` PQ 检索算法的参数。PQ 检索算法可以简单理解为“分层”检索算法,`pq_size` 是每层的“容量”,因此该参数的设置会影响检索性能,不过,在底库总数据量不太大(小于 10000 张)的情况下,这个参数对性能的影响很小,因此对于大多数使用场景而言,在构建底库时无需修改该参数。关于 PQ 检索算法的更多内容,可以查看相关[论文](https://lear.inrialpes.fr/pubs/2011/JDS11/jegou_searching_with_quantization.pdf)
<a name="精选"></a> <a name="精选"></a>
## 精选 ## 精选
<a name="1.理论篇"></a> <a name="1"></a>
## 1. 理论篇 ## 1. 理论篇
<a name="1.1PaddleClas基础知识"></a> <a name="1.1"></a>
### 1.1 PaddleClas基础知识 ### 1.1 PaddleClas 基础知识
#### Q1.1.1 PaddleClas和PaddleDetection区别 #### Q1.1.1 PaddleClas 和 PaddleDetection 区别
**A**:PaddleClas是一个兼主体检测、图像分类、图像检索于一体的图像识别repo,用于解决大部分图像识别问题,用户可以很方便的使用PaddleClas来解决小样本、多类别的图像识别问题。PaddleDetection提供了目标检测、关键点检测、多目标跟踪等能力,方便用户定位图像中的感兴趣的点和区域,被广泛应用于工业质检、遥感图像检测、无人巡检等项目。 **A**:PaddleClas 是一个兼主体检测、图像分类、图像检索于一体的图像识别 repo,用于解决大部分图像识别问题,用户可以很方便的使用 PaddleClas 来解决小样本、多类别的图像识别问题。PaddleDetection 提供了目标检测、关键点检测、多目标跟踪等能力,方便用户定位图像中的感兴趣的点和区域,被广泛应用于工业质检、遥感图像检测、无人巡检等项目。
#### Q1.1.3: Momentum 优化器中的 momentum 参数是什么意思呢? #### Q1.1.3: Momentum 优化器中的 momentum 参数是什么意思呢?
**A**: Momentum 优化器是在 SGD 优化器的基础上引入了“动量”的概念。在 SGD 优化器中,在 `t+1` 时刻,参数 `w` 的更新可表示为: **A**: Momentum 优化器是在 SGD 优化器的基础上引入了“动量”的概念。在 SGD 优化器中,在 `t+1` 时刻,参数 `w` 的更新可表示为:
...@@ -120,74 +120,74 @@ w_t+1 = w_t - v_t+1 ...@@ -120,74 +120,74 @@ w_t+1 = w_t - v_t+1
通过引入动量的概念,在参数更新时考虑了历史更新的影响,因此可以加快收敛速度,也改善了 `SGD` 优化器带来的损失(cost、loss)震荡问题。 通过引入动量的概念,在参数更新时考虑了历史更新的影响,因此可以加快收敛速度,也改善了 `SGD` 优化器带来的损失(cost、loss)震荡问题。
#### Q1.1.4: PaddleClas 是否有 `Fixing the train-test resolution discrepancy` 这篇论文的实现呢? #### Q1.1.4: PaddleClas 是否有 `Fixing the train-test resolution discrepancy` 这篇论文的实现呢?
**A**: 目前 PaddleClas 没有实现。如果需要,可以尝试自己修改代码。简单来说,该论文所提出的思想是使用较大分辨率作为输入,对已经训练好的模型最后的FC层进行fine-tune。具体操作上,首先在较低分辨率的数据集上对模型网络进行训练,完成训练后,对网络除最后的FC层外的其他层的权重设置参数 `stop_gradient=True`,然后使用较大分辨率的输入对网络进行fine-tune训练。 **A**: 目前 PaddleClas 没有实现。如果需要,可以尝试自己修改代码。简单来说,该论文所提出的思想是使用较大分辨率作为输入,对已经训练好的模型最后的 FC 层进行 fine-tune。具体操作上,首先在较低分辨率的数据集上对模型网络进行训练,完成训练后,对网络除最后的 FC 层外的其他层的权重设置参数 `stop_gradient=True`,然后使用较大分辨率的输入对网络进行 fine-tune 训练。
<a name="1.2骨干网络和预训练模型库"></a> <a name="1.2"></a>
### 1.2 骨干网络和预训练模型库 ### 1.2 骨干网络和预训练模型库
<a name="1.3图像分类"></a> <a name="1.3"></a>
### 1.3 图像分类 ### 1.3 图像分类
#### Q1.3.1: PaddleClas有提供调整图片亮度,对比度,饱和度,色调等方面的数据增强吗? #### Q1.3.1: PaddleClas 有提供调整图片亮度,对比度,饱和度,色调等方面的数据增强吗?
**A**:PaddleClas提供了多种数据增广方式, 可分为3类: **A**:PaddleClas 提供了多种数据增广方式,可分为 3 类:
1. 图像变换类: AutoAugment, RandAugment; 1. 图像变换类: AutoAugment, RandAugment;
2. 图像裁剪类: CutOut、RandErasing、HideAndSeek、GridMask; 2. 图像裁剪类: CutOut、RandErasing、HideAndSeek、GridMask;
3. 图像混叠类:Mixup, Cutmix. 3. 图像混叠类:Mixup, Cutmix.
其中,RandAngment提供了多种数据增强方式的随机组合,可以满足亮度、对比度、饱和度、色调等多方面的数据增广需求。 其中,RandAngment 提供了多种数据增强方式的随机组合,可以满足亮度、对比度、饱和度、色调等多方面的数据增广需求。
<a name="1.4通用检测模块"></a> <a name="1.4"></a>
### 1.4 通用检测模块 ### 1.4 通用检测模块
#### Q1.4.1 主体检测是每次只输出一个主体检测框吗? #### Q1.4.1 主体检测是每次只输出一个主体检测框吗?
**A**:主体检测这块的输出数量是可以通过配置文件配置的。在配置文件中Global.threshold控制检测的阈值,小于该阈值的检测框被舍弃,Global.max_det_results控制最大返回的结果数,这两个参数共同决定了输出检测框的数量。 **A**:主体检测这块的输出数量是可以通过配置文件配置的。在配置文件中 Global.threshold 控制检测的阈值,小于该阈值的检测框被舍弃,Global.max_det_results 控制最大返回的结果数,这两个参数共同决定了输出检测框的数量。
#### Q1.4.2 训练主体检测模型的数据是如何选择的?换成更小的模型会有损精度吗? #### Q1.4.2 训练主体检测模型的数据是如何选择的?换成更小的模型会有损精度吗?
**A**:训练数据是在COCO、Object365、RPC、LogoDet等公开数据集中随机抽取的子集。目前我们在2.3版本中推出了超轻量的主体检测模型,具体信息可以参考[主体检测](../image_recognition_pipeline/mainbody_detection.md#2-模型选择)。关于主体检测模型的更多信息请参考[主体检测](../image_recognition_pipeline/mainbody_detection.md) **A**:训练数据是在 COCO、Object365、RPC、LogoDet 等公开数据集中随机抽取的子集。目前我们在 2.3 版本中推出了超轻量的主体检测模型,具体信息可以参考[主体检测](../image_recognition_pipeline/mainbody_detection.md#2-模型选择)。关于主体检测模型的更多信息请参考[主体检测](../image_recognition_pipeline/mainbody_detection.md)
#### Q1.4.3: 目前使用的主体检测模型检测在某些场景中会有误检? #### Q1.4.3: 目前使用的主体检测模型检测在某些场景中会有误检?
**A**:目前的主体检测模型训练时使用了COCO、Object365、RPC、LogoDet等公开数据集,如果被检测数据是类似工业质检等于常见类别差异较大的数据,需要基于目前的检测模型重新微调训练。 **A**:目前的主体检测模型训练时使用了 COCO、Object365、RPC、LogoDet 等公开数据集,如果被检测数据是类似工业质检等于常见类别差异较大的数据,需要基于目前的检测模型重新微调训练。
<a name="1.5图像识别模块"></a> <a name="1.5"></a>
### 1.5 图像识别模块 ### 1.5 图像识别模块
#### Q1.5.1 使用`circle loss`还需加`triplet loss`吗? #### Q1.5.1 使用 `circle loss` 还需加 `triplet loss` 吗?
**A**`circle loss`是统一了样本对学习和分类学习的两种形式,如果是分类学习的形式的话,可以增加`triplet loss` **A**`circle loss` 是统一了样本对学习和分类学习的两种形式,如果是分类学习的形式的话,可以增加 `triplet loss`
#### Q1.5.2 如果不是识别开源的四个方向的图片,该使用哪个识别模型? #### Q1.5.2 如果不是识别开源的四个方向的图片,该使用哪个识别模型?
**A**:建议使用商品识别模型,一来是因为商品覆盖的范围比较广,被识别的图片是商品的概率更大,二来是因为商品识别模型的训练数据使用了5万类别的数据,泛化能力更好,特征会更鲁棒一些。 **A**:建议使用商品识别模型,一来是因为商品覆盖的范围比较广,被识别的图片是商品的概率更大,二来是因为商品识别模型的训练数据使用了 5 万类别的数据,泛化能力更好,特征会更鲁棒一些。
#### Q1.5.3 最后使用512维的向量,为什么不用1024或者其他维度的呢? #### Q1.5.3 最后使用 512 维的向量,为什么不用 1024 或者其他维度的呢?
**A**:使用维度小的向量,为了加快计算,在实际使用过程中,可能使用128甚至更小。一般来说,512的维度已经够大,能充分表示特征了。 **A**:使用维度小的向量,为了加快计算,在实际使用过程中,可能使用 128 甚至更小。一般来说,512 的维度已经够大,能充分表示特征了。
<a name="1.6检索模块"></a> <a name="1.6"></a>
### 1.6 检索模块 ### 1.6 检索模块
#### Q1.6.1 PaddleClas目前使用的Möbius向量检索算法支持类似于faiss的那种index.add()的功能吗? 另外,每次构建新的图都要进行train吗?这里的train是为了检索加速还是为了构建相似的图? #### Q1.6.1 PaddleClas 目前使用的 Möbius 向量检索算法支持类似于 faiss 的那种 index.add()的功能吗? 另外,每次构建新的图都要进行 train 吗?这里的 train 是为了检索加速还是为了构建相似的图?
**A**:目前在release/2.3分支已经支持faiss检索模块,并且不再支持Möbius。关于Möbius提供的检索算法,是一种基于图的近似最近邻搜索算法,目前支持两种距离计算方式:inner product和L2 distance,但是Möbius暂不支持faiss中提供的index.add功能,如果需要增加检索库的内容,需要从头重新构建新的index. 在每次构建index时,检索算法内部执行的操作是一种类似于train的过程,不同于faiss提供的train接口。因此需要faiss模块的话,可以使用release/2.3分支,需要Möbius的话,目前需要回退到release/2.2分支。 **A**:目前在 release/2.3 分支已经支持 faiss 检索模块,并且不再支持 Möbius。关于 Möbius 提供的检索算法,是一种基于图的近似最近邻搜索算法,目前支持两种距离计算方式:inner product 和 L2 distance,但是 Möbius 暂不支持 faiss 中提供的 index.add 功能,如果需要增加检索库的内容,需要从头重新构建新的 index. 在每次构建 index 时,检索算法内部执行的操作是一种类似于 train 的过程,不同于 faiss 提供的 train 接口。因此需要 faiss 模块的话,可以使用 release/2.3 分支,需要 Möbius 的话,目前需要回退到 release/2.2 分支。
#### Q1.6.2: PaddleClas 图像识别用于 Eval 的配置文件中,`Query` 和 `Gallery` 配置具体是用于做什么呢? #### Q1.6.2: PaddleClas 图像识别用于 Eval 的配置文件中,`Query` 和 `Gallery` 配置具体是用于做什么呢?
**A**: `Query``Gallery` 均为数据集配置,其中 `Gallery` 用于配置底库数据,`Query` 用于配置验证集。在进行 Eval 时,首先使用模型对 `Gallery` 底库数据进行前向计算特征向量,特征向量用于构建底库,然后模型对 `Query` 验证集中的数据进行前向计算特征向量,再与底库计算召回率等指标。 **A**: `Query``Gallery` 均为数据集配置,其中 `Gallery` 用于配置底库数据,`Query` 用于配置验证集。在进行 Eval 时,首先使用模型对 `Gallery` 底库数据进行前向计算特征向量,特征向量用于构建底库,然后模型对 `Query` 验证集中的数据进行前向计算特征向量,再与底库计算召回率等指标。
<a name="2.实战篇"></a> <a name="2"></a>
## 2. 实战篇 ## 2. 实战篇
<a name="2.1训练与评估共性问题"></a> <a name="2.1"></a>
### 2.1 训练与评估共性问题 ### 2.1 训练与评估共性问题
#### Q2.1.1 PaddleClas 的`train_log`文件在哪里? #### Q2.1.1 PaddleClas 的 `train_log` 文件在哪里?
**A**:在保存权重的路径中存放了`train.log` **A**:在保存权重的路径中存放了 `train.log`
#### Q2.1.2 模型训练出nan,为什么? #### Q2.1.2 模型训练出 nan,为什么?
**A** **A**
1.确保正确加载预训练模型, 最简单的加载方式添加参数`-o Arch.pretrained=True`即可; 1.确保正确加载预训练模型, 最简单的加载方式添加参数 `-o Arch.pretrained=True` 即可;
2.模型微调时,学习率不要太大,如设置0.001就好。 2.模型微调时,学习率不要太大,如设置 0.001 就好。
#### Q2.1.3 可以对视频中每一帧画面进行逐帧预测吗? #### Q2.1.3 可以对视频中每一帧画面进行逐帧预测吗?
**A**:可以,但目前PaddleClas并不支持视频输入。可以尝试修改一下PaddleClas代码,或者预先将视频逐帧转为图像存储,再使用PaddleClas进行预测。 **A**:可以,但目前 PaddleClas 并不支持视频输入。可以尝试修改一下 PaddleClas 代码,或者预先将视频逐帧转为图像存储,再使用 PaddleClas 进行预测。
#### Q2.1.4: 数据预处理中,不想对输入数据进行裁剪,该如何设置?或者如何设置剪裁的尺寸。 #### Q2.1.4: 数据预处理中,不想对输入数据进行裁剪,该如何设置?或者如何设置剪裁的尺寸。
**A**: PaddleClas 支持的数据预处理算子可在这里查看:`ppcls/data/preprocess/__init__.py`,所有支持的算子均可在配置文件中进行配置,配置的算子名称需要和算子类名一致,参数与对应算子类的构造函数参数一致。如不需要对图像裁剪,则可去掉 `CropImage``RandCropImage`,使用 `ResizeImage` 替换即可,可通过其参数设置不同的resize方式, 使用 `size` 参数则直接将图像缩放至固定大小,使用`resize_short` 参数则会维持图像宽高比进行缩放。设置裁剪尺寸时,可通过 `CropImage` 算子的 `size` 参数,或 `RandCropImage` 算子的 `size` 参数。 **A**: PaddleClas 支持的数据预处理算子可在这里查看:`ppcls/data/preprocess/__init__.py`,所有支持的算子均可在配置文件中进行配置,配置的算子名称需要和算子类名一致,参数与对应算子类的构造函数参数一致。如不需要对图像裁剪,则可去掉 `CropImage``RandCropImage`,使用 `ResizeImage` 替换即可,可通过其参数设置不同的 resize 方式,使用 `size` 参数则直接将图像缩放至固定大小,使用 `resize_short` 参数则会维持图像宽高比进行缩放。设置裁剪尺寸时,可通过 `CropImage` 算子的 `size` 参数,或 `RandCropImage` 算子的 `size` 参数。
#### Q2.1.5: PaddlePaddle 安装后,使用报错,无法导入 paddle 下的任何模块(import paddle.xxx),是为什么呢? #### Q2.1.5: PaddlePaddle 安装后,使用报错,无法导入 paddle 下的任何模块(import paddle.xxx),是为什么呢?
**A**: 首先可以使用以下代码测试 Paddle 是否安装正确: **A**: 首先可以使用以下代码测试 Paddle 是否安装正确:
...@@ -200,13 +200,13 @@ paddle.utils.install_check.run_check() ...@@ -200,13 +200,13 @@ paddle.utils.install_check.run_check()
PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now. PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.
``` ```
如未能安装成功,则会有相应问题的提示。 如未能安装成功,则会有相应问题的提示。
另外,在同时安装CPU版本和GPU版本Paddle后,由于两个版本存在冲突,需要将两个版本全部卸载,然后重新安装所需要的版本。 另外,在同时安装 CPU 版本和 GPU 版本 Paddle 后,由于两个版本存在冲突,需要将两个版本全部卸载,然后重新安装所需要的版本。
#### Q2.1.6: 使用PaddleClas训练时,如何设置仅保存最优模型?不想保存中间模型。 #### Q2.1.6: 使用 PaddleClas 训练时,如何设置仅保存最优模型?不想保存中间模型。
**A**: PaddleClas在训练过程中,会保存/更新以下三类模型: **A**: PaddleClas 在训练过程中,会保存/更新以下三类模型:
1. 最新的模型(`latest.pdopt` `latest.pdparams``latest.pdstates`),当训练意外中断时,可使用最新保存的模型恢复训练; 1. 最新的模型(`latest.pdopt``latest.pdparams``latest.pdstates`),当训练意外中断时,可使用最新保存的模型恢复训练;
2. 最优的模型(`best_model.pdopt``best_model.pdparams``best_model.pdstates`); 2. 最优的模型(`best_model.pdopt``best_model.pdparams``best_model.pdstates`);
3. 训练过程中,一个epoch结束时的断点(`epoch_xxx.pdopt``epoch_xxx.pdparams``epoch_xxx.pdstates`)。训练配置文件中 `Global.save_interval` 字段表示该模型的保存间隔。将该字段设置大于总epochs数,则不再保存中间断点模型。 3. 训练过程中,一个 epoch 结束时的断点(`epoch_xxx.pdopt``epoch_xxx.pdparams``epoch_xxx.pdstates`)。训练配置文件中 `Global.save_interval` 字段表示该模型的保存间隔。将该字段设置大于总 epochs 数,则不再保存中间断点模型。
#### Q2.1.7: 在训练时,出现如下报错信息:`ERROR: Unexpected segmentation fault encountered in DataLoader workers.`,如何排查解决问题呢? #### Q2.1.7: 在训练时,出现如下报错信息:`ERROR: Unexpected segmentation fault encountered in DataLoader workers.`,如何排查解决问题呢?
**A**:尝试将训练配置文件中的字段 `num_workers` 设置为 `0`;尝试将训练配置文件中的字段 `batch_size` 调小一些;检查数据集格式和配置文件中的数据集路径是否正确。 **A**:尝试将训练配置文件中的字段 `num_workers` 设置为 `0`;尝试将训练配置文件中的字段 `batch_size` 调小一些;检查数据集格式和配置文件中的数据集路径是否正确。
...@@ -217,70 +217,70 @@ PaddlePaddle is installed successfully! Let's start deep learning with PaddlePad ...@@ -217,70 +217,70 @@ PaddlePaddle is installed successfully! Let's start deep learning with PaddlePad
* 使用 `Mixup``Cutmix` 做训练时无法计算训练的精度(Acc)指标,因此需要在配置文件中取消 `Metric.Train.TopkAcc` 字段,可参考 [Metric.Train.TopkAcc](../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L125-L128) * 使用 `Mixup``Cutmix` 做训练时无法计算训练的精度(Acc)指标,因此需要在配置文件中取消 `Metric.Train.TopkAcc` 字段,可参考 [Metric.Train.TopkAcc](../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L125-L128)
#### Q2.1.9: 训练配置yaml文件中,字段 `Global.pretrain_model` 和 `Global.checkpoints` 分别用于配置什么呢? #### Q2.1.9: 训练配置 yaml 文件中,字段 `Global.pretrain_model` 和 `Global.checkpoints` 分别用于配置什么呢?
**A** **A**
* 当需要 `fine-tune` 时,可以通过字段 `Global.pretrain_model` 配置预训练模型权重文件的路径,预训练模型权重文件后缀名通常为 `.pdparams` * 当需要 `fine-tune` 时,可以通过字段 `Global.pretrain_model` 配置预训练模型权重文件的路径,预训练模型权重文件后缀名通常为 `.pdparams`
* 在训练过程中,训练程序会自动保存每个epoch结束时的断点信息,包括优化器信息 `.pdopt` 和模型权重信息 `.pdparams`。在训练过程意外中断等情况下,需要恢复训练时,可以通过字段 `Global.checkpoints` 配置训练过程中保存的断点信息文件,例如通过配置 `checkpoints: ./output/ResNet18/epoch_18` 即可恢复18epoch训练结束时的断点信息,PaddleClas将自动加载 `epoch_18.pdopt``epoch_18.pdparams`,从19epoch继续训练。 * 在训练过程中,训练程序会自动保存每个 epoch 结束时的断点信息,包括优化器信息 `.pdopt` 和模型权重信息 `.pdparams`。在训练过程意外中断等情况下,需要恢复训练时,可以通过字段 `Global.checkpoints` 配置训练过程中保存的断点信息文件,例如通过配置 `checkpoints: ./output/ResNet18/epoch_18` 即可恢复 18 epoch 训练结束时的断点信息,PaddleClas 将自动加载 `epoch_18.pdopt``epoch_18.pdparams`,从 19 epoch 继续训练。
<a name="2.2图像分类"></a> <a name="2.2"></a>
### 2.2 图像分类 ### 2.2 图像分类
#### Q2.2.1 在SSLD中,大模型在500M数据上预训练后蒸馏小模型,然后在1M数据上蒸馏finetune小模型,具体步骤是怎样做的? #### Q2.2.1 在 SSLD 中,大模型在 500M 数据上预训练后蒸馏小模型,然后在 1M 数据上蒸馏 finetune 小模型,具体步骤是怎样做的?
**A**:步骤如下: **A**:步骤如下:
1. 基于facebook开源的`ResNeXt101-32x16d-wsl`模型去蒸馏得到了`ResNet50-vd`模型; 1. 基于 facebook 开源的 `ResNeXt101-32x16d-wsl` 模型去蒸馏得到了 `ResNet50-vd` 模型;
2. 用这个`ResNet50-vd`,在500W数据集上去蒸馏`MobilNetV3` 2. 用这个 `ResNet50-vd`,在 500W 数据集上去蒸馏 `MobilNetV3`
3. 考虑到500W的数据集的分布和100W的数据分布不完全一致,所以这块,在100W上的数据上又finetune了一下,精度有微弱的提升。 3. 考虑到 500W 的数据集的分布和 100W 的数据分布不完全一致,所以这块,在 100W 上的数据上又 finetune 了一下,精度有微弱的提升。
#### Q2.2.2 训练SwinTransformer,loss出现nan #### Q2.2.2 训练 SwinTransformer,loss 出现 nan
**A**:训练SwinTransformer时,请使用版本大于等于 `2.1.1``Paddle`,并且加载我们提供的预训练模型,学习率也不宜过大。 **A**:训练 SwinTransformer 时,请使用版本大于等于 `2.1.1``Paddle`,并且加载我们提供的预训练模型,学习率也不宜过大。
<a name="2.3通用检测模块"></a> <a name="2.3"></a>
### 2.3 通用检测模块 ### 2.3 通用检测模块
#### Q2.3.1 为什么有一些图片检测出的结果就是原图? #### Q2.3.1 为什么有一些图片检测出的结果就是原图?
**A**:主体检测模型会返回检测框,但事实上为了让后续的识别模型更加准确,在返回检测框的同时也返回了原图。后续会根据原图或者检测框与库中的图片的相似度排序,相似度最高的库中图片的标签即为被识别图片的标签。 **A**:主体检测模型会返回检测框,但事实上为了让后续的识别模型更加准确,在返回检测框的同时也返回了原图。后续会根据原图或者检测框与库中的图片的相似度排序,相似度最高的库中图片的标签即为被识别图片的标签。
#### Q2.3.2:在直播场景中,需要提供一个直播即时识别画面,能够在延迟几秒内找到特征目标物并用框圈起,这个可以实现吗? #### Q2.3.2:在直播场景中,需要提供一个直播即时识别画面,能够在延迟几秒内找到特征目标物并用框圈起,这个可以实现吗?
**A**:要达到实时的检测效果,需要检测速度达到实时性的要求;PP-YOLO是Paddle团队提供的轻量级目标检测模型,检测速度和精度达到了很好的平衡,可以试试PP-YOLO来做检测. 关于PP-YOLO的使用,可以参照:[PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/configs/ppyolo/README_cn.md) **A**:要达到实时的检测效果,需要检测速度达到实时性的要求;PP-YOLO 是 Paddle 团队提供的轻量级目标检测模型,检测速度和精度达到了很好的平衡,可以试试 PP-YOLO 来做检测. 关于 PP-YOLO 的使用,可以参照:[PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/configs/ppyolo/README_cn.md)
#### Q2.3.3: 对于未知的标签,加入gallery dataset可以用于后续的分类识别(无需训练),但是如果前面的检测模型对于未知的标签无法定位检测出来,是否还是要训练前面的检测模型? #### Q2.3.3: 对于未知的标签,加入 gallery dataset 可以用于后续的分类识别(无需训练),但是如果前面的检测模型对于未知的标签无法定位检测出来,是否还是要训练前面的检测模型?
**A**:如果检测模型在自己的数据集上表现不佳,需要在自己的检测数据集上再finetune **A**:如果检测模型在自己的数据集上表现不佳,需要在自己的检测数据集上再 finetune
<a name="2.4图像识别模块"></a> <a name="2.4"></a>
### 2.4 图像识别模块 ### 2.4 图像识别模块
#### Q2.4.1: 识别模块预测时报`Illegal instruction`错? #### Q2.4.1: 识别模块预测时报 `Illegal instruction` 错?
**A**:如果使用的是release/2.2分支,建议更新为release/2.3分支,在release/2.3分支中,我们使用faiss检索模块替换了Möbius检索模型,具体可以参考[向量检索教程](../../../deploy/vector_search/README.md)。如仍存在问题,可以在用户微信群中联系我们,也可以在GitHub提issue。 **A**:如果使用的是 release/2.2 分支,建议更新为 release/2.3 分支,在 release/2.3 分支中,我们使用 faiss 检索模块替换了 Möbius 检索模型,具体可以参考[向量检索教程](../../../deploy/vector_search/README.md)。如仍存在问题,可以在用户微信群中联系我们,也可以在 GitHub 提 issue。
#### Q2.4.2: 识别模型怎么在预训练模型的基础上进行微调训练? #### Q2.4.2: 识别模型怎么在预训练模型的基础上进行微调训练?
**A**:识别模型的微调训练和分类模型的微调训练类似,识别模型可以加载商品的预训练模型,训练过程可以参考[识别模型训练](../../zh_CN/models_training/recognition.md),后续我们也会持续细化这块的文档。 **A**:识别模型的微调训练和分类模型的微调训练类似,识别模型可以加载商品的预训练模型,训练过程可以参考[识别模型训练](../../zh_CN/models_training/recognition.md),后续我们也会持续细化这块的文档。
#### Q2.4.3: 训练metric learning时,每个epoch中,无法跑完所有mini-batch,为什么? #### Q2.4.3: 训练 metric learning 时,每个 epoch 中,无法跑完所有 mini-batch,为什么?
**A**:在训练metric learning时,使用的Sampler是DistributedRandomIdentitySampler,该Sampler不会采样全部的图片,导致会让每一个epoch采样的数据不是所有的数据,所以无法跑完显示的mini-batch是正常现象。该问题在release/2.3分支已经优化,请更新到release/2.3使用。 **A**:在训练 metric learning 时,使用的 Sampler 是 DistributedRandomIdentitySampler,该 Sampler 不会采样全部的图片,导致会让每一个 epoch 采样的数据不是所有的数据,所以无法跑完显示的 mini-batch 是正常现象。该问题在 release/2.3 分支已经优化,请更新到 release/2.3 使用。
#### Q2.4.4: 有些图片没有识别出结果,为什么? #### Q2.4.4: 有些图片没有识别出结果,为什么?
**A**:在配置文件(如inference_product.yaml)中,`IndexProcess.score_thres`中会控制被识别的图片与库中的图片的余弦相似度的最小值。当余弦相似度小于该值时,不会打印结果。您可以根据自己的实际数据调整该值。 **A**:在配置文件(如 inference_product.yaml)中,`IndexProcess.score_thres` 中会控制被识别的图片与库中的图片的余弦相似度的最小值。当余弦相似度小于该值时,不会打印结果。您可以根据自己的实际数据调整该值。
<a name="2.5检索模块"></a> <a name="2.5"></a>
### 2.5 检索模块 ### 2.5 检索模块
#### Q2.5.1: 添加图片后建索引报`assert text_num >= 2`错? #### Q2.5.1: 添加图片后建索引报 `assert text_num >= 2` 错?
**A**:请确保data_file.txt中图片路径和图片名称中间的间隔为单个table,而不是空格。 **A**:请确保 data_file.txt 中图片路径和图片名称中间的间隔为单个 table,而不是空格。
#### Q2.5.2: 新增底库数据需要重新构建索引吗? #### Q2.5.2: 新增底库数据需要重新构建索引吗?
**A**:从release/2.3分支起,我们使用faiss检索模块替换了Möbius检索模型,已经支持在不构建底库的前提下新增底库数据,具体可以参考[向量检索教程](../../../deploy/vector_search/README.md) **A**:从 release/2.3 分支起,我们使用 faiss 检索模块替换了 Möbius 检索模型,已经支持在不构建底库的前提下新增底库数据,具体可以参考[向量检索教程](../../../deploy/vector_search/README.md)
#### Q2.5.3: Mac重新编译index.so时报错如下:clang: error: unsupported option '-fopenmp', 该如何处理? #### Q2.5.3: Mac 重新编译 index.so 时报错如下:clang: error: unsupported option '-fopenmp', 该如何处理?
**A**:如果使用的是release/2.2分支,建议更新为release/2.3分支,在release/2.3分支中,我们使用faiss检索模块替换了Möbius检索模型,具体可以参考[向量检索教程](../../../deploy/vector_search/README.md)。如仍存在问题,可以在用户微信群中联系我们,也可以在GitHub提issue。 **A**:如果使用的是 release/2.2 分支,建议更新为 release/2.3 分支,在 release/2.3 分支中,我们使用 faiss 检索模块替换了 Möbius 检索模型,具体可以参考[向量检索教程](../../../deploy/vector_search/README.md)。如仍存在问题,可以在用户微信群中联系我们,也可以在 GitHub 提 issue。
#### Q2.5.4: 在 build 检索底库时,参数 `pq_size` 应该如何设置? #### Q2.5.4: 在 build 检索底库时,参数 `pq_size` 应该如何设置?
**A**`pq_size`PQ检索算法的参数。PQ检索算法可以简单理解为“分层”检索算法,`pq_size` 是每层的“容量”,因此该参数的设置会影响检索性能,不过,在底库总数据量不太大(小于10000张)的情况下,这个参数对性能的影响很小,因此对于大多数使用场景而言,在构建底库时无需修改该参数。关于PQ检索算法的更多内容,可以查看相关[论文](https://lear.inrialpes.fr/pubs/2011/JDS11/jegou_searching_with_quantization.pdf) **A**`pq_size` PQ 检索算法的参数。PQ 检索算法可以简单理解为“分层”检索算法,`pq_size` 是每层的“容量”,因此该参数的设置会影响检索性能,不过,在底库总数据量不太大(小于 10000 张)的情况下,这个参数对性能的影响很小,因此对于大多数使用场景而言,在构建底库时无需修改该参数。关于 PQ 检索算法的更多内容,可以查看相关[论文](https://lear.inrialpes.fr/pubs/2011/JDS11/jegou_searching_with_quantization.pdf)
<a name="2.6模型预测部署"></a> <a name="2.6"></a>
### 2.6 模型预测部署 ### 2.6 模型预测部署
#### Q2.6.1: hub serving方式启动某个模块,怎么添加该模块的参数呢? #### Q2.6.1: hub serving 方式启动某个模块,怎么添加该模块的参数呢?
**A**:具体可以参考[hub serving参数](../../../deploy/hubserving/clas/params.py) **A**:具体可以参考 [hub serving 参数](../../../deploy/hubserving/clas/params.py)
#### Q2.6.2: 导出inference模型进行预测部署,准确率异常,为什么呢? #### Q2.6.2: 导出inference模型进行预测部署,准确率异常,为什么呢?
**A**: 该问题通常是由于在导出时未能正确加载模型参数导致的,首先检查模型导出时的日志,是否存在类似下述内容: **A**: 该问题通常是由于在导出时未能正确加载模型参数导致的,首先检查模型导出时的日志,是否存在类似下述内容:
...@@ -290,7 +290,7 @@ UserWarning: Skip loading for ***. *** is not found in the provided dict. ...@@ -290,7 +290,7 @@ UserWarning: Skip loading for ***. *** is not found in the provided dict.
如果存在,则说明模型权重未能加载成功,请进一步检查配置文件中的 `Global.pretrained_model` 字段,是否正确配置了模型权重文件的路径。模型权重文件后缀名通常为 `pdparams`,注意在配置该路径时无需填写文件后缀名。 如果存在,则说明模型权重未能加载成功,请进一步检查配置文件中的 `Global.pretrained_model` 字段,是否正确配置了模型权重文件的路径。模型权重文件后缀名通常为 `pdparams`,注意在配置该路径时无需填写文件后缀名。
#### Q2.6.3: 如何将模型转为 `ONNX` 格式? #### Q2.6.3: 如何将模型转为 `ONNX` 格式?
**A**:Paddle支持两种转ONNX格式模型的方式,且依赖于 `paddle2onnx` 工具,首先需要安装 `paddle2onnx` **A**:Paddle 支持两种转 ONNX 格式模型的方式,且依赖于 `paddle2onnx` 工具,首先需要安装 `paddle2onnx`
```shell ```shell
pip install paddle2onnx pip install paddle2onnx
...@@ -310,7 +310,7 @@ pip install paddle2onnx ...@@ -310,7 +310,7 @@ pip install paddle2onnx
关于静态图导出的非 `combined` 格式的 inference model(通常包含文件 `__model__` 和多个参数文件)转换模型格式,以及更多参数说明请参考 paddle2onnx 官方文档 [paddle2onnx](https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/README_zh.md#%E5%8F%82%E6%95%B0%E9%80%89%E9%A1%B9)。 关于静态图导出的非 `combined` 格式的 inference model(通常包含文件 `__model__` 和多个参数文件)转换模型格式,以及更多参数说明请参考 paddle2onnx 官方文档 [paddle2onnx](https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/README_zh.md#%E5%8F%82%E6%95%B0%E9%80%89%E9%A1%B9)。
* 直接从模型组网代码导出ONNX格式模型: * 直接从模型组网代码导出 ONNX 格式模型:
以动态图模型组网代码为例,模型类为继承于 `paddle.nn.Layer` 的子类,代码如下所示: 以动态图模型组网代码为例,模型类为继承于 `paddle.nn.Layer` 的子类,代码如下所示:
...@@ -332,4 +332,4 @@ pip install paddle2onnx ...@@ -332,4 +332,4 @@ pip install paddle2onnx
* `InputSpec()` 函数用于描述模型输入的签名信息,包括输入数据的 `shape`、`type` 和 `name`(可省略); * `InputSpec()` 函数用于描述模型输入的签名信息,包括输入数据的 `shape`、`type` 和 `name`(可省略);
* `paddle.onnx.export()` 函数需要指定模型组网对象 `net`,导出模型的保存路径 `save_path`,模型的输入数据描述 `input_spec`。 * `paddle.onnx.export()` 函数需要指定模型组网对象 `net`,导出模型的保存路径 `save_path`,模型的输入数据描述 `input_spec`。
需要注意,`paddlepaddle` 版本需大于 `2.0.0`。关于 `paddle.onnx.export()` 函数的更多参数说明请参考[paddle.onnx.export](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/onnx/export_cn.html#export)。 需要注意,`paddlepaddle` 版本需大于 `2.0.0`。关于 `paddle.onnx.export()` 函数的更多参数说明请参考 [paddle.onnx.export](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/onnx/export_cn.html#export)。
...@@ -2,82 +2,82 @@ ...@@ -2,82 +2,82 @@
## 写在前面 ## 写在前面
* 我们收集整理了开源以来在issues和用户群中的常见问题并且给出了简要解答,旨在为图像分类的开发者提供一些参考,也希望帮助大家少走一些弯路。 * 我们收集整理了开源以来在 issues 和用户群中的常见问题并且给出了简要解答,旨在为图像分类的开发者提供一些参考,也希望帮助大家少走一些弯路。
* 图像分类领域大佬众多,模型和论文更新速度也很快,本文档回答主要依赖有限的项目实践,难免挂一漏万,如有遗漏和不足,也希望有识之士帮忙补充和修正,万分感谢。 * 图像分类领域大佬众多,模型和论文更新速度也很快,本文档回答主要依赖有限的项目实践,难免挂一漏万,如有遗漏和不足,也希望有识之士帮忙补充和修正,万分感谢。
## PaddleClas常见问题汇总 ## PaddleClas 常见问题汇总
* [图像分类30个问题](#图像分类30个问题) * [1. 图像分类 30 个问题](#1)
* [基础知识](#基础知识) * [1.1 基础知识](#1.1)
* [模型训练相关](#模型训练相关) * [1.2 模型训练相关](#1.2)
* [数据相关](#数据相关) * [1.3 数据相关](#1.3)
* [模型推理与预测相关](#模型推理与预测相关) * [1.4 模型推理与预测相关](#1.4)
* [PaddleClas使用问题](#PaddleClas使用问题) * [2. PaddleClas 使用问题](#2)
<a name="图像分类30个问题"></a> <a name="1"></a>
## 图像分类30个问题 ## 1. 图像分类 30 个问题
<a name="基础知识"></a> <a name="1.1"></a>
### 基础知识 ### 1.1 基础知识
>> >>
* Q: 图像分类领域常用的分类指标有几种 * Q: 图像分类领域常用的分类指标有几种
* A: * A:
* 对于单个标签的图像分类问题(仅包含1个类别与背景),评估指标主要有Accuracy,Precision,Recall,F-score等,令TP(True Positive)表示将正类预测为正类,FP(False Positive)表示将负类预测为正类,TN(True Negative)表示将负类预测为负类,FN(False Negative)表示将正类预测为负类。那么Accuracy=(TP + TN) / NUM,Precision=TP /(TP + FP),Recall=TP /(TP + FN)。 * 对于单个标签的图像分类问题(仅包含 1 个类别与背景),评估指标主要有 Accuracy,Precision,Recall,F-score 等,令 TP(True Positive)表示将正类预测为正类,FP(False Positive)表示将负类预测为正类,TN(True Negative)表示将负类预测为负类,FN(False Negative)表示将正类预测为负类。那么 Accuracy=(TP + TN) / NUM,Precision=TP /(TP + FP),Recall=TP /(TP + FN)。
* 对于类别数大于1的图像分类问题,评估指标主要有Accuary和Class-wise Accuracy,Accuary表示所有类别预测正确的图像数量占总图像数量的百分比;Class-wise Accuracy是对每个类别的图像计算Accuracy,然后再对所有类别的Accuracy取平均得到。 * 对于类别数大于 1 的图像分类问题,评估指标主要有 Accuary 和 Class-wise Accuracy,Accuary 表示所有类别预测正确的图像数量占总图像数量的百分比;Class-wise Accuracy 是对每个类别的图像计算 Accuracy,然后再对所有类别的 Accuracy 取平均得到。
>> >>
* Q: 怎样根据自己的任务选择合适的模型进行训练? * Q: 怎样根据自己的任务选择合适的模型进行训练?
* A: 如果希望在服务器部署,或者希望精度尽可能地高,对模型存储大小或者预测速度的要求不是很高,那么推荐使用ResNet_vd、Res2Net_vd、DenseNet、Xception等适合于服务器端的系列模型;如果希望在移动端侧部署,则推荐使用MobileNetV3、GhostNet等适合于移动端的系列模型。同时,我们推荐在选择模型的时候可以参考[模型库](../models/models_intro.md)中的速度-精度指标图。 * A: 如果希望在服务器部署,或者希望精度尽可能地高,对模型存储大小或者预测速度的要求不是很高,那么推荐使用 ResNet_vd、Res2Net_vd、DenseNet、Xception 等适合于服务器端的系列模型;如果希望在移动端侧部署,则推荐使用 MobileNetV3、GhostNet 等适合于移动端的系列模型。同时,我们推荐在选择模型的时候可以参考[模型库](../models/models_intro.md)中的速度-精度指标图。
>> >>
* Q: 如何进行参数初始化,什么样的初始化可以加快模型收敛? * Q: 如何进行参数初始化,什么样的初始化可以加快模型收敛?
* A: 众所周知,参数的初始化可以影响模型的最终性能。一般来说,如果目标数据集不是很大,建议使用ImageNet-1k训练得到的预训练模型进行初始化。如果是自己手动设计的网络或者暂时没有基于ImageNet-1k训练得到的预训练权重,可以使用Xavier初始化或者MSRA初始化,其中Xavier初始化是针对Sigmoid函数提出的,对RELU函数不太友好,网络越深,各层输入的方差越小,网络越难训练,所以当神经网络中使用较多RELU激活函数时,推荐使用MSRA初始化。 * A: 众所周知,参数的初始化可以影响模型的最终性能。一般来说,如果目标数据集不是很大,建议使用 ImageNet-1k 训练得到的预训练模型进行初始化。如果是自己手动设计的网络或者暂时没有基于 ImageNet-1k 训练得到的预训练权重,可以使用 Xavier 初始化或者 MSRA 初始化,其中 Xavier 初始化是针对 Sigmoid 函数提出的,对 RELU 函数不太友好,网络越深,各层输入的方差越小,网络越难训练,所以当神经网络中使用较多 RELU 激活函数时,推荐使用 MSRA 初始化。
>> >>
* Q: 针对深度神经网络参数冗余的问题,目前有哪些比较好的解决办法? * Q: 针对深度神经网络参数冗余的问题,目前有哪些比较好的解决办法?
* A: 目前有几种主要的方法对模型进行压缩,减少模型参数冗余的问题,如剪枝、量化、知识蒸馏等。模型剪枝指的是将权重矩阵中相对不重要的权值剔除,然后再重新对网络进行微调;模型量化指的是一种将浮点计算转成低比特定点计算的技术,如8比特、4比特等,可以有效的降低模型计算强度、参数大小和内存消耗。知识蒸馏是指使用教师模型(teacher model)去指导学生模型(student model)学习特定任务,保证小模型在参数量不变的情况下,性能有较大的提升,甚至获得与大模型相似的精度指标。 * A: 目前有几种主要的方法对模型进行压缩,减少模型参数冗余的问题,如剪枝、量化、知识蒸馏等。模型剪枝指的是将权重矩阵中相对不重要的权值剔除,然后再重新对网络进行微调;模型量化指的是一种将浮点计算转成低比特定点计算的技术,如 8 比特、4 比特等,可以有效的降低模型计算强度、参数大小和内存消耗。知识蒸馏是指使用教师模型(teacher model)去指导学生模型(student model)学习特定任务,保证小模型在参数量不变的情况下,性能有较大的提升,甚至获得与大模型相似的精度指标。
>> >>
* Q: 怎样在其他任务,如目标检测、图像分割、关键点检测等任务中选择比较合适的分类模型作为骨干网络? * Q: 怎样在其他任务,如目标检测、图像分割、关键点检测等任务中选择比较合适的分类模型作为骨干网络?
* A: 在不考虑速度的情况下,在大部分的任务中,推荐使用精度更高的预训练模型和骨干网络,PaddleClas中开源了一系列的SSLD知识蒸馏预训练模型,如ResNet50_vd_ssld, Res2Net200_vd_26w_4s_ssld等,在模型精度和速度方面都是非常有优势的,推荐大家使用。对于一些特定的任务,如图像分割或者关键点检测等任务,对图像分辨率的要求比较高,那么更推荐使用HRNet等能够同时兼顾网络深度和分辨率的神经网络模型,PaddleClas也提供了HRNet_W18_C_ssld、HRNet_W48_C_ssld等精度非常高的HRNet SSLD蒸馏系列预训练模型,大家可以使用这些精度更高的预训练模型与骨干网络,提升自己在其他任务上的模型精度。 * A: 在不考虑速度的情况下,在大部分的任务中,推荐使用精度更高的预训练模型和骨干网络,PaddleClas 中开源了一系列的 SSLD 知识蒸馏预训练模型,如 ResNet50_vd_ssld, Res2Net200_vd_26w_4s_ssld 等,在模型精度和速度方面都是非常有优势的,推荐大家使用。对于一些特定的任务,如图像分割或者关键点检测等任务,对图像分辨率的要求比较高,那么更推荐使用 HRNet 等能够同时兼顾网络深度和分辨率的神经网络模型,PaddleClas 也提供了 HRNet_W18_C_ssld、HRNet_W48_C_ssld 等精度非常高的 HRNet SSLD 蒸馏系列预训练模型,大家可以使用这些精度更高的预训练模型与骨干网络,提升自己在其他任务上的模型精度。
>> >>
* Q: 注意力机制是什么?目前有哪些比较常用的注意力机制方法? * Q: 注意力机制是什么?目前有哪些比较常用的注意力机制方法?
* A: 注意力机制(Attention Mechanism)源于对人类视觉的研究。将注意力机制用在计算机视觉任务上,可以有效捕捉图片中有用的区域,从而提升整体网络性能。目前比较常用的有[SE block](https://arxiv.org/abs/1709.01507)[SK-block](https://arxiv.org/abs/1903.06586)[Non-local block](https://arxiv.org/abs/1711.07971)[GC block](https://arxiv.org/abs/1904.11492)[CBAM](https://arxiv.org/abs/1807.06521)等,核心思想就是去学习特征图在不同区域或者不同通道中的重要性,从而让网络更加注意显著性的区域。 * A: 注意力机制(Attention Mechanism)源于对人类视觉的研究。将注意力机制用在计算机视觉任务上,可以有效捕捉图片中有用的区域,从而提升整体网络性能。目前比较常用的有 [SE block](https://arxiv.org/abs/1709.01507)[SK-block](https://arxiv.org/abs/1903.06586)[Non-local block](https://arxiv.org/abs/1711.07971)[GC block](https://arxiv.org/abs/1904.11492)[CBAM](https://arxiv.org/abs/1807.06521) 等,核心思想就是去学习特征图在不同区域或者不同通道中的重要性,从而让网络更加注意显著性的区域。
<a name="模型训练相关"></a> <a name="1.2"></a>
### 模型训练相关 ### 1.2 模型训练相关
>> >>
* Q: 使用深度卷积网络做图像分类,如果训练一个拥有1000万个类的模型会碰到什么问题? * Q: 使用深度卷积网络做图像分类,如果训练一个拥有 1000 万个类的模型会碰到什么问题?
* A: 因为FC层参数很多,内存/显存/模型的存储占用都会大幅增大;模型收敛速度也会变慢一些。建议在这种情况下,再最后的FC层前加一层维度较小的FC,这样可以大幅减少模型的存储大小。 * A: 因为 FC 层参数很多,内存/显存/模型的存储占用都会大幅增大;模型收敛速度也会变慢一些。建议在这种情况下,再最后的 FC 层前加一层维度较小的 FC,这样可以大幅减少模型的存储大小。
>> >>
* Q: 训练过程中,如果模型收敛效果很差,可能的原因有哪些呢? * Q: 训练过程中,如果模型收敛效果很差,可能的原因有哪些呢?
* A: 主要有以下几个可以排查的地方:(1)应该检查数据标注,确保训练集和验证集的数据标注没有问题。(2)可以试着调整一下学习率(初期可以以10倍为单位进行调节),过大(训练震荡)或者过小(收敛太慢)的学习率都可能导致收敛效果差。(3)数据量太大,选择的模型太小,难以学习所有数据的特征。(4)可以看下数据预处理的过程中是否使用了归一化,如果没有使用归一化操作,收敛速度可能会比较慢。(5)如果数据量比较小,可以试着加载PaddleClas中提供的基于ImageNet-1k数据集的预训练模型,这可以大大提升训练收敛速度。(6)数据集存在长尾问题,可以参考[数据长尾问题解决方案](#long_tail) * A: 主要有以下几个可以排查的地方:(1)应该检查数据标注,确保训练集和验证集的数据标注没有问题。(2)可以试着调整一下学习率(初期可以以 10 倍为单位进行调节),过大(训练震荡)或者过小(收敛太慢)的学习率都可能导致收敛效果差。(3)数据量太大,选择的模型太小,难以学习所有数据的特征。(4)可以看下数据预处理的过程中是否使用了归一化,如果没有使用归一化操作,收敛速度可能会比较慢。(5)如果数据量比较小,可以试着加载 PaddleClas 中提供的基于 ImageNet-1k 数据集的预训练模型,这可以大大提升训练收敛速度。(6)数据集存在长尾问题,可以参考[数据长尾问题解决方案](#long_tail)
>> >>
* Q: 训练图像分类任务时,该怎么选择合适的优化器? * Q: 训练图像分类任务时,该怎么选择合适的优化器?
* A: 优化器的目的是为了让损失函数尽可能的小,从而找到合适的参数来完成某项任务。目前业界主要用到的优化器有SGD、RMSProp、Adam、AdaDelt等,其中由于带momentum的SGD优化器广泛应用于学术界和工业界,所以我们发布的模型也大都使用该优化器来实现损失函数的梯度下降。带momentum的SGD优化器有两个劣势,其一是收敛速度慢,其二是初始学习率的设置需要依靠大量的经验,然而如果初始学习率设置得当并且迭代轮数充足,该优化器也会在众多的优化器中脱颖而出,使得其在验证集上获得更高的准确率。一些自适应学习率的优化器如Adam、RMSProp等,收敛速度往往比较快,但是最终的收敛精度会稍差一些。如果追求更快的收敛速度,我们推荐使用这些自适应学习率的优化器,如果追求更高的收敛精度,我们推荐使用带momentum的SGD优化器。 * A: 优化器的目的是为了让损失函数尽可能的小,从而找到合适的参数来完成某项任务。目前业界主要用到的优化器有 SGD、RMSProp、Adam、AdaDelt 等,其中由于带 momentum 的 SGD 优化器广泛应用于学术界和工业界,所以我们发布的模型也大都使用该优化器来实现损失函数的梯度下降。带 momentum 的 SGD 优化器有两个劣势,其一是收敛速度慢,其二是初始学习率的设置需要依靠大量的经验,然而如果初始学习率设置得当并且迭代轮数充足,该优化器也会在众多的优化器中脱颖而出,使得其在验证集上获得更高的准确率。一些自适应学习率的优化器如 Adam、RMSProp 等,收敛速度往往比较快,但是最终的收敛精度会稍差一些。如果追求更快的收敛速度,我们推荐使用这些自适应学习率的优化器,如果追求更高的收敛精度,我们推荐使用带 momentum 的 SGD 优化器。
>> >>
* Q: 当前主流的学习率下降策略有哪些?一般需要怎么选择呢? * Q: 当前主流的学习率下降策略有哪些?一般需要怎么选择呢?
* A: 学习率是通过损失函数的梯度调整网络权重的超参数的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是piecewise_decay,即阶梯式下降学习率,如在ResNet50标准的训练中,我们设置的初始学习率是0.1,每30epoch学习率下降到原来的1/10,一共迭代120epoch。除了piecewise_decay,很多研究者也提出了学习率的其他下降方式,如polynomial_decay(多项式下降)、exponential_decay(指数下降),cosine_decay(余弦下降)等,其中cosine_decay无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay和piecewise_decay的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较peicewise_decay更好一些。 * A: 学习率是通过损失函数的梯度调整网络权重的超参数的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是 piecewise_decay,即阶梯式下降学习率,如在 ResNet50 标准的训练中,我们设置的初始学习率是 0.1,每 30 epoch 学习率下降到原来的 1/10,一共迭代 120 epoch。除了 piecewise_decay,很多研究者也提出了学习率的其他下降方式,如 polynomial_decay(多项式下降)、exponential_decay(指数下降), cosine_decay(余弦下降)等,其中 cosine_decay 无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay 和 piecewise_decay 的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay 都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较 peicewise_decay 更好一些。
![](../../images/models/lr_decay.jpeg) ![](../../images/models/lr_decay.jpeg)
>> >>
* Q: Warmup学习率策略是什么?一般用在什么样的场景中? * Q: Warmup 学习率策略是什么?一般用在什么样的场景中?
* A: Warmup策略顾名思义就是让学习率先预热一下,在训练初期我们不直接使用最大的学习率,而是用一个逐渐增大的学习率去训练网络,当学习率增大到最高点时,再使用学习率下降策略中提到的学习率下降方式衰减学习率的值。如果使用较大的batch_size训练神经网络时,我们建议您使用warmup策略。实验表明,在batch_size较大时,warmup可以稳定提升模型的精度。在训练MobileNetV3等batch_size较大的实验中,我们默认将warmup中的epoch设置为5,即先用5epoch将学习率从0增加到最大值,再去做相应的学习率衰减。 * A: Warmup 策略顾名思义就是让学习率先预热一下,在训练初期我们不直接使用最大的学习率,而是用一个逐渐增大的学习率去训练网络,当学习率增大到最高点时,再使用学习率下降策略中提到的学习率下降方式衰减学习率的值。如果使用较大的 batch_size 训练神经网络时,我们建议您使用 warmup 策略。实验表明,在 batch_size 较大时,warmup 可以稳定提升模型的精度。在训练 MobileNetV3 等 batch_size 较大的实验中,我们默认将 warmup 中的 epoch 设置为 5,即先用 5 epoch 将学习率从 0 增加到最大值,再去做相应的学习率衰减。
>> >>
* Q: 什么是`batch size`?在模型训练中,怎么选择合适的`batch size` * Q: 什么是 `batch size`?在模型训练中,怎么选择合适的 `batch size`
* A: `batch size`是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络参与训练。论文[Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/abs/1706.02677),当`batch size`的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练ImageNet数据时,大部分的神经网络选择的初始学习率为0.1,`batch size`是256,所以根据实际的模型大小和显存情况,可以将学习率设置为0.1*k,batch_size设置为256*k。在实际任务中,也可以将该设置作为初始参数,进一步调节学习率参数并获得更优的性能。 * A: `batch size` 是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络参与训练。论文 [Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/abs/1706.02677),当 `batch size` 的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练 ImageNet 数据时,大部分的神经网络选择的初始学习率为 0.1,`batch size` 是 256,所以根据实际的模型大小和显存情况,可以将学习率设置为 0.1*k, batch_size 设置为 256*k。在实际任务中,也可以将该设置作为初始参数,进一步调节学习率参数并获得更优的性能。
>> >>
* Q: weight_decay是什么?怎么选择合适的weight_decay呢? * Q: weight_decay 是什么?怎么选择合适的 weight_decay 呢?
* A: 过拟合是机器学习中常见的一个名词,简单理解即为模型在训练数据上表现很好,但在测试数据上表现较差,在卷积神经网络中,同样存在过拟合的问题,为了避免过拟合,很多正则方式被提出,其中,weight_decay是其中一个广泛使用的避免过拟合的方式。在使用SGD优化器时,weight_decay等价于在最终的损失函数后添加L2正则化,L2正则化使得网络的权重倾向于选择更小的值,最终整个网络中的参数值更趋向于0,模型的泛化性能相应提高。在各大深度学习框架的实现中,该值表达的含义是L2正则前的系数,在paddle框架中,该值的名称是l2_decay,所以以下都称其为l2_decay。该系数越大,表示加入的正则越强,模型越趋于欠拟合状态。在训练ImageNet的任务中,大多数的网络将该参数值设置为1e-4,在一些小的网络如MobileNet系列网络中,为了避免网络欠拟合,该值设置为1e-5~4e-5之间。当然,该值的设置也和具体的数据集有关系,当任务的数据集较大时,网络本身趋向于欠拟合状态,可以将该值适当减小,当任务的数据集较小时,网络本身趋向于过拟合状态,可以将该值适当增大。下表展示了MobileNetV1_x0_25在ImageNet-1k上使用不同l2_decay的精度情况。由于MobileNetV1_x0_25是一个比较小的网络,所以l2_decay过大会使网络趋向于欠拟合状态,所以在该网络中,相对1e-4,3e-5是更好的选择。 * A: 过拟合是机器学习中常见的一个名词,简单理解即为模型在训练数据上表现很好,但在测试数据上表现较差,在卷积神经网络中,同样存在过拟合的问题,为了避免过拟合,很多正则方式被提出,其中,weight_decay 是其中一个广泛使用的避免过拟合的方式。在使用 SGD 优化器时,weight_decay 等价于在最终的损失函数后添加 L2 正则化,L2 正则化使得网络的权重倾向于选择更小的值,最终整个网络中的参数值更趋向于 0,模型的泛化性能相应提高。在各大深度学习框架的实现中,该值表达的含义是 L2 正则前的系数,在 paddle 框架中,该值的名称是 l2_decay,所以以下都称其为 l2_decay。该系数越大,表示加入的正则越强,模型越趋于欠拟合状态。在训练 ImageNet 的任务中,大多数的网络将该参数值设置为 1e-4,在一些小的网络如 MobileNet 系列网络中,为了避免网络欠拟合,该值设置为 1e-5~4e-5 之间。当然,该值的设置也和具体的数据集有关系,当任务的数据集较大时,网络本身趋向于欠拟合状态,可以将该值适当减小,当任务的数据集较小时,网络本身趋向于过拟合状态,可以将该值适当增大。下表展示了 MobileNetV1_x0_25 在 ImageNet-1k 上使用不同 l2_decay 的精度情况。由于 MobileNetV1_x0_25 是一个比较小的网络,所以 l2_decay 过大会使网络趋向于欠拟合状态,所以在该网络中,相对 1e-4,3e-5 是更好的选择。
| 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 | | 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
...@@ -87,8 +87,8 @@ ...@@ -87,8 +87,8 @@
>> >>
* Q: 标签平滑(label_smoothing)指的是什么?有什么效果呢?一般适用于什么样的场景中? * Q: 标签平滑(label_smoothing)指的是什么?有什么效果呢?一般适用于什么样的场景中?
* A: Label_smoothing是深度学习中的一种正则化方法,其全称是 Label Smoothing Regularization(LSR),即标签平滑正则化。在传统的分类任务计算损失函数时,是将真实的one hot标签与神经网络的输出做相应的交叉熵计算,而label_smoothing是将真实的one hot标签做一个标签平滑的处理,使得网络学习的标签不再是一个hard label,而是一个有概率值的soft label,其中在类别对应的位置的概率最大,其他位置概率是一个非常小的数。具体的计算方式参见论文[2]。在label_smoothing里,有一个epsilon的参数值,该值描述了将标签软化的程度,该值越大,经过label smoothing后的标签向量的标签概率值越小,标签越平滑,反之,标签越趋向于hard label,在训练ImageNet-1k的实验里通常将该值设置为0.1。 * A: Label_smoothing 是深度学习中的一种正则化方法,其全称是 Label Smoothing Regularization(LSR),即标签平滑正则化。在传统的分类任务计算损失函数时,是将真实的 one hot 标签与神经网络的输出做相应的交叉熵计算,而 label_smoothing 是将真实的 one hot 标签做一个标签平滑的处理,使得网络学习的标签不再是一个 hard label,而是一个有概率值的 soft label,其中在类别对应的位置的概率最大,其他位置概率是一个非常小的数。具体的计算方式参见论文[2]。在 label_smoothing 里,有一个 epsilon 的参数值,该值描述了将标签软化的程度,该值越大,经过 label smoothing 后的标签向量的标签概率值越小,标签越平滑,反之,标签越趋向于 hard label,在训练 ImageNet-1k 的实验里通常将该值设置为 0.1。
在训练ImageNet-1k的实验中,我们发现,ResNet50大小级别及其以上的模型在使用label_smooting后,精度有稳定的提升。下表展示了ResNet50_vd在使用label_smoothing前后的精度指标。同时,由于label_smoohing相当于一种正则方式,在相对较小的模型上,精度提升不明显甚至会有所下降,下表展示了ResNet18在ImageNet-1k上使用label_smoothing前后的精度指标。可以明显看到,在使用label_smoothing后,精度有所下降。 在训练 ImageNet-1k 的实验中,我们发现,ResNet50 大小级别及其以上的模型在使用 label_smooting 后,精度有稳定的提升。下表展示了 ResNet50_vd 在使用 label_smoothing 前后的精度指标。同时,由于 label_smoohing 相当于一种正则方式,在相对较小的模型上,精度提升不明显甚至会有所下降,下表展示了 ResNet18 在 ImageNet-1k 上使用 label_smoothing 前后的精度指标。可以明显看到,在使用 label_smoothing 后,精度有所下降。
| 模型 | Use_label_smoothing | Test acc1 | | 模型 | Use_label_smoothing | Test acc1 |
|:--:|:--:|:--:| |:--:|:--:|:--:|
...@@ -99,25 +99,25 @@ ...@@ -99,25 +99,25 @@
>> >>
* Q: 在训练的时候怎么通过训练集和验证集的准确率或者loss确定进一步的调优策略呢? * Q: 在训练的时候怎么通过训练集和验证集的准确率或者 loss 确定进一步的调优策略呢?
* A: 在训练网络的过程中,通常会打印每一个epoch的训练集准确率和验证集准确率,二者刻画了该模型在两个数据集上的表现。通常来说,训练集的准确率比验证集准确率微高或者二者相当是比较不错的状态。如果发现训练集的准确率比验证集高很多,说明在这个任务上已经过拟合,需要在训练过程中加入更多的正则,如增大l2_decay的值,加入更多的数据增广策略,加入label_smoothing策略等;如果发现训练集的准确率比验证集低一些,说明在这个任务上可能欠拟合,需要在训练过程中减弱正则效果,如减小l2_decay的值,减少数据增广方式,增大图片crop区域面积,减弱图片拉伸变换,去除label_smoothing等。 * A: 在训练网络的过程中,通常会打印每一个 epoch 的训练集准确率和验证集准确率,二者刻画了该模型在两个数据集上的表现。通常来说,训练集的准确率比验证集准确率微高或者二者相当是比较不错的状态。如果发现训练集的准确率比验证集高很多,说明在这个任务上已经过拟合,需要在训练过程中加入更多的正则,如增大 l2_decay 的值,加入更多的数据增广策略,加入 label_smoothing 策略等;如果发现训练集的准确率比验证集低一些,说明在这个任务上可能欠拟合,需要在训练过程中减弱正则效果,如减小 l2_decay 的值,减少数据增广方式,增大图片 crop 区域面积,减弱图片拉伸变换,去除 label_smoothing 等。
>> >>
* Q: 怎么使用已有的预训练模型提升自己的数据集的精度呢? * Q: 怎么使用已有的预训练模型提升自己的数据集的精度呢?
* A: 在现阶段计算机视觉领域中,加载预训练模型来训练自己的任务已成为普遍的做法,相比从随机初始化开始训练,加载预训练模型往往可以提升特定任务的精度。一般来说,业界广泛使用的预训练模型是通过训练128万张图片1000类的ImageNet-1k数据集得到的,该预训练模型的fc层权重是是一个k\*1000的矩阵,其中k是fc层以前的神经元数,在加载预训练权重时,无需加载fc层的权重。在学习率方面,如果您的任务训练的数据集特别小(如小于1千张),我们建议你使用较小的初始学习率,如0.001(batch_size:256,下同),以免较大的学习率破坏预训练权重。如果您的训练数据集规模相对较大(大于10万),我们建议你尝试更大的初始学习率,如0.01或者更大。 * A: 在现阶段计算机视觉领域中,加载预训练模型来训练自己的任务已成为普遍的做法,相比从随机初始化开始训练,加载预训练模型往往可以提升特定任务的精度。一般来说,业界广泛使用的预训练模型是通过训练 128 万张图片 1000 类的 ImageNet-1k 数据集得到的,该预训练模型的 fc 层权重是是一个 k\*1000 的矩阵,其中 k 是 fc 层以前的神经元数,在加载预训练权重时,无需加载 fc 层的权重。在学习率方面,如果您的任务训练的数据集特别小(如小于 1 千张),我们建议你使用较小的初始学习率,如 0.001(batch_size:256,下同),以免较大的学习率破坏预训练权重。如果您的训练数据集规模相对较大(大于 10 万),我们建议你尝试更大的初始学习率,如 0.01 或者更大。
<a name="数据相关"></a> <a name="1.3"></a>
### 数据相关 ### 1.3 数据相关
>> >>
* Q: 图像分类的数据预处理过程一般包括哪些步骤? * Q: 图像分类的数据预处理过程一般包括哪些步骤?
* A: 以在ImageNet-1k数据集上训练ResNet50为例,一张图片被输入进网络,主要有图像解码、随机裁剪、随机水平翻转、标准化、数据重排,组batch并送进网络这几个步骤。图像解码指的是将图片文件读入到内存中,随机裁剪指的是将读入的图像随机拉伸并裁剪到长宽均为224的图像,随机水平翻转指的是对裁剪后的图片以0.5的概率进行水平翻转,标准化指的是将图片每个通道的数据通过去均值实现中心化的处理,使得数据尽可能符合`N(0,1)`的正态分布,数据重排指的是将数据由`[224,224,3]`的格式变为`[3,224,224]`的格式,组batch指的是将多幅图像组成一个批数据,送进网络进行训练。 * A: 以在 ImageNet-1k 数据集上训练 ResNet50 为例,一张图片被输入进网络,主要有图像解码、随机裁剪、随机水平翻转、标准化、数据重排,组 batch 并送进网络这几个步骤。图像解码指的是将图片文件读入到内存中,随机裁剪指的是将读入的图像随机拉伸并裁剪到长宽均为 224 的图像,随机水平翻转指的是对裁剪后的图片以 0.5 的概率进行水平翻转,标准化指的是将图片每个通道的数据通过去均值实现中心化的处理,使得数据尽可能符合 `N(0,1)` 的正态分布,数据重排指的是将数据由 `[224,224,3]` 的格式变为 `[3,224,224]` 的格式,组 batch 指的是将多幅图像组成一个批数据,送进网络进行训练。
>> >>
* Q: 随机裁剪是怎么影响小模型训练的性能的? * Q: 随机裁剪是怎么影响小模型训练的性能的?
* A: 在ImageNet-1k数据的标准预处理中,随机裁剪函数中定义了scale和ratio两个值,两个值分别确定了图片crop的大小和图片的拉伸程度,其中scale的默认取值范围是0.08-1(lower_scale-upper_scale),ratio的默认取值范围是3/4-4/3(lower_ratio-upper_ratio)。在非常小的网络训练中,此类数据增强会使得网络欠拟合,导致精度有所下降。为了提升网络的精度,可以使其数据增强变的更弱,即增大图片的crop区域或者减弱图片的拉伸变换程度。我们可以分别通过增大lower_scale的值或缩小lower_ratio与upper_scale的差距来实现更弱的图片变换。下表列出了使用不同lower_scale训练MobileNetV2_x0_25的精度,可以看到,增大图片的crop区域面积后训练精度和验证精度均有提升。 * A: 在 ImageNet-1k 数据的标准预处理中,随机裁剪函数中定义了 scale 和 ratio 两个值,两个值分别确定了图片 crop 的大小和图片的拉伸程度,其中 scale 的默认取值范围是 0.08-1(lower_scale-upper_scale),ratio 的默认取值范围是 3/4-4/3(lower_ratio-upper_ratio)。在非常小的网络训练中,此类数据增强会使得网络欠拟合,导致精度有所下降。为了提升网络的精度,可以使其数据增强变的更弱,即增大图片的 crop 区域或者减弱图片的拉伸变换程度。我们可以分别通过增大 lower_scale 的值或缩小 lower_ratio 与 upper_scale 的差距来实现更弱的图片变换。下表列出了使用不同 lower_scale 训练 MobileNetV2_x0_25 的精度,可以看到,增大图片的 crop 区域面积后训练精度和验证精度均有提升。
| 模型 | Scale取值范围 | Train_acc1/acc5 | Test_acc1/acc5 | | 模型 | Scale 取值范围 | Train_acc1/acc5 | Test_acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| MobileNetV2_x0_25 | [0.08,1] | 50.36%/72.98% | 52.35%/75.65% | | MobileNetV2_x0_25 | [0.08,1] | 50.36%/72.98% | 52.35%/75.65% |
| MobileNetV2_x0_25 | [0.2,1] | 54.39%/77.08% | 53.18%/76.14% | | MobileNetV2_x0_25 | [0.2,1] | 54.39%/77.08% | 53.18%/76.14% |
...@@ -125,58 +125,58 @@ ...@@ -125,58 +125,58 @@
>> >>
* Q: 数据量不足的情况下,目前有哪些常见的数据增广方法来增加训练样本的丰富度呢? * Q: 数据量不足的情况下,目前有哪些常见的数据增广方法来增加训练样本的丰富度呢?
* A: PaddleClas中将目前比较常见的数据增广方法分为了三大类,分别是图像变换类、图像裁剪类和图像混叠类,图像变换类主要包括AutoAugment和RandAugment,图像裁剪类主要包括CutOut、RandErasing、HideAndSeek和GridMask,图像混叠类主要包括Mixup和Cutmix,更详细的关于数据增广的介绍可以参考:[数据增广章节](../algorithm_introduction/DataAugmentation.md) * A: PaddleClas 中将目前比较常见的数据增广方法分为了三大类,分别是图像变换类、图像裁剪类和图像混叠类,图像变换类主要包括 AutoAugment 和 RandAugment,图像裁剪类主要包括 CutOut、RandErasing、HideAndSeek 和 GridMask,图像混叠类主要包括 Mixup 和 Cutmix,更详细的关于数据增广的介绍可以参考:[数据增广章节](../algorithm_introduction/DataAugmentation.md)
>> >>
* Q: 对于遮挡情况比较常见的图像分类场景,该使用什么数据增广方法去提升模型的精度呢? * Q: 对于遮挡情况比较常见的图像分类场景,该使用什么数据增广方法去提升模型的精度呢?
* A: 在训练的过程中可以尝试对训练集使用CutOut、RandErasing、HideAndSeek和GridMask等裁剪类数据增广方法,让模型也能够不止学习到显著区域,也能关注到非显著性区域,从而在遮挡的情况下,也能较好地完成识别任务。 * A: 在训练的过程中可以尝试对训练集使用 CutOut、RandErasing、HideAndSeek 和 GridMask 等裁剪类数据增广方法,让模型也能够不止学习到显著区域,也能关注到非显著性区域,从而在遮挡的情况下,也能较好地完成识别任务。
>> >>
* Q: 对于色彩变换情况比较复杂的情况下,应该使用哪些数据增广方法提升模型精度呢? * Q: 对于色彩变换情况比较复杂的情况下,应该使用哪些数据增广方法提升模型精度呢?
* A: 可以考虑使用AutoAugment或者RandAugment的数据增广策略,这两种策略中都包括了锐化、直方图均衡化等丰富的颜色变换,可以让模型在训练的过程中对这些变换更加鲁棒。 * A: 可以考虑使用 AutoAugment 或者 RandAugment 的数据增广策略,这两种策略中都包括了锐化、直方图均衡化等丰富的颜色变换,可以让模型在训练的过程中对这些变换更加鲁棒。
>> >>
* Q: Mixup和Cutmix的工作原理是什么?为什么它们也是非常有效的数据增广方法? * Q: Mixup 和 Cutmix 的工作原理是什么?为什么它们也是非常有效的数据增广方法?
* A: Mixup通过线性叠加两张图片生成新的图片,对应label也进行线性叠加用以训练,Cutmix则是从一幅图中随机裁剪出一个 感兴趣区域(ROI),然后覆盖当前图像中对应的区域,label也按照图像面积比例进行线性叠加。它们其实也是生成了和训练集不同的样本和label并让网络去学习,从而扩充了样本的丰富度。 * A: Mixup 通过线性叠加两张图片生成新的图片,对应 label 也进行线性叠加用以训练,Cutmix 则是从一幅图中随机裁剪出一个 感兴趣区域(ROI),然后覆盖当前图像中对应的区域,label 也按照图像面积比例进行线性叠加。它们其实也是生成了和训练集不同的样本和 label 并让网络去学习,从而扩充了样本的丰富度。
>> >>
* Q: 对于精度要求不是那么高的图像分类任务,大概需要准备多大的训练数据集呢? * Q: 对于精度要求不是那么高的图像分类任务,大概需要准备多大的训练数据集呢?
* A: 训练数据的数量和需要解决问题的复杂度有关系。难度越大,精度要求越高,则数据集需求越大,而且一般情况实际中的训练数据越多效果越好。当然,一般情况下,在加载预训练模型的情况下,每个类别包括10-20张图像即可保证基本的分类效果;不加载预训练模型的情况下,每个类别需要至少包含100-200张图像以保证基本的分类效果。 * A: 训练数据的数量和需要解决问题的复杂度有关系。难度越大,精度要求越高,则数据集需求越大,而且一般情况实际中的训练数据越多效果越好。当然,一般情况下,在加载预训练模型的情况下,每个类别包括 10-20 张图像即可保证基本的分类效果;不加载预训练模型的情况下,每个类别需要至少包含 100-200 张图像以保证基本的分类效果。
<a name="long_tail"></a> <a name="long_tail"></a>
>> >>
* Q: 对于长尾分布的数据集,目前有哪些比较常用的方法? * Q: 对于长尾分布的数据集,目前有哪些比较常用的方法?
* A: (1)可以对数据量比较少的类别进行重采样,增加其出现的概率;(2)可以修改loss,增加图像较少对应的类别的图片的loss权重;(3)可以借鉴迁移学习的方法,从常见类别中学习通用知识,然后迁移到少样本的类别中。 * A:(1)可以对数据量比较少的类别进行重采样,增加其出现的概率;(2)可以修改 loss,增加图像较少对应的类别的图片的 loss 权重;(3)可以借鉴迁移学习的方法,从常见类别中学习通用知识,然后迁移到少样本的类别中。
<a name="模型推理与预测相关"></a> <a name="1.4"></a>
### 模型推理与预测相关 ### 1.4 模型推理与预测相关
>> >>
* Q: 有时候图像中只有小部分区域是所关注的前景物体,直接拿原图来进行分类的话,识别效果很差,这种情况要怎么做呢? * Q: 有时候图像中只有小部分区域是所关注的前景物体,直接拿原图来进行分类的话,识别效果很差,这种情况要怎么做呢?
* A: 可以在分类之前先加一个主体检测的模型,将前景物体检测出来之后再进行分类,可以大大提升最终的识别效果。如果不考虑时间成本,也可以使用multi-crop的方式对所有的预测做融合来决定最终的类别。 * A: 可以在分类之前先加一个主体检测的模型,将前景物体检测出来之后再进行分类,可以大大提升最终的识别效果。如果不考虑时间成本,也可以使用 multi-crop 的方式对所有的预测做融合来决定最终的类别。
>> >>
* Q: 目前推荐的,模型预测方式有哪些? * Q: 目前推荐的,模型预测方式有哪些?
* A: 在模型训练完成之后,推荐使用导出的固化模型(inference model),基于Paddle预测引擎进行预测,目前支持python inference与cpp inference。如果希望基于服务化部署预测模型,那么推荐使用PaddleServing的部署方式。 * A: 在模型训练完成之后,推荐使用导出的固化模型(inference model),基于 Paddle 预测引擎进行预测,目前支持 python inference 与 cpp inference。如果希望基于服务化部署预测模型,那么推荐使用 PaddleServing 的部署方式。
>> >>
* Q: 模型训练完成之后,有哪些比较合适的预测方法进一步提升模型精度呢? * Q: 模型训练完成之后,有哪些比较合适的预测方法进一步提升模型精度呢?
* A: (1)可以使用更大的预测尺度,比如说训练的时候使用的是224,那么预测的时候可以考虑使用288或者320,这会直接带来0.5%左右的精度提升。(2)可以使用测试时增广的策略(Test Time Augmentation, TTA),将测试集通过旋转、翻转、颜色变换等策略,创建多个副本,并分别预测,最后将所有的预测结果进行融合,这可以大大提升预测结果的精度和鲁棒性。(3)当然,也可以使用多模型融合的策略,将多个模型针对相同图片的预测结果进行融合。 * A:(1)可以使用更大的预测尺度,比如说训练的时候使用的是 224,那么预测的时候可以考虑使用 288 或者 320,这会直接带来 0.5% 左右的精度提升。(2)可以使用测试时增广的策略(Test Time Augmentation, TTA),将测试集通过旋转、翻转、颜色变换等策略,创建多个副本,并分别预测,最后将所有的预测结果进行融合,这可以大大提升预测结果的精度和鲁棒性。(3)当然,也可以使用多模型融合的策略,将多个模型针对相同图片的预测结果进行融合。
>> >>
* Q: 多模型融合的时候,该怎么选择合适的模型进行融合呢? * Q: 多模型融合的时候,该怎么选择合适的模型进行融合呢?
* A: 在不考虑预测速度的情况下,建议选择精度尽量高的模型;同时建议选择不同结构或者系列的模型进行融合,比如在精度相似的情况下,ResNet50_vd与Xception65的模型融合结果往往比ResNet50_vd与ResNet101_vd的模型融合结果要好一些。 * A: 在不考虑预测速度的情况下,建议选择精度尽量高的模型;同时建议选择不同结构或者系列的模型进行融合,比如在精度相似的情况下,ResNet50_vd 与 Xception65 的模型融合结果往往比 ResNet50_vd 与 ResNet101_vd 的模型融合结果要好一些。
>> >>
* Q: 使用固定的模型进行预测时有哪些比较常用的加速方法? * Q: 使用固定的模型进行预测时有哪些比较常用的加速方法?
* A: (1)使用性能更优的GPU进行预测;(2)增大预测的batch size;(3)使用TenorRT以及FP16半精度浮点数等方法进行预测。 * A:(1)使用性能更优的 GPU 进行预测;(2)增大预测的 batch size;(3)使用 TenorRT 以及 FP16 半精度浮点数等方法进行预测。
<a name="PaddleClas使用问题"></a> <a name="2"></a>
## PaddleClas使用问题 ## 2. PaddleClas 使用问题
>> >>
* Q: 评估和预测时,已经指定了预训练模型所在文件夹的地址,但是仍然无法导入参数,这么为什么呢? * Q: 评估和预测时,已经指定了预训练模型所在文件夹的地址,但是仍然无法导入参数,这么为什么呢?
* A: 加载预训练模型时,需要指定预训练模型的前缀,例如预训练模型参数所在的文件夹为`output/ResNet50_vd/19`,预训练模型参数的名称为`output/ResNet50_vd/19/ppcls.pdparams`,则`pretrained_model`参数需要指定为`output/ResNet50_vd/19/ppcls`,PaddleClas会自动补齐`.pdparams`的后缀。 * A: 加载预训练模型时,需要指定预训练模型的前缀,例如预训练模型参数所在的文件夹为 `output/ResNet50_vd/19`,预训练模型参数的名称为 `output/ResNet50_vd/19/ppcls.pdparams`,则 `pretrained_model` 参数需要指定为 `output/ResNet50_vd/19/ppcls`,PaddleClas 会自动补齐`.pdparams` 的后缀。
>> >>
* Q: 在评测`EfficientNetB0_small`模型时,为什么最终的精度始终比官网的低0.3%左右? * Q: 在评测 `EfficientNetB0_small` 模型时,为什么最终的精度始终比官网的低 0.3% 左右?
* A: `EfficientNet`系列的网络在进行resize的时候,是使用`cubic插值方式`(resize参数的interpolation值设置为2),而其他模型默认情况下为None,因此在训练和评估的时候需要显式地指定resize的interpolation值。具体地,可以参考以下配置中预处理过程中ResizeImage的参数。 * A: `EfficientNet` 系列的网络在进行 resize 的时候,是使用 `cubic 插值方式`(resize 参数的 interpolation 值设置为 2),而其他模型默认情况下为 None,因此在训练和评估的时候需要显式地指定 resize 的 interpolation 值。具体地,可以参考以下配置中预处理过程中 ResizeImage 的参数。
``` ```
Eval: Eval:
dataset: dataset:
...@@ -200,23 +200,23 @@ ...@@ -200,23 +200,23 @@
``` ```
>> >>
* Q: python2下,使用visualdl的时候,报出以下错误,`TypeError: __init__() missing 1 required positional argument: 'sync_cycle'`,这是为什么呢? * Q: python2 下,使用 visualdl 的时候,报出以下错误,`TypeError: __init__() missing 1 required positional argument: 'sync_cycle'`,这是为什么呢?
* A: 目前visualdl仅支持在python3下运行,visualdl需要是2.0以上的版本,如果visualdl版本不对的话,可以通过以下方式进行安装:`pip3 install visualdl -i https://mirror.baidu.com/pypi/simple` * A: 目前 visualdl 仅支持在 python3 下运行,visualdl 需要是 2.0 以上的版本,如果 visualdl 版本不对的话,可以通过以下方式进行安装:`pip3 install visualdl -i https://mirror.baidu.com/pypi/simple`
>> >>
* Q: 自己在测ResNet50_vd预测单张图片速度的时候发现比官网提供的速度benchmark慢了很多,而且CPU速度比GPU速度快很多,这个是为什么呢? * Q: 自己在测 ResNet50_vd 预测单张图片速度的时候发现比官网提供的速度 benchmark 慢了很多,而且 CPU 速度比 GPU 速度快很多,这个是为什么呢?
* A: 模型预测需要初始化,初始化的过程比较耗时,因此在统计预测速度的时候,需要批量跑一批图片,去除前若干张图片的预测耗时,再统计下平均的时间。GPU比CPU速度测试单张图片速度慢是因为GPU的初始化并CPU要慢很多。 * A: 模型预测需要初始化,初始化的过程比较耗时,因此在统计预测速度的时候,需要批量跑一批图片,去除前若干张图片的预测耗时,再统计下平均的时间。GPU 比 CPU 速度测试单张图片速度慢是因为 GPU 的初始化并 CPU 要慢很多。
>> >>
* Q: 灰度图可以用于模型训练吗? * Q: 灰度图可以用于模型训练吗?
* A: 灰度图也可以用于模型训练,不过需要修改模型的输入shape为`[1, 224, 224]`,此外数据增广部分也需要注意适配一下。不过为了更好地使用PaddleClas代码的话,即使是灰度图,也建议调整为3通道的图片进行训练(RGB通道的像素值相等)。 * A: 灰度图也可以用于模型训练,不过需要修改模型的输入 shape 为 `[1, 224, 224]`,此外数据增广部分也需要注意适配一下。不过为了更好地使用 PaddleClas 代码的话,即使是灰度图,也建议调整为 3 通道的图片进行训练(RGB 通道的像素值相等)。
>> >>
* Q: 怎么在windows上或者cpu上面模型训练呢? * Q: 怎么在 windows 上或者 cpu 上面模型训练呢?
* A: 可以参考[开始使用教程](../models_training/classification.md),详细介绍了在Linux、Windows、CPU等环境中进行模型训练、评估与预测的教程。 * A: 可以参考[开始使用教程](../models_training/classification.md),详细介绍了在 Linux、Windows、CPU 等环境中进行模型训练、评估与预测的教程。
>> >>
* Q: 怎样在模型训练的时候使用label smoothing呢? * Q: 怎样在模型训练的时候使用 label smoothing 呢?
* A: 可以在配置文件中的`Loss`字段下进行设置,如下所示,`epsilon=0.1` 表示设置该值为0.1,若不设置 `epsilon` 字段,则不使用 `label smoothing` * A: 可以在配置文件中的 `Loss` 字段下进行设置,如下所示,`epsilon=0.1` 表示设置该值为 0.1,若不设置 `epsilon` 字段,则不使用 `label smoothing`
```yaml ```yaml
Loss: Loss:
Train: Train:
...@@ -225,14 +225,14 @@ Loss: ...@@ -225,14 +225,14 @@ Loss:
epsilon: 0.1 epsilon: 0.1
``` ```
>> >>
* Q: PaddleClas提供的10W类图像分类预训练模型能否用于模型推断呢? * Q: PaddleClas 提供的 10W 类图像分类预训练模型能否用于模型推断呢?
* A: 该10W类图像分类预训练模型没有提供fc全连接层的参数,无法用于模型推断,目前可以用于模型微调。 * A: 该 10W 类图像分类预训练模型没有提供 fc 全连接层的参数,无法用于模型推断,目前可以用于模型微调。
>> >>
* Q: 在使用`deploy/python/predict_cls.py`进行模型预测的时候,报了这个问题:`Error: Pass tensorrt_subgraph_pass has not been registered`,这是为什么呢? * Q: 在使用 `deploy/python/predict_cls.py` 进行模型预测的时候,报了这个问题: `Error: Pass tensorrt_subgraph_pass has not been registered`,这是为什么呢?
* A: 如果希望使用TensorRT进行模型预测推理的话,需要安装或是自己编译带TensorRT的PaddlePaddle,Linux、Windows、macOS系统的用户下载安装可以参考参考[下载预测库](https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html),如果没有符合您所需要的版本,则需要本地编译安装,编译方法可以参考[源码编译](https://paddleinference.paddlepaddle.org.cn/user_guides/source_compile.html) * A: 如果希望使用 TensorRT 进行模型预测推理的话,需要安装或是自己编译带 TensorRT 的 PaddlePaddle,Linux、Windows、macOS 系统的用户下载安装可以参考参考[下载预测库](https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html),如果没有符合您所需要的版本,则需要本地编译安装,编译方法可以参考[源码编译](https://paddleinference.paddlepaddle.org.cn/user_guides/source_compile.html)
>> >>
* Q: 怎样在训练的时候使用自动混合精度(Automatic Mixed Precision, AMP)训练呢? * Q: 怎样在训练的时候使用自动混合精度(Automatic Mixed Precision, AMP)训练呢?
* A: 可以参考[ResNet50_fp16.yaml](../../../ppcls/configs/ImageNet/ResNet/ResNet50_fp16.yaml)这个配置文件;具体地,如果希望自己的配置文件在模型训练的时候也支持自动混合精度,可以在配置文件中添加下面的配置信息。 * A: 可以参考 [ResNet50_fp16.yaml](../../../ppcls/configs/ImageNet/ResNet/ResNet50_fp16.yaml) 这个配置文件;具体地,如果希望自己的配置文件在模型训练的时候也支持自动混合精度,可以在配置文件中添加下面的配置信息。
``` ```
# mixed precision training # mixed precision training
AMP: AMP:
......
# 特征提取 # 特征提取
## 目录
- [1. 简介](#1)
- [2. 网络结构](#2)
- [3. 通用识别模型](#3)
- [4. 自定义特征提取](#4)
- [4.1 数据准备](#4.1)
- [4.2 模型训练](#4.2)
- [4.3 模型评估](#4.3)
- [4.4 模型推理](#4.4)
- [4.4.1 导出推理模型](#4.4.1)
- [4.4.2 获取特征向量](#4.4.2)
<a name="1"></a>
## 1. 简介 ## 1. 简介
特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的[向量检索](./vector_search.md)。好的特征需要具备相似度保持性,即在特征空间中,相似度高的图片对其特征相似度要比较高(距离比较近),相似度低的图片对,其特征相似度要比较小(距离比较远)。[Deep Metric Learning](../algorithm_introduction/metric_learning.md)用以研究如何通过深度学习的方法获得具有强表征能力的特征。 特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的[向量检索](./vector_search.md)。好的特征需要具备相似度保持性,即在特征空间中,相似度高的图片对其特征相似度要比较高(距离比较近),相似度低的图片对,其特征相似度要比较小(距离比较远)。[Deep Metric Learning](../algorithm_introduction/metric_learning.md)用以研究如何通过深度学习的方法获得具有强表征能力的特征。
<a name="2"></a>
## 2. 网络结构 ## 2. 网络结构
为了图像识别任务的灵活定制,我们将整个网络分为Backbone、 Neck、 Head以及Loss部分,整体结构如下图所示: 为了图像识别任务的灵活定制,我们将整个网络分为 Backbone、 Neck、 Head 以及 Loss 部分,整体结构如下图所示:
![](../../images/feature_extraction_framework.png) ![](../../images/feature_extraction_framework.png)
图中各个模块的功能为: 图中各个模块的功能为:
- **Backbone**: 指定所使用的骨干网络。 值得注意的是,PaddleClas提供的基于ImageNet的预训练模型,最后一层的输出为1000, 我们需要依据所需的特征维度定制最后一层的输出。
- **Neck**: 用以特征增强及特征维度变换。 这儿的Neck,可以是一个简单的Linear Layer,用来做特征维度变换;也可以是较复杂的FPN结构,用以做特征增强。 - **Backbone**: 指定所使用的骨干网络。 值得注意的是,PaddleClas 提供的基于 ImageNet 的预训练模型,最后一层的输出为 1000,我们需要依据所需的特征维度定制最后一层的输出。
- **Head**: 用来将feature转化为logits。 除了常用的Fc Layer外,还可以替换为cosmargin, arcmargin, circlemargin等模块。 - **Neck**: 用以特征增强及特征维度变换。这儿的 Neck,可以是一个简单的 Linear Layer,用来做特征维度变换;也可以是较复杂的 FPN 结构,用以做特征增强。
- **Loss**: 指定所使用的Loss函数。 我们将Loss设计为组合loss的形式, 可以方便得将Classification Loss和Pair_wise Loss组合在一起。 - **Head**: 用来将 feature 转化为 logits。除了常用的 Fc Layer 外,还可以替换为 cosmargin, arcmargin, circlemargin 等模块。
- **Loss**: 指定所使用的 Loss 函数。我们将 Loss 设计为组合 loss 的形式,可以方便得将 Classification Loss 和 Pair_wise Loss 组合在一起。
<a name="3"></a>
## 3. 通用识别模型 ## 3. 通用识别模型
在PP-Shitu中, 我们采用[PP_LCNet_x2_5](../models/PP-LCNet.md)作为骨干网络, Neck部分选用Linear Layer, Head部分选用[ArcMargin](../../../ppcls/arch/gears/arcmargin.py), Loss部分选用CELoss,详细的配置文件见[通用识别配置文件](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml)。其中,训练数据为如下7个公开数据集的汇总:
在 PP-Shitu 中, 我们采用 [PP_LCNet_x2_5](../models/PP-LCNet.md) 作为骨干网络 Neck 部分选用 Linear Layer, Head 部分选用 [ArcMargin](../../../ppcls/arch/gears/arcmargin.py),Loss 部分选用 CELoss,详细的配置文件见[通用识别配置文件](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml)。其中,训练数据为如下 7 个公开数据集的汇总:
| 数据集 | 数据量 | 类别数 | 场景 | 数据集地址 | | 数据集 | 数据量 | 类别数 | 场景 | 数据集地址 |
| :------------: | :-------------: | :-------: | :-------: | :--------: | | :------------: | :-------------: | :-------: | :-------: | :--------: |
| Aliproduct | 2498771 | 50030 | 商品 | [地址](https://retailvisionworkshop.github.io/recognition_challenge_2020/) | | Aliproduct | 2498771 | 50030 | 商品 | [地址](https://retailvisionworkshop.github.io/recognition_challenge_2020/) |
...@@ -29,13 +52,20 @@ ...@@ -29,13 +52,20 @@
| :----------: | :---------: | :-------: | :-------: | :--------: | :--------: | :--------: | :--------: | | :----------: | :---------: | :-------: | :-------: | :--------: | :--------: | :--------: | :--------: |
PP-LCNet-2.5x | 0.839 | 0.888 | 0.861 | 0.841 | 0.793 | 0.892 | 5.0 PP-LCNet-2.5x | 0.839 | 0.888 | 0.861 | 0.841 | 0.793 | 0.892 | 5.0
* 采用的评测指标为:`Recall@1` * 采用的评测指标为:`Recall@1`
* 速度评测机器的CPU具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz` * 速度评测机器的 CPU 具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz`
* 速度指标的评测条件为: 开启MKLDNN, 线程数设置为10 * 速度指标的评测条件为: 开启 MKLDNN, 线程数设置为 10
* 预训练模型地址:[通用识别预训练模型](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/general_PPLCNet_x2_5_pretrained_v1.0.pdparams) * 预训练模型地址:[通用识别预训练模型](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/general_PPLCNet_x2_5_pretrained_v1.0.pdparams)
<a name="4"></a>
# 4. 自定义特征提取 # 4. 自定义特征提取
自定义特征提取,是指依据自己的任务,重新训练特征提取模型。主要包含四个步骤:1)数据准备;2)模型训练;3)模型评估;4)模型推理。 自定义特征提取,是指依据自己的任务,重新训练特征提取模型。主要包含四个步骤:1)数据准备;2)模型训练;3)模型评估;4)模型推理。
<a name="4.1"></a>
## 4.1 数据准备 ## 4.1 数据准备
首先,需要基于任务定制自己的数据集。数据集格式参见[格式说明](https://github.com/PaddlePaddle/PaddleClas/blob/develop/docs/zh_CN/data_preparation/recognition_dataset.md#%E6%95%B0%E6%8D%AE%E9%9B%86%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E)。在启动模型训练之前,需要在配置文件中修改数据配置相关的内容, 主要包括数据集的地址以及类别数量。对应到配置文件中的位置如下所示: 首先,需要基于任务定制自己的数据集。数据集格式参见[格式说明](https://github.com/PaddlePaddle/PaddleClas/blob/develop/docs/zh_CN/data_preparation/recognition_dataset.md#%E6%95%B0%E6%8D%AE%E9%9B%86%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E)。在启动模型训练之前,需要在配置文件中修改数据配置相关的内容, 主要包括数据集的地址以及类别数量。对应到配置文件中的位置如下所示:
``` ```
Head: Head:
...@@ -65,8 +95,10 @@ PP-LCNet-2.5x | 0.839 | 0.888 | 0.861 | 0.841 | 0.793 | 0.892 | 5.0 ...@@ -65,8 +95,10 @@ PP-LCNet-2.5x | 0.839 | 0.888 | 0.861 | 0.841 | 0.793 | 0.892 | 5.0
cls_label_path: ./dataset/Aliproduct/val_list.txt. #此处表示gallery数据集label文件的地址 cls_label_path: ./dataset/Aliproduct/val_list.txt. #此处表示gallery数据集label文件的地址
``` ```
<a name="4.2"></a>
## 4.2 模型训练 ## 4.2 模型训练
- 单机单卡训练 - 单机单卡训练
```shell ```shell
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
...@@ -80,7 +112,8 @@ python -m paddle.distributed.launch \ ...@@ -80,7 +112,8 @@ python -m paddle.distributed.launch \
-c ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml -c ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml
``` ```
**注意:** **注意:**
配置文件中默认采用`在线评估`的方式,如果你想加快训练速度,去除`在线评估`,只需要在上述命令后面,增加`-o eval_during_train=False`。训练完毕后,在output目录下会生成最终模型文件`latest``best_model`和训练日志文件`train.log`。其中,`best_model`用来存储当前评测指标下的最佳模型;`latest`用来存储最新生成的模型, 方便在任务中断的情况下从断点位置启动训练。 配置文件中默认采用`在线评估`的方式,如果你想加快训练速度,去除`在线评估`,只需要在上述命令后面,增加 `-o eval_during_train=False`。训练完毕后,在 output 目录下会生成最终模型文件 `latest``best_model` 和训练日志文件 `train.log`。其中,`best_model` 用来存储当前评测指标下的最佳模型;`latest` 用来存储最新生成的模型, 方便在任务中断的情况下从断点位置启动训练。
- 断点续训: - 断点续训:
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -90,7 +123,10 @@ python -m paddle.distributed.launch \ ...@@ -90,7 +123,10 @@ python -m paddle.distributed.launch \
-o Global.checkpoint="output/RecModel/latest" -o Global.checkpoint="output/RecModel/latest"
``` ```
<a name="4.3"></a>
## 4.3 模型评估 ## 4.3 模型评估
- 单卡评估 - 单卡评估
```shell ```shell
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
...@@ -109,17 +145,28 @@ python -m paddle.distributed.launch \ ...@@ -109,17 +145,28 @@ python -m paddle.distributed.launch \
``` ```
**推荐:** 建议使用多卡评估。多卡评估方式可以利用多卡并行计算快速得到整体数据集的特征集合,能够加速评估的过程。 **推荐:** 建议使用多卡评估。多卡评估方式可以利用多卡并行计算快速得到整体数据集的特征集合,能够加速评估的过程。
<a name="4.4"></a>
## 4.4 模型推理 ## 4.4 模型推理
推理过程包括两个步骤: 1)导出推理模型; 2)获取特征向量 推理过程包括两个步骤: 1)导出推理模型; 2)获取特征向量
<a name="4.4.1"></a>
### 4.4.1 导出推理模型 ### 4.4.1 导出推理模型
``` ```
python tools/export_model \ python tools/export_model \
-c ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml \ -c ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml \
-o Global.pretrained_model="output/RecModel/best_model" -o Global.pretrained_model="output/RecModel/best_model"
``` ```
生成的推理模型位于`inference`目录,里面包含三个文件,分别为`inference.pdmodel``inference.pdiparams``inference.pdiparams.info` 生成的推理模型位于 `inference` 目录,里面包含三个文件,分别为 `inference.pdmodel``inference.pdiparams``inference.pdiparams.info`
其中: `inference.pdmodel`用来存储推理模型的结构, `inference.pdiparams``inference.pdiparams.info`用来存储推理模型相关的参数信息。 其中: `inference.pdmodel` 用来存储推理模型的结构, `inference.pdiparams``inference.pdiparams.info` 用来存储推理模型相关的参数信息。
<a name="4.4.2"></a>
### 4.4.2 获取特征向量 ### 4.4.2 获取特征向量
``` ```
cd deploy cd deploy
python python/predict_rec.py \ python python/predict_rec.py \
......
...@@ -5,6 +5,23 @@ ...@@ -5,6 +5,23 @@
本部分主要从数据集、模型选择和模型训练 3 个方面对该部分内容进行介绍。 本部分主要从数据集、模型选择和模型训练 3 个方面对该部分内容进行介绍。
----------
## 目录
- [1. 数据集](#1)
- [2. 模型选择](#2)
- [2.1 轻量级主体检测模型](#2.1)
- [2.2 服务端主体检测模型](#2.2)
- [3. 模型训练](#3)
- [3.1 环境准备](#3.1)
- [3.2 数据准备](#3.2)
- [3.3 配置文件改动和说明](#3.3)
- [3.4 启动训练](#3.4)
- [3.5 模型预测与调试](#3.5)
- [3.6 模型导出与预测部署](#3.6)
<a name="1"></a>
## 1. 数据集 ## 1. 数据集
...@@ -15,32 +32,34 @@ ...@@ -15,32 +32,34 @@
| Objects365 | 170W | 6k | 通用场景 | [地址](https://www.objects365.org/overview.html) | | Objects365 | 170W | 6k | 通用场景 | [地址](https://www.objects365.org/overview.html) |
| COCO2017 | 12W | 5k | 通用场景 | [地址](https://cocodataset.org/) | | COCO2017 | 12W | 5k | 通用场景 | [地址](https://cocodataset.org/) |
| iCartoonFace | 2k | 2k | 动漫人脸检测 | [地址](https://github.com/luxiangju-PersonAI/iCartoonFace) | | iCartoonFace | 2k | 2k | 动漫人脸检测 | [地址](https://github.com/luxiangju-PersonAI/iCartoonFace) |
| LogoDet-3k | 3k | 2k | Logo检测 | [地址](https://github.com/Wangjing1551/LogoDet-3K-Dataset) | | LogoDet-3k | 3k | 2k | Logo 检测 | [地址](https://github.com/Wangjing1551/LogoDet-3K-Dataset) |
| RPC | 3k | 3k | 商品检测 | [地址](https://rpc-dataset.github.io/) | | RPC | 3k | 3k | 商品检测 | [地址](https://rpc-dataset.github.io/) |
在实际训练的过程中,将所有数据集混合在一起。由于是主体检测,这里将所有标注出的检测框对应的类别都修改为 `前景` 的类别,最终融合的数据集中只包含 1 个类别,即前景。 在实际训练的过程中,将所有数据集混合在一起。由于是主体检测,这里将所有标注出的检测框对应的类别都修改为 `前景` 的类别,最终融合的数据集中只包含 1 个类别,即前景。
<a name="2"></a>
## 2. 模型选择 ## 2. 模型选择
目标检测方法种类繁多,比较常用的有两阶段检测器(如FasterRCNN系列等);单阶段检测器(如YOLO、SSD等);anchor-free检测器(如PicoDet、FCOS等)。PaddleDetection中针对服务端使用场景,自研了 PP-YOLO 系列模型;针对端侧(CPU和移动端等)使用场景,自研了 PicoDet 系列模型,在服务端和端侧均处于业界较为领先的水平。 目标检测方法种类繁多,比较常用的有两阶段检测器(如 FasterRCNN 系列等);单阶段检测器(如 YOLO、SSD 等);anchor-free 检测器(如 PicoDet、FCOS 等)。PaddleDetection 中针对服务端使用场景,自研了 PP-YOLO 系列模型;针对端侧(CPU 和移动端等)使用场景,自研了 PicoDet 系列模型,在服务端和端侧均处于业界较为领先的水平。
基于上述研究,PaddleClas 中提供了 2 个通用主体检测模型,为轻量级与服务端主体检测模型,分别适用于端侧场景以及服务端场景。下面的表格中给出了在上述 5 个数据集上的平均 mAP 以及它们的模型大小、预测速度对比信息。 基于上述研究,PaddleClas 中提供了 2 个通用主体检测模型,为轻量级与服务端主体检测模型,分别适用于端侧场景以及服务端场景。下面的表格中给出了在上述 5 个数据集上的平均 mAP 以及它们的模型大小、预测速度对比信息。
| 模型 | 模型结构 | 预训练模型下载地址 | inference模型下载地址 | mAP | inference模型大小(MB) | 单张图片预测耗时(不包含预处理)(ms) | | 模型 | 模型结构 | 预训练模型下载地址 | inference 模型下载地址 | mAP | inference 模型大小(MB) | 单张图片预测耗时(不包含预处理)(ms) |
| :------------: | :-------------: | :------: | :-------: | :--------: | :-------: | :--------: | | :------------: | :-------------: | :------: | :-------: | :--------: | :-------: | :--------: |
| 轻量级主体检测模型 | PicoDet | [地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_pretrained.pdparams) | [tar 格式文件地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.tar) [zip 格式文件地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.zip) | 40.1% | 30.1 | 29.8 | | 轻量级主体检测模型 | PicoDet | [地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_pretrained.pdparams) | [tar 格式文件地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.tar) [zip 格式文件地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.zip) | 40.1% | 30.1 | 29.8 |
| 服务端主体检测模型 | PP-YOLOv2 | [地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/ppyolov2_r50vd_dcn_mainbody_v1.0_pretrained.pdparams) | [tar 格式文件地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar) [zip 格式文件地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.zip) | 42.5% | 210.5 | 466.6 | | 服务端主体检测模型 | PP-YOLOv2 | [地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/ppyolov2_r50vd_dcn_mainbody_v1.0_pretrained.pdparams) | [tar 格式文件地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar) [zip 格式文件地址](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.zip) | 42.5% | 210.5 | 466.6 |
* 注意 * 注意
* 由于部分解压缩软件在解压上述 `tar` 格式文件时存在问题,建议非命令行用户下载 `zip` 格式文件并解压。`tar` 格式文件建议使用命令 `tar xf xxx.tar` 解压。 * 由于部分解压缩软件在解压上述 `tar` 格式文件时存在问题,建议非命令行用户下载 `zip` 格式文件并解压。`tar` 格式文件建议使用命令 `tar xf xxx.tar` 解压。
* 速度评测机器的CPU具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz`,速度指标为开启 mkldnn ,线程数设置为 10 测试得到。 * 速度评测机器的 CPU 具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz`,速度指标为开启 mkldnn,线程数设置为 10 测试得到。
* 主体检测的预处理过程较为耗时,平均每张图在上述机器上的时间在 40~55 ms 左右,没有包含在上述的预测耗时统计中。 * 主体检测的预处理过程较为耗时,平均每张图在上述机器上的时间在 40~55 ms 左右,没有包含在上述的预测耗时统计中。
<a name="2.1"></a>
### 2.1 轻量级主体检测模型 ### 2.1 轻量级主体检测模型
PicoDet 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) 提出,是一个适用于CPU或者移动端场景的目标检测算法。具体地,它融合了下面一系列优化算法。 PicoDet 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) 提出,是一个适用于 CPU 或者移动端场景的目标检测算法。具体地,它融合了下面一系列优化算法。
- [ATSS](https://arxiv.org/abs/1912.02424) - [ATSS](https://arxiv.org/abs/1912.02424)
- [Generalized Focal Loss](https://arxiv.org/abs/2006.04388) - [Generalized Focal Loss](https://arxiv.org/abs/2006.04388)
...@@ -51,15 +70,16 @@ PicoDet 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) ...@@ -51,15 +70,16 @@ PicoDet 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection)
更多关于 PicoDet 的优化细节与 benchmark 可以参考 [PicoDet 系列模型介绍](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/configs/picodet/README.md) 更多关于 PicoDet 的优化细节与 benchmark 可以参考 [PicoDet 系列模型介绍](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/configs/picodet/README.md)
在轻量级主体检测任务中,为了更好地兼顾检测速度与效果,我们使用 PPLCNet_x2_5 作为主体检测模型的骨干网络,同时将训练与预测的图像尺度修改为了 640x640,其余配置与 [picodet_lcnet_1_5x_416_coco.yml](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/configs/picodet/more_config/picodet_lcnet_1_5x_416_coco.yml)完全一致。将数据集更换为自定义的主体检测数据集,进行训练,最终得到检测模型。 在轻量级主体检测任务中,为了更好地兼顾检测速度与效果,我们使用 PPLCNet_x2_5 作为主体检测模型的骨干网络,同时将训练与预测的图像尺度修改为了 640x640,其余配置与 [picodet_lcnet_1_5x_416_coco.yml](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/configs/picodet/more_config/picodet_lcnet_1_5x_416_coco.yml) 完全一致。将数据集更换为自定义的主体检测数据集,进行训练,最终得到检测模型。
<a name="2.2"></a>
### 2.2 服务端主体检测模型 ### 2.2 服务端主体检测模型
PP-YOLO 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) 提出,从骨干网络、数据增广、正则化策略、损失函数、后处理等多个角度对 yolov3 模型进行深度优化,最终在"速度-精度"方面达到了业界领先的水平。具体地,优化的策略如下。 PP-YOLO 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) 提出,从骨干网络、数据增广、正则化策略、损失函数、后处理等多个角度对 yolov3 模型进行深度优化,最终在“速度-精度”方面达到了业界领先的水平。具体地,优化的策略如下。
- 更优的骨干网络: ResNet50vd-DCN - 更优的骨干网络: ResNet50vd-DCN
- 更大的训练batch size: 8 GPUs,每GPU batch_size=24,对应调整学习率和迭代轮数 - 更大的训练 batch size: 8 GPUs,每 GPU batch_size=24,对应调整学习率和迭代轮数
- [Drop Block](https://arxiv.org/abs/1810.12890) - [Drop Block](https://arxiv.org/abs/1810.12890)
- [Exponential Moving Average](https://www.investopedia.com/terms/e/ema.asp) - [Exponential Moving Average](https://www.investopedia.com/terms/e/ema.asp)
- [IoU Loss](https://arxiv.org/pdf/1902.09630.pdf) - [IoU Loss](https://arxiv.org/pdf/1902.09630.pdf)
...@@ -71,16 +91,19 @@ PP-YOLO 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) ...@@ -71,16 +91,19 @@ PP-YOLO 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection)
更多关于 PP-YOLO 的详细介绍可以参考:[PP-YOLO 模型](https://github.com/PaddlePaddle/PaddleDetection/blob/release%2F2.1/configs/ppyolo/README_cn.md) 更多关于 PP-YOLO 的详细介绍可以参考:[PP-YOLO 模型](https://github.com/PaddlePaddle/PaddleDetection/blob/release%2F2.1/configs/ppyolo/README_cn.md)
在服务端主体检测任务中,为了保证检测效果,我们使用 ResNet50vd-DCN 作为检测模型的骨干网络,使用配置文件 [ppyolov2_r50vd_dcn_365e_coco.yml](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml) ,更换为自定义的主体检测数据集,进行训练,最终得到检测模型。 在服务端主体检测任务中,为了保证检测效果,我们使用 ResNet50vd-DCN 作为检测模型的骨干网络,使用配置文件 [ppyolov2_r50vd_dcn_365e_coco.yml](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml),更换为自定义的主体检测数据集,进行训练,最终得到检测模型。
<a name="3"></a>
## 3. 模型训练 ## 3. 模型训练
本节主要介绍怎样基于PaddleDetection,基于自己的数据集,训练主体检测模型。 本节主要介绍怎样基于 PaddleDetection,基于自己的数据集,训练主体检测模型。
<a name="3.1"></a>
### 3.1 环境准备 ### 3.1 环境准备
下载PaddleDetection代码,安装requirements。 下载 PaddleDetection 代码,安装 requirements。
```shell ```shell
cd <path/to/clone/PaddleDetection> cd <path/to/clone/PaddleDetection>
...@@ -93,16 +116,20 @@ pip install -r requirements.txt ...@@ -93,16 +116,20 @@ pip install -r requirements.txt
更多安装教程,请参考: [安装文档](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/docs/tutorials/INSTALL_cn.md) 更多安装教程,请参考: [安装文档](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/docs/tutorials/INSTALL_cn.md)
<a name="3.2"></a>
### 3.2 数据准备 ### 3.2 数据准备
对于自定义数据集,首先需要将自己的数据集修改为COCO格式,可以参考[自定义检测数据集教程](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/static/docs/tutorials/Custom_DataSet.md)制作COCO格式的数据集。 对于自定义数据集,首先需要将自己的数据集修改为 COCO 格式,可以参考[自定义检测数据集教程](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/static/docs/tutorials/Custom_DataSet.md)制作 COCO 格式的数据集。
主体检测任务中,所有的检测框均属于前景,在这里需要将标注文件中,检测框的`category_id`修改为1,同时将整个标注文件中的`categories`映射表修改为下面的格式,即整个类别映射表中只包含`前景`类别。 主体检测任务中,所有的检测框均属于前景,在这里需要将标注文件中,检测框的 `category_id` 修改为 1,同时将整个标注文件中的 `categories` 映射表修改为下面的格式,即整个类别映射表中只包含`前景`类别。
```json ```json
[{u'id': 1, u'name': u'foreground', u'supercategory': u'foreground'}] [{u'id': 1, u'name': u'foreground', u'supercategory': u'foreground'}]
``` ```
<a name="3.3"></a>
### 3.3 配置文件改动和说明 ### 3.3 配置文件改动和说明
我们使用 `configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml` 配置进行训练,配置文件摘要如下: 我们使用 `configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml` 配置进行训练,配置文件摘要如下:
...@@ -116,19 +143,20 @@ pip install -r requirements.txt ...@@ -116,19 +143,20 @@ pip install -r requirements.txt
``` ```
coco_detection.yml:主要说明了训练数据和验证数据的路径 coco_detection.yml:主要说明了训练数据和验证数据的路径
runtime.yml:主要说明了公共的运行参数,比如是否使用GPU、每多少个epoch存储checkpoint runtime.yml:主要说明了公共的运行参数,比如是否使用 GPU、每多少个 epoch 存储 checkpoint
optimizer_365e.yml:主要说明了学习率和优化器的配置 optimizer_365e.yml:主要说明了学习率和优化器的配置
ppyolov2_r50vd_dcn.yml:主要说明模型和主干网络的情况 ppyolov2_r50vd_dcn.yml:主要说明模型和主干网络的情况
ppyolov2_reader.yml:主要说明数据读取器配置,如 batch size,并发加载子进程数等,同时包含读取后预处理操作,如resize、数据增强等等 ppyolov2_reader.yml:主要说明数据读取器配置,如 batch size,并发加载子进程数等,同时包含读取后预处理操作,如 resize、数据增强等等
``` ```
在主体检测任务中,需要将 `datasets/coco_detection.yml` 中的 `num_classes` 参数修改为 1 (只有 1 个前景类别),同时将训练集和测试集的路径修改为自定义数据集的路径。 在主体检测任务中,需要将 `datasets/coco_detection.yml` 中的 `num_classes` 参数修改为 1(只有 1 个前景类别),同时将训练集和测试集的路径修改为自定义数据集的路径。
此外,也可以根据实际情况,修改上述文件,比如,如果显存溢出,可以将 batch size 和学习率等比缩小等。 此外,也可以根据实际情况,修改上述文件,比如,如果显存溢出,可以将 batch size 和学习率等比缩小等。
<a name="3.4"></a>
### 3.4 启动训练 ### 3.4 启动训练
...@@ -137,12 +165,12 @@ PaddleDetection 提供了单卡/多卡训练模式,满足用户多种训练需 ...@@ -137,12 +165,12 @@ PaddleDetection 提供了单卡/多卡训练模式,满足用户多种训练需
* GPU 单卡训练 * GPU 单卡训练
```bash ```bash
# windows和Mac下不需要执行该命令 # windows 和 Mac 下不需要执行该命令
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml
``` ```
* GPU多卡训练 * GPU 多卡训练
```bash ```bash
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -152,12 +180,12 @@ python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/ppy ...@@ -152,12 +180,12 @@ python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/ppy
--eval:表示边训练边验证。 --eval:表示边训练边验证。
* (**推荐**)模型微调 * **推荐**模型微调
如果希望加载 PaddleClas 中已经训练好的主体检测模型,在自己的数据集上进行模型微调,可以使用下面的命令进行训练。 如果希望加载 PaddleClas 中已经训练好的主体检测模型,在自己的数据集上进行模型微调,可以使用下面的命令进行训练。
```bash ```bash
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
# 指定pretrain_weights参数,加载通用的主体检测预训练模型 # 指定 pretrain_weights 参数,加载通用的主体检测预训练模型
python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml -o pretrain_weights=https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/ppyolov2_r50vd_dcn_mainbody_v1.0_pretrained.pdparams python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml -o pretrain_weights=https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/ppyolov2_r50vd_dcn_mainbody_v1.0_pretrained.pdparams
``` ```
...@@ -170,8 +198,9 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3 ...@@ -170,8 +198,9 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --eval -r output/ppyolov2_r50vd_dcn_365e_coco/10000 python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --eval -r output/ppyolov2_r50vd_dcn_365e_coco/10000
``` ```
注意:如果遇到 "`Out of memory error`" 问题, 尝试在 `ppyolov2_reader.yml` 文件中调小`batch_size`,同时等比例调小学习率。 注意:如果遇到 "`Out of memory error`" 问题, 尝试在 `ppyolov2_reader.yml` 文件中调小 `batch_size`,同时等比例调小学习率。
<a name="3.5"></a>
### 3.5 模型预测与调试 ### 3.5 模型预测与调试
...@@ -182,7 +211,9 @@ export CUDA_VISIBLE_DEVICES=0 ...@@ -182,7 +211,9 @@ export CUDA_VISIBLE_DEVICES=0
python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --infer_img=your_image_path.jpg --output_dir=infer_output/ --draw_threshold=0.5 -o weights=output/ppyolov2_r50vd_dcn_365e_coco/model_final python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --infer_img=your_image_path.jpg --output_dir=infer_output/ --draw_threshold=0.5 -o weights=output/ppyolov2_r50vd_dcn_365e_coco/model_final
``` ```
`--draw_threshold` 是个可选参数. 根据 [NMS](https://ieeexplore.ieee.org/document/1699659) 的计算,不同阈值会产生不同的结果 `keep_top_k` 表示设置输出目标的最大数量,默认值为 100 ,用户可以根据自己的实际情况进行设定。 `--draw_threshold` 是个可选参数. 根据 [NMS](https://ieeexplore.ieee.org/document/1699659) 的计算,不同阈值会产生不同的结果 `keep_top_k` 表示设置输出目标的最大数量,默认值为 100,用户可以根据自己的实际情况进行设定。
<a name="3.6"></a>
### 3.6 模型导出与预测部署。 ### 3.6 模型导出与预测部署。
...@@ -194,16 +225,16 @@ python tools/export_model.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml ...@@ -194,16 +225,16 @@ python tools/export_model.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml
预测模型会导出到 `inference/ppyolov2_r50vd_dcn_365e_coco` 目录下,分别为 `infer_cfg.yml` (预测不需要), `model.pdiparams`, `model.pdiparams.info`, `model.pdmodel` 预测模型会导出到 `inference/ppyolov2_r50vd_dcn_365e_coco` 目录下,分别为 `infer_cfg.yml` (预测不需要), `model.pdiparams`, `model.pdiparams.info`, `model.pdmodel`
注意: `PaddleDetection` 导出的inference模型的文件格式为 `model.xxx`,这里如果希望与PaddleClas的inference模型文件格式保持一致,需要将其 `model.xxx` 文件修改为 `inference.xxx` 文件,用于后续主体检测的预测部署。 注意: `PaddleDetection` 导出的 inference 模型的文件格式为 `model.xxx`,这里如果希望与 PaddleClas 的 inference 模型文件格式保持一致,需要将其 `model.xxx` 文件修改为 `inference.xxx` 文件,用于后续主体检测的预测部署。
更多模型导出教程,请参考: [EXPORT_MODEL](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/deploy/EXPORT_MODEL.md) 更多模型导出教程,请参考: [EXPORT_MODEL](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/deploy/EXPORT_MODEL.md)
最终,目录 `inference/ppyolov2_r50vd_dcn_365e_coco` 中包含 `inference.pdiparams`, `inference.pdiparams.info` 以及 `inference.pdmodel` 文件,其中 `inference.pdiparams` 为保存的 inference 模型权重文件, `inference.pdmodel` 为保存的 inference 模型结构文件。 最终,目录 `inference/ppyolov2_r50vd_dcn_365e_coco` 中包含 `inference.pdiparams`, `inference.pdiparams.info` 以及 `inference.pdmodel` 文件,其中 `inference.pdiparams` 为保存的 inference 模型权重文件,`inference.pdmodel` 为保存的 inference 模型结构文件。
导出模型之后,在主体检测与识别任务中,就可以将检测模型的路径更改为该 inference 模型路径,完成预测。 导出模型之后,在主体检测与识别任务中,就可以将检测模型的路径更改为该 inference 模型路径,完成预测。
以商品识别为例,其配置文件为 [inference_product.yaml](../../../deploy/configs/inference_product.yaml) ,修改其中的 `Global.det_inference_model_dir` 字段为导出的主体检测 inference 模型目录,参考[图像识别快速开始教程](../quick_start/quick_start_recognition.md) ,即可完成商品检测与识别过程。 以商品识别为例,其配置文件为 [inference_product.yaml](../../../deploy/configs/inference_product.yaml),修改其中的 `Global.det_inference_model_dir` 字段为导出的主体检测 inference 模型目录,参考[图像识别快速开始教程](../quick_start/quick_start_recognition.md),即可完成商品检测与识别过程。
### FAQ ### FAQ
......
# 向量检索 # 向量检索
向量检索技术在图像识别、图像检索中应用比较广泛。其主要目标是,对于给定的查询向量,在已经建立好的向量库中,与库中所有的待查询向量,进行特征向量的相似度或距离计算,得到相似度排序。在图像识别系统中,我们使用[Faiss](https://github.com/facebookresearch/faiss)对此部分进行支持,具体信息请详查[Faiss官网](https://github.com/facebookresearch/faiss)`Faiss`主要有以下优势 向量检索技术在图像识别、图像检索中应用比较广泛。其主要目标是,对于给定的查询向量,在已经建立好的向量库中,与库中所有的待查询向量,进行特征向量的相似度或距离计算,得到相似度排序。在图像识别系统中,我们使用 [Faiss](https://github.com/facebookresearch/faiss) 对此部分进行支持,具体信息请详查 [Faiss 官网](https://github.com/facebookresearch/faiss)`Faiss` 主要有以下优势
- 适配性好:支持Windos、Linux、MacOS系统 - 适配性好:支持 Windos、Linux、MacOS 系统
- 安装方便: 支持`python`接口,直接使用`pip`安装 - 安装方便: 支持 `python` 接口,直接使用 `pip` 安装
- 算法丰富:支持多种检索算法,满足不同场景的需求 - 算法丰富:支持多种检索算法,满足不同场景的需求
- 同时支持CPU、GPU,能够加速检索过程 - 同时支持 CPU、GPU,能够加速检索过程
值得注意的是,为了更好是适配性,目前版本,`PaddleClas`中暂时**只使用CPU进行向量检索** 值得注意的是,为了更好是适配性,目前版本,`PaddleClas` 中暂时**只使用 CPU 进行向量检索**
本文档主要主要介绍PaddleClas中检索模块的安装、使用的检索算法,及使用过程中的相关配置文件中参数介绍。 <div align="center">
<img src="../../images/structure.jpg" width = "800" />
</div>
## 一、检索库安装 如上图中所示,向量检索部分,在整个 `PP-ShiTu` 系统中有两部分内容
`Faiss`具体安装方法如下: - 图中绿色部分:建立检索库,供检索时查询使用,同时提供增、删等功能
- 图中蓝色部分:检索功能,即给定一张图的特征向量,返回库中相似图像的 label
本文档主要主要介绍 PaddleClas 中检索模块的安装、使用的检索算法、建库流程的及相关配置文件中参数介绍。
--------------------------
## 目录
- [1. 检索库安装](#1)
- [2. 使用的检索算法](#2)
- [3. 使用及配置文档介绍](#3)
- [3.1 建库及配置文件参数](#3.1)
- [3.2 检索配置文件参数](#3.2)
<a name="1"></a>
## 1. 检索库安装
`Faiss` 具体安装方法如下:
```python ```python
pip install faiss-cpu==1.7.1post2 pip install faiss-cpu==1.7.1post2
``` ```
若使用时,不能正常引用,则`uninstall` 之后,重新`install`,尤其是`windows`下。 若使用时,不能正常引用,则 `uninstall` 之后,重新 `install`,尤其是 `windows` 下。
## 二、使用的检索算法 <a name="2"></a>
目前`PaddleClas`中检索模块,支持如下三种检索算法 ## 2. 使用的检索算法
目前 `PaddleClas` 中检索模块,支持如下三种检索算法
- **HNSW32**: 一种图索引方法。检索精度较高,速度较快。但是特征库只支持添加图像功能,不支持删除图像特征功能。(默认方法) - **HNSW32**: 一种图索引方法。检索精度较高,速度较快。但是特征库只支持添加图像功能,不支持删除图像特征功能。(默认方法)
- **IVF**:倒排索引检索方法。速度较快,但是精度略低。特征库支持增加、删除图像特征功能。 - **IVF**:倒排索引检索方法。速度较快,但是精度略低。特征库支持增加、删除图像特征功能。
- **FLAT**: 暴力检索算法。精度最高,但是数据量大时,检索速度较慢。特征库支持增加、删除图像特征功能。 - **FLAT**: 暴力检索算法。精度最高,但是数据量大时,检索速度较慢。特征库支持增加、删除图像特征功能。
每种检索算法,满足不同场景。其中`HNSW32`为默认方法,此方法的检索精度、检索速度可以取得一个较好的平衡,具体算法介绍可以查看[官方文档](https://github.com/facebookresearch/faiss/wiki) 每种检索算法,满足不同场景。其中 `HNSW32` 为默认方法,此方法的检索精度、检索速度可以取得一个较好的平衡,具体算法介绍可以查看[官方文档](https://github.com/facebookresearch/faiss/wiki)
<a name="3"></a>
## 三、相关配置文档参数介绍 ## 3. 使用及配置文档介绍
涉及检索模块配置文件位于:`deploy/configs/`下,其中`build_*.yaml`是建立特征库的相关配置文件,`inference_*.yaml`是检索或者分类的推理配置文件。 涉及检索模块配置文件位于:`deploy/configs/` 下,其中 `build_*.yaml` 是建立特征库的相关配置文件,`inference_*.yaml` 是检索或者分类的推理配置文件。
### 3.1 建库配置文件参数 <a name="3.1"></a>
示例建库的配置如下 ### 3.1 建库及配置文件参数
建库的具体操作如下:
```shell
# 进入 deploy 目录
cd deploy
# yaml 文件根据需要改成自己所需的具体 yaml 文件
python python/build_gallery.py -c configs/build_***.yaml
```
其中 `yaml` 文件的建库的配置如下,在运行时,请根据实际情况进行修改。建库操作会将根据 `data_file` 的图像列表,将 `image_root` 下的图像进行特征提取,并在 `index_dir` 下进行存储,以待后续检索使用。
其中 `data_file` 文件存储的是图像文件的路径和标签,每一行的格式为:`image_path label`。中间间隔以 `yaml` 文件中 `delimiter` 参数作为间隔。
关于特征提取的具体模型参数,可查看 `yaml` 文件。
```yaml ```yaml
# indexing engine config # indexing engine config
...@@ -56,13 +96,19 @@ IndexProcess: ...@@ -56,13 +96,19 @@ IndexProcess:
- **index_dir**:构建的特征库所存放的文件夹 - **index_dir**:构建的特征库所存放的文件夹
- **image_root**:构建特征库所需要的标注图像所存储的文件夹位置 - **image_root**:构建特征库所需要的标注图像所存储的文件夹位置
- **data_file**:构建特征库所需要的标注图像的数据列表,每一行的格式:relative_path label - **data_file**:构建特征库所需要的标注图像的数据列表,每一行的格式:relative_path label
- **index_operation**: 此次运行建库的操作:`new`新建,`append`将data_file的图像特征添加到特征库中,`remove`将data_file的图像从特征库中删除 - **index_operation**: 此次运行建库的操作:`new` 新建,`append` 将 data_file 的图像特征添加到特征库中,`remove` 将 data_file 的图像从特征库中删除
- **delimiter****data_file**中每一行的间隔符 - **delimiter****data_file** 中每一行的间隔符
- **dist_type**: 特征匹配过程中使用的相似度计算方式。`IP`内积相似度计算方式,`L2`欧式距离计算方法 - **dist_type**: 特征匹配过程中使用的相似度计算方式。例如 `IP` 内积相似度计算方式,`L2` 欧式距离计算方法
- **embedding_size**:特征维度 - **embedding_size**:特征维度
<a name="3.2"></a>
### 3.2 检索配置文件参数 ### 3.2 检索配置文件参数
将检索的过程融合到 `PP-ShiTu` 的整体流程中,请参考 [README](../../../README_ch.md)`PP-ShiTu 图像识别系统介绍` 部分。检索具体使用操作请参考[识别快速开始文档](../quick_start/quick_start_recognition.md)
其中,检索部分配置如下,整体检索配置文件,请参考 `deploy/configs/inference_*.yaml` 文件。
```yaml ```yaml
IndexProcess: IndexProcess:
index_dir: "./recognition_demo_data_v1.1/gallery_logo/index/" index_dir: "./recognition_demo_data_v1.1/gallery_logo/index/"
...@@ -72,5 +118,5 @@ IndexProcess: ...@@ -72,5 +118,5 @@ IndexProcess:
与建库配置文件不同,新参数主要如下: 与建库配置文件不同,新参数主要如下:
- `return_k`: 检索结果返回`k`个结果 - `return_k`: 检索结果返回 `k` 个结果
- `score_thres`: 检索匹配的阈值 - `score_thres`: 检索匹配的阈值
# 服务器端C++预测 # 服务器端 C++ 预测
本教程将介绍在服务器端部署PaddleClas分类模型的详细步骤,识别模型部署方式将在近期支持,敬请期待。 本教程将介绍在服务器端部署 PaddleClas 分类模型的详细步骤,识别模型部署方式将在近期支持,敬请期待。
--- ---
## 目录 ## 目录
- [准备环境](#1) - [1. 准备环境](#1)
- [1.1编译opencv](#1.1) - [1.1 编译 opencv ](#1.1)
- [1.2准备环境](#1.2) - [1.2 准备环境](#1.2)
- [1.2.1 预测库源码编译](#1.2.1) - [1.2.1 预测库源码编译](#1.2.1)
- [1.2.2 直接下载安装](#1.2.2) - [1.2.2 直接下载安装](#1.2.2)
- [编译](#2) - [2. 编译](#2)
- [2.1 编译 PaddleClas C++ 预测 demo](#2.1) - [2.1 编译 PaddleClas C++ 预测 demo](#2.1)
- [2.2 编译 config lib 预测库与 cls lib 预测库](#2.2) - [2.2 编译 config lib 预测库与 cls lib 预测库](#2.2)
- [运行](#3) - [3. 运行](#3)
- [3.1 准备 inference model](#3.1) - [3.1 准备 inference model](#3.1)
- [3.2 运行 demo](#3.2) - [3.2 运行 demo](#3.2)
...@@ -23,12 +23,12 @@ ...@@ -23,12 +23,12 @@
## 1. 准备环境 ## 1. 准备环境
- Linux 环境,推荐使用 docker。 - Linux 环境,推荐使用 docker。
- Windows 环境,目前支持基于 `Visual Studio 2019 Community` 进行编译;此外,如果您希望通过生成 `sln解决方案` 的方式进行编译,可以参考该文档:[https://zhuanlan.zhihu.com/p/145446681](https://zhuanlan.zhihu.com/p/145446681) - Windows 环境,目前支持基于 `Visual Studio 2019 Community` 进行编译;此外,如果您希望通过生成 `sln 解决方案` 的方式进行编译,可以参考该文档:[https://zhuanlan.zhihu.com/p/145446681](https://zhuanlan.zhihu.com/p/145446681)
* 该文档主要介绍基于 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> <a name="1.1"></a>
### 1.1 编译opencv ### 1.1 编译 opencv
* 首先需要从 opencv 官网上下载在 Linux 环境下源码编译的包,以 3.4.7 版本为例,下载及解压缩命令如下: * 首先需要从 opencv 官网上下载在 Linux 环境下源码编译的包,以 3.4.7 版本为例,下载及解压缩命令如下:
...@@ -95,9 +95,9 @@ opencv3/ ...@@ -95,9 +95,9 @@ opencv3/
<a name="1.2.1"></a> <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) 的说明。编译示例如下:
1. 使用Git获取源代码: 1. 使用 Git 获取源代码:
```shell ```shell
git clone https://github.com/PaddlePaddle/Paddle.git git clone https://github.com/PaddlePaddle/Paddle.git
...@@ -140,7 +140,7 @@ build/paddle_inference_install_dir/ ...@@ -140,7 +140,7 @@ build/paddle_inference_install_dir/
<a name="1.2.2"></a> <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` 版本。
**注意**:在选择预测库时,所选预测库版本需要与后续编译选项一致: **注意**:在选择预测库时,所选预测库版本需要与后续编译选项一致:
* CPU 预测库仅可用于 GPU 预测,具体又分为 `mkl``openblas`,分别对应其低层实现基于 `MKL` 数学运算库 和 `OpenBLAS` 数学运算库; * CPU 预测库仅可用于 GPU 预测,具体又分为 `mkl``openblas`,分别对应其低层实现基于 `MKL` 数学运算库 和 `OpenBLAS` 数学运算库;
...@@ -167,7 +167,7 @@ tar -xf paddle_inference.tgz ...@@ -167,7 +167,7 @@ tar -xf paddle_inference.tgz
sh tools/build_demo.sh sh tools/build_demo.sh
``` ```
具体地,`tools/build_demo.sh`中内容如下: 具体地,`tools/build_demo.sh` 中内容如下:
```shell ```shell
OpenCV_DIR=path/to/opencv OpenCV_DIR=path/to/opencv
...@@ -224,7 +224,7 @@ make -j ...@@ -224,7 +224,7 @@ make -j
sh tools/build_lib.sh sh tools/build_lib.sh
``` ```
具体地,`tools/build_lib.sh`中内容如下: 具体地,`tools/build_lib.sh` 中内容如下:
```shell ```shell
OpenCV_DIR=path/to/opencv OpenCV_DIR=path/to/opencv
...@@ -269,19 +269,19 @@ inference/ ...@@ -269,19 +269,19 @@ inference/
### 3.2 运行 demo ### 3.2 运行 demo
首先修改 `tools/config.txt` 中对应字段: 首先修改 `tools/config.txt` 中对应字段:
* use_gpu:是否使用GPU; * use_gpu:是否使用 GPU;
* gpu_id:使用的GPU卡号; * gpu_id:使用的 GPU 卡号;
* gpu_mem:显存; * gpu_mem:显存;
* cpu_math_library_num_threads:底层科学计算库所用线程的数量; * cpu_math_library_num_threads:底层科学计算库所用线程的数量;
* use_mkldnn:是否使用MKLDNN加速; * use_mkldnn:是否使用 MKLDNN 加速;
* use_tensorrt: 是否使用tensorRT进行加速; * use_tensorrt: 是否使用 tensorRT 进行加速;
* use_fp16:是否使用半精度浮点数进行计算,该选项仅在use_tensorrt为true时有效; * use_fp16:是否使用半精度浮点数进行计算,该选项仅在 use_tensorrt 为 true 时有效;
* cls_model_path:预测模型结构文件路径; * cls_model_path:预测模型结构文件路径;
* cls_params_path:预测模型参数文件路径; * cls_params_path:预测模型参数文件路径;
* resize_short_size:预处理时图像缩放大小; * resize_short_size:预处理时图像缩放大小;
* crop_size:预处理时图像裁剪后的大小。 * crop_size:预处理时图像裁剪后的大小。
然后修改`tools/run.sh`: 然后修改 `tools/run.sh`:
* `./build/clas_system ./tools/config.txt ./docs/imgs/ILSVRC2012_val_00000666.JPEG` * `./build/clas_system ./tools/config.txt ./docs/imgs/ILSVRC2012_val_00000666.JPEG`
* 上述命令中分别为:编译得到的可执行文件 `clas_system`;运行时的配置文件 `config.txt`;待预测的图像。 * 上述命令中分别为:编译得到的可执行文件 `clas_system`;运行时的配置文件 `config.txt`;待预测的图像。
......
# 基于 Visual Studio 2019 Community CMake 编译指南 # 基于 Visual Studio 2019 Community CMake 编译指南
PaddleClas 在 Windows 平台下基于 `Visual Studio 2019 Community` 进行了测试。微软从 `Visual Studio 2017` 开始即支持直接管理 `CMake` 跨平台编译项目,但是直到 `2019` 版才提供了稳定和完全的支持,所以如果你想使用 CMake 管理项目编译构建,我们推荐使用 `Visual Studio 2019`。如果您希望通过生成 `sln解决方案` 的方式进行编译,可以参考该文档:[https://zhuanlan.zhihu.com/p/145446681](https://zhuanlan.zhihu.com/p/145446681) PaddleClas 在 Windows 平台下基于 `Visual Studio 2019 Community` 进行了测试。微软从 `Visual Studio 2017` 开始即支持直接管理 `CMake` 跨平台编译项目,但是直到 `2019` 版才提供了稳定和完全的支持,所以如果你想使用 CMake 管理项目编译构建,我们推荐使用 `Visual Studio 2019`。如果您希望通过生成 `sln 解决方案` 的方式进行编译,可以参考该文档:[https://zhuanlan.zhihu.com/p/145446681](https://zhuanlan.zhihu.com/p/145446681)
-----
## 目录
* [1. 前置条件](#1)
* [1.1 下载 PaddlePaddle C++ 预测库 paddle_inference_install_dir](#1.1)
* [1.2 安装配置 OpenCV](#1.2)
* [2. 使用 Visual Studio 2019 编译](#2)
* [3. 预测](#3)
* [3.1 准备 inference model](#3.1)
* [3.2 运行预测](#3.2)
* [3.3 注意事项](#3.3)
<a name='1'></a>
## 1. 前置条件 ## 1. 前置条件
* Visual Studio 2019 * Visual Studio 2019
* CUDA 9.0 / CUDA 10.0,cudnn 7.6+ (仅在使用GPU版本的预测库时需要) * CUDA 9.0 / CUDA 10.0,cudnn 7.6+(仅在使用 GPU 版本的预测库时需要)
* CMake 3.0+ * CMake 3.0+
请确保系统已经正确安装并配置好上述基本软件,其中: 请确保系统已经正确安装并配置好上述基本软件,其中:
* 在安装 `Visual Studio 2019` 时,`工作负载` 需要勾选 `使用C++的桌面开发` * 在安装 `Visual Studio 2019` 时,`工作负载` 需要勾选 `使用 C++的桌面开发`
* CUDA需要正确安装并设置系统环境变量; * CUDA 需要正确安装并设置系统环境变量;
* CMake需要正确安装并将路径添加到系统环境变量中。 * CMake 需要正确安装并将路径添加到系统环境变量中。
以下示例基于 `Visual Studio 2019 Community` 版本,以工作目录为 `D:\projects` 进行演示。 以下示例基于 `Visual Studio 2019 Community` 版本,以工作目录为 `D:\projects` 进行演示。
...@@ -27,16 +39,17 @@ PaddlePaddle C++ 预测库针对不同的 `CPU `和 `CUDA` 版本提供了不同 ...@@ -27,16 +39,17 @@ PaddlePaddle C++ 预测库针对不同的 `CPU `和 `CUDA` 版本提供了不同
``` ```
paddle_inference_install_dir paddle_inference_install_dir
├── paddle # paddle核心库和头文件 ├── paddle # paddle 核心库和头文件
├── third_party # 第三方依赖库和头文件 ├── third_party # 第三方依赖库和头文件
└── version.txt # 版本和编译信息 └── version.txt # 版本和编译信息
``` ```
**注意**:需要将 `Paddle预测库` 的路径(`D:\projects\paddle_inference_install_dir\paddle\lib`)添加到系统环境变量 `Path` 中。 **注意**:需要将 `Paddle 预测库` 的路径(`D:\projects\paddle_inference_install_dir\paddle\lib`)添加到系统环境变量 `Path` 中。
<a name='1.2'></a>
### 1.2 安装配置 OpenCV ### 1.2 安装配置 OpenCV
1. 在 OpenCV 官网下载适用于 Windows 平台的 3.4.6 版本,[下载地址](https://sourceforge.net/projects/opencvlibrary/files/3.4.6/opencv-3.4.6-vc14_vc15.exe/download) 1. 在 OpenCV 官网下载适用于 Windows 平台的 3.4.6 版本,[下载地址](https://sourceforge.net/projects/opencvlibrary/files/3.4.6/opencv-3.4.6-vc14_vc15.exe/download)
2. 运行下载的可执行文件,将 OpenCV 解压至指定目录,如 `D:\projects\opencv` 2. 运行下载的可执行文件,将 OpenCV 解压至指定目录,如 `D:\projects\opencv`
3. 配置环境变量,如下流程所示: 3. 配置环境变量,如下流程所示:
* 此电脑(我的电脑)-> 属性 -> 高级系统设置 -> 环境变量; * 此电脑(我的电脑)-> 属性 -> 高级系统设置 -> 环境变量;
...@@ -44,7 +57,6 @@ paddle_inference_install_dir ...@@ -44,7 +57,6 @@ paddle_inference_install_dir
* 新建,将 OpenCV 路径填入并保存,如 `D:\projects\opencv\build\x64\vc14\bin` * 新建,将 OpenCV 路径填入并保存,如 `D:\projects\opencv\build\x64\vc14\bin`
<a name="2"></a> <a name="2"></a>
## 2. 使用 Visual Studio 2019 编译 ## 2. 使用 Visual Studio 2019 编译
1. 打开 Visual Studio 2019 Community,点击 `继续但无需代码` 1. 打开 Visual Studio 2019 Community,点击 `继续但无需代码`
...@@ -55,11 +67,11 @@ paddle_inference_install_dir ...@@ -55,11 +67,11 @@ paddle_inference_install_dir
![step2.1](../../images/inference_deployment/vs2019_step2.png) ![step2.1](../../images/inference_deployment/vs2019_step2.png)
选择项目代码所在路径,并打开`CMakeList.txt` 选择项目代码所在路径,并打开 `CMakeList.txt`
![step2.2](../../images/inference_deployment/vs2019_step3.png) ![step2.2](../../images/inference_deployment/vs2019_step3.png)
3. 点击:`项目`->`CMake设置` 3. 点击:`项目`->`CMake 设置`
![step3](../../images/inference_deployment/vs2019_step4.png) ![step3](../../images/inference_deployment/vs2019_step4.png)
...@@ -69,10 +81,10 @@ paddle_inference_install_dir ...@@ -69,10 +81,10 @@ paddle_inference_install_dir
| ----------------------------- | ------------------ | ----------- | | ----------------------------- | ------------------ | ----------- |
| CMAKE_BACKWARDS_COMPATIBILITY | 3.17 | [√] | | CMAKE_BACKWARDS_COMPATIBILITY | 3.17 | [√] |
| CMAKE_BUILD_TYPE | RelWithDebInfo | [√] | | CMAKE_BUILD_TYPE | RelWithDebInfo | [√] |
| CUDA_LIB | CUDA的库路径 | [√] | | CUDA_LIB | CUDA 的库路径 | [√] |
| CUDNN_LIB | CUDNN的库路径 | [√] | | CUDNN_LIB | CUDNN 的库路径 | [√] |
| OpenCV_DIR | OpenCV的安装路径 | [√] | | OpenCV_DIR | OpenCV 的安装路径 | [√] |
| PADDLE_LIB | Paddle预测库的路径 | [√] | | PADDLE_LIB | Paddle 预测库的路径 | [√] |
| WITH_GPU | [√] | [√] | | WITH_GPU | [√] | [√] |
| WITH_MKL | [√] | [√] | | WITH_MKL | [√] | [√] |
| WITH_STATIC_LIB | [√] | [√] | | WITH_STATIC_LIB | [√] | [√] |
...@@ -83,16 +95,16 @@ paddle_inference_install_dir ...@@ -83,16 +95,16 @@ paddle_inference_install_dir
**注意** **注意**
* `CMAKE_BACKWARDS_COMPATIBILITY` 的值请根据自己 `cmake` 版本设置,`cmake` 版本可以通过命令:`cmake --version` 查询; * `CMAKE_BACKWARDS_COMPATIBILITY` 的值请根据自己 `cmake` 版本设置,`cmake` 版本可以通过命令:`cmake --version` 查询;
* `CUDA_LIB``CUDNN_LIB` 的值仅需在使用**GPU版本**预测库时指定,其中CUDA库版本尽量对齐,**使用9.0、10.0版本,不使用9.2、10.1等版本CUDA库** * `CUDA_LIB``CUDNN_LIB` 的值仅需在使用 **GPU 版本**预测库时指定,其中 CUDA 库版本尽量对齐,**使用 9.0、10.0 版本,不使用 9.2、10.1 等版本 CUDA 库**
* 在设置 `CUDA_LIB``CUDNN_LIB``OPENCV_DIR``PADDLE_LIB` 时,点击 `浏览`,分别设置相应的路径; * 在设置 `CUDA_LIB``CUDNN_LIB``OPENCV_DIR``PADDLE_LIB` 时,点击 `浏览`,分别设置相应的路径;
* `CUDA_LIB``CUDNN_LIB`:该路径取决于CUDA与CUDNN的安装位置。 * `CUDA_LIB``CUDNN_LIB`:该路径取决于 CUDA 与 CUDNN 的安装位置。
* `OpenCV_DIR`:该路径下需要有`.cmake`文件,一般为`opencv/build/` * `OpenCV_DIR`:该路径下需要有`.cmake` 文件,一般为 `opencv/build/`
* `PADDLE_LIB`:该路径下需要有`CMakeCache.txt`文件,一般为`paddle_inference_install_dir/` * `PADDLE_LIB`:该路径下需要有 `CMakeCache.txt` 文件,一般为 `paddle_inference_install_dir/`
* 在使用 `CPU` 版预测库时,请不要勾选 `WITH_GPU` - `保存到 JSON` * 在使用 `CPU` 版预测库时,请不要勾选 `WITH_GPU` - `保存到 JSON`
![step4](../../images/inference_deployment/vs2019_step5.png) ![step4](../../images/inference_deployment/vs2019_step5.png)
设置完成后,点击上图中 `保存并生成CMake缓存以加载变量` 设置完成后,点击上图中 `保存并生成 CMake 缓存以加载变量`
5. 点击`生成`->`全部生成` 5. 点击`生成`->`全部生成`
...@@ -100,8 +112,10 @@ paddle_inference_install_dir ...@@ -100,8 +112,10 @@ paddle_inference_install_dir
在编译完成后,会生成可执行文件 `clas_system.exe`。并且,如未设置 `DCONFIG_LIB``DCLS_LIB`,则会在 `.\lib\` 目录下生成 `config lib` 和 `cls lib` 两个静态链接库文件(`libconfig.a`、`libcls.a`)。类似地,你也可以仅编译生成 `config lib` 和 `cls lib` 两个静态链接库文件,只需打开路径为 `D:\projects\PaddleClas\deploy\cpp\lib\CMakeList.txt` 的 `CMake` 文件并进行编译即可,具体参考[2. 使用 Visual Studio 2019 编译](#2),完成编译后,同样可在 `.\lib\` 目录下生成静态链接库文件,静态链接库文件可用于二次开发。 在编译完成后,会生成可执行文件 `clas_system.exe`。并且,如未设置 `DCONFIG_LIB``DCLS_LIB`,则会在 `.\lib\` 目录下生成 `config lib` 和 `cls lib` 两个静态链接库文件(`libconfig.a`、`libcls.a`)。类似地,你也可以仅编译生成 `config lib` 和 `cls lib` 两个静态链接库文件,只需打开路径为 `D:\projects\PaddleClas\deploy\cpp\lib\CMakeList.txt` 的 `CMake` 文件并进行编译即可,具体参考[2. 使用 Visual Studio 2019 编译](#2),完成编译后,同样可在 `.\lib\` 目录下生成静态链接库文件,静态链接库文件可用于二次开发。
<a name='3'></a>
## 3. 预测 ## 3. 预测
<a name='3.1'></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` 目录下,则目录结构如下。
...@@ -114,16 +128,17 @@ inference/ ...@@ -114,16 +128,17 @@ 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 运行预测 ### 3.2 运行预测
首先修改 `tools/config.txt` 中对应字段: 首先修改 `tools/config.txt` 中对应字段:
* use_gpu:是否使用GPU; * use_gpu:是否使用 GPU;
* gpu_id:使用的GPU卡号; * gpu_id:使用的 GPU 卡号;
* gpu_mem:显存; * gpu_mem:显存;
* cpu_math_library_num_threads:底层科学计算库所用线程的数量; * cpu_math_library_num_threads:底层科学计算库所用线程的数量;
* use_mkldnn:是否使用MKLDNN加速; * use_mkldnn:是否使用 MKLDNN 加速;
* use_tensorrt: 是否使用tensorRT进行加速; * use_tensorrt: 是否使用 tensorRT 进行加速;
* use_fp16:是否使用半精度浮点数进行计算,该选项仅在use_tensorrt为true时有效; * use_fp16:是否使用半精度浮点数进行计算,该选项仅在 use_tensorrt 为 true 时有效;
* cls_model_path:预测模型结构文件路径; * cls_model_path:预测模型结构文件路径;
* cls_params_path:预测模型参数文件路径; * cls_params_path:预测模型参数文件路径;
* resize_short_size:预处理时图像缩放大小; * resize_short_size:预处理时图像缩放大小;
...@@ -143,8 +158,8 @@ cd D:\projects\PaddleClas\deploy\cpp\out\build\x64-Release ...@@ -143,8 +158,8 @@ cd D:\projects\PaddleClas\deploy\cpp\out\build\x64-Release
上述命令中,第一个参数(`D:\projects\PaddleClas\deploy\cpp\tools\config.txt`)为配置文件路径,第二个参数(`.\docs\ILSVRC2012_val_00008306.JPEG`)为需要预测的图片路径。 上述命令中,第一个参数(`D:\projects\PaddleClas\deploy\cpp\tools\config.txt`)为配置文件路径,第二个参数(`.\docs\ILSVRC2012_val_00008306.JPEG`)为需要预测的图片路径。
注意,需要在配置文件中正确设置预测参数,包括所用模型文件的路径(`cls_model_path``cls_params_path`)。 注意,需要在配置文件中正确设置预测参数,包括所用模型文件的路径(`cls_model_path``cls_params_path`)。
<a name='3.3'></a>
### 4. 注意事项 ### 3.3 注意事项
* 在 Windows 下的终端中执行文件 exe 时,可能会发生乱码的现象,此时需要在终端中输入 `CHCP 65001`,将终端的编码方式由 GBK 编码(默认)改为 UTF-8 编码,更加具体的解释可以参考这篇博客:[https://blog.csdn.net/qq_35038153/article/details/78430359](https://blog.csdn.net/qq_35038153/article/details/78430359) * 在 Windows 下的终端中执行文件 exe 时,可能会发生乱码的现象,此时需要在终端中输入 `CHCP 65001`,将终端的编码方式由 GBK 编码(默认)改为 UTF-8 编码,更加具体的解释可以参考这篇博客:[https://blog.csdn.net/qq_35038153/article/details/78430359](https://blog.csdn.net/qq_35038153/article/details/78430359)
* 如果需要使用 CPU 预测,PaddlePaddle 在 Windows 上仅支持 avx 的 CPU 预测,目前不支持 noavx 的 CPU 预测; * 如果需要使用 CPU 预测,PaddlePaddle 在 Windows 上仅支持 avx 的 CPU 预测,目前不支持 noavx 的 CPU 预测;
* 在使用生成的 `clas_system.exe` 进行预测时,如提示 `由于找不到paddle_fluid.dll,无法继续执行代码。重新安装程序可能会解决此问题`,请检查是否将 Paddle 预测库路径添加到系统环境变量,详见[1.1 下载 PaddlePaddle C++ 预测库 paddle_inference_install_dir](#1.1) * 在使用生成的 `clas_system.exe` 进行预测时,如提示 `由于找不到 paddle_fluid.dll,无法继续执行代码。重新安装程序可能会解决此问题`,请检查是否将 Paddle 预测库路径添加到系统环境变量,详见[1.1 下载 PaddlePaddle C++ 预测库 paddle_inference_install_dir](#1.1)
...@@ -7,19 +7,19 @@ PaddlePaddle 支持导出 inference 模型用于部署推理场景,相比于 ...@@ -7,19 +7,19 @@ PaddlePaddle 支持导出 inference 模型用于部署推理场景,相比于
## 目录 ## 目录
- [环境准备](#环境准备) - [1. 环境准备](#1)
- [分类模型导出](#分类模型导出) - [2. 分类模型导出](#2)
- [主体检测模型导出](#主体检测模型导出) - [3. 主体检测模型导出](#3)
- [识别模型导出](#识别模型导出) - [4. 识别模型导出](#4)
- [命令参数说明](#命令参数说明) - [5. 命令参数说明](#5)
<a name="环境准备"></a> <a name="1"></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> <a name="2"></a>
## 2. 分类模型导出 ## 2. 分类模型导出
进入 PaddleClas 目录下: 进入 PaddleClas 目录下:
...@@ -43,12 +43,12 @@ python tools/export_model.py \ ...@@ -43,12 +43,12 @@ 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
``` ```
<a name="主体检测模型导出"></a> <a name="3"></a>
## 3. 主体检测模型导出 ## 3. 主体检测模型导出
主体检测模型的导出,可以参考[主题检测介绍](../image_recognition_pipeline/mainbody_detection.md) 主体检测模型的导出,可以参考[主题检测介绍](../image_recognition_pipeline/mainbody_detection.md)
<a name="识别模型导出"></a> <a name="4"></a>
## 4. 识别模型导出 ## 4. 识别模型导出
进入 PaddleClas 目录下: 进入 PaddleClas 目录下:
...@@ -74,7 +74,7 @@ python3 tools/export_model.py \ ...@@ -74,7 +74,7 @@ python3 tools/export_model.py \
注意,此处保存的 inference 模型在 embedding 特征层做了截断,即导出后模型最终的输出为 n 维 embedding 特征。 注意,此处保存的 inference 模型在 embedding 特征层做了截断,即导出后模型最终的输出为 n 维 embedding 特征。
<a name="命令参数说明"></a> <a name="5"></a>
## 5. 命令参数说明 ## 5. 命令参数说明
在上述模型导出命令中,所使用的配置文件需要与该模型的训练文件相同,在配置文件中有以下字段用于配置模型导出参数: 在上述模型导出命令中,所使用的配置文件需要与该模型的训练文件相同,在配置文件中有以下字段用于配置模型导出参数:
......
# 基于PaddleHub Serving的服务部署 # 基于 PaddleHub Serving 的服务部署
PaddleClas 支持通过 PaddleHub 快速进行服务化部署。目前支持图像分类的部署,图像识别的部署敬请期待。 PaddleClas 支持通过 PaddleHub 快速进行服务化部署。目前支持图像分类的部署,图像识别的部署敬请期待。
...@@ -6,15 +6,15 @@ PaddleClas 支持通过 PaddleHub 快速进行服务化部署。目前支持图 ...@@ -6,15 +6,15 @@ PaddleClas 支持通过 PaddleHub 快速进行服务化部署。目前支持图
## 目录 ## 目录
- [简介](#1) - [1. 简介](#1)
- [准备环境](#2) - [2. 准备环境](#2)
- [下载推理模型](#3) - [3. 下载推理模型](#3)
- [安装服务模块](#4) - [4. 安装服务模块](#4)
- [启动服务](#5) - [5. 启动服务](#5)
- [5.1命令行命令启动](#5.1) - [5.1 命令行命令启动](#5.1)
- [5.2 配置文件启动](#5.2) - [5.2 配置文件启动](#5.2)
- [发送预测请求](#6) - [6. 发送预测请求](#6)
- [自定义修改服务模块](#7) - [7. 自定义修改服务模块](#7)
<a name="1"></a> <a name="1"></a>
...@@ -34,7 +34,7 @@ hubserving/clas/ ...@@ -34,7 +34,7 @@ hubserving/clas/
<a name="2"></a> <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
``` ```
...@@ -54,8 +54,8 @@ pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/sim ...@@ -54,8 +54,8 @@ pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/sim
"inference_model_dir": "../inference/" "inference_model_dir": "../inference/"
``` ```
需要注意, 需要注意,
* 模型文件(包括 `.pdmodel``.pdiparams`)名称必须为`inference` * 模型文件(包括 `.pdmodel``.pdiparams`)名称必须为 `inference`
* 我们也提供了大量基于ImageNet-1k数据集的预训练模型,模型列表及下载地址详见[模型库概览](../models/models_intro.md),也可以使用自己训练转换好的模型。 * 我们也提供了大量基于 ImageNet-1k 数据集的预训练模型,模型列表及下载地址详见[模型库概览](../models/models_intro.md),也可以使用自己训练转换好的模型。
<a name="4"></a> <a name="4"></a>
...@@ -63,14 +63,14 @@ pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/sim ...@@ -63,14 +63,14 @@ pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/sim
针对 Linux 环境和 Windows 环境,安装命令如下。 针对 Linux 环境和 Windows 环境,安装命令如下。
*Linux环境下,安装示例如下: * Linux 环境下,安装示例如下:
```shell ```shell
cd PaddleClas/deploy cd PaddleClas/deploy
# 安装服务模块: # 安装服务模块:
hub install hubserving/clas/ hub install hubserving/clas/
``` ```
*Windows环境下(文件夹的分隔符为`\`),安装示例如下: * Windows 环境下(文件夹的分隔符为`\`),安装示例如下:
```shell ```shell
cd PaddleClas\deploy cd PaddleClas\deploy
...@@ -98,10 +98,10 @@ $ hub serving start --modules Module1==Version1 \ ...@@ -98,10 +98,10 @@ $ hub serving start --modules Module1==Version1 \
**参数说明**: **参数说明**:
|参数|用途| |参数|用途|
|-|-| |-|-|
|--modules/-m| [**必选**] PaddleHub Serving预安装模型,以多个Module==Version键值对的形式列出<br>*`当不指定Version时,默认选择最新版本`*| |--modules/-m| [**必选**] PaddleHub Serving 预安装模型,以多个 Module==Version 键值对的形式列出<br>*`当不指定 Version 时,默认选择最新版本`*|
|--port/-p| [**可选**] 服务端口,默认为8866| |--port/-p| [**可选**] 服务端口,默认为 8866|
|--use_multiprocess| [**可选**] 是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式<br>*`Windows操作系统只支持单进程方式`*| |--use_multiprocess| [**可选**] 是否启用并发方式,默认为单进程方式,推荐多核 CPU 机器使用此方式<br>*`Windows 操作系统只支持单进程方式`*|
|--workers| [**可选**] 在并发方式下指定的并发任务数,默认为`2*cpu_count-1`,其中`cpu_count`为CPU核数| |--workers| [**可选**] 在并发方式下指定的并发任务数,默认为 `2*cpu_count-1`,其中 `cpu_count` 为 CPU 核数|
如按默认参数启动服务:```hub serving start -m clas_system``` 如按默认参数启动服务:```hub serving start -m clas_system```
...@@ -115,7 +115,7 @@ $ hub serving start --modules Module1==Version1 \ ...@@ -115,7 +115,7 @@ $ hub serving start --modules Module1==Version1 \
```hub serving start -c config.json``` ```hub serving start -c config.json```
其中,`config.json`格式如下: 其中,`config.json` 格式如下:
```json ```json
{ {
...@@ -137,18 +137,18 @@ $ hub serving start --modules Module1==Version1 \ ...@@ -137,18 +137,18 @@ $ hub serving start --modules Module1==Version1 \
``` ```
**参数说明**: **参数说明**:
* `init_args`中的可配参数与`module.py`中的`_initialize`函数接口一致。其中, * `init_args` 中的可配参数与 `module.py` 中的 `_initialize` 函数接口一致。其中,
- 当`use_gpu`为`true`时,表示使用GPU启动服务。 - 当 `use_gpu` 为 `true` 时,表示使用 GPU 启动服务。
- 当`enable_mkldnn`为`true`时,表示使用MKL-DNN加速。 - 当 `enable_mkldnn` 为 `true` 时,表示使用 MKL-DNN 加速。
* `predict_args`中的可配参数与`module.py`中的`predict`函数接口一致。 * `predict_args` 中的可配参数与 `module.py` 中的 `predict` 函数接口一致。
**注意**: **注意**:
* 使用配置文件启动服务时,将使用配置文件中的参数设置,其他命令行参数将被忽略; * 使用配置文件启动服务时,将使用配置文件中的参数设置,其他命令行参数将被忽略;
* 如果使用 GPU 预测(即,`use_gpu`置为`true`),则需要在启动服务之前,设置 `CUDA_VISIBLE_DEVICES` 环境变量来指定所使用的 GPU 卡号,如:`export CUDA_VISIBLE_DEVICES=0`; * 如果使用 GPU 预测(即,`use_gpu` 置为 `true`),则需要在启动服务之前,设置 `CUDA_VISIBLE_DEVICES` 环境变量来指定所使用的 GPU 卡号,如:`export CUDA_VISIBLE_DEVICES=0`;
* **`use_gpu` 不可与 `use_multiprocess` 同时为 `true`**; * **`use_gpu` 不可与 `use_multiprocess` 同时为 `true`**;
* **`use_gpu` 与 `enable_mkldnn` 同时为 `true` 时,将忽略 `enable_mkldnn`,而使用 GPU**。 * **`use_gpu` 与 `enable_mkldnn` 同时为 `true` 时,将忽略 `enable_mkldnn`,而使用 GPU**。
如使用 GPU 3号卡启动服务: 如使用 GPU 3 号卡启动服务:
```shell ```shell
cd PaddleClas/deploy cd PaddleClas/deploy
...@@ -170,13 +170,13 @@ python hubserving/test_hubserving.py server_url image_path ...@@ -170,13 +170,13 @@ python hubserving/test_hubserving.py server_url image_path
* **server_url**:服务地址,格式为 * **server_url**:服务地址,格式为
`http://[ip_address]:[port]/predict/[module_name]` `http://[ip_address]:[port]/predict/[module_name]`
* **image_path**:测试图像路径,可以是单张图片路径,也可以是图像集合目录路径。 * **image_path**:测试图像路径,可以是单张图片路径,也可以是图像集合目录路径。
* **batch_size**:[**可选**] 以`batch_size`大小为单位进行预测,默认为`1`。 * **batch_size**:[**可选**] 以 `batch_size` 大小为单位进行预测,默认为 `1`。
* **resize_short**:[**可选**] 预处理时,按短边调整大小,默认为`256`。 * **resize_short**:[**可选**] 预处理时,按短边调整大小,默认为 `256`。
* **crop_size**:[**可选**] 预处理时,居中裁剪的大小,默认为`224`。 * **crop_size**:[**可选**] 预处理时,居中裁剪的大小,默认为 `224`。
* **normalize**:[**可选**] 预处理时,是否进行`normalize`,默认为`True`。 * **normalize**:[**可选**] 预处理时,是否进行 `normalize`,默认为 `True`。
* **to_chw**:[**可选**] 预处理时,是否调整为`CHW`顺序,默认为`True`。 * **to_chw**:[**可选**] 预处理时,是否调整为 `CHW` 顺序,默认为 `True`。
**注意**:如果使用`Transformer`系列模型,如`DeiT_***_384`, `ViT_***_384`等,请注意模型的输入数据尺寸,需要指定`--resize_short=384 --crop_size=384`。 **注意**:如果使用 `Transformer` 系列模型,如 `DeiT_***_384`, `ViT_***_384` 等,请注意模型的输入数据尺寸,需要指定`--resize_short=384 --crop_size=384`。
访问示例: 访问示例:
...@@ -189,8 +189,8 @@ python hubserving/test_hubserving.py --server_url http://127.0.0.1:8866/predict/ ...@@ -189,8 +189,8 @@ python hubserving/test_hubserving.py --server_url http://127.0.0.1:8866/predict/
``` ```
list: 返回结果 list: 返回结果
└─ list: 第一张图片结果 └─ list: 第一张图片结果
└─ list: 前k个分类结果,依score递减排序 └─ list: 前 k 个分类结果,依 score 递减排序
└─ list: 前k个分类结果对应的score,依score递减排序 └─ list: 前 k 个分类结果对应的 score,依 score 递减排序
└─ float: 该图分类耗时,单位秒 └─ float: 该图分类耗时,单位秒
``` ```
...@@ -203,7 +203,7 @@ list: 返回结果 ...@@ -203,7 +203,7 @@ list: 返回结果
1. 停止服务 1. 停止服务
```hub serving stop --port/-p XXXX``` ```hub serving stop --port/-p XXXX```
2. 到相应的`module.py`和`params.py`等文件中根据实际需求修改代码。`module.py`修改后需要重新安装(`hub install hubserving/clas/`)并部署。在进行部署前,可通过`python hubserving/clas/module.py`测试已安装服务模块。 2. 到相应的 `module.py` 和 `params.py` 等文件中根据实际需求修改代码。`module.py` 修改后需要重新安装(`hub install hubserving/clas/`)并部署。在进行部署前,可通过 `python hubserving/clas/module.py` 测试已安装服务模块。
3. 卸载旧服务包 3. 卸载旧服务包
```hub uninstall clas_system``` ```hub uninstall clas_system```
...@@ -220,13 +220,13 @@ list: 返回结果 ...@@ -220,13 +220,13 @@ list: 返回结果
```python ```python
"inference_model_dir": "inference_model_dir":
``` ```
* 更改后处理时返回的`top-k`结果数量: * 更改后处理时返回的 `top-k` 结果数量:
```python ```python
'topk': 'topk':
``` ```
* 更改后处理时的lable与class id对应映射文件: * 更改后处理时的 lable 与 class id 对应映射文件:
```python ```python
'class_id_map_file': 'class_id_map_file':
``` ```
为了避免不必要的延时以及能够以 batch_size 进行预测,数据预处理逻辑(包括 `resize`、`crop` 等操作)均在客户端完成,因此需要在 `PaddleClas/deploy/hubserving/test_hubserving.py#L35-L52`中修改。 为了避免不必要的延时以及能够以 batch_size 进行预测,数据预处理逻辑(包括 `resize`、`crop` 等操作)均在客户端完成,因此需要在 `PaddleClas/deploy/hubserving/test_hubserving.py#L35-L52` 中修改。
# 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 端提供高效推理能力,并广泛整合跨平台硬件,为端侧部署及应用落地问题提供轻量化的部署方案。
如果希望直接测试速度,可以参考[Paddle-Lite移动端benchmark测试教程](../others/paddle_mobile_inference.md) 如果希望直接测试速度,可以参考[Paddle-Lite 移动端 benchmark 测试教程](../others/paddle_mobile_inference.md)
--- ---
## 目录 ## 目录
- [准备环境](#1) - [1. 准备环境](#1)
- [1.1 准备交叉编译环境](#1.1) - [1.1 准备交叉编译环境](#1.1)
- [1.2 准备预测库](#1.2) - [1.2 准备预测库](#1.2)
- [开始运行](#2) - [2. 开始运行](#2)
- [2.1模型优化](#2.1) - [2.1 模型优化](#2.1)
- [2.1.1 pip安装paddlelite并进行转换](#2.1.1) - [2.1.1 pip 安装 paddlelite 并进行转换](#2.1.1)
- [2.1.2 源码编译Paddle-Lite生成opt工具](#2.1.2) - [2.1.2 源码编译 Paddle-Lite 生成 opt 工具](#2.1.2)
- [2.1.3 转换示例](#2.1.3) - [2.1.3 转换示例](#2.1.3)
- [2.2与手机联调](#2.2) - [2.2 与手机联调](#2.2)
- [FAQ](#3) - [3. FAQ](#3)
<a name="1"></a> <a name="1"></a>
## 一、准备环境 ## 1. 准备环境
Paddle Lite 目前支持以下平台部署: Paddle Lite 目前支持以下平台部署:
* 电脑(编译Paddle Lite) * 电脑(编译 Paddle Lite)
* 安卓手机(armv7armv8) * 安卓手机(armv7armv8)
<a name="1.1"></a> <a name="1.1"></a>
### 1.1 准备交叉编译环境 ### 1.1 准备交叉编译环境
...@@ -54,13 +54,13 @@ Paddle Lite 目前支持以下平台部署: ...@@ -54,13 +54,13 @@ Paddle Lite 目前支持以下平台部署:
```shell ```shell
git clone https://github.com/PaddlePaddle/Paddle-Lite.git git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite cd Paddle-Lite
# 如果使用编译方式,建议使用develop分支编译预测库 # 如果使用编译方式,建议使用 develop 分支编译预测库
git checkout develop git checkout develop
./lite/tools/build_android.sh --arch=armv8 --with_cv=ON --with_extra=ON ./lite/tools/build_android.sh --arch=armv8 --with_cv=ON --with_extra=ON
``` ```
**注意**:编译Paddle-Lite获得预测库时,需要打开`--with_cv=ON --with_extra=ON`两个选项,`--arch`表示`arm`版本,这里指定为armv8,更多编译命令介绍请参考[Linux x86 环境下编译适用于 Android 的库](https://paddle-lite.readthedocs.io/zh/latest/source_compile/linux_x86_compile_android.html),关于其他平台的编译操作,具体请参考[PaddleLite](https://paddle-lite.readthedocs.io/zh/latest/)`源码编译`部分。 **注意**:编译 Paddle-Lite 获得预测库时,需要打开`--with_cv=ON --with_extra=ON` 两个选项,`--arch` 表示 `arm` 版本,这里指定为 armv8,更多编译命令介绍请参考[Linux x86 环境下编译适用于 Android 的库](https://paddle-lite.readthedocs.io/zh/latest/source_compile/linux_x86_compile_android.html),关于其他平台的编译操作,具体请参考[PaddleLite](https://paddle-lite.readthedocs.io/zh/latest/)`源码编译`部分。
直接下载预测库并解压后,可以得到`inference_lite_lib.android.armv8/`文件夹,通过编译Paddle-Lite得到的预测库位于`Paddle-Lite/build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/`文件夹下。 直接下载预测库并解压后,可以得到 `inference_lite_lib.android.armv8/`文件夹,通过编译 Paddle-Lite 得到的预测库位于 `Paddle-Lite/build.lite.android.armv8.gcc/inference_lite_lib.android.armv8/`文件夹下。
预测库的文件目录如下: 预测库的文件目录如下:
``` ```
...@@ -77,7 +77,7 @@ inference_lite_lib.android.armv8/ ...@@ -77,7 +77,7 @@ inference_lite_lib.android.armv8/
| `-- lib C++预测库 | `-- lib C++预测库
| |-- libpaddle_api_light_bundled.a C++静态库 | |-- libpaddle_api_light_bundled.a C++静态库
| `-- libpaddle_light_api_shared.so C++动态库 | `-- libpaddle_light_api_shared.so C++动态库
|-- java Java预测库 |-- java Java 预测库
| |-- jar | |-- jar
| | `-- PaddlePredictor.jar | | `-- PaddlePredictor.jar
| |-- so | |-- so
...@@ -89,7 +89,7 @@ inference_lite_lib.android.armv8/ ...@@ -89,7 +89,7 @@ inference_lite_lib.android.armv8/
``` ```
<a name="2"></a> <a name="2"></a>
## 二、开始运行 ## 2. 开始运行
<a name="2.1"></a> <a name="2.1"></a>
### 2.1 模型优化 ### 2.1 模型优化
...@@ -99,10 +99,10 @@ Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括 ...@@ -99,10 +99,10 @@ Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括
**注意**:如果已经准备好了 `.nb` 结尾的模型文件,可以跳过此步骤。 **注意**:如果已经准备好了 `.nb` 结尾的模型文件,可以跳过此步骤。
<a name="2.1.1"></a> <a name="2.1.1"></a>
#### 2.1.1 [建议]pip安装paddlelite并进行转换 #### 2.1.1 [建议]pip 安装 paddlelite 并进行转换
Python下安装 `paddlelite`,目前最高支持 `Python3.7` Python 下安装 `paddlelite`,目前最高支持 `Python3.7`
**注意**`paddlelite` whl包版本必须和预测库版本对应。 **注意**`paddlelite` whl 包版本必须和预测库版本对应。
```shell ```shell
pip install paddlelite==2.8 pip install paddlelite==2.8
...@@ -112,23 +112,23 @@ pip install paddlelite==2.8 ...@@ -112,23 +112,23 @@ pip install paddlelite==2.8
|选项|说明| |选项|说明|
|-|-| |-|-|
|--model_dir|待优化的PaddlePaddle模型(非combined形式)的路径| |--model_dir|待优化的 PaddlePaddle 模型(非 combined 形式)的路径|
|--model_file|待优化的PaddlePaddle模型(combined形式)的网络结构文件路径| |--model_file|待优化的 PaddlePaddle 模型(combined 形式)的网络结构文件路径|
|--param_file|待优化的PaddlePaddle模型(combined形式)的权重文件路径| |--param_file|待优化的 PaddlePaddle 模型(combined 形式)的权重文件路径|
|--optimize_out_type|输出模型类型,目前支持两种类型:protobuf和naive_buffer,其中naive_buffer是一种更轻量级的序列化/反序列化实现。若您需要在mobile端执行模型预测,请将此选项设置为naive_buffer。默认为protobuf| |--optimize_out_type|输出模型类型,目前支持两种类型:protobuf 和 naive_buffer,其中 naive_buffer 是一种更轻量级的序列化/反序列化实现。若您需要在 mobile 端执行模型预测,请将此选项设置为 naive_buffer。默认为 protobuf|
|--optimize_out|优化模型的输出路径| |--optimize_out|优化模型的输出路径|
|--valid_targets|指定模型可执行的backend,默认为arm。目前可支持x86、arm、opencl、npu、xpu,可以同时指定多个backend(以空格分隔),Model Optimize Tool将会自动选择最佳方式。如果需要支持华为NPU(Kirin 810/990 Soc搭载的达芬奇架构NPU),应当设置为npu, arm| |--valid_targets|指定模型可执行的 backend,默认为 arm。目前可支持 x86、arm、opencl、npu、xpu,可以同时指定多个 backend(以空格分隔),Model Optimize Tool 将会自动选择最佳方式。如果需要支持华为 NPU(Kirin 810/990 Soc 搭载的达芬奇架构 NPU),应当设置为 npu, arm|
|--record_tailoring_info|当使用 根据模型裁剪库文件 功能时,则设置该选项为true,以记录优化后模型含有的kernel和OP信息,默认为false| |--record_tailoring_info|当使用 根据模型裁剪库文件 功能时,则设置该选项为 true,以记录优化后模型含有的 kernel 和 OP 信息,默认为 false|
`--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> <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 源码获得,编译步骤如下:
```shell ```shell
# 如果准备环境时已经clone了Paddle-Lite,则不用重新clone Paddle-Lite # 如果准备环境时已经 clone 了 Paddle-Lite,则不用重新 clone Paddle-Lite
git clone https://github.com/PaddlePaddle/Paddle-Lite.git git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite cd Paddle-Lite
git checkout develop git checkout develop
...@@ -148,17 +148,17 @@ cd build.opt/lite/api/ ...@@ -148,17 +148,17 @@ cd build.opt/lite/api/
<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 优化模型的转换。
```shell ```shell
# 进入PaddleClas根目录 # 进入 PaddleClas 根目录
cd PaddleClas_root_path cd PaddleClas_root_path
# 下载并解压inference模型 # 下载并解压 inference 模型
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/MobileNetV3_large_x1_0_infer.tar wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/MobileNetV3_large_x1_0_infer.tar
tar -xf MobileNetV3_large_x1_0_infer.tar tar -xf MobileNetV3_large_x1_0_infer.tar
# 将inference模型转化为Paddle-Lite优化模型 # 将 inference 模型转化为 Paddle-Lite 优化模型
paddle_lite_opt --model_file=./MobileNetV3_large_x1_0_infer/inference.pdmodel --param_file=./MobileNetV3_large_x1_0_infer/inference.pdiparams --optimize_out=./MobileNetV3_large_x1_0 paddle_lite_opt --model_file=./MobileNetV3_large_x1_0_infer/inference.pdmodel --param_file=./MobileNetV3_large_x1_0_infer/inference.pdiparams --optimize_out=./MobileNetV3_large_x1_0
``` ```
...@@ -171,21 +171,21 @@ paddle_lite_opt --model_file=./MobileNetV3_large_x1_0_infer/inference.pdmodel -- ...@@ -171,21 +171,21 @@ paddle_lite_opt --model_file=./MobileNetV3_large_x1_0_infer/inference.pdmodel --
首先需要进行一些准备工作。 首先需要进行一些准备工作。
1. 准备一台 arm8 的安卓手机,如果编译的预测库和 opt 文件是 armv7,则需要 arm7 的手机,并修改 Makefile 中 `ARM_ABI = arm7` 1. 准备一台 arm8 的安卓手机,如果编译的预测库和 opt 文件是 armv7,则需要 arm7 的手机,并修改 Makefile 中 `ARM_ABI = arm7`
2. 电脑上安装 ADB 工具,用于调试。 ADB安装方式如下: 2. 电脑上安装 ADB 工具,用于调试。 ADB 安装方式如下:
* MAC电脑安装ADB: * MAC 电脑安装 ADB:
```shell ```shell
brew cask install android-platform-tools brew cask install android-platform-tools
``` ```
* Linux安装ADB * Linux 安装 ADB
```shell ```shell
sudo apt update sudo apt update
sudo apt install -y wget adb sudo apt install -y wget adb
``` ```
* Window安装ADB * Window 安装 ADB
win上安装需要去谷歌的安卓平台下载ADB软件包进行安装:[链接](https://developer.android.com/studio) win 上安装需要去谷歌的安卓平台下载 ADB 软件包进行安装:[链接](https://developer.android.com/studio)
3. 手机连接电脑后,开启手机 `USB调试` 选项,选择 `文件传输` 模式,在电脑终端中输入: 3. 手机连接电脑后,开启手机 `USB 调试` 选项,选择 `文件传输` 模式,在电脑终端中输入:
```shell ```shell
adb devices adb devices
...@@ -202,15 +202,15 @@ List of devices attached ...@@ -202,15 +202,15 @@ List of devices attached
cd PaddleClas_root_path cd PaddleClas_root_path
cd deploy/lite/ cd deploy/lite/
# 运行prepare.sh # 运行 prepare.sh
# prepare.sh 会将预测库文件、测试图像和使用的字典文件放置在预测库中的demo/cxx/clas文件夹下 # prepare.sh 会将预测库文件、测试图像和使用的字典文件放置在预测库中的 demo/cxx/clas 文件夹下
sh prepare.sh /{lite prediction library path}/inference_lite_lib.android.armv8 sh prepare.sh /{lite prediction library path}/inference_lite_lib.android.armv8
# 进入lite demo的工作目录 # 进入 lite demo 的工作目录
cd /{lite prediction library path}/inference_lite_lib.android.armv8/ cd /{lite prediction library path}/inference_lite_lib.android.armv8/
cd demo/cxx/clas/ cd demo/cxx/clas/
# 将C++预测动态库so文件复制到debug文件夹中 # 将 C++ 预测动态库 so 文件复制到 debug 文件夹中
cp ../../../cxx/lib/libpaddle_light_api_shared.so ./debug/ cp ../../../cxx/lib/libpaddle_light_api_shared.so ./debug/
``` ```
...@@ -240,28 +240,28 @@ demo/cxx/clas/ ...@@ -240,28 +240,28 @@ demo/cxx/clas/
```shell ```shell
clas_model_file ./MobileNetV3_large_x1_0.nb # 模型文件地址 clas_model_file ./MobileNetV3_large_x1_0.nb # 模型文件地址
label_path ./imagenet1k_label_list.txt # 类别映射文本文件 label_path ./imagenet1k_label_list.txt # 类别映射文本文件
resize_short_size 256 # resize之后的短边边长 resize_short_size 256 # resize 之后的短边边长
crop_size 224 # 裁剪后用于预测的边长 crop_size 224 # 裁剪后用于预测的边长
visualize 0 # 是否进行可视化,如果选择的话,会在当前文件夹下生成名为clas_result.png的图像文件。 visualize 0 # 是否进行可视化,如果选择的话,会在当前文件夹下生成名为 clas_result.png 的图像文件。
``` ```
5. 启动调试,上述步骤完成后就可以使用ADB将文件夹 `debug/` push 到手机上运行,步骤如下: 5. 启动调试,上述步骤完成后就可以使用 ADB 将文件夹 `debug/` push 到手机上运行,步骤如下:
```shell ```shell
# 执行编译,得到可执行文件clas_system # 执行编译,得到可执行文件 clas_system
make -j make -j
# 将编译得到的可执行文件移动到debug文件夹中 # 将编译得到的可执行文件移动到 debug 文件夹中
mv clas_system ./debug/ mv clas_system ./debug/
# 将上述debug文件夹push到手机上 # 将上述 debug 文件夹 push 到手机上
adb push debug /data/local/tmp/ adb push debug /data/local/tmp/
adb shell adb shell
cd /data/local/tmp/debug cd /data/local/tmp/debug
export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH
# clas_system可执行文件的使用方式为: # clas_system 可执行文件的使用方式为:
# ./clas_system 配置文件路径 测试图像路径 # ./clas_system 配置文件路径 测试图像路径
./clas_system ./config.txt ./tabby_cat.jpg ./clas_system ./config.txt ./tabby_cat.jpg
``` ```
...@@ -275,7 +275,7 @@ export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH ...@@ -275,7 +275,7 @@ export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH
</div> </div>
<a name="3"></a> <a name="3"></a>
## 三、FAQ ## 3. FAQ
Q1:如果想更换模型怎么办,需要重新按照流程走一遍吗? Q1:如果想更换模型怎么办,需要重新按照流程走一遍吗?
A1:如果已经走通了上述步骤,更换模型只需要替换 `.nb` 模型文件即可,同时要注意修改下配置文件中的 `.nb` 文件路径以及类别映射文件(如有必要)。 A1:如果已经走通了上述步骤,更换模型只需要替换 `.nb` 模型文件即可,同时要注意修改下配置文件中的 `.nb` 文件路径以及类别映射文件(如有必要)。
......
...@@ -46,7 +46,6 @@ pip3 install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUDA11.2 + Tens ...@@ -46,7 +46,6 @@ pip3 install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUDA11.2 + Tens
```shell ```shell
pip install paddle-serving-server pip install paddle-serving-server
``` ```
<a name="3"></a>
## 3. 图像分类服务部署 ## 3. 图像分类服务部署
<a name="3.1"></a> <a name="3.1"></a>
...@@ -81,7 +80,7 @@ ResNet50_vd 推理模型转换完成后,会在当前文件夹多出 `ResNet50_ ...@@ -81,7 +80,7 @@ ResNet50_vd 推理模型转换完成后,会在当前文件夹多出 `ResNet50_
|- serving_client_conf.prototxt |- serving_client_conf.prototxt
|- serving_client_conf.stream.prototxt |- serving_client_conf.stream.prototxt
``` ```
得到模型文件之后,需要修改 `ResNet50_vd_server` 下文件 `serving_server_conf.prototxt` 中的 alias 名字:`fetch_var` 中的 `alias_name` 改为 `prediction` 得到模型文件之后,需要修改 serving_server_conf.prototxt 中的 alias 名字: 将 `feed_var` 中的 `alias_name` 改为 `image`, `fetch_var` 中的 `alias_name` 改为 `prediction`
**备注**: Serving 为了兼容不同模型的部署,提供了输入输出重命名的功能。这样,不同的模型在推理部署时,只需要修改配置文件的 alias_name 即可,无需修改代码即可完成推理部署。 **备注**: Serving 为了兼容不同模型的部署,提供了输入输出重命名的功能。这样,不同的模型在推理部署时,只需要修改配置文件的 alias_name 即可,无需修改代码即可完成推理部署。
修改后的 serving_server_conf.prototxt 如下所示: 修改后的 serving_server_conf.prototxt 如下所示:
...@@ -233,4 +232,4 @@ unset https_proxy ...@@ -233,4 +232,4 @@ unset https_proxy
unset http_proxy unset http_proxy
``` ```
更多的服务部署类型,如 `RPC 预测服务` 等,可以参考 Serving 的[github 官网](https://github.com/PaddlePaddle/Serving/tree/v0.7.0/examples) 更多的服务部署类型,如 `RPC 预测服务` 等,可以参考 Serving 的[github 官网](https://github.com/PaddlePaddle/Serving/tree/develop/python/examples/imagenet)
...@@ -2,16 +2,16 @@ ...@@ -2,16 +2,16 @@
--- ---
首先请参考文档[安装PaddlePaddle](../installation/install_paddle.md)和文档[安装PaddleClas](../installation/install_paddleclas.md)配置运行环境。 首先请参考文档[安装 PaddlePaddle](../installation/install_paddle.md)和文档[安装 PaddleClas](../installation/install_paddleclas.md)配置运行环境。
## 目录 ## 目录
- [图像分类推理](#图像分类推理) - [1. 图像分类推理](#1)
- [主体检测模型推理](#主体检测模型推理) - [2. 主体检测模型推理](#2)
- [特征提取模型推理](#特征提取模型推理) - [3. 特征提取模型推理](#3)
- [主体检测、特征提取和向量检索串联](#主体检测、特征提取和向量检索串联) - [4. 主体检测、特征提取和向量检索串联](#4)
<a name="图像分类推理"></a> <a name="1"></a>
## 1. 图像分类推理 ## 1. 图像分类推理
首先请参考文档[模型导出](./export_model.md)准备 inference 模型,然后进入 PaddleClas 的 `deploy` 目录下: 首先请参考文档[模型导出](./export_model.md)准备 inference 模型,然后进入 PaddleClas 的 `deploy` 目录下:
...@@ -32,16 +32,16 @@ python python/predict_cls.py -c configs/inference_cls.yaml ...@@ -32,16 +32,16 @@ python python/predict_cls.py -c configs/inference_cls.yaml
* `Global.use_tensorrt`:是否使用 TesorRT 预测引擎,默认为 `False` * `Global.use_tensorrt`:是否使用 TesorRT 预测引擎,默认为 `False`
* `Global.use_gpu`:是否使用 GPU 预测,默认为 `True` * `Global.use_gpu`:是否使用 GPU 预测,默认为 `True`
* `Global.enable_mkldnn`:是否启用 `MKL-DNN` 加速库,默认为 `False`。注意 `enable_mkldnn``use_gpu` 同时为 `True` 时,将忽略 `enable_mkldnn`,而使用 GPU 预测; * `Global.enable_mkldnn`:是否启用 `MKL-DNN` 加速库,默认为 `False`。注意 `enable_mkldnn``use_gpu` 同时为 `True` 时,将忽略 `enable_mkldnn`,而使用 GPU 预测;
* `Global.use_fp16`:是否启用 `FP16` ,默认为 `False` * `Global.use_fp16`:是否启用 `FP16`,默认为 `False`
* `PreProcess`:用于数据预处理配置; * `PreProcess`:用于数据预处理配置;
* `PostProcess`:由于后处理配置; * `PostProcess`:由于后处理配置;
* `PostProcess.Topk.class_id_map_file`:数据集 label 的映射文件,默认为 `./utils/imagenet1k_label_list.txt`,该文件为 PaddleClas 所使用的 ImageNet 数据集 label 映射文件。 * `PostProcess.Topk.class_id_map_file`:数据集 label 的映射文件,默认为 `./utils/imagenet1k_label_list.txt`,该文件为 PaddleClas 所使用的 ImageNet 数据集 label 映射文件。
**注意**: **注意**:
* 如果使用 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> <a name="2"></a>
## 2. 主体检测模型推理 ## 2. 主体检测模型推理
进入 PaddleClas 的 `deploy` 目录下: 进入 PaddleClas 的 `deploy` 目录下:
...@@ -70,7 +70,7 @@ python python/predict_det.py -c configs/inference_det.yaml ...@@ -70,7 +70,7 @@ python python/predict_det.py -c configs/inference_det.yaml
* `Global.use_gpu`: 是否使用 GPU 预测,默认为 `True` * `Global.use_gpu`: 是否使用 GPU 预测,默认为 `True`
<a name="特征提取模型推理"></a> <a name="3"></a>
## 3. 特征提取模型推理 ## 3. 特征提取模型推理
下面以商品特征提取为例,介绍特征提取模型推理。首先进入 PaddleClas 的 `deploy` 目录下: 下面以商品特征提取为例,介绍特征提取模型推理。首先进入 PaddleClas 的 `deploy` 目录下:
...@@ -90,7 +90,7 @@ tar -xf ./models/product_ResNet50_vd_aliproduct_v1.0_infer.tar -C ./models/ ...@@ -90,7 +90,7 @@ tar -xf ./models/product_ResNet50_vd_aliproduct_v1.0_infer.tar -C ./models/
上述预测命令可以得到一个 512 维的特征向量,直接输出在在命令行中。 上述预测命令可以得到一个 512 维的特征向量,直接输出在在命令行中。
<a name="主体检测、特征提取和向量检索串联"></a> <a name="4"></a>
## 4. 主体检测、特征提取和向量检索串联 ## 4. 主体检测、特征提取和向量检索串联
主体检测、特征提取和向量检索的串联预测,可以参考图像识别[快速体验](../quick_start/quick_start_recognition.md) 主体检测、特征提取和向量检索的串联预测,可以参考图像识别[快速体验](../quick_start/quick_start_recognition.md)
...@@ -6,23 +6,24 @@ PaddleClas 支持 Python Whl 包方式进行预测,目前 Whl 包方式仅支 ...@@ -6,23 +6,24 @@ PaddleClas 支持 Python Whl 包方式进行预测,目前 Whl 包方式仅支
## 目录 ## 目录
- [安装paddleclas](#1) - [1. 安装 paddleclas](#1)
- [快速开始](#2) - [2. 快速开始](#2)
- [参数解释](#3) - [3. 参数解释](#3)
- [使用示例](#4) - [4. 使用示例](#4)
- [4.1 查看帮助信息](#4.1) - [4.1 查看帮助信息](#4.1)
- [4.2 使用PaddleClas提供的预训练模型进行预测](#4.2) - [4.2 使用 PaddleClas 提供的预训练模型进行预测](#4.2)
- [4.3 使用本地模型文件预测](#4.3) - [4.3 使用本地模型文件预测](#4.3)
- [4.4 批量预测](#4.4) - [4.4 批量预测](#4.4)
- [4.5 对网络图片进行预测](#4.5) - [4.5 对网络图片进行预测](#4.5)
- [4.6 对`NumPy.ndarray`格式数据进行预测](#4.6) - [4.6 对 `NumPy.ndarray` 格式数据进行预测](#4.6)
- [4.7 保存预测结果](#4.7) - [4.7 保存预测结果](#4.7)
- [4.8 指定label name](#4.8) - [4.8 指定 label name](#4.8)
<a name="1"></a> <a name="1"></a>
## 一、安装paddleclas ## 1. 安装 paddleclas
* pip安装 * pip 安装
```bash ```bash
pip3 install paddleclas==2.2.1 pip3 install paddleclas==2.2.1
...@@ -36,15 +37,15 @@ pip3 install dist/* ...@@ -36,15 +37,15 @@ pip3 install dist/*
``` ```
<a name="2"></a> <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">
<img src="../../images/inference_deployment/whl_demo.jpg" width = "400" /> <img src="../../images/inference_deployment/whl_demo.jpg" width = "400" />
</div> </div>
*Python代码中使用 * Python 代码中使用
```python ```python
from paddleclas import PaddleClas from paddleclas import PaddleClas
clas = PaddleClas(model_name='ResNet50') clas = PaddleClas(model_name='ResNet50')
...@@ -72,24 +73,24 @@ Predict complete! ...@@ -72,24 +73,24 @@ Predict complete!
``` ```
<a name="3"></a> <a name="3"></a>
## 三、参数解释 ## 3. 参数解释
以下参数可在命令行方式使用中通过参数指定,或在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` 两个模型文件。
* infer_imgs(str): 待预测图片文件路径,或包含图片文件的目录,或网络图片的URL。 * infer_imgs(str): 待预测图片文件路径,或包含图片文件的目录,或网络图片的 URL。
* use_gpu(bool): 是否使用GPU,默认为 `True` * use_gpu(bool): 是否使用 GPU,默认为 `True`
* gpu_mem(int): 使用的GPU显存大小,当 `use_gpu``True` 时有效,默认为8000。 * gpu_mem(int): 使用的 GPU 显存大小,当 `use_gpu``True` 时有效,默认为 8000。
* use_tensorrt(bool): 是否开启TensorRT预测,可提升GPU预测性能,需要使用带TensorRT的预测库,默认为 `False` * use_tensorrt(bool): 是否开启 TensorRT 预测,可提升 GPU 预测性能,需要使用带 TensorRT 的预测库,默认为 `False`
* enable_mkldnn(bool): 是否开启MKLDNN,当 `use_gpu``False` 时有效,默认 `False` * enable_mkldnn(bool): 是否开启 MKLDNN,当 `use_gpu``False` 时有效,默认 `False`
* cpu_num_threads(int): cpu预测时的线程数,当 `use_gpu``False``enable_mkldnn``True` 时有效,默认值为 `10` * cpu_num_threads(int): CPU 预测时的线程数,当 `use_gpu``False``enable_mkldnn``True` 时有效,默认值为 `10`
* batch_size(int): 预测时每个batch的样本数量,默认为 `1` * batch_size(int): 预测时每个 batch 的样本数量,默认为 `1`
* resize_short(int): 按图像较短边进行等比例缩放,默认为 `256` * resize_short(int): 按图像较短边进行等比例缩放,默认为 `256`
* crop_size(int): 将图像裁剪到指定大小,默认为 `224` * crop_size(int): 将图像裁剪到指定大小,默认为 `224`
* topk(int): 打印(返回)预测结果的前 `topk` 个类别和对应的分类概率,默认为 `5` * topk(int): 打印(返回)预测结果的前 `topk` 个类别和对应的分类概率,默认为 `5`
* class_id_map_file(str): `class id``label` 的映射关系文件。默认使用 `ImageNet1K` 数据集的映射关系。 * class_id_map_file(str): `class id``label` 的映射关系文件。默认使用 `ImageNet1K` 数据集的映射关系。
* save_dir(str): 将预测结果作为预标注数据保存的路径,默认为 `None`,即不保存。 * save_dir(str): 将预测结果作为预标注数据保存的路径,默认为 `None`,即不保存。
**注意**: 如果使用`Transformer`系列模型,如`DeiT_***_384`, `ViT_***_384`等,请注意模型的输入数据尺寸,需要设置参数`resize_short=384`, `crop_size=384`,如下所示。 **注意**: 如果使用 `Transformer` 系列模型,如 `DeiT_***_384`, `ViT_***_384` 等,请注意模型的输入数据尺寸,需要设置参数 `resize_short=384`, `crop_size=384`,如下所示。
* 命令行中 * 命令行中
```bash ```bash
...@@ -97,17 +98,17 @@ from paddleclas import PaddleClas, get_default_confg ...@@ -97,17 +98,17 @@ from paddleclas import PaddleClas, get_default_confg
paddleclas --model_name=ViT_base_patch16_384 --infer_imgs='docs/images/inference_deployment/whl_demo.jpg' --resize_short=384 --crop_size=384 paddleclas --model_name=ViT_base_patch16_384 --infer_imgs='docs/images/inference_deployment/whl_demo.jpg' --resize_short=384 --crop_size=384
``` ```
* Python代码中 * Python 代码中
```python ```python
from paddleclas import PaddleClas 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> <a name="4"></a>
## 四、使用示例 ## 4. 使用示例
PaddleClas提供两种使用方式: PaddleClas 提供两种使用方式:
1. Python代码中使用; 1. Python 代码中使用;
2. 命令行中使用。 2. 命令行中使用。
<a name="4.1"></a> <a name="4.1"></a>
...@@ -119,8 +120,8 @@ paddleclas -h ...@@ -119,8 +120,8 @@ paddleclas -h
``` ```
<a name="4.2"></a> <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/`下。
* Python * Python
```python ```python
...@@ -138,7 +139,7 @@ paddleclas --model_name='ResNet50' --infer_imgs='docs/images/inference_deploymen ...@@ -138,7 +139,7 @@ paddleclas --model_name='ResNet50' --infer_imgs='docs/images/inference_deploymen
<a name="4.3"></a> <a name="4.3"></a>
### 4.3 使用本地模型文件预测 ### 4.3 使用本地模型文件预测
可以使用本地的模型文件进行预测,通过参数`inference_model_dir`指定模型文件目录即可。需要注意,模型文件目录下必须包含`inference.pdmodel``inference.pdiparams`两个文件。 可以使用本地的模型文件进行预测,通过参数 `inference_model_dir` 指定模型文件目录即可。需要注意,模型文件目录下必须包含 `inference.pdmodel``inference.pdiparams` 两个文件。
* Python * Python
```python ```python
...@@ -156,7 +157,7 @@ paddleclas --inference_model_dir='./inference/' --infer_imgs='docs/images/infere ...@@ -156,7 +157,7 @@ paddleclas --inference_model_dir='./inference/' --infer_imgs='docs/images/infere
<a name="4.4"></a> <a name="4.4"></a>
### 4.4 批量预测 ### 4.4 批量预测
当参数 `infer_imgs` 为包含图片文件的目录时,可以对图片进行批量预测,只需通过参数 `batch_size` 指定batch大小。 当参数 `infer_imgs` 为包含图片文件的目录时,可以对图片进行批量预测,只需通过参数 `batch_size` 指定 batch 大小。
* Python * Python
```python ```python
...@@ -175,7 +176,7 @@ paddleclas --model_name='ResNet50' --infer_imgs='docs/images/' --batch_size 2 ...@@ -175,7 +176,7 @@ paddleclas --model_name='ResNet50' --infer_imgs='docs/images/' --batch_size 2
<a name="4.5"></a> <a name="4.5"></a>
### 4.5 对网络图片进行预测 ### 4.5 对网络图片进行预测
可以对网络图片进行预测,只需通过参数`infer_imgs`指定图片`url`。此时图片会下载并保存在`~/.paddleclas/images/`目录下。 可以对网络图片进行预测,只需通过参数 `infer_imgs` 指定图片 `url`。此时图片会下载并保存在`~/.paddleclas/images/`目录下。
* Python * Python
```python ```python
...@@ -192,8 +193,8 @@ paddleclas --model_name='ResNet50' --infer_imgs='https://raw.githubusercontent.c ...@@ -192,8 +193,8 @@ paddleclas --model_name='ResNet50' --infer_imgs='https://raw.githubusercontent.c
``` ```
<a name="4.6"></a> <a name="4.6"></a>
### 4.6 对`NumPy.ndarray`格式数据进行预测 ### 4.6 对 `NumPy.ndarray` 格式数据进行预测
Python中,可以对`Numpy.ndarray`格式的图像数据进行预测,只需通过参数`infer_imgs`指定即可。注意该图像数据必须为三通道图像数据。 Python 中,可以对 `Numpy.ndarray` 格式的图像数据进行预测,只需通过参数 `infer_imgs` 指定即可。注意该图像数据必须为三通道图像数据。
* python * python
```python ```python
...@@ -207,7 +208,7 @@ print(next(result)) ...@@ -207,7 +208,7 @@ print(next(result))
<a name="4.7"></a> <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` 目录下对应类别的文件夹中。
* python * python
```python ```python
...@@ -224,10 +225,10 @@ paddleclas --model_name='ResNet50' --infer_imgs='docs/images/whl/' --save_dir='. ...@@ -224,10 +225,10 @@ paddleclas --model_name='ResNet50' --infer_imgs='docs/images/whl/' --save_dir='.
``` ```
<a name="4.8"></a> <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`)。
`class_id_map_file`文件内容格式应为: `class_id_map_file` 文件内容格式应为:
``` ```
class_id<space>class_name<\n> class_id<space>class_name<\n>
......
# 安装 PaddlePaddle # 安装 PaddlePaddle
--- ---
## 目录
目前, **PaddleClas** 要求 **PaddlePaddle** 版本 `>=2.0`。建议使用我们提供的 Docker 运行 PaddleClas,有关 Docker、nvidia-docker 的相关使用教程可以参考[链接](https://www.runoob.com/Docker/Docker-tutorial.html)。如果不使用 Docker,可以直接跳过 [2.(建议)使用 Docker 环境](#2) 部分内容,从 [3. 通过 pip 安装 PaddlePaddle](#3) 部分开始。 - [1. 环境要求](#1)
- [2.(建议)使用 Docker 环境](#2)
- [3. 通过 pip 安装 PaddlePaddle](#3)
- [4. 验证安装](#4)
目前,**PaddleClas** 要求 **PaddlePaddle** 版本 `>=2.0`。建议使用我们提供的 Docker 运行 PaddleClas,有关 Docker、nvidia-docker 的相关使用教程可以参考[链接](https://www.runoob.com/Docker/Docker-tutorial.html)。如果不使用 Docker,可以直接跳过 [2.(建议)使用 Docker 环境](#2) 部分内容,从 [3. 通过 pip 安装 PaddlePaddle](#3) 部分开始。
<a name='1'></a>
## 1. 环境要求 ## 1. 环境要求
**版本要求** **版本要求**
- python 3.x - python 3.x
- CUDA >= 10.1 (如果使用 `paddlepaddle-gpu`) - CUDA >= 10.1(如果使用 `paddlepaddle-gpu`
- cuDNN >= 7.6.4 (如果使用 `paddlepaddle-gpu`) - cuDNN >= 7.6.4(如果使用 `paddlepaddle-gpu`
- nccl >= 2.1.2 (如果使用分布式训练/评估) - nccl >= 2.1.2(如果使用分布式训练/评估)
- gcc >= 8.2 - gcc >= 8.2
**建议** **建议**
...@@ -33,17 +41,17 @@ cd /home/Projects ...@@ -33,17 +41,17 @@ cd /home/Projects
下述命令会创建一个名为 ppcls 的 Docker 容器,并将当前工作目录映射到容器内的 `/paddle` 目录。 下述命令会创建一个名为 ppcls 的 Docker 容器,并将当前工作目录映射到容器内的 `/paddle` 目录。
```shell ```shell
# 对于GPU用户 # 对于 GPU 用户
sudo nvidia-docker run --name ppcls -v $PWD:/paddle --shm-size=8G --network=host -it paddlepaddle/paddle:2.1.0-gpu-cuda10.2-cudnn7 /bin/bash sudo nvidia-docker run --name ppcls -v $PWD:/paddle --shm-size=8G --network=host -it paddlepaddle/paddle:2.1.0-gpu-cuda10.2-cudnn7 /bin/bash
# 对于CPU用户 # 对于 CPU 用户
sudo docker run --name ppcls -v $PWD:/paddle --shm-size=8G --network=host -it paddlepaddle/paddle:2.1.0 /bin/bash sudo docker run --name ppcls -v $PWD:/paddle --shm-size=8G --network=host -it paddlepaddle/paddle:2.1.0 /bin/bash
``` ```
**注意** **注意**
* 首次使用该镜像时,下述命令会自动下载该镜像文件,下载需要一定的时间,请耐心等待; * 首次使用该镜像时,下述命令会自动下载该镜像文件,下载需要一定的时间,请耐心等待;
* 上述命令会创建一个名为 ppcls 的 Docker 容器,之后再次使用该容器时无需再次运行该命令; * 上述命令会创建一个名为 ppcls 的 Docker 容器,之后再次使用该容器时无需再次运行该命令;
* 参数 `--shm-size=8G` 将设置容器的共享内存为8G,如机器环境允许,建议将该参数设置较大,如 `64G` * 参数 `--shm-size=8G` 将设置容器的共享内存为 8 G,如机器环境允许,建议将该参数设置较大,如 `64G`
* 您也可以访问 [DockerHub](https://hub.Docker.com/r/paddlepaddle/paddle/tags/) 获取与您机器适配的镜像; * 您也可以访问 [DockerHub](https://hub.Docker.com/r/paddlepaddle/paddle/tags/) 获取与您机器适配的镜像;
* 退出/进入 docker 容器: * 退出/进入 docker 容器:
* 在进入 Docker 容器后,可使用组合键 `Ctrl + P + Q` 退出当前容器,同时不关闭该容器; * 在进入 Docker 容器后,可使用组合键 `Ctrl + P + Q` 退出当前容器,同时不关闭该容器;
...@@ -60,10 +68,10 @@ sudo docker run --name ppcls -v $PWD:/paddle --shm-size=8G --network=host -it pa ...@@ -60,10 +68,10 @@ sudo docker run --name ppcls -v $PWD:/paddle --shm-size=8G --network=host -it pa
可运行下面的命令,通过 pip 安装最新版本 PaddlePaddle: 可运行下面的命令,通过 pip 安装最新版本 PaddlePaddle:
```bash ```bash
# 对于CPU用户 # 对于 CPU 用户
pip3 install paddlepaddle --upgrade -i https://mirror.baidu.com/pypi/simple pip3 install paddlepaddle --upgrade -i https://mirror.baidu.com/pypi/simple
# 对于GPU用户 # 对于 GPU 用户
pip3 install paddlepaddle-gpu --upgrade -i https://mirror.baidu.com/pypi/simple pip3 install paddlepaddle-gpu --upgrade -i https://mirror.baidu.com/pypi/simple
``` ```
...@@ -71,6 +79,7 @@ pip3 install paddlepaddle-gpu --upgrade -i https://mirror.baidu.com/pypi/simple ...@@ -71,6 +79,7 @@ pip3 install paddlepaddle-gpu --upgrade -i https://mirror.baidu.com/pypi/simple
* 如果先安装了 CPU 版本的 PaddlePaddle,之后想切换到 GPU 版本,那么需要使用 pip 先卸载 CPU 版本的 PaddlePaddle,再安装 GPU 版本的 PaddlePaddle,否则容易导致 PaddlePaddle 冲突。 * 如果先安装了 CPU 版本的 PaddlePaddle,之后想切换到 GPU 版本,那么需要使用 pip 先卸载 CPU 版本的 PaddlePaddle,再安装 GPU 版本的 PaddlePaddle,否则容易导致 PaddlePaddle 冲突。
* 您也可以从源码编译安装 PaddlePaddle,请参照 [PaddlePaddle 安装文档](http://www.paddlepaddle.org.cn/install/quick) 中的说明进行操作。 * 您也可以从源码编译安装 PaddlePaddle,请参照 [PaddlePaddle 安装文档](http://www.paddlepaddle.org.cn/install/quick) 中的说明进行操作。
<a name='4'></a>
## 4. 验证安装 ## 4. 验证安装
使用以下命令可以验证 PaddlePaddle 是否安装成功。 使用以下命令可以验证 PaddlePaddle 是否安装成功。
......
# 安装 PaddleClas # 安装 PaddleClas
--- ---
## 目录
* [1. 克隆 PaddleClas](#1)
* [2. 安装 Python 依赖库](#2)
<a name='1'></a>
## 1. 克隆 PaddleClas ## 1. 克隆 PaddleClas
...@@ -15,6 +21,7 @@ git clone https://github.com/PaddlePaddle/PaddleClas.git -b release/2.3 ...@@ -15,6 +21,7 @@ git clone https://github.com/PaddlePaddle/PaddleClas.git -b release/2.3
```shell ```shell
git clone https://gitee.com/paddlepaddle/PaddleClas.git -b release/2.3 git clone https://gitee.com/paddlepaddle/PaddleClas.git -b release/2.3
``` ```
<a name='2'></a>
## 2. 安装 Python 依赖库 ## 2. 安装 Python 依赖库
......
...@@ -4,13 +4,13 @@ ...@@ -4,13 +4,13 @@
- 实用的图像识别系统:集成了目标检测、特征学习、图像检索等模块,广泛适用于各类图像识别任务。 - 实用的图像识别系统:集成了目标检测、特征学习、图像检索等模块,广泛适用于各类图像识别任务。
提供商品识别、车辆识别、 logo 识别和动漫人物识别等4个场景应用示例。 提供商品识别、车辆识别、 logo 识别和动漫人物识别等 4 个场景应用示例。
- 丰富的预训练模型库:提供了 36 个系列共 175 个 ImageNet 预训练模型,其中 7 个精选系列模型支持结构快速修改。 - 丰富的预训练模型库:提供了 36 个系列共 175 个 ImageNet 预训练模型,其中 7 个精选系列模型支持结构快速修改。
- 全面易用的特征学习组件:集成 arcmargin , triplet loss 等 12 度量学习方法,通过配置文件即可随意组合切换。 - 全面易用的特征学习组件:集成 arcmargin, triplet loss 等 12 度量学习方法,通过配置文件即可随意组合切换。
- SSLD 知识蒸馏: 14 个分类预训练模型,精度普遍提升 3% 以上;其中 ResNet50_vd 模型在 ImageNet-1k 数据集上的 Top-1 精度达到了 84.0%Res2Net200_vd 预训练模型 Top-1 精度高达 85.1% 。 - SSLD 知识蒸馏: 14 个分类预训练模型,精度普遍提升 3% 以上;其中 ResNet50_vd 模型在 ImageNet-1k 数据集上的 Top-1 精度达到了 84.0%Res2Net200_vd 预训练模型 Top-1 精度高达 85.1% 。
- 数据增广:支持 AutoAugment 、 Cutout 、 Cutmix 等 8 种数据增广算法详细介绍、代码复现和在统一实验环境下的效果评估。 - 数据增广:支持 AutoAugment 、 Cutout 、 Cutmix 等 8 种数据增广算法详细介绍、代码复现和在统一实验环境下的效果评估。
...@@ -19,4 +19,4 @@ ...@@ -19,4 +19,4 @@
<img src="../../images/recognition.gif" width = "400" /> <img src="../../images/recognition.gif" width = "400" />
</div> </div>
更多关于图像识别快速体验、算法详解、模型训练评估与预测部署方法,请参考[首页README文档教程](../../../README_ch.md) 更多关于图像识别快速体验、算法详解、模型训练评估与预测部署方法,请参考[首页 README 文档教程](../../../README_ch.md)
## 识别效果展示 ## 识别效果展示
- 商品识别 - 商品识别
<div align="center"> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277277-7b29f596-35f6-4f00-8d2b-0ef0be57a090.jpg" width = "400" /> </div>
<img src="../../images/recognition/more_demo_images/output_product/channelhandle_5.jpg" width = "400" /> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277291-f7d2b2a1-5790-4f5b-a0e6-f5c52d04a69a.jpg" width = "400" /> </div>
</div> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277300-8ce0d5ce-e0ca-46ea-bb9a-74df0df66ae3.jpg" width = "400" /> </div>
<div align="center"> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277308-14a097bd-2bcd-41ce-a9e6-5e9cd0bd8b08.jpg" width = "400" /> </div>
<img src="../../images/recognition/more_demo_images/output_product/cliniqueblush_1.jpg" width = "400" /> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140277311-208ae574-a708-46e2-a41e-c639322913b1.jpg" width = "400" /> </div>
</div>
<div align="center"> [更多效果图](../../images/recognition/more_demo_images/product.md)
<img src="../../images/recognition/more_demo_images/output_product/daoxiangcunjinzhubing_10.jpg" width = "400" />
</div>
<div align="center">
<img src="../../images/recognition/more_demo_images/output_product/gannidress_10.jpg" width = "400" />
</div>
<div align="center">
<img src="../../images/recognition/more_demo_images/output_product/gbyingerche_15.jpg" width = "400" />
</div>
<div align="center">
<img src="../../images/recognition/more_demo_images/output_product/lafiolewine_03.jpg" width = "400" />
</div>
<div align="center">
<img src="../../images/recognition/more_demo_images/output_product/taochunqiu_8.jpg" width = "400" />
</div>
<div align="center">
<img src="../../images/recognition/more_demo_images/output_product/weiduomeinaiyougege_10.jpg" width = "400" />
</div>
- 动漫人物识别 - 动漫人物识别
<div align="center">
<img src="../../images/recognition/more_demo_images/output_cartoon/labixiaoxin-005.jpeg" width = "400" /> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069108-ad54ae1d-610d-4cfa-9cd6-8ee8d280d61d.jpeg" width = "400" /> </div>
</div> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069100-7539d292-1bd8-4655-8a6d-d1f2238bd618.jpeg" width = "400" /> </div>
<div align="center"> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140069080-a821e0b7-8a10-4946-bf05-ff093cc16064.jpeg" width = "400" /> </div>
<img src="../../images/recognition/more_demo_images/output_cartoon/liuchuanfeng-010.jpeg" width = "400" />
</div> [更多效果图](../../images/recognition/more_demo_images/cartoon.md)
<div align="center">
<img src="../../images/recognition/more_demo_images/output_cartoon/zhangchulan-007.jpeg" width = "400" />
</div>
- logo识别 - logo识别
<div align="center">
<img src="../../images/recognition/more_demo_images/output_logo/cctv_4.jpg" width = "400" /> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096687-5b562e2d-0653-4be6-861d-1936a4440df2.jpeg" width = "400" /> </div>
</div> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096701-4a4b2bd9-85f2-4d55-be4b-be6ab5e0fb81.jpeg" width = "400" /> </div>
<div align="center"> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096706-ef4ad024-7284-4cb3-975a-779fd06b96f5.jpeg" width = "400" /> </div>
<img src="../../images/recognition/more_demo_images/output_logo/mangguo_8.jpeg" width = "400" /> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096713-48e629aa-c637-4603-b005-18570fa94d6d.jpeg" width = "400" /> </div>
</div>
<div align="center"> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096752-1f98c937-5d83-4c29-b495-01971b5fb258.jpeg" width = "400" /> </div>
<img src="../../images/recognition/more_demo_images/output_logo/zhongshiyou-007.jpg" width = "400" /> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140096767-e8f701eb-d0e8-4304-b031-e2bff8c199f3.jpeg" width = "400" /> </div>
</div>
[更多效果图](../../images/recognition/more_demo_images/logo.md)
- 车辆识别 - 车辆识别
<div align="center">
<img src="../../images/recognition/more_demo_images/output_vehicle/audia5-115.jpeg" width = "400" /> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243899-c60f0a51-db9b-438a-9f2d-0d2893c200bb.jpeg" width = "400" /> </div>
</div> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243905-7eeb938d-d88f-4540-a667-06e08dcf1f55.jpeg" width = "400" /> </div>
<div align="center"> <div align="center"> <img src="https://user-images.githubusercontent.com/12560511/140243911-735a6ec0-a624-4965-b3cd-2b9f52fa8d65.jpeg" width = "400" /> </div>
<img src="../../images/recognition/more_demo_images/output_vehicle/bentian-yage-101.jpeg" width = "400" />
</div> [更多效果图](../../images/recognition/more_demo_images/vehicle.md)
<div align="center">
<img src="../../images/recognition/more_demo_images/output_vehicle/bmw-m340-107.jpeg" width = "400" />
</div>
[更多效果图](../../images/recognition/more_demo_images)
# DLA系列 # DLA 系列
----
## 目录
* [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
## 概述 <a name='1'></a>
DLA (Deep Layer Aggregation)。 视觉识别需要丰富的表示形式,其范围从低到高,范围从小到大,分辨率从精细到粗糙。即使卷积网络中的要素深度很深,仅靠隔离层还是不够的:将这些表示法进行复合和聚合可改善对内容和位置的推断。尽管已合并了残差连接以组合各层,但是这些连接本身是“浅”的,并且只能通过简单的一步操作来融合。作者通过更深层的聚合来增强标准体系结构,以更好地融合各层的信息。Deep Layer Aggregation 结构迭代地和分层地合并了特征层次结构,以使网络具有更高的准确性和更少的参数。跨体系结构和任务的实验表明,与现有的分支和合并方案相比,Deep Layer Aggregation 可提高识别和分辨率。[论文地址](https://arxiv.org/abs/1707.06484) ## 1. 概述
DLA(Deep Layer Aggregation)。 视觉识别需要丰富的表示形式,其范围从低到高,范围从小到大,分辨率从精细到粗糙。即使卷积网络中的要素深度很深,仅靠隔离层还是不够的:将这些表示法进行复合和聚合可改善对内容和位置的推断。尽管已合并了残差连接以组合各层,但是这些连接本身是“浅”的,并且只能通过简单的一步操作来融合。作者通过更深层的聚合来增强标准体系结构,以更好地融合各层的信息。Deep Layer Aggregation 结构迭代地和分层地合并了特征层次结构,以使网络具有更高的准确性和更少的参数。跨体系结构和任务的实验表明,与现有的分支和合并方案相比,Deep Layer Aggregation 可提高识别和分辨率。[论文地址](https://arxiv.org/abs/1707.06484)
## 精度、FLOPS和参数量 <a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Model | Params (M) | FLOPs (G) | Top-1 (%) | Top-5 (%) | | Model | Params (M) | FLOPs (G) | Top-1 (%) | Top-5 (%) |
|:-----------------:|:----------:|:---------:|:---------:|:---------:| |:-----------------:|:----------:|:---------:|:---------:|:---------:|
......
# DPN与DenseNet系列 # DPN 与 DenseNet 系列
---
## 目录
## 概述 * [1. 概述](#1)
DenseNet是2017年CVPR best paper提出的一种新的网络结构,该网络设计了一种新的跨层连接的block,即dense-block。相比ResNet中的bottleneck,dense-block设计了一个更激进的密集连接机制,即互相连接所有的层,每个层都会接受其前面所有层作为其额外的输入。DenseNet将所有的dense-block堆叠,组合成了一个密集连接型网络。密集的连接方式使得DenseNe更容易进行梯度的反向传播,使得网络更容易训练。 * [2. 精度、FLOPS 和参数量](#2)
DPN的全称是Dual Path Networks,即双通道网络。该网络是由DenseNet和ResNeXt结合的一个网络,其证明了DenseNet能从靠前的层级中提取到新的特征,而ResNeXt本质上是对之前层级中已提取特征的复用。作者进一步分析发现,ResNeXt对特征有高复用率,但冗余度低,DenseNet能创造新特征,但冗余度高。结合二者结构的优势,作者设计了DPN网络。最终DPN网络在同样FLOPS和参数量下,取得了比ResNeXt与DenseNet更好的结果。 * [3. 基于 V100 GPU 的预测速度](#3)
* [4. 基于 T4 GPU 的预测速度](#4)
该系列模型的FLOPS、参数量以及T4 GPU上的预测耗时如下图所示。 <a name='1'></a>
## 1. 概述
DenseNet 是 2017 年 CVPR best paper 提出的一种新的网络结构,该网络设计了一种新的跨层连接的 block,即 dense-block。相比 ResNet 中的 bottleneck,dense-block 设计了一个更激进的密集连接机制,即互相连接所有的层,每个层都会接受其前面所有层作为其额外的输入。DenseNet 将所有的 dense-block 堆叠,组合成了一个密集连接型网络。密集的连接方式使得 DenseNe 更容易进行梯度的反向传播,使得网络更容易训练。
DPN 的全称是 Dual Path Networks,即双通道网络。该网络是由 DenseNet 和 ResNeXt 结合的一个网络,其证明了 DenseNet 能从靠前的层级中提取到新的特征,而 ResNeXt 本质上是对之前层级中已提取特征的复用。作者进一步分析发现,ResNeXt 对特征有高复用率,但冗余度低,DenseNet 能创造新特征,但冗余度高。结合二者结构的优势,作者设计了 DPN 网络。最终 DPN 网络在同样 FLOPS 和参数量下,取得了比 ResNeXt 与 DenseNet 更好的结果。
该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
![](../../images/models/T4_benchmark/t4.fp32.bs4.DPN.flops.png) ![](../../images/models/T4_benchmark/t4.fp32.bs4.DPN.flops.png)
...@@ -14,11 +23,12 @@ DPN的全称是Dual Path Networks,即双通道网络。该网络是由DenseNet ...@@ -14,11 +23,12 @@ DPN的全称是Dual Path Networks,即双通道网络。该网络是由DenseNet
![](../../images/models/T4_benchmark/t4.fp16.bs4.DPN.png) ![](../../images/models/T4_benchmark/t4.fp16.bs4.DPN.png)
目前PaddleClas开源的这两类模型的预训练模型一共有10个,其指标如上图所示,可以看到,在相同的FLOPS和参数量下,相比DenseNet,DPN拥有更高的精度。但是由于DPN有更多的分支,所以其推理速度要慢于DenseNet。由于DenseNet264的网络层数最深,所以该网络是DenseNet系列模型中参数量最大的网络,DenseNet161的网络的宽度最大,导致其是该系列中网络中计算量最大、精度最高的网络。从推理速度来看,计算量大且精度高的的DenseNet161比DenseNet264具有更快的速度,所以其比DenseNet264具有更大的优势。 目前 PaddleClas 开源的这两类模型的预训练模型一共有 10 个,其指标如上图所示,可以看到,在相同的 FLOPS 和参数量下,相比 DenseNet,DPN 拥有更高的精度。但是由于 DPN 有更多的分支,所以其推理速度要慢于 DenseNet。由于 DenseNet264 的网络层数最深,所以该网络是 DenseNet 系列模型中参数量最大的网络,DenseNet161 的网络的宽度最大,导致其是该系列中网络中计算量最大、精度最高的网络。从推理速度来看,计算量大且精度高的的 DenseNet161 比 DenseNet264 具有更快的速度,所以其比 DenseNet264 具有更大的优势。
对于DPN系列网络,模型的FLOPS和参数量越大,模型的精度越高。其中,由于DPN107的网络宽度最大,所以其是该系列网络中参数量与计算量最大的网络。 对于 DPN 系列网络,模型的 FLOPS 和参数量越大,模型的精度越高。其中,由于 DPN107 的网络宽度最大,所以其是该系列网络中参数量与计算量最大的网络。
## 精度、FLOPS和参数量 <a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -35,8 +45,8 @@ DPN的全称是Dual Path Networks,即双通道网络。该网络是由DenseNet ...@@ -35,8 +45,8 @@ DPN的全称是Dual Path Networks,即双通道网络。该网络是由DenseNet
<a name='3'></a>
## 基于V100 GPU的预测速度 ## 3. 基于 V100 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) | | Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) |
|-------------|-----------|-------------------|--------------------------| |-------------|-----------|-------------------|--------------------------|
...@@ -52,8 +62,8 @@ DPN的全称是Dual Path Networks,即双通道网络。该网络是由DenseNet ...@@ -52,8 +62,8 @@ DPN的全称是Dual Path Networks,即双通道网络。该网络是由DenseNet
| DPN131 | 224 | 256 | 28.083 | | DPN131 | 224 | 256 | 28.083 |
<a name='4'></a>
## 基于T4 GPU的预测速度 ## 4. 基于 T4 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) | | Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) |
|-------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------| |-------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|
......
# ESNet系列 # ESNet 系列
---
## 目录
## 概述 * [1. 概述](#)
* [2. 精度、FLOPs 和参数量](#FLOPs)
ESNet(Enhanced ShuffleNet)是百度自研的一个轻量级网络,该网络在ShuffleNetV2的基础上融合了MobileNetV3、GhostNet、PPLCNet的优点,组合成了一个在ARM设备上速度更快、精度更高的网络,由于其出色的表现,所以在PaddleDetection推出的[PP-PicoDet](https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.3/configs/picodet)使用了该模型做backbone,配合更强的目标检测算法,最终的指标一举刷新了目标检测模型在ARM设备上的SOTA指标。 <a name='1'></a>
## 精度、FLOPs和参数量 ## 1. 概述
ESNet(Enhanced ShuffleNet)是百度自研的一个轻量级网络,该网络在 ShuffleNetV2 的基础上融合了 MobileNetV3、GhostNet、PPLCNet 的优点,组合成了一个在 ARM 设备上速度更快、精度更高的网络,由于其出色的表现,所以在 PaddleDetection 推出的 [PP-PicoDet](https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.3/configs/picodet) 使用了该模型做 backbone,配合更强的目标检测算法,最终的指标一举刷新了目标检测模型在 ARM 设备上的 SOTA 指标。
<a name='2'></a>
## 2.精度、FLOPs 和参数量
| Models | Top1 | Top5 | FLOPs<br>(M) | Params<br/>(M) | | Models | Top1 | Top5 | FLOPs<br>(M) | Params<br/>(M) |
|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|
...@@ -13,4 +22,4 @@ ESNet(Enhanced ShuffleNet)是百度自研的一个轻量级网络,该网络在 ...@@ -13,4 +22,4 @@ ESNet(Enhanced ShuffleNet)是百度自研的一个轻量级网络,该网络在
| ESNet_x0_75 | 72.24 | 90.45 | 123.7 | 3.87 | | ESNet_x0_75 | 72.24 | 90.45 | 123.7 | 3.87 |
| ESNet_x1_0 | 73.92 | 91.40 | 197.3 | 4.64 | | ESNet_x1_0 | 73.92 | 91.40 | 197.3 | 4.64 |
关于Inference speed等信息,敬请期待。 关于 Inference speed 等信息,敬请期待。
# EfficientNet与ResNeXt101_wsl系列 # EfficientNet 与 ResNeXt101_wsl 系列
-----
## 目录
## 概述 * [1. 概述](#1)
EfficientNet是Google于2019年发布的一个基于NAS的轻量级网络,其中EfficientNetB7刷新了当时ImageNet-1k的分类准确率。在该文章中,作者指出,传统的提升神经网络性能的方法主要是从网络的宽度、网络的深度、以及输入图片的分辨率入手,但是作者通过实验发现,平衡这三个维度对精度和效率的提升至关重要,于是,作者通过一系列的实验中总结出了如何同时平衡这三个维度的放缩,与此同时,基于这种放缩方法,作者在EfficientNet_B0的基础上,构建了EfficientNet系列中B1-B7共7个网络,并在同样FLOPS与参数量的情况下,精度达到了state-of-the-art的效果。 * [2. 精度、FLOPS 和参数量](#2)
* [3. 基于 V100 GPU 的预测速度](#3)
* [4. 基于 T4 GPU 的预测速度](#4)
ResNeXt是facebook于2016年提出的一种对ResNet的改进版网络。在2019年,facebook通过弱监督学习研究了该系列网络在ImageNet上的精度上限,为了区别之前的ResNeXt网络,该系列网络的后缀为wsl,其中wsl是弱监督学习(weakly-supervised-learning)的简称。为了能有更强的特征提取能力,研究者将其网络宽度进一步放大,其中最大的ResNeXt101_32x48d_wsl拥有8亿个参数,将其在9.4亿的弱标签图片下训练并在ImageNet-1k上做finetune,最终在ImageNet-1k的top-1达到了85.4%,这也是迄今为止在ImageNet-1k的数据集上以224x224的分辨率下精度最高的网络。Fix-ResNeXt中,作者使用了更大的图像分辨率,针对训练图片和验证图片数据预处理不一致的情况下做了专门的Fix策略,并使得ResNeXt101_32x48d_wsl拥有了更高的精度,由于其用到了Fix策略,故命名为Fix-ResNeXt101_32x48d_wsl。 <a name='1'></a>
## 1. 概述
EfficientNet 是 Google 于 2019 年发布的一个基于 NAS 的轻量级网络,其中 EfficientNetB7 刷新了当时 ImageNet-1k 的分类准确率。在该文章中,作者指出,传统的提升神经网络性能的方法主要是从网络的宽度、网络的深度、以及输入图片的分辨率入手,但是作者通过实验发现,平衡这三个维度对精度和效率的提升至关重要,于是,作者通过一系列的实验中总结出了如何同时平衡这三个维度的放缩,与此同时,基于这种放缩方法,作者在 EfficientNet_B0 的基础上,构建了 EfficientNet 系列中 B1-B7 共 7 个网络,并在同样 FLOPS 与参数量的情况下,精度达到了 state-of-the-art 的效果。
ResNeXt 是 facebook 于 2016 年提出的一种对 ResNet 的改进版网络。在 2019 年,facebook 通过弱监督学习研究了该系列网络在 ImageNet 上的精度上限,为了区别之前的 ResNeXt 网络,该系列网络的后缀为 wsl,其中 wsl 是弱监督学习(weakly-supervised-learning)的简称。为了能有更强的特征提取能力,研究者将其网络宽度进一步放大,其中最大的 ResNeXt101_32x48d_wsl 拥有 8 亿个参数,将其在 9.4 亿的弱标签图片下训练并在 ImageNet-1k 上做 finetune,最终在 ImageNet-1k 的 top-1 达到了 85.4%,这也是迄今为止在 ImageNet-1k 的数据集上以 224x224 的分辨率下精度最高的网络。Fix-ResNeXt 中,作者使用了更大的图像分辨率,针对训练图片和验证图片数据预处理不一致的情况下做了专门的 Fix 策略,并使得 ResNeXt101_32x48d_wsl 拥有了更高的精度,由于其用到了 Fix 策略,故命名为 Fix-ResNeXt101_32x48d_wsl。
该系列模型的FLOPS、参数量以及T4 GPU上的预测耗时如下图所示。
该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
![](../../images/models/T4_benchmark/t4.fp32.bs4.EfficientNet.flops.png) ![](../../images/models/T4_benchmark/t4.fp32.bs4.EfficientNet.flops.png)
...@@ -16,9 +24,10 @@ ResNeXt是facebook于2016年提出的一种对ResNet的改进版网络。在2019 ...@@ -16,9 +24,10 @@ ResNeXt是facebook于2016年提出的一种对ResNet的改进版网络。在2019
![](../../images/models/T4_benchmark/t4.fp16.bs1.EfficientNet.png) ![](../../images/models/T4_benchmark/t4.fp16.bs1.EfficientNet.png)
目前PaddleClas开源的这两类模型的预训练模型一共有14个。从上图中可以看出EfficientNet系列网络优势非常明显,ResNeXt101_wsl系列模型由于用到了更多的数据,最终的精度也更高。EfficientNet_B0_Small是去掉了SE_block的EfficientNet_B0,其具有更快的推理速度。 目前 PaddleClas 开源的这两类模型的预训练模型一共有 14 个。从上图中可以看出 EfficientNet 系列网络优势非常明显,ResNeXt101_wsl 系列模型由于用到了更多的数据,最终的精度也更高。EfficientNet_B0_Small 是去掉了 SE_block 的 EfficientNet_B0,其具有更快的推理速度。
## 精度、FLOPS和参数量 <a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -37,8 +46,9 @@ ResNeXt是facebook于2016年提出的一种对ResNet的改进版网络。在2019 ...@@ -37,8 +46,9 @@ ResNeXt是facebook于2016年提出的一种对ResNet的改进版网络。在2019
| EfficientNetB7 | 0.843 | 0.969 | 0.844 | 0.971 | 72.350 | 64.920 | | EfficientNetB7 | 0.843 | 0.969 | 0.844 | 0.971 | 72.350 | 64.920 |
| EfficientNetB0_<br>small | 0.758 | 0.926 | | | 0.720 | 4.650 | | EfficientNetB0_<br>small | 0.758 | 0.926 | | | 0.720 | 4.650 |
<a name='3'></a>
## 基于V100 GPU的预测速度 ## 3. 基于 V100 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) | | Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) |
|-------------------------------|-----------|-------------------|--------------------------| |-------------------------------|-----------|-------------------|--------------------------|
...@@ -58,8 +68,9 @@ ResNeXt是facebook于2016年提出的一种对ResNet的改进版网络。在2019 ...@@ -58,8 +68,9 @@ ResNeXt是facebook于2016年提出的一种对ResNet的改进版网络。在2019
| EfficientNetB0_<br>small | 224 | 256 | 1.692 | | EfficientNetB0_<br>small | 224 | 256 | 1.692 |
<a name='4'></a>
## 基于T4 GPU的预测速度 ## 4. 基于 T4 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) | | Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) |
|---------------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------| |---------------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|
......
# HRNet系列 # HRNet 系列
-----
## 目录
## 概述 * [1. 概述](#1)
HRNet是2019年由微软亚洲研究院提出的一种全新的神经网络,不同于以往的卷积神经网络,该网络在网络深层仍然可以保持高分辨率,因此预测的关键点热图更准确,在空间上也更精确。此外,该网络在对分辨率敏感的其他视觉任务中,如检测、分割等,表现尤为优异。 * [2. 精度、FLOPS 和参数量](#2)
* [3. 基于 V100 GPU 的预测速度](#3)
* [4. 基于 T4 GPU 的预测速度](#4)
该系列模型的FLOPS、参数量以及T4 GPU上的预测耗时如下图所示。 <a name='1'></a>
## 1. 概述
HRNet 是 2019 年由微软亚洲研究院提出的一种全新的神经网络,不同于以往的卷积神经网络,该网络在网络深层仍然可以保持高分辨率,因此预测的关键点热图更准确,在空间上也更精确。此外,该网络在对分辨率敏感的其他视觉任务中,如检测、分割等,表现尤为优异。
该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
![](../../images/models/T4_benchmark/t4.fp32.bs4.HRNet.flops.png) ![](../../images/models/T4_benchmark/t4.fp32.bs4.HRNet.flops.png)
...@@ -13,10 +22,10 @@ HRNet是2019年由微软亚洲研究院提出的一种全新的神经网络, ...@@ -13,10 +22,10 @@ HRNet是2019年由微软亚洲研究院提出的一种全新的神经网络,
![](../../images/models/T4_benchmark/t4.fp16.bs4.HRNet.png) ![](../../images/models/T4_benchmark/t4.fp16.bs4.HRNet.png)
目前PaddleClas开源的这类模型的预训练模型一共有7个,其指标如图所示,其中HRNet_W48_C指标精度异常的原因可能是因为网络训练的正常波动。 目前 PaddleClas 开源的这类模型的预训练模型一共有 7 个,其指标如图所示,其中 HRNet_W48_C 指标精度异常的原因可能是因为网络训练的正常波动。
## 精度、FLOPS和参数量 <a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -31,8 +40,8 @@ HRNet是2019年由微软亚洲研究院提出的一种全新的神经网络, ...@@ -31,8 +40,8 @@ HRNet是2019年由微软亚洲研究院提出的一种全新的神经网络,
| HRNet_W64_C | 0.793 | 0.946 | 0.795 | 0.946 | 57.830 | 128.060 | | HRNet_W64_C | 0.793 | 0.946 | 0.795 | 0.946 | 57.830 | 128.060 |
| SE_HRNet_W64_C_ssld | 0.847 | 0.973 | | | 57.830 | 128.970 | | SE_HRNet_W64_C_ssld | 0.847 | 0.973 | | | 57.830 | 128.970 |
<a name='3'></a>
## 基于V100 GPU的预测速度 ## 3. 基于 V100 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) | | Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) |
|-------------|-----------|-------------------|--------------------------| |-------------|-----------|-------------------|--------------------------|
...@@ -47,8 +56,8 @@ HRNet是2019年由微软亚洲研究院提出的一种全新的神经网络, ...@@ -47,8 +56,8 @@ HRNet是2019年由微软亚洲研究院提出的一种全新的神经网络,
| HRNet_W64_C | 224 | 256 | 15.003 | | HRNet_W64_C | 224 | 256 | 15.003 |
<a name='4'></a>
## 基于T4 GPU的预测速度 ## 4. 基于 T4 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) | | Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) |
|-------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------| |-------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|
......
# HarDNet系列 # HarDNet 系列
---
## 目录
## 概述 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
HarDNet(Harmonic DenseNet)是 2019 年由国立清华大学提出的一种全新的神经网络,在低 MAC 和内存流量的条件下实现了高效率。与 FC-DenseNet-103,DenseNet-264,ResNet-50,ResNet-152 和SSD-VGG 相比,新网络的推理时间减少了 35%,36%,30%,32% 和 45%。我们使用了包括Nvidia Profiler 和 ARM Scale-Sim 在内的工具来测量内存流量,并验证推理延迟确实与内存流量消耗成正比,并且所提议的网络消耗的内存流量很低。[论文地址](https://arxiv.org/abs/1909.00948) <a name='1'></a>
## 1. 概述
## 精度、FLOPS和参数量 HarDNet(Harmonic DenseNet)是 2019 年由国立清华大学提出的一种全新的神经网络,在低 MAC 和内存流量的条件下实现了高效率。与 FC-DenseNet-103,DenseNet-264,ResNet-50,ResNet-152 和 SSD-VGG 相比,新网络的推理时间减少了 35%,36%,30%,32% 和 45%。我们使用了包括 Nvidia Profiler 和 ARM Scale-Sim 在内的工具来测量内存流量,并验证推理延迟确实与内存流量消耗成正比,并且所提议的网络消耗的内存流量很低。[论文地址](https://arxiv.org/abs/1909.00948)
<a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Model | Params (M) | FLOPs (G) | Top-1 (%) | Top-5 (%) | | Model | Params (M) | FLOPs (G) | Top-1 (%) | Top-5 (%) |
|:---------------------:|:----------:|:---------:|:---------:|:---------:| |:---------------------:|:----------:|:---------:|:---------:|:---------:|
......
# Inception系列 # Inception 系列
-----
## 目录
## 概述 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
* [3. 基于 V100 GPU 的预测速度](#3)
* [4. 基于 T4 GPU 的预测速度](#4)
GoogLeNet是2014年由Google设计的一种新的神经网络结构,其与VGG网络并列成为当年ImageNet挑战赛的双雄。GoogLeNet首次引入Inception结构,在网络中堆叠该结构使得网络层数达到了22层,这也是卷积网络首次超过20层的标志。由于在Inception结构中使用了1x1的卷积用于通道数降维,并且使用了Global-pooling代替传统的多fc层加工特征的方式,最终的GoogLeNet网络的FLOPS和参数量远小于VGG网络,成为当时神经网络设计的一道亮丽风景线。 <a name='1'></a>
InceptionV3是Google 对InceptionV2的一种改进。首先,InceptionV3 对 Inception模块进行了优化,同时设计和使用了更多种类的Inception模块,与此同时,InceptionV3中的部分Inception模块将较大的方形二维卷积拆成两个较小的非对称卷积,这样可以大幅度节省参数量。 ## 1. 概述
Xception 是 Google 继 Inception 后提出的对 InceptionV3 的另一种改进。在Xception中,作者使用了深度可分离卷积代替了传统的卷积操作,该操作大大节省了网络的FLOPS和参数量,但是精度反而有所提升。在DeeplabV3+中,作者将Xception做了进一步的改进,同时增加了Xception的层数,设计出了Xception65和Xception71的网络 GoogLeNet 是 2014 年由 Google 设计的一种新的神经网络结构,其与 VGG 网络并列成为当年 ImageNet 挑战赛的双雄。GoogLeNet 首次引入 Inception 结构,在网络中堆叠该结构使得网络层数达到了 22 层,这也是卷积网络首次超过 20 层的标志。由于在 Inception 结构中使用了 1x1 的卷积用于通道数降维,并且使用了 Global-pooling 代替传统的多 fc 层加工特征的方式,最终的 GoogLeNet 网络的 FLOPS 和参数量远小于 VGG 网络,成为当时神经网络设计的一道亮丽风景线
InceptionV4是2016年由Google设计的新的神经网络,当时残差结构风靡一时,但是作者认为仅使用Inception 结构也可以达到很高的性能。InceptionV4使用了更多的Inception module,在ImageNet上的精度再创新高 InceptionV3 是 Google 对 InceptionV2 的一种改进。首先,InceptionV3 对 Inception 模块进行了优化,同时设计和使用了更多种类的 Inception 模块,与此同时,InceptionV3 中的部分 Inception 模块将较大的方形二维卷积拆成两个较小的非对称卷积,这样可以大幅度节省参数量
Xception 是 Google 继 Inception 后提出的对 InceptionV3 的另一种改进。在 Xception 中,作者使用了深度可分离卷积代替了传统的卷积操作,该操作大大节省了网络的 FLOPS 和参数量,但是精度反而有所提升。在 DeeplabV3+ 中,作者将 Xception 做了进一步的改进,同时增加了 Xception 的层数,设计出了 Xception65 和 Xception71 的网络。
该系列模型的FLOPS、参数量以及T4 GPU上的预测耗时如下图所示。 InceptionV4 是 2016 年由 Google 设计的新的神经网络,当时残差结构风靡一时,但是作者认为仅使用 Inception 结构也可以达到很高的性能。InceptionV4 使用了更多的 Inception module,在 ImageNet 上的精度再创新高。
该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
![](../../images/models/T4_benchmark/t4.fp32.bs4.Inception.flops.png) ![](../../images/models/T4_benchmark/t4.fp32.bs4.Inception.flops.png)
...@@ -21,11 +30,12 @@ InceptionV4是2016年由Google设计的新的神经网络,当时残差结构 ...@@ -21,11 +30,12 @@ InceptionV4是2016年由Google设计的新的神经网络,当时残差结构
![](../../images/models/T4_benchmark/t4.fp16.bs4.Inception.png) ![](../../images/models/T4_benchmark/t4.fp16.bs4.Inception.png)
上图反映了Xception系列和InceptionV4的精度和其他指标的关系。其中Xception_deeplab与论文结构保持一致,Xception是PaddleClas的改进模型,在预测速度基本不变的情况下,精度提升约0.6%。关于该改进模型的详细介绍正在持续更新中,敬请期待。 上图反映了 Xception 系列和 InceptionV4 的精度和其他指标的关系。其中 Xception_deeplab 与论文结构保持一致,Xception 是 PaddleClas 的改进模型,在预测速度基本不变的情况下,精度提升约 0.6%。关于该改进模型的详细介绍正在持续更新中,敬请期待。
<a name='2'></a>
## 精度、FLOPS和参数量 ## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -39,8 +49,9 @@ InceptionV4是2016年由Google设计的新的神经网络,当时残差结构 ...@@ -39,8 +49,9 @@ InceptionV4是2016年由Google设计的新的神经网络,当时残差结构
| InceptionV4 | 0.808 | 0.953 | 0.800 | 0.950 | 24.570 | 42.680 | | InceptionV4 | 0.808 | 0.953 | 0.800 | 0.950 | 24.570 | 42.680 |
<a name='3'></a>
## 基于V100 GPU的预测速度 ## 3. 基于 V100 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) | | Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) |
|------------------------|-----------|-------------------|--------------------------| |------------------------|-----------|-------------------|--------------------------|
...@@ -53,8 +64,9 @@ InceptionV4是2016年由Google设计的新的神经网络,当时残差结构 ...@@ -53,8 +64,9 @@ InceptionV4是2016年由Google设计的新的神经网络,当时残差结构
| InceptionV4 | 299 | 320 | 11.141 | | InceptionV4 | 299 | 320 | 11.141 |
<a name='4'></a>
## 基于T4 GPU的预测速度 ## 4. 基于 T4 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) | | Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) |
|--------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------| |--------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|
......
# LeViT # LeViT
## 概述 ---
LeViT是一种快速推理的、用于图像分类任务的混合神经网络。其设计之初考虑了网络模型在不同的硬件平台上的性能,因此能够更好地反映普遍应用的真实场景。通过大量实验,作者找到了卷积神经网络与Transformer体系更好的结合方式,并且提出了attention-based方法,用于整合Transformer中的位置信息编码。[论文地址](https://arxiv.org/abs/2104.01136) ## 目录
## 精度、FLOPS和参数量 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
<a name='1'></a>
## 1. 概述
LeViT 是一种快速推理的、用于图像分类任务的混合神经网络。其设计之初考虑了网络模型在不同的硬件平台上的性能,因此能够更好地反映普遍应用的真实场景。通过大量实验,作者找到了卷积神经网络与 Transformer 体系更好的结合方式,并且提出了 attention-based 方法,用于整合 Transformer 中的位置信息编码。[论文地址](https://arxiv.org/abs/2104.01136)
<a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(M) | Params<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(M) | Params<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -14,4 +24,4 @@ LeViT是一种快速推理的、用于图像分类任务的混合神经网络。 ...@@ -14,4 +24,4 @@ LeViT是一种快速推理的、用于图像分类任务的混合神经网络。
| LeViT-384 | 0.8191 | 0.9551 | 0.826 | 0.960 | 2353 | 39 | | LeViT-384 | 0.8191 | 0.9551 | 0.826 | 0.960 | 2353 | 39 |
**注**:与Reference的精度差异源于数据预处理不同及未使用蒸馏的head作为输出。 **注**:与 Reference 的精度差异源于数据预处理不同及未使用蒸馏的 head 作为输出。
# MixNet系列 # MixNet 系列
---
## 目录
## 概述 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
MixNet是谷歌出的一篇关于轻量级网络的文章,主要工作就在于探索不同大小的卷积核的组合。作者发现目前网络有以下两个问题: <a name='1'></a>
## 1. 概述
MixNet 是谷歌出的一篇关于轻量级网络的文章,主要工作就在于探索不同大小的卷积核的组合。作者发现目前网络有以下两个问题:
- 小的卷积核感受野小,参数少,但是准确率不高 - 小的卷积核感受野小,参数少,但是准确率不高
- 大的卷积核感受野大,准确率相对略高,但是参数也相对增加了很多 - 大的卷积核感受野大,准确率相对略高,但是参数也相对增加了很多
为了解决上面两个问题,文中提出一种新的混合深度分离卷积(MDConv)(mixed depthwise convolution),将不同的核大小混合在一个卷积运算中,并且基于AutoML的搜索空间,提出了一系列的网络叫做MixNets,在ImageNet上取得了较好的效果。[论文地址](https://arxiv.org/pdf/1907.09595.pdf) 为了解决上面两个问题,文中提出一种新的混合深度分离卷积(MDConv)(mixed depthwise convolution),将不同的核大小混合在一个卷积运算中,并且基于 AutoML 的搜索空间,提出了一系列的网络叫做 MixNets,在 ImageNet 上取得了较好的效果。[论文地址](https://arxiv.org/pdf/1907.09595.pdf)
<a name='2'></a>
## 精度、FLOPS和参数量 ## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1| FLOPS<br>(M) | Params<br/>(M) | | Models | Top1 | Top5 | Reference<br>top1| FLOPS<br>(M) | Params<br/>(M) |
|:--:|:--:|:--:|:--:|:--:|----| |:--:|:--:|:--:|:--:|:--:|----|
...@@ -18,4 +26,4 @@ MixNet是谷歌出的一篇关于轻量级网络的文章,主要工作就在 ...@@ -18,4 +26,4 @@ MixNet是谷歌出的一篇关于轻量级网络的文章,主要工作就在
| MixNet_M | 77.67 | 93.64 | 77.0 | 357.119 | 5.065 | | MixNet_M | 77.67 | 93.64 | 77.0 | 357.119 | 5.065 |
| MixNet_L | 78.60 | 94.37 | 78.9 | 579.017 | 7.384 | | MixNet_L | 78.60 | 94.37 | 78.9 | 579.017 | 7.384 |
关于Inference speed等信息,敬请期待。 关于 Inference speed 等信息,敬请期待。
# 移动端系列 # 移动端系列
---
## 目录
## 概述 * [1. 概述](#1)
MobileNetV1是Google于2017年发布的用于移动设备或嵌入式设备中的网络。该网络将传统的卷积操作替换深度可分离卷积,即Depthwise卷积和Pointwise卷积的组合,相比传统的卷积操作,该组合可以大大节省参数量和计算量。与此同时,MobileNetV1也可以用于目标检测、图像分割等其他视觉任务中。 * [2. 精度、FLOPS 和参数量](#2)
* [3. 基于 SD855 的预测速度和存储大小](#3)
* [4. 基于 T4 GPU 的预测速度](#4)
MobileNetV2是Google继MobileNetV1提出的一种轻量级网络。相比MobileNetV1,MobileNetV2提出了Linear bottlenecks与Inverted residual block作为网络基本结构,通过大量地堆叠这些基本模块,构成了MobileNetV2的网络结构。最终,在FLOPS只有MobileNetV1的一半的情况下取得了更高的分类精度。 <a name='1'></a>
ShuffleNet系列网络是旷视提出的轻量化网络结构,到目前为止,该系列网络一共有两种典型的结构,即ShuffleNetV1与ShuffleNetV2。ShuffleNet中的Channel Shuffle操作可以将组间的信息进行交换,并且可以实现端到端的训练。在ShuffleNetV2的论文中,作者提出了设计轻量级网络的四大准则,并且根据四大准则与ShuffleNetV1的不足,设计了ShuffleNetV2网络。 ## 1. 概述
MobileNetV1 是 Google 于 2017 年发布的用于移动设备或嵌入式设备中的网络。该网络将传统的卷积操作替换深度可分离卷积,即 Depthwise 卷积和 Pointwise 卷积的组合,相比传统的卷积操作,该组合可以大大节省参数量和计算量。与此同时,MobileNetV1 也可以用于目标检测、图像分割等其他视觉任务中。
MobileNetV3是Google于2019年提出的一种基于NAS的新的轻量级网络,为了进一步提升效果,将relu和sigmoid激活函数分别替换为hard_swish与hard_sigmoid激活函数,同时引入了一些专门减小网络计算量的改进策略 MobileNetV2 是 Google 继 MobileNetV1 提出的一种轻量级网络。相比 MobileNetV1,MobileNetV2 提出了 Linear bottlenecks 与 Inverted residual block 作为网络基本结构,通过大量地堆叠这些基本模块,构成了 MobileNetV2 的网络结构。最终,在 FLOPS 只有 MobileNetV1 的一半的情况下取得了更高的分类精度
GhostNet是华为于2020年提出的一种全新的轻量化网络结构,通过引入ghost module,大大减缓了传统深度网络中特征的冗余计算问题,使得网络的参数量和计算量大大降低。 ShuffleNet 系列网络是旷视提出的轻量化网络结构,到目前为止,该系列网络一共有两种典型的结构,即 ShuffleNetV1 与 ShuffleNetV2。ShuffleNet 中的 Channel Shuffle 操作可以将组间的信息进行交换,并且可以实现端到端的训练。在 ShuffleNetV2 的论文中,作者提出了设计轻量级网络的四大准则,并且根据四大准则与 ShuffleNetV1 的不足,设计了 ShuffleNetV2 网络。
MobileNetV3 是 Google 于 2019 年提出的一种基于 NAS 的新的轻量级网络,为了进一步提升效果,将 relu 和 sigmoid 激活函数分别替换为 hard_swish 与 hard_sigmoid 激活函数,同时引入了一些专门减小网络计算量的改进策略。
GhostNet 是华为于 2020 年提出的一种全新的轻量化网络结构,通过引入 ghost module,大大减缓了传统深度网络中特征的冗余计算问题,使得网络的参数量和计算量大大降低。
![](../../images/models/mobile_arm_top1.png) ![](../../images/models/mobile_arm_top1.png)
...@@ -20,10 +29,11 @@ GhostNet是华为于2020年提出的一种全新的轻量化网络结构,通 ...@@ -20,10 +29,11 @@ GhostNet是华为于2020年提出的一种全新的轻量化网络结构,通
![](../../images/models/T4_benchmark/t4.fp32.bs4.mobile_trt.params.png) ![](../../images/models/T4_benchmark/t4.fp32.bs4.mobile_trt.params.png)
目前PaddleClas开源的的移动端系列的预训练模型一共有35个,其指标如图所示。从图片可以看出,越新的轻量级模型往往有更优的表现,MobileNetV3代表了目前主流的轻量级神经网络结构。在MobileNetV3中,作者为了获得更高的精度,在global-avg-pooling后使用了1x1的卷积。该操作大幅提升了参数量但对计算量影响不大,所以如果从存储角度评价模型的优异程度,MobileNetV3优势不是很大,但由于其更小的计算量,使得其有更快的推理速度。此外,我们模型库中的ssld蒸馏模型表现优异,从各个考量角度下,都刷新了当前轻量级模型的精度。由于MobileNetV3模型结构复杂,分支较多,对GPU并不友好,GPU预测速度不如MobileNetV1。GhostNet于2020年提出,通过引入ghost的网络设计理念,大大降低了计算量和参数量,同时在精度上也超过前期最高的MobileNetV3网络结构。 目前 PaddleClas 开源的的移动端系列的预训练模型一共有 35 个,其指标如图所示。从图片可以看出,越新的轻量级模型往往有更优的表现,MobileNetV3 代表了目前主流的轻量级神经网络结构。在 MobileNetV3 中,作者为了获得更高的精度,在 global-avg-pooling 后使用了 1x1 的卷积。该操作大幅提升了参数量但对计算量影响不大,所以如果从存储角度评价模型的优异程度,MobileNetV3 优势不是很大,但由于其更小的计算量,使得其有更快的推理速度。此外,我们模型库中的 ssld 蒸馏模型表现优异,从各个考量角度下,都刷新了当前轻量级模型的精度。由于 MobileNetV3 模型结构复杂,分支较多,对 GPU 并不友好,GPU 预测速度不如 MobileNetV1。GhostNet 于 2020 年提出,通过引入 ghost 的网络设计理念,大大降低了计算量和参数量,同时在精度上也超过前期最高的 MobileNetV3 网络结构。
<a name='2'></a>
## 精度、FLOPS和参数量 ## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -65,8 +75,9 @@ GhostNet是华为于2020年提出的一种全新的轻量化网络结构,通 ...@@ -65,8 +75,9 @@ GhostNet是华为于2020年提出的一种全新的轻量化网络结构,通
| GhostNet_x1_3 | 0.757 | 0.925 | 0.757 | 0.927 | 0.440 | 7.300 | | GhostNet_x1_3 | 0.757 | 0.925 | 0.757 | 0.927 | 0.440 | 7.300 |
| GhostNet_x1_3_ssld | 0.794 | 0.945 | 0.757 | 0.927 | 0.440 | 7.300 | | GhostNet_x1_3_ssld | 0.794 | 0.945 | 0.757 | 0.927 | 0.440 | 7.300 |
<a name='3'></a>
## 基于SD855的预测速度和存储大小 ## 3. 基于 SD855 的预测速度和存储大小
| Models | Batch Size=1(ms) | Storage Size(M) | | Models | Batch Size=1(ms) | Storage Size(M) |
|:--:|:--:|:--:| |:--:|:--:|:--:|
...@@ -108,8 +119,9 @@ GhostNet是华为于2020年提出的一种全新的轻量化网络结构,通 ...@@ -108,8 +119,9 @@ GhostNet是华为于2020年提出的一种全新的轻量化网络结构,通
| GhostNet_x1_3 | 19.982 | 29.000 | | GhostNet_x1_3 | 19.982 | 29.000 |
| GhostNet_x1_3_ssld | 19.982 | 29.000 | | GhostNet_x1_3_ssld | 19.982 | 29.000 |
<a name='4'></a>
## 基于T4 GPU的预测速度 ## 4. 基于 T4 GPU 的预测速度
| Models | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) | | Models | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) |
|-----------------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------| |-----------------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|
......
# 其他模型 # 其他模型
-----
## 目录
## 概述 * [1. 概述](#1)
2012年,Alex等人提出的AlexNet网络在ImageNet大赛上以远超第二名的成绩夺冠,卷积神经网络乃至深度学习引起了广泛的关注。AlexNet使用relu作为CNN的激活函数,解决了sigmoid在网络较深时的梯度弥散问题。训练时使用Dropout随机丢掉一部分神经元,避免了模型过拟合。网络中使用重叠的最大池化代替了此前CNN中普遍使用的平均池化,避免了平均池化的模糊效果,提升了特征的丰富性。从某种意义上说,AlexNet引爆了神经网络的研究与应用热潮。 * [2. 精度、FLOPS 和参数量](#2)
* [3. 基于 V100 GPU 的预测速度](#3)
* [4. 基于 T4 GPU 的预测速度](#4)
SqueezeNet在ImageNet-1k上实现了与AlexNet相同的精度,但只用了1/50的参数量。该网络的核心是Fire模块,Fire模块通过使用1x1的卷积实现通道降维,从而大大节省了参数量。作者通过大量堆叠Fire模块组成了SqueezeNet。 <a name='1'></a>
VGG由牛津大学计算机视觉组和DeepMind公司研究员一起研发的卷积神经网络。该网络探索了卷积神经网络的深度和其性能之间的关系,通过反复的堆叠3x3的小型卷积核和2x2的最大池化层,成功的构建了多层卷积神经网络并取得了不错的收敛精度。最终,VGG获得了ILSVRC 2014比赛分类项目的亚军和定位项目的冠军。 ## 1. 概述
2012 年,Alex 等人提出的 AlexNet 网络在 ImageNet 大赛上以远超第二名的成绩夺冠,卷积神经网络乃至深度学习引起了广泛的关注。AlexNet 使用 relu 作为 CNN 的激活函数,解决了 sigmoid 在网络较深时的梯度弥散问题。训练时使用 Dropout 随机丢掉一部分神经元,避免了模型过拟合。网络中使用重叠的最大池化代替了此前 CNN 中普遍使用的平均池化,避免了平均池化的模糊效果,提升了特征的丰富性。从某种意义上说,AlexNet 引爆了神经网络的研究与应用热潮。
DarkNet53是YOLO作者在论文设计的用于目标检测的backbone,该网络基本由1x1与3x3卷积构成,共53层,取名为DarkNet53 SqueezeNet 在 ImageNet-1k 上实现了与 AlexNet 相同的精度,但只用了 1/50 的参数量。该网络的核心是 Fire 模块,Fire 模块通过使用 1x1 的卷积实现通道降维,从而大大节省了参数量。作者通过大量堆叠 Fire 模块组成了 SqueezeNet
VGG 由牛津大学计算机视觉组和 DeepMind 公司研究员一起研发的卷积神经网络。该网络探索了卷积神经网络的深度和其性能之间的关系,通过反复的堆叠 3x3 的小型卷积核和 2x2 的最大池化层,成功的构建了多层卷积神经网络并取得了不错的收敛精度。最终,VGG 获得了 ILSVRC 2014 比赛分类项目的亚军和定位项目的冠军。
## 精度、FLOPS和参数量 DarkNet53 是 YOLO 作者在论文设计的用于目标检测的 backbone,该网络基本由 1x1 与 3x3 卷积构成,共 53 层,取名为 DarkNet53。
<a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -24,8 +33,8 @@ DarkNet53是YOLO作者在论文设计的用于目标检测的backbone,该网 ...@@ -24,8 +33,8 @@ DarkNet53是YOLO作者在论文设计的用于目标检测的backbone,该网
| DarkNet53 | 0.780 | 0.941 | 0.772 | 0.938 | 18.580 | 41.600 | | DarkNet53 | 0.780 | 0.941 | 0.772 | 0.938 | 18.580 | 41.600 |
<a name='3'></a>
## 基于V100 GPU的预测速度 ## 3. 基于 V100 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) | | Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) |
...@@ -40,8 +49,8 @@ DarkNet53是YOLO作者在论文设计的用于目标检测的backbone,该网 ...@@ -40,8 +49,8 @@ DarkNet53是YOLO作者在论文设计的用于目标检测的backbone,该网
| DarkNet53 | 256 | 256 | 3.139 | | DarkNet53 | 256 | 256 | 3.139 |
<a name='4'></a>
## 基于T4 GPU的预测速度 ## 基于 T4 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) | | Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) |
|-----------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------| |-----------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|
......
# PP-LCNet系列 # PP-LCNet 系列
--- ---
## 目录 ## 目录
- [摘要](#1) - [1. 摘要](#1)
- [介绍](#2) - [2. 介绍](#2)
- [方法](#3) - [3. 方法](#3)
- [3.1 更好的激活函数](#3.1) - [3.1 更好的激活函数](#3.1)
- [3.2 合适的位置添加SE模块](#3.2) - [3.2 合适的位置添加 SE 模块](#3.2)
- [3.3 合适的位置添加更大的卷积核](#3.3) - [3.3 合适的位置添加更大的卷积核](#3.3)
- [3.4 GAP后使用更大的1x1卷积层](#3.4) - [3.4 GAP 后使用更大的 1x1 卷积层](#3.4)
- [实验部分](#4) - [4. 实验部分](#4)
- [图像分类](#4.1) - [4.1 图像分类](#4.1)
- [目标检测](#4.2) - [4.2 目标检测](#4.2)
- [语义分割](#4.3) - [4.3 语义分割](#4.3)
- [总结](#5) - [5. 总结](#5)
- [引用](#6) - [6. 引用](#6)
<a name="1"></a> <a name="1"></a>
## 一、摘要 ## 1. 摘要
在计算机视觉领域中,骨干网络的好坏直接影响到整个视觉任务的结果。在之前的一些工作中,相关的研究者普遍将FLOPs或者Params作为优化目的,但是在工业界真实落地的场景中,推理速度才是考量模型好坏的重要指标,然而,推理速度和准确性很难兼得。考虑到工业界有很多基于Intel CPU的应用,所以我们本次的工作旨在使骨干网络更好的适应Intel CPU,从而得到一个速度更快、准确率更高的轻量级骨干网络,与此同时,目标检测、语义分割等下游视觉任务的性能也同样得到提升。 在计算机视觉领域中,骨干网络的好坏直接影响到整个视觉任务的结果。在之前的一些工作中,相关的研究者普遍将 FLOPs 或者 Params 作为优化目的,但是在工业界真实落地的场景中,推理速度才是考量模型好坏的重要指标,然而,推理速度和准确性很难兼得。考虑到工业界有很多基于 Intel CPU 的应用,所以我们本次的工作旨在使骨干网络更好的适应 Intel CPU,从而得到一个速度更快、准确率更高的轻量级骨干网络,与此同时,目标检测、语义分割等下游视觉任务的性能也同样得到提升。
<a name="2"></a> <a name="2"></a>
## 二、介绍 ## 2. 介绍
近年来,有很多轻量级的骨干网络问世,尤其最近两年,各种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> <a name="3"></a>
## 三、方法 ## 3. 方法
网络结构整体如下图所示。 网络结构整体如下图所示。
<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> <a name="3.1"></a>
### 3.1 更好的激活函数 ### 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 中,我们选用了该激活函数。
<a name="3.2"></a> <a name="3.2"></a>
### 3.2 合适的位置添加SE模块 ### 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) |
...@@ -55,12 +55,12 @@ SE模块是SENet提出的一种通道注意力机制,可以有效提升模型 ...@@ -55,12 +55,12 @@ SE模块是SENet提出的一种通道注意力机制,可以有效提升模型
| 1111111111111 | 64.27 | 3.80 | | 1111111111111 | 64.27 | 3.80 |
最终,PP-LCNet中的SE模块的位置选用了表格中第三行的方案。 最终,PP-LCNet 中的 SE 模块的位置选用了表格中第三行的方案。
<a name="3.3"></a> <a name="3.3"></a>
### 3.3 合适的位置添加更大的卷积核 ### 3.3 合适的位置添加更大的卷积核
MixNet的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种split-concat范式的MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。我们通过实验总结了一些更大的卷积核在不同位置的作用,类似SE模块的位置,更大的卷积核在网络的中后部作用更明显,下表展示了5x5卷积核的位置对精度的影响: MixNet 的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种 split-concat 范式的 MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。我们通过实验总结了一些更大的卷积核在不同位置的作用,类似 SE 模块的位置,更大的卷积核在网络的中后部作用更明显,下表展示了 5x5 卷积核的位置对精度的影响:
| large-kernel Location | Top-1 Acc(\%) | Latency(ms) | | large-kernel Location | Top-1 Acc(\%) | Latency(ms) |
|-------------------|---------------|-------------| |-------------------|---------------|-------------|
...@@ -69,13 +69,13 @@ SE模块是SENet提出的一种通道注意力机制,可以有效提升模型 ...@@ -69,13 +69,13 @@ SE模块是SENet提出的一种通道注意力机制,可以有效提升模型
| <b>0000001111111<b> | <b>63.14<b> | <b>2.05<b> | | <b>0000001111111<b> | <b>63.14<b> | <b>2.05<b> |
实验表明,更大的卷积核放在网络的中后部即可达到放在所有位置的精度,与此同时,获得更快的推理速度。PP-LCNet最终选用了表格中第三行的方案。 实验表明,更大的卷积核放在网络的中后部即可达到放在所有位置的精度,与此同时,获得更快的推理速度。PP-LCNet 最终选用了表格中第三行的方案。
<a name="3.4"></a> <a name="3.4"></a>
### 3.4 GAP后使用更大的1x1卷积层 ### 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-kernel | last-1x1-conv | Top-1 Acc(\%) | Latency(ms) | | Activation | SE-block | Large-kernel | last-1x1-conv | Top-1 Acc(\%) | Latency(ms) |
|------------|----------|--------------|---------------|---------------|-------------| |------------|----------|--------------|---------------|---------------|-------------|
...@@ -86,12 +86,12 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步 ...@@ -86,12 +86,12 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步
| <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"></a>
## 四、实验部分 ## 4. 实验部分
<a name="4.1"></a> <a name="4.1"></a>
### 4.1 图像分类 ### 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%。
| Model | Params(M) | FLOPs(M) | Top-1 Acc(\%) | Top-5 Acc(\%) | Latency(ms) | | Model | Params(M) | FLOPs(M) | Top-1 Acc(\%) | Top-5 Acc(\%) | Latency(ms) |
|-------|-----------|----------|---------------|---------------|-------------| |-------|-----------|----------|---------------|---------------|-------------|
...@@ -107,7 +107,7 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步 ...@@ -107,7 +107,7 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步
| PP-LCNet-1.0x\* | 3.0 | 161 | 74.39 | 92.09 | 2.46 | | PP-LCNet-1.0x\* | 3.0 | 161 | 74.39 | 92.09 | 2.46 |
| PP-LCNet-2.5x\* | 9.0 | 906 | 80.82 | 95.33 | 5.39 | | PP-LCNet-2.5x\* | 9.0 | 906 | 80.82 | 95.33 | 5.39 |
其中\*表示使用SSLD蒸馏后的模型。 其中\*表示使用 SSLD 蒸馏后的模型。
与其他轻量级网络的性能对比: 与其他轻量级网络的性能对比:
...@@ -129,7 +129,7 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步 ...@@ -129,7 +129,7 @@ BaseNet经过以上四个方面的改进,得到了PP-LCNet。下表进一步
<a name="4.2"></a> <a name="4.2"></a>
### 4.2 目标检测 ### 4.2 目标检测
目标检测的方法我们选用了百度自研的PicoDet,该方法主打轻量级目标检测场景,下表展示了在COCO数据集上、backbone选用PP-LCNet与MobileNetV3的结果的比较,无论在精度还是速度上,PP-LCNet的优势都非常明显。 目标检测的方法我们选用了百度自研的 PicoDet,该方法主打轻量级目标检测场景,下表展示了在 COCO 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的结果的比较,无论在精度还是速度上,PP-LCNet 的优势都非常明显。
| Backbone | mAP(%) | Latency(ms) | | Backbone | mAP(%) | Latency(ms) |
|-------|-----------|----------| |-------|-----------|----------|
...@@ -141,7 +141,7 @@ MobileNetV3-large-0.75x | 25.8 | 11.1 | ...@@ -141,7 +141,7 @@ MobileNetV3-large-0.75x | 25.8 | 11.1 |
<a name="4.3"></a> <a name="4.3"></a>
### 4.3 语义分割 ### 4.3 语义分割
语义分割的方法我们选用了DeeplabV3+,下表展示了在Cityscapes数据集上、backbone选用PP-LCNet与MobileNetV3的比较,在精度和速度方面,PP-LCNet的优势同样明显。 语义分割的方法我们选用了 DeeplabV3+,下表展示了在 Cityscapes 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的比较,在精度和速度方面,PP-LCNet 的优势同样明显。
| Backbone | mIoU(%) | Latency(ms) | | Backbone | mIoU(%) | Latency(ms) |
|-------|-----------|----------| |-------|-----------|----------|
...@@ -151,14 +151,14 @@ MobileNetV3-large-0.75x | 64.53 | 151 | ...@@ -151,14 +151,14 @@ 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> <a name="5"></a>
## 五、总结 ## 5. 总结
PP-LCNet没有像学术界那样死扣极致的FLOPs与Params,而是着眼于分析如何添加对Intel CPU友好的模块来提升模型的性能,这样可以更好的平衡准确率和推理时间,其中的实验结论也很适合其他网络结构设计的研究者,同时也为NAS搜索研究者提供了更小的搜索空间和一般结论。最终的PP-LCNet在产业界也可以更好的落地和应用。 PP-LCNet 没有像学术界那样死扣极致的 FLOPs 与 Params,而是着眼于分析如何添加对 Intel CPU 友好的模块来提升模型的性能,这样可以更好的平衡准确率和推理时间,其中的实验结论也很适合其他网络结构设计的研究者,同时也为 NAS 搜索研究者提供了更小的搜索空间和一般结论。最终的 PP-LCNet 在产业界也可以更好的落地和应用。
<a name="6"></a> <a name="6"></a>
## 六、引用 ## 6. 引用
如果你的论文用到了PP-LCNet的方法,请添加如下cite: 如果你的论文用到了 PP-LCNet 的方法,请添加如下 cite:
``` ```
@misc{cui2021pplcnet, @misc{cui2021pplcnet,
title={PP-LCNet: A Lightweight CPU Convolutional Neural Network}, title={PP-LCNet: A Lightweight CPU Convolutional Neural Network},
......
# ReXNet系列 # ReXNet 系列
---
## 目录
## 概述 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
ReXNet是NAVER集团ClovaAI研发中心基于一种网络架构设计新范式而构建的网络。针对现有网络中存在的`Representational Bottleneck`问题,作者提出了一组新的设计原则。作者认为传统的网络架构设计范式会产生表达瓶颈,进而影响模型的性能。为研究此问题,作者研究了上万个随机网络生成特征的`matric rank`,同时进一步研究了网络层中通道配置方案。基于此,作者提出了一组简单而有效的设计原则,以消除表达瓶颈问题。[论文地址](https://arxiv.org/pdf/2007.00992.pdf) <a name='1'></a>
## 1. 概述
## 精度、FLOPS和参数量 ReXNet 是 NAVER 集团 ClovaAI 研发中心基于一种网络架构设计新范式而构建的网络。针对现有网络中存在的 `Representational Bottleneck` 问题,作者提出了一组新的设计原则。作者认为传统的网络架构设计范式会产生表达瓶颈,进而影响模型的性能。为研究此问题,作者研究了上万个随机网络生成特征的 `matric rank`,同时进一步研究了网络层中通道配置方案。基于此,作者提出了一组简单而有效的设计原则,以消除表达瓶颈问题。[论文地址](https://arxiv.org/pdf/2007.00992.pdf)
<a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1| FLOPS<br/>(G) | Params<br/>(M) | | Models | Top1 | Top5 | Reference<br>top1| FLOPS<br/>(G) | Params<br/>(M) |
|:--:|:--:|:--:|:--:|:--:|----| |:--:|:--:|:--:|:--:|:--:|----|
...@@ -15,4 +24,4 @@ ReXNet是NAVER集团ClovaAI研发中心基于一种网络架构设计新范式 ...@@ -15,4 +24,4 @@ ReXNet是NAVER集团ClovaAI研发中心基于一种网络架构设计新范式
| ReXNet_2_0 | 81.22 | 95.36 | 81.6 | 1.561 | 16.449 | | ReXNet_2_0 | 81.22 | 95.36 | 81.6 | 1.561 | 16.449 |
| ReXNet_3_0 | 82.09 | 96.12 | 82.8 | 3.445 | 34.833 | | ReXNet_3_0 | 82.09 | 96.12 | 82.8 | 3.445 | 34.833 |
关于Inference speed等信息,敬请期待。 关于 Inference speed 等信息,敬请期待。
# RedNet系列 # RedNet 系列
---
## 目录
## 概述 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
在 ResNet 的 Backbone 和 Backbone 的所有 Bottleneck 位置上使用 Involution 替换掉了卷积,但保留了所有的卷积用于通道映射和融合。这些精心重新设计的实体联合起来,形成了一种新的高效 Backbone 网络,称为 RedNet。[论文地址](https://arxiv.org/abs/2103.06255) <a name='1'></a>
## 1. 概述
在 ResNet 的 Backbone 和 Backbone 的所有 Bottleneck 位置上使用 Involution 替换掉了卷积,但保留了所有的卷积用于通道映射和融合。这些精心重新设计的实体联合起来,形成了一种新的高效 Backbone 网络,称为 RedNet。[论文地址](https://arxiv.org/abs/2103.06255)
## 精度、FLOPS和参数量 <a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Model | Params (M) | FLOPs (G) | Top-1 (%) | Top-5 (%) | | Model | Params (M) | FLOPs (G) | Top-1 (%) | Top-5 (%) |
|:---------------------:|:----------:|:---------:|:---------:|:---------:| |:---------------------:|:----------:|:---------:|:---------:|:---------:|
......
# RepVGG系列 # RepVGG 系列
---
## 目录
## 概述 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
RepVGG(Making VGG-style ConvNets Great Again)系列模型是由清华大学(丁贵广团队)、旷视科技(孙剑等人)、港科大和阿伯里斯特威斯大学在2021年提出的一个简单但强大的卷积神经网络架构,该架构具有类似于VGG的推理时间主体,该主体仅由3x3卷积和ReLU的堆栈组成,而训练时间模型具有多分支拓扑。训练时间和推理时间架构的这种解耦是通过结构重新参数化(re-parameterization)技术实现的,因此该模型称为RepVGG。[论文地址](https://arxiv.org/abs/2101.03697) <a name='1'></a>
## 概述
RepVGG(Making VGG-style ConvNets Great Again)系列模型是由清华大学(丁贵广团队)、旷视科技(孙剑等人)、港科大和阿伯里斯特威斯大学在 2021 年提出的一个简单但强大的卷积神经网络架构,该架构具有类似于 VGG 的推理时间主体,该主体仅由 3x3 卷积和 ReLU 的堆栈组成,而训练时间模型具有多分支拓扑。训练时间和推理时间架构的这种解耦是通过结构重新参数化(re-parameterization)技术实现的,因此该模型称为 RepVGG。[论文地址](https://arxiv.org/abs/2101.03697)
## 精度、FLOPS和参数量 <a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1| FLOPS<br>(G) | | Models | Top1 | Top5 | Reference<br>top1| FLOPS<br>(G) |
|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|
...@@ -20,4 +26,4 @@ RepVGG(Making VGG-style ConvNets Great Again)系列模型是由清华大学( ...@@ -20,4 +26,4 @@ RepVGG(Making VGG-style ConvNets Great Again)系列模型是由清华大学(
| RepVGG_B2g4 | 0.7881 | 0.9448 | 0.7938 | | | RepVGG_B2g4 | 0.7881 | 0.9448 | 0.7938 | |
| RepVGG_B3g4 | 0.7965 | 0.9485 | 0.8021 | | | RepVGG_B3g4 | 0.7965 | 0.9485 | 0.8021 | |
关于Params、FLOPs、Inference speed等信息,敬请期待。 关于 Params、FLOPs、Inference speed 等信息,敬请期待。
# ResNeSt与RegNet系列 # ResNeSt 与 RegNet 系列
----
## 目录
## 概述 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
* [3. 基于 T4 GPU 的预测速度](#3)
ResNeSt系列模型是在2020年提出的,在原有的resnet网络结构上做了改进,通过引入K个Group和在不同Group中加入类似于SEBlock的attention模块,使得精度相比于基础模型ResNet有了大幅度的提高,且参数量和flops与基础的ResNet基本保持一致。 <a name='1'></a>
RegNet是由facebook于2020年提出,旨在深化设计空间理念的概念,在AnyNetX的基础上逐步改进,通过加入共享瓶颈ratio、共享组宽度、调整网络深度与宽度等策略,最终实现简化设计空间结构、提高设计空间的可解释性、改善设计空间的质量,并保持设计空间的模型多样性的目的。最终设计出的模型在类似的条件下,性能还要优于EfficientNet,并且在GPU上的速度提高了5倍。 ## 1. 概述
ResNeSt 系列模型是在 2020 年提出的,在原有的 resnet 网络结构上做了改进,通过引入 K 个 Group 和在不同 Group 中加入类似于 SEBlock 的 attention 模块,使得精度相比于基础模型 ResNet 有了大幅度的提高,且参数量和 flops 与基础的 ResNet 基本保持一致。
## 精度、FLOPS和参数量 RegNet 是由 facebook 于 2020 年提出,旨在深化设计空间理念的概念,在 AnyNetX 的基础上逐步改进,通过加入共享瓶颈 ratio、共享组宽度、调整网络深度与宽度等策略,最终实现简化设计空间结构、提高设计空间的可解释性、改善设计空间的质量,并保持设计空间的模型多样性的目的。最终设计出的模型在类似的条件下,性能还要优于 EfficientNet,并且在 GPU 上的速度提高了 5 倍。
<a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -15,8 +24,9 @@ RegNet是由facebook于2020年提出,旨在深化设计空间理念的概念 ...@@ -15,8 +24,9 @@ RegNet是由facebook于2020年提出,旨在深化设计空间理念的概念
| ResNeSt50 | 0.8083 | 0.9542| 0.8113 | -| 10.78 | 27.5 | | ResNeSt50 | 0.8083 | 0.9542| 0.8113 | -| 10.78 | 27.5 |
| RegNetX_4GF | 0.7850 | 0.9416| 0.7860 | -| 8.0 | 22.1 | | RegNetX_4GF | 0.7850 | 0.9416| 0.7860 | -| 8.0 | 22.1 |
<a name='3'></a>
## 基于T4 GPU的预测速度 ## 3. 基于 T4 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) | | Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) |
|--------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------| |--------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|
......
# ResNet及其Vd系列 # ResNet 及其 Vd 系列
-----
## 目录
## 概述 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
* [3. 基于 V100 GPU 的预测速度](#3)
* [4. 基于 T4 GPU 的预测速度](#4)
ResNet系列模型是在2015年提出的,一举在ILSVRC2015比赛中取得冠军,top5错误率为3.57%。该网络创新性的提出了残差结构,通过堆叠多个残差结构从而构建了ResNet网络。实验表明使用残差块可以有效地提升收敛速度和精度。 <a name='1'></a>
斯坦福大学的Joyce Xu将ResNet称为「真正重新定义了我们看待神经网络的方式」的三大架构之一。由于ResNet卓越的性能,越来越多的来自学术界和工业界学者和工程师对其结构进行了改进,比较出名的有Wide-ResNet, ResNet-vc ,ResNet-vd, Res2Net等,其中ResNet-vc与ResNet-vd的参数量和计算量与ResNet几乎一致,所以在此我们将其与ResNet统一归为ResNet系列。 ## 1. 概述
本次发布ResNet系列的模型包括ResNet50,ResNet50_vd,ResNet50_vd_ssld,ResNet200_vd等14个预训练模型。在训练层面上,ResNet的模型采用了训练ImageNet的标准训练流程,而其余改进版模型采用了更多的训练策略,如learning rate的下降方式采用了cosine decay,引入了label smoothing的标签正则方式,在数据预处理加入了mixup的操作,迭代总轮数从120个epoch增加到200个epoch ResNet 系列模型是在 2015 年提出的,一举在 ILSVRC2015 比赛中取得冠军,top5 错误率为 3.57%。该网络创新性的提出了残差结构,通过堆叠多个残差结构从而构建了 ResNet 网络。实验表明使用残差块可以有效地提升收敛速度和精度
其中,ResNet50_vd_v2与ResNet50_vd_ssld采用了知识蒸馏,保证模型结构不变的情况下,进一步提升了模型的精度,具体地,ResNet50_vd_v2的teacher模型是ResNet152_vd(top1准确率80.59%),数据选用的是ImageNet-1k的训练集,ResNet50_vd_ssld的teacher模型是ResNeXt101_32x16d_wsl(top1准确率84.2%),数据选用结合了ImageNet-1k的训练集和ImageNet-22k挖掘的400万数据。知识蒸馏的具体方法正在持续更新中 斯坦福大学的 Joyce Xu 将 ResNet 称为「真正重新定义了我们看待神经网络的方式」的三大架构之一。由于 ResNet 卓越的性能,越来越多的来自学术界和工业界学者和工程师对其结构进行了改进,比较出名的有 Wide-ResNet, ResNet-vc,ResNet-vd, Res2Net 等,其中 ResNet-vc 与 ResNet-vd 的参数量和计算量与 ResNet 几乎一致,所以在此我们将其与 ResNet 统一归为 ResNet 系列
该系列模型的FLOPS、参数量以及T4 GPU上的预测耗时如下图所示。 本次发布 ResNet 系列的模型包括 ResNet50,ResNet50_vd,ResNet50_vd_ssld,ResNet200_vd 等 14 个预训练模型。在训练层面上,ResNet 的模型采用了训练 ImageNet 的标准训练流程,而其余改进版模型采用了更多的训练策略,如 learning rate 的下降方式采用了 cosine decay,引入了 label smoothing 的标签正则方式,在数据预处理加入了 mixup 的操作,迭代总轮数从 120 个 epoch 增加到 200 个 epoch。
其中,ResNet50_vd_v2 与 ResNet50_vd_ssld 采用了知识蒸馏,保证模型结构不变的情况下,进一步提升了模型的精度,具体地,ResNet50_vd_v2 的 teacher 模型是 ResNet152_vd(top1 准确率 80.59%),数据选用的是 ImageNet-1k 的训练集,ResNet50_vd_ssld 的 teacher 模型是 ResNeXt101_32x16d_wsl(top1 准确率 84.2%),数据选用结合了 ImageNet-1k 的训练集和 ImageNet-22k 挖掘的 400 万数据。知识蒸馏的具体方法正在持续更新中。
该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
![](../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.flops.png) ![](../../images/models/T4_benchmark/t4.fp32.bs4.ResNet.flops.png)
...@@ -21,10 +30,10 @@ ResNet系列模型是在2015年提出的,一举在ILSVRC2015比赛中取得冠 ...@@ -21,10 +30,10 @@ ResNet系列模型是在2015年提出的,一举在ILSVRC2015比赛中取得冠
![](../../images/models/T4_benchmark/t4.fp16.bs4.ResNet.png) ![](../../images/models/T4_benchmark/t4.fp16.bs4.ResNet.png)
通过上述曲线可以看出,层数越多,准确率越高,但是相应的参数量、计算量和延时都会增加。ResNet50_vd_ssld通过用更强的teacher和更多的数据,将其在ImageNet-1k上的验证集top-1精度进一步提高,达到了82.39%,刷新了ResNet50系列模型的精度。 通过上述曲线可以看出,层数越多,准确率越高,但是相应的参数量、计算量和延时都会增加。ResNet50_vd_ssld 通过用更强的 teacher 和更多的数据,将其在 ImageNet-1k 上的验证集 top-1 精度进一步提高,达到了 82.39%,刷新了 ResNet50 系列模型的精度。
## 精度、FLOPS和参数量 <a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -47,11 +56,12 @@ ResNet系列模型是在2015年提出的,一举在ILSVRC2015比赛中取得冠 ...@@ -47,11 +56,12 @@ ResNet系列模型是在2015年提出的,一举在ILSVRC2015比赛中取得冠
| Fix_ResNet50_vd_ssld_v2 | 0.840 | 0.970 | | | 17.696 | 25.580 | | Fix_ResNet50_vd_ssld_v2 | 0.840 | 0.970 | | | 17.696 | 25.580 |
| ResNet101_vd_ssld | 0.837 | 0.967 | | | 16.100 | 44.570 | | ResNet101_vd_ssld | 0.837 | 0.967 | | | 16.100 | 44.570 |
* 注:`ResNet50_vd_ssld_v2`是在`ResNet50_vd_ssld`训练策略的基础上加上AutoAugment训练得到,`Fix_ResNet50_vd_ssld_v2`是固定`ResNet50_vd_ssld_v2`除FC层外所有的网络参数,在320x320的图像输入分辨率下,基于ImageNet1k数据集微调得到。 * 注:`ResNet50_vd_ssld_v2` 是在 `ResNet50_vd_ssld` 训练策略的基础上加上 AutoAugment 训练得到,`Fix_ResNet50_vd_ssld_v2` 是固定 `ResNet50_vd_ssld_v2` 除 FC 层外所有的网络参数,在 320x320 的图像输入分辨率下,基于 ImageNet1k 数据集微调得到。
<a name='3'></a>
## 基于V100 GPU的预测速度 ## 3. 基于 V100 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) | | Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) |
|------------------|-----------|-------------------|--------------------------| |------------------|-----------|-------------------|--------------------------|
...@@ -72,8 +82,9 @@ ResNet系列模型是在2015年提出的,一举在ILSVRC2015比赛中取得冠 ...@@ -72,8 +82,9 @@ ResNet系列模型是在2015年提出的,一举在ILSVRC2015比赛中取得冠
| ResNet50_vd_ssld | 224 | 256 | 3.165 | | ResNet50_vd_ssld | 224 | 256 | 3.165 |
| ResNet101_vd_ssld | 224 | 256 | 5.252 | | ResNet101_vd_ssld | 224 | 256 | 5.252 |
<a name='4'></a>
## 基于T4 GPU的预测速度 ## 4. 基于 T4 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) | | Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) |
|-------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------| |-------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|
......
# SEResNeXt与Res2Net系列 # SEResNeXt 与 Res2Net 系列
## 概述 -----
ResNeXt是ResNet的典型变种网络之一,ResNeXt发表于2017年的CVPR会议。在此之前,提升模型精度的方法主要集中在将网络变深或者变宽,这样增加了参数量和计算量,推理速度也会相应变慢。ResNeXt结构提出了通道分组(cardinality)的概念,作者通过实验发现增加通道的组数比增加深度和宽度更有效。其可以在不增加参数复杂度的前提下提高准确率,同时还减少了参数的数量,所以是比较成功的ResNet的变种。 ## 目录
SENet是2017年ImageNet分类比赛的冠军方案,其提出了一个全新的SE结构,该结构可以迁移到任何其他网络中,其通过控制scale的大小,把每个通道间重要的特征增强,不重要的特征减弱,从而让提取的特征指向性更强。 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
* [3. 基于 V100 GPU 的预测速度](#3)
* [4. 基于 T4 GPU 的预测速度](#4)
Res2Net是2019年提出的一种全新的对ResNet的改进方案,该方案可以和现有其他优秀模块轻松整合,在不增加计算负载量的情况下,在ImageNet、CIFAR-100等数据集上的测试性能超过了ResNet。Res2Net结构简单,性能优越,进一步探索了CNN在更细粒度级别的多尺度表示能力。Res2Net揭示了一个新的提升模型精度的维度,即scale,其是除了深度、宽度和基数的现有维度之外另外一个必不可少的更有效的因素。该网络在其他视觉任务如目标检测、图像分割等也有相当不错的表现。 <a name='1'></a>
该系列模型的FLOPS、参数量以及T4 GPU上的预测耗时如下图所示。 ## 1. 概述
ResNeXt 是 ResNet 的典型变种网络之一,ResNeXt 发表于 2017 年的 CVPR 会议。在此之前,提升模型精度的方法主要集中在将网络变深或者变宽,这样增加了参数量和计算量,推理速度也会相应变慢。ResNeXt 结构提出了通道分组(cardinality)的概念,作者通过实验发现增加通道的组数比增加深度和宽度更有效。其可以在不增加参数复杂度的前提下提高准确率,同时还减少了参数的数量,所以是比较成功的 ResNet 的变种。
SENet 是 2017 年 ImageNet 分类比赛的冠军方案,其提出了一个全新的 SE 结构,该结构可以迁移到任何其他网络中,其通过控制 scale 的大小,把每个通道间重要的特征增强,不重要的特征减弱,从而让提取的特征指向性更强。
Res2Net 是 2019 年提出的一种全新的对 ResNet 的改进方案,该方案可以和现有其他优秀模块轻松整合,在不增加计算负载量的情况下,在 ImageNet、CIFAR-100 等数据集上的测试性能超过了 ResNet。Res2Net 结构简单,性能优越,进一步探索了 CNN 在更细粒度级别的多尺度表示能力。Res2Net 揭示了一个新的提升模型精度的维度,即 scale,其是除了深度、宽度和基数的现有维度之外另外一个必不可少的更有效的因素。该网络在其他视觉任务如目标检测、图像分割等也有相当不错的表现。
该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
![](../../images/models/T4_benchmark/t4.fp32.bs4.SeResNeXt.flops.png) ![](../../images/models/T4_benchmark/t4.fp32.bs4.SeResNeXt.flops.png)
...@@ -19,11 +29,12 @@ Res2Net是2019年提出的一种全新的对ResNet的改进方案,该方案可 ...@@ -19,11 +29,12 @@ Res2Net是2019年提出的一种全新的对ResNet的改进方案,该方案可
![](../../images/models/T4_benchmark/t4.fp16.bs4.SeResNeXt.png) ![](../../images/models/T4_benchmark/t4.fp16.bs4.SeResNeXt.png)
目前PaddleClas开源的这三类的预训练模型一共有24个,其指标如图所示,从图中可以看出,在同样Flops和Params下,改进版的模型往往有更高的精度,但是推理速度往往不如ResNet系列。另一方面,Res2Net表现也较为优秀,相比ResNeXt中的group操作、SEResNet中的SE结构操作,Res2Net在相同Flops、Params和推理速度下往往精度更佳。 目前 PaddleClas 开源的这三类的预训练模型一共有 24 个,其指标如图所示,从图中可以看出,在同样 Flops 和 Params 下,改进版的模型往往有更高的精度,但是推理速度往往不如 ResNet 系列。另一方面,Res2Net 表现也较为优秀,相比 ResNeXt 中的 group 操作、SEResNet 中的 SE 结构操作,Res2Net 在相同 Flops、Params 和推理速度下往往精度更佳。
<a name='2'></a>
## 精度、FLOPS和参数量 ## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -56,8 +67,9 @@ Res2Net是2019年提出的一种全新的对ResNet的改进方案,该方案可 ...@@ -56,8 +67,9 @@ Res2Net是2019年提出的一种全新的对ResNet的改进方案,该方案可
| SENet154_vd | 0.814 | 0.955 | | | 45.830 | 114.290 | | SENet154_vd | 0.814 | 0.955 | | | 45.830 | 114.290 |
<a name='3'></a>
## 基于V100 GPU的预测速度 ## 3. 基于 V100 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) | | Models | Crop Size | Resize Short Size | FP32<br>Batch Size=1<br>(ms) |
|-----------------------|-----------|-------------------|--------------------------| |-----------------------|-----------|-------------------|--------------------------|
...@@ -87,7 +99,9 @@ Res2Net是2019年提出的一种全新的对ResNet的改进方案,该方案可 ...@@ -87,7 +99,9 @@ Res2Net是2019年提出的一种全新的对ResNet的改进方案,该方案可
| SENet154_vd | 224 | 256 | 50.406 | | SENet154_vd | 224 | 256 | 50.406 |
## 基于T4 GPU的预测速度 <a name='4'></a>
## 4. 基于 T4 GPU 的预测速度
| Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) | | Models | Crop Size | Resize Short Size | FP16<br>Batch Size=1<br>(ms) | FP16<br>Batch Size=4<br>(ms) | FP16<br>Batch Size=8<br>(ms) | FP32<br>Batch Size=1<br>(ms) | FP32<br>Batch Size=4<br>(ms) | FP32<br>Batch Size=8<br>(ms) |
|-----------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------| |-----------------------|-----------|-------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|------------------------------|
......
# SwinTransformer # SwinTransformer
---
## 目录
## 概述 * [1. 概述](#1)
Swin Transformer 是一种新的视觉Transformer网络,可以用作计算机视觉领域的通用骨干网路。SwinTransformer由移动窗口(shifted windows)表示的层次Transformer结构组成。移动窗口将自注意计算限制在非重叠的局部窗口上,同时允许跨窗口连接,从而提高了网络性能。[论文地址](https://arxiv.org/abs/2103.14030) * [2. 精度、FLOPS 和参数量](#2)
<a name='1'></a>
## 精度、FLOPS和参数量 ## 1. 概述
Swin Transformer 是一种新的视觉 Transformer 网络,可以用作计算机视觉领域的通用骨干网路。SwinTransformer 由移动窗口(shifted windows)表示的层次 Transformer 结构组成。移动窗口将自注意计算限制在非重叠的局部窗口上,同时允许跨窗口连接,从而提高了网络性能。[论文地址](https://arxiv.org/abs/2103.14030)
<a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Params<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Params<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -17,6 +25,6 @@ Swin Transformer 是一种新的视觉Transformer网络,可以用作计算机 ...@@ -17,6 +25,6 @@ Swin Transformer 是一种新的视觉Transformer网络,可以用作计算机
| SwinTransformer_large_patch4_window7_224<sup>[1]</sup> | 0.8596 | 0.9783 | 0.863 | 0.979 | 34.5 | 197 | | SwinTransformer_large_patch4_window7_224<sup>[1]</sup> | 0.8596 | 0.9783 | 0.863 | 0.979 | 34.5 | 197 |
| SwinTransformer_large_patch4_window12_384<sup>[1]</sup> | 0.8719 | 0.9823 | 0.873 | 0.982 | 103.9 | 197 | | SwinTransformer_large_patch4_window12_384<sup>[1]</sup> | 0.8719 | 0.9823 | 0.873 | 0.982 | 103.9 | 197 |
[1]:基于ImageNet22k数据集预训练,然后在ImageNet1k数据集迁移学习得到。 [1]:基于 ImageNet22k 数据集预训练,然后在 ImageNet1k 数据集迁移学习得到。
**注**:与Reference的精度差异源于数据预处理不同。 **注**:与 Reference 的精度差异源于数据预处理不同。
# TNT系列 # TNT 系列
---
## 目录
## 概述 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
TNT(Transformer-iN-Transformer)系列模型由华为诺亚于2021年提出,用于对 patch 级别和 pixel 级别的表示进行建模。在每个 TNT 块中,outer transformer block 用于处理 patch 嵌入,inner transformer block 从 pixel 嵌入中提取局部特征。通过线性变换层将 pixel 级特征投影到 patch 嵌入空间,然后加入到 patch 中。通过对 TNT 块的叠加,建立了用于图像识别的 TNT 模型。在ImageNet 基准测试和下游任务上的实验证明了该 TNT 体系结构的优越性和有效性。例如,在计算量相当的情况下 TNT 能在 ImageNet 上达到 81.3% 的 top-1 精度,比 DeiT 高 1.5%。[论文地址](https://arxiv.org/abs/2103.00112) <a name='1'></a>
## 1. 概述
## 精度、FLOPS和参数量 TNT(Transformer-iN-Transformer)系列模型由华为诺亚于 2021 年提出,用于对 patch 级别和 pixel 级别的表示进行建模。在每个 TNT 块中,outer transformer block 用于处理 patch 嵌入,inner transformer block 从 pixel 嵌入中提取局部特征。通过线性变换层将 pixel 级特征投影到 patch 嵌入空间,然后加入到 patch 中。通过对 TNT 块的叠加,建立了用于图像识别的 TNT 模型。在 ImageNet 基准测试和下游任务上的实验证明了该 TNT 体系结构的优越性和有效性。例如,在计算量相当的情况下 TNT 能在 ImageNet 上达到 81.3% 的 top-1 精度,比 DeiT 高 1.5%。[论文地址](https://arxiv.org/abs/2103.00112)
<a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Model | Params (M) | FLOPs (G) | Top-1 (%) | Top-5 (%) | | Model | Params (M) | FLOPs (G) | Top-1 (%) | Top-5 (%) |
|:---------------------:|:----------:|:---------:|:---------:|:---------:| |:---------------------:|:----------:|:---------:|:---------:|:---------:|
......
# 训练技巧 # 训练技巧
---
## 目录
* [1.优化器的选择](#1)
* [2.学习率以及学习率下降策略的选择](#2)
* [2.1 学习率的概念](#2.1)
* [2.2 学习率下降策略](#2.2)
* [2.3 warmup 策略](#2.3)
* [3.batch_size 的选择](#3)
* [4.weight_decay 的选择](#4)
* [5.label_smoothing 的选择](#5)
* [6.针对小模型更改图片的 crop 面积与拉伸变换程度](#6)
* [7.使用数据增广方式提升精度](#7)
* [8. 通过 train_acc 和 test_acc 确定调优策略](#8)
* [9.通过已有的预训练模型提升自己的数据集的精度](#9)
* [10. 参考文献](#10)
<a name='1'></a>
## 1.优化器的选择 ## 1.优化器的选择
自深度学习发展以来,就有很多关于优化器的研究者工作,优化器的目的是为了让损失函数尽可能的小,从而找到合适的参数来完成某项任务。目前业界主要用到的优化器有SGD、RMSProp、Adam、AdaDelt等,其中由于带momentum的SGD优化器广泛应用于学术界和工业界,所以我们发布的模型也大都使用该优化器来实现损失函数的梯度下降。带momentum的SGD优化器有两个劣势,其一是收敛速度慢,其二是初始学习率的设置需要依靠大量的经验,然而如果初始学习率设置得当并且迭代轮数充足,该优化器也会在众多的优化器中脱颖而出,使得其在验证集上获得更高的准确率。一些自适应学习率的优化器如Adam、RMSProp等,收敛速度往往比较快,但是最终的收敛精度会稍差一些。如果追求更快的收敛速度,我们推荐使用这些自适应学习率的优化器,如果追求更高的收敛精度,我们推荐使用带momentum的SGD优化器。 自深度学习发展以来,就有很多关于优化器的研究者工作,优化器的目的是为了让损失函数尽可能的小,从而找到合适的参数来完成某项任务。目前业界主要用到的优化器 有 SGD、RMSProp、Adam、AdaDelt 等,其中由于带 momentum 的 SGD 优化器广泛应用于学术界和工业界,所以我们发布的模型也大都使用该优化器来实现损失函数的梯度下降。带 momentum 的 SGD 优化器有两个劣势,其一是收敛速度慢,其二是初始学习率的设置需要依靠大量的经验,然而如果初始学习率设置得当并且迭代轮数充足,该优化器也会在众多的优化器中脱颖而出,使得其在验证集上获得更高的准确率。一些自适应学习率的优化器如 Adam、RMSProp 等,收敛速度往往比较快,但是最终的收敛精度会稍差一些。如果追求更快的收敛速度,我们推荐使用这些自适应学习率的优化器,如果追求更高的收敛精度,我们推荐使用带 momentum 的 SGD 优化器。
<a name='2'></a>
## 2.学习率以及学习率下降策略的选择 ## 2.学习率以及学习率下降策略的选择
学习率的选择往往和优化器以及数据和任务有关系。这里主要介绍以momentum+SGD作为优化器训练ImageNet-1k的学习率以及学习率下降的选择。 学习率的选择往往和优化器以及数据和任务有关系。这里主要介绍以 momentum+SGD 作为优化器训练 ImageNet-1k 的学习率以及学习率下降的选择。
<a name='2.1'></a>
### 学习率的概念: ### 2.1 学习率的概念:
学习率是通过损失函数的梯度调整网络权重的超参数的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。 学习率是通过损失函数的梯度调整网络权重的超参数的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。
### 学习率下降策略: <a name='2.2'></a>
在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是piecewise_decay,即阶梯式下降学习率,如在ResNet50标准的训练中,我们设置的初始学习率是0.1,每30epoch学习率下降到原来的1/10,一共迭代120epoch。除了piecewise_decay,很多研究者也提出了学习率的其他下降方式,如polynomial_decay(多项式下降)、exponential_decay(指数下降),cosine_decay(余弦下降)等,其中cosine_decay无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay和piecewise_decay的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较peicewise_decay更好一些。
### 2.2 学习率下降策略:
在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是 piecewise_decay,即阶梯式下降学习率,如在 ResNet50 标准的训练中,我们设置的初始学习率是 0.1,每 30 epoch 学习率下降到原来的 1/10,一共迭代 120 epoch。除了 piecewise_decay,很多研究者也提出了学习率的其他下降方式,如 polynomial_decay(多项式下降)、exponential_decay(指数下降),cosine_decay(余弦下降)等,其中 cosine_decay 无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay 和 piecewise_decay 的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay 都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较 peicewise_decay 更好一些。
![](../../images/models/lr_decay.jpeg) ![](../../images/models/lr_decay.jpeg)
另外,从图中我们也可以看到,cosine_decay里学习率小的轮数较少,这样会影响到最终的精度,所以为了使得cosine_decay发挥更好的效果,建议迭代更多的轮数,如200轮。 另外,从图中我们也可以看到,cosine_decay 里学习率小的轮数较少,这样会影响到最终的精度,所以为了使得 cosine_decay 发挥更好的效果,建议迭代更多的轮数,如 200 轮。
<a name='2.3'></a>
### 2.3 warmup 策略
如果使用较大的 batch_size 训练神经网络时,我们建议您使用 warmup 策略。Warmup 策略顾名思义就是让学习率先预热一下,在训练初期我们不直接使用最大的学习率,而是用一个逐渐增大的学习率去训练网络,当学习率增大到最高点时,再使用学习率下降策略中提到的学习率下降方式衰减学习率的值。实验表明,在 batch_size 较大时,warmup 可以稳定提升模型的精度。在训练 MobileNetV3 等 batch_size 较大的实验中,我们默认将 warmup 中的 epoch 设置为 5,即先用 5 epoch 将学习率从 0 增加到最大值,再去做相应的学习率衰减。
<a name='3'></a>
### warmup策略 ## 3.batch_size 的选择
如果使用较大的batch_size训练神经网络时,我们建议您使用warmup策略。Warmup策略顾名思义就是让学习率先预热一下,在训练初期我们不直接使用最大的学习率,而是用一个逐渐增大的学习率去训练网络,当学习率增大到最高点时,再使用学习率下降策略中提到的学习率下降方式衰减学习率的值。实验表明,在batch_size较大时,warmup可以稳定提升模型的精度。在训练MobileNetV3等batch_size较大的实验中,我们默认将warmup中的epoch设置为5,即先用5epoch将学习率从0增加到最大值,再去做相应的学习率衰减 batch_size 是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络参与训练。在论文[1]中,作者通过实验发现,当 batch_size 的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练 ImageNet 数据时,大部分的神经网络选择的初始学习率为 0.1,batch_size 是 256,所以根据实际的模型大小和显存情况,可以将学习率设置为 0.1\*k,batch_size 设置为 256\*k
## 3.batch_size的选择 <a name='4'></a>
batch_size是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络参与训练。在论文[1]中,作者通过实验发现,当batch_size的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练ImageNet数据时,大部分的神经网络选择的初始学习率为0.1,batch_size是256,所以根据实际的模型大小和显存情况,可以将学习率设置为0.1\*k,batch_size设置为256\*k。
## 4.weight_decay的选择 ## 4.weight_decay 的选择
过拟合是机器学习中常见的一个名词,简单理解即为模型在训练数据上表现很好,但在测试数据上表现较差,在卷积神经网络中,同样存在过拟合的问题,为了避免过拟合,很多正则方式被提出,其中,weight_decay是其中一个广泛使用的避免过拟合的方式。Weight_decay等价于在最终的损失函数后添加L2正则化,L2正则化使得网络的权重倾向于选择更小的值,最终整个网络中的参数值更趋向于0,模型的泛化性能相应提高。在各大深度学习框架的实现中,该值表达的含义是L2正则前的系数,在paddle框架中,该值的名称是l2_decay,所以以下都称其为l2_decay。该系数越大,表示加入的正则越强,模型越趋于欠拟合状态。在训练ImageNet的任务中,大多数的网络将该参数值设置为1e-4,在一些小的网络如MobileNet系列网络中,为了避免网络欠拟合,该值设置为1e-5~4e-5之间。当然,该值的设置也和具体的数据集有关系,当任务的数据集较大时,网络本身趋向于欠拟合状态,可以将该值适当减小,当任务的数据集较小时,网络本身趋向于过拟合状态,可以将该值适当增大。下表展示了MobileNetV1_x0_25在ImageNet-1k上使用不同l2_decay的精度情况。由于MobileNetV1_x0_25是一个比较小的网络,所以l2_decay过大会使网络趋向于欠拟合状态,所以在该网络中,相对1e-4,3e-5是更好的选择。 过拟合是机器学习中常见的一个名词,简单理解即为模型在训练数据上表现很好,但在测试数据上表现较差,在卷积神经网络中,同样存在过拟合的问题,为了避免过拟合,很多正则方式被提出,其中,weight_decay 是其中一个广泛使用的避免过拟合的方式。Weight_decay 等价于在最终的损失函数后添加 L2 正则化,L2 正则化使得网络的权重倾向于选择更小的值,最终整个网络中的参数值更趋向于 0,模型的泛化性能相应提高。在各大深度学习框架的实现中,该值表达的含义是 L2 正则前的系数,在 paddle 框架中,该值的名称是 l2_decay,所以以下都称其为 l2_decay。该系数越大,表示加入的正则越强,模型越趋于欠拟合状态。在训练 ImageNet 的任务中,大多数的网络将该参数值设置为 1e-4,在一些小的网络如 MobileNet 系列网络中,为了避免网络欠拟合,该值设置为 1e-5~4e-5 之间。当然,该值的设置也和具体的数据集有关系,当任务的数据集较大时,网络本身趋向于欠拟合状态,可以将该值适当减小,当任务的数据集较小时,网络本身趋向于过拟合状态,可以将该值适当增大。下表展示了 MobileNetV1_x0_25 在 ImageNet-1k 上使用不同 l2_decay 的精度情况。由于 MobileNetV1_x0_25 是一个比较小的网络,所以 l2_decay 过大会使网络趋向于欠拟合状态,所以在该网络中,相对 1e-4,3e-5 是更好的选择。
| 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 | | 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| MobileNetV1_x0_25 | 1e-4 | 43.79%/67.61% | 50.41%/74.70% | | MobileNetV1_x0_25 | 1e-4 | 43.79%/67.61% | 50.41%/74.70% |
| MobileNetV1_x0_25 | 3e-5 | 47.38%/70.83% | 51.45%/75.45% | | MobileNetV1_x0_25 | 3e-5 | 47.38%/70.83% | 51.45%/75.45% |
另外,该值的设置也和训练过程中是否使用其他正则化有关系。如果训练过程中的数据预处理比较复杂,相当于训练任务变的更难,可以将该值适当减小,下表展示了在ImageNet-1k上,ResNet50在使用randaugment预处理方式后使用不同l2_decay的精度。容易观察到,在任务变难后,使用更小的l2_decay有助于模型精度的提升。 另外,该值的设置也和训练过程中是否使用其他正则化有关系。如果训练过程中的数据预处理比较复杂,相当于训练任务变的更难,可以将该值适当减小,下表展示了在 ImageNet-1k 上,ResNet50 在使用 randaugment 预处理方式后使用不同 l2_decay 的精度。容易观察到,在任务变难后,使用更小的 l2_decay 有助于模型精度的提升。
| 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 | | 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| ResNet50 | 1e-4 | 75.13%/90.42% | 77.65%/93.79% | | ResNet50 | 1e-4 | 75.13%/90.42% | 77.65%/93.79% |
| ResNet50 | 7e-5 | 75.56%/90.55% | 78.04%/93.74% | | ResNet50 | 7e-5 | 75.56%/90.55% | 78.04%/93.74% |
综上所述,l2_decay可以根据具体的任务和模型去做相应的调整,通常简单的任务或者较大的模型,推荐使用较大的l2_decay,复杂的任务或者较小的模型,推荐使用较小的l2_decay。 综上所述,l2_decay 可以根据具体的任务和模型去做相应的调整,通常简单的任务或者较大的模型,推荐使用较大的 l2_decay,复杂的任务或者较小的模型,推荐使用较小的 l2_decay。
## 5.label_smoothing的选择 <a name='5'></a>
Label_smoothing是深度学习中的一种正则化方法,其全称是 Label Smoothing Regularization(LSR),即标签平滑正则化。在传统的分类任务计算损失函数时,是将真实的one hot标签与神经网络的输出做相应的交叉熵计算,而label_smoothing是将真实的one hot标签做一个标签平滑的处理,使得网络学习的标签不再是一个hard label,而是一个有概率值的soft label,其中在类别对应的位置的概率最大,其他位置概率是一个非常小的数。具体的计算方式参见论文[2]。在label_smoothing里,有一个epsilon的参数值,该值描述了将标签软化的程度,该值越大,经过label smoothing后的标签向量的标签概率值越小,标签越平滑,反之,标签越趋向于hard label,在训练ImageNet-1k的实验里通常将该值设置为0.1。
在训练ImageNet-1k的实验中,我们发现,ResNet50大小级别及其以上的模型在使用label_smooting后,精度有稳定的提升。下表展示了ResNet50_vd在使用label_smoothing前后的精度指标。 ## 5.label_smoothing 的选择
Label_smoothing 是深度学习中的一种正则化方法,其全称是 Label Smoothing Regularization(LSR),即标签平滑正则化。在传统的分类任务计算损失函数时,是将真实的 one hot 标签与神经网络的输出做相应的交叉熵计算,而 label_smoothing 是将真实的 one hot 标签做一个标签平滑的处理,使得网络学习的标签不再是一个 hard label,而是一个有概率值的 soft label,其中在类别对应的位置的概率最大,其他位置概率是一个非常小的数。具体的计算方式参见论文[2]。在 label_smoothing 里,有一个 epsilon 的参数值,该值描述了将标签软化的程度,该值越大,经过 label smoothing 后的标签向量的标签概率值越小,标签越平滑,反之,标签越趋向于 hard label,在训练 ImageNet-1k 的实验里通常将该值设置为 0.1。
在训练 ImageNet-1k 的实验中,我们发现,ResNet50 大小级别及其以上的模型在使用 label_smooting 后,精度有稳定的提升。下表展示了 ResNet50_vd 在使用 label_smoothing 前后的精度指标。
| 模型 | Use_label_smoothing | Test acc1 | | 模型 | Use_label_smoothing | Test acc1 |
|:--:|:--:|:--:| |:--:|:--:|:--:|
| ResNet50_vd | 0 | 77.9% | | ResNet50_vd | 0 | 77.9% |
| ResNet50_vd | 1 | 78.4% | | ResNet50_vd | 1 | 78.4% |
同时,由于label_smoohing相当于一种正则方式,在相对较小的模型上,精度提升不明显甚至会有所下降,下表展示了ResNet18在ImageNet-1k上使用label_smoothing前后的精度指标。可以明显看到,在使用label_smoothing后,精度有所下降。 同时,由于 label_smoohing 相当于一种正则方式,在相对较小的模型上,精度提升不明显甚至会有所下降,下表展示了 ResNet18 在 ImageNet-1k 上使用 label_smoothing 前后的精度指标。可以明显看到,在使用 label_smoothing 后,精度有所下降。
| 模型 | Use_label_smoohing | Train acc1/acc5 | Test acc1/acc5 | | 模型 | Use_label_smoohing | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
...@@ -56,18 +87,22 @@ Label_smoothing是深度学习中的一种正则化方法,其全称是 Label S ...@@ -56,18 +87,22 @@ Label_smoothing是深度学习中的一种正则化方法,其全称是 Label S
| ResNet18 | 1 | 68.00%/86.56% | 70.81%/89.89% | | ResNet18 | 1 | 68.00%/86.56% | 70.81%/89.89% |
综上所述,较大的模型使用label_smoohing可以有效提升模型的精度,较小的模型使用label_smoohing可能会降低模型的精度,所以在决定是否使用label_smoohing前,需要评估模型的大小和任务的难易程度。 综上所述,较大的模型使用 label_smoohing 可以有效提升模型的精度,较小的模型使用 label_smoohing 可能会降低模型的精度,所以在决定是否使用 label_smoohing 前,需要评估模型的大小和任务的难易程度。
<a name='6'></a>
## 6.针对小模型更改图片的crop面积与拉伸变换程度 ## 6.针对小模型更改图片的 crop 面积与拉伸变换程度
ImageNet-1k数据的标准预处理中,random_crop函数中定义了scale和ratio两个值,两个值分别确定了图片crop的大小和图片的拉伸程度,其中scale的默认取值范围是0.08-1(lower_scale-upper_scale),ratio的默认取值范围是3/4-4/3(lower_ratio-upper_ratio)。在非常小的网络训练中,此类数据增强会使得网络欠拟合,导致精度有所下降。为了提升网络的精度,可以使其数据增强变的更弱,即增大图片的crop区域或者减弱图片的拉伸变换程度。我们可以分别通过增大lower_scale的值或缩小lower_ratio与upper_scale的差距来实现更弱的图片变换。下表列出了使用不同lower_scale训练MobileNetV2_x0_25的精度,可以看到,增大图片的crop区域面积后训练精度和验证精度均有提升。 ImageNet-1k 数据的标准预处理中,random_crop 函数中定义了 scale 和 ratio 两个值,两个值分别确定了图片 crop 的大小和图片的拉伸程度,其中 scale 的默认取值范围是 0.08-1(lower_scale-upper_scale),ratio 的默认取值范围是 3/4-4/3(lower_ratio-upper_ratio)。在非常小的网络训练中,此类数据增强会使得网络欠拟合,导致精度有所下降。为了提升网络的精度,可以使其数据增强变的更弱,即增大图片的 crop 区域或者减弱图片的拉伸变换程度。我们可以分别通过增大 lower_scale 的值或缩小 lower_ratio 与 upper_scale 的差距来实现更弱的图片变换。下表列出了使用不同 lower_scale 训练 MobileNetV2_x0_25 的精度,可以看到,增大图片的 crop 区域面积后训练精度和验证精度均有提升。
| 模型 | Scale取值范围 | Train_acc1/acc5 | Test_acc1/acc5 | | 模型 | Scale 取值范围 | Train_acc1/acc5 | Test_acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| MobileNetV2_x0_25 | [0.08,1] | 50.36%/72.98% | 52.35%/75.65% | | MobileNetV2_x0_25 | [0.08,1] | 50.36%/72.98% | 52.35%/75.65% |
| MobileNetV2_x0_25 | [0.2,1] | 54.39%/77.08% | 53.18%/76.14% | | MobileNetV2_x0_25 | [0.2,1] | 54.39%/77.08% | 53.18%/76.14% |
<a name='7'></a>
## 7.使用数据增广方式提升精度 ## 7.使用数据增广方式提升精度
一般来说,数据集的规模对性能影响至关重要,但是图片的标注往往比较昂贵,所以有标注的图片数量往往比较稀少,在这种情况下,数据的增广尤为重要。在训练ImageNet-1k的标准数据增广中,主要使用了random_crop与random_flip两种数据增广方式,然而,近些年,越来越多的数据增广方式被提出,如cutout、mixup、cutmix、AutoAugment等。实验表明,这些数据的增广方式可以有效提升模型的精度,下表列出了ResNet50在8种不同的数据增广方式的表现,可以看出,相比baseline,所有的数据增广方式均有收益,其中cutmix是目前最有效的数据增广。更多数据增广的介绍请参考[**数据增广章节**](https://paddleclas.readthedocs.io/zh_CN/latest/advanced_tutorials/image_augmentation/ImageAugment.html) 一般来说,数据集的规模对性能影响至关重要,但是图片的标注往往比较昂贵,所以有标注的图片数量往往比较稀少,在这种情况下,数据的增广尤为重要。在训练 ImageNet-1k 的标准数据增广中,主要使用了 random_crop 与 random_flip 两种数据增广方式,然而,近些年,越来越多的数据增广方式被提出,如 cutout、mixup、cutmix、AutoAugment 等。实验表明,这些数据的增广方式可以有效提升模型的精度,下表列出了 ResNet50 在 8 种不同的数据增广方式的表现,可以看出,相比 baseline,所有的数据增广方式均有收益,其中 cutmix 是目前最有效的数据增广。更多数据增广的介绍请参考[**数据增广章节**](https://paddleclas.readthedocs.io/zh_CN/latest/advanced_tutorials/image_augmentation/ImageAugment.html)
| 模型 | 数据增广方式 | Test top-1 | | 模型 | 数据增广方式 | Test top-1 |
|:--:|:--:|:--:| |:--:|:--:|:--:|
...@@ -81,16 +116,22 @@ Label_smoothing是深度学习中的一种正则化方法,其全称是 Label S ...@@ -81,16 +116,22 @@ Label_smoothing是深度学习中的一种正则化方法,其全称是 Label S
| ResNet50 | Random-Erasing | 77.91% | | ResNet50 | Random-Erasing | 77.91% |
| ResNet50 | Hide-and-Seek | 77.43% | | ResNet50 | Hide-and-Seek | 77.43% |
## 8. 通过train_acc和test_acc确定调优策略 <a name='8'></a>
在训练网络的过程中,通常会打印每一个epoch的训练集准确率和验证集准确率,二者刻画了该模型在两个数据集上的表现。通常来说,训练集的准确率比验证集准确率微高或者二者相当是比较不错的状态。如果发现训练集的准确率比验证集高很多,说明在这个任务上已经过拟合,需要在训练过程中加入更多的正则,如增大l2_decay的值,加入更多的数据增广策略,加入label_smoothing策略等;如果发现训练集的准确率比验证集低一些,说明在这个任务上可能欠拟合,需要在训练过程中减弱正则效果,如减小l2_decay的值,减少数据增广方式,增大图片crop区域面积,减弱图片拉伸变换,去除label_smoothing等。
## 8. 通过 train_acc 和 test_acc 确定调优策略
在训练网络的过程中,通常会打印每一个 epoch 的训练集准确率和验证集准确率,二者刻画了该模型在两个数据集上的表现。通常来说,训练集的准确率比验证集准确率微高或者二者相当是比较不错的状态。如果发现训练集的准确率比验证集高很多,说明在这个任务上已经过拟合,需要在训练过程中加入更多的正则,如增大 l2_decay 的值,加入更多的数据增广策略,加入 label_smoothing 策略等;如果发现训练集的准确率比验证集低一些,说明在这个任务上可能欠拟合,需要在训练过程中减弱正则效果,如减小 l2_decay 的值,减少数据增广方式,增大图片 crop 区域面积,减弱图片拉伸变换,去除 label_smoothing 等。
<a name='9'></a>
## 9.通过已有的预训练模型提升自己的数据集的精度 ## 9.通过已有的预训练模型提升自己的数据集的精度
在现阶段计算机视觉领域中,加载预训练模型来训练自己的任务已成为普遍的做法,相比从随机初始化开始训练,加载预训练模型往往可以提升特定任务的精度。一般来说,业界广泛使用的预训练模型是通过训练128万张图片1000类的ImageNet-1k数据集得到的,该预训练模型的fc层权重是是一个k\*1000的矩阵,其中k是fc层以前的神经元数,在加载预训练权重时,无需加载fc层的权重。在学习率方面,如果您的任务训练的数据集特别小(如小于1千张),我们建议你使用较小的初始学习率,如0.001(batch_size:256,下同),以免较大的学习率破坏预训练权重。如果您的训练数据集规模相对较大(大于10万),我们建议你尝试更大的初始学习率,如0.01或者更大。 在现阶段计算机视觉领域中,加载预训练模型来训练自己的任务已成为普遍的做法,相比从随机初始化开始训练,加载预训练模型往往可以提升特定任务的精度。一般来说,业界广泛使用的预训练模型是通过训练 128 万张图片 1000 类的 ImageNet-1k 数据集得到的,该预训练模型的 fc 层权重是是一个 k\*1000 的矩阵,其中 k 是 fc 层以前的神经元数,在加载预训练权重时,无需加载 fc 层的权重。在学习率方面,如果您的任务训练的数据集特别小(如小于 1 千张),我们建议你使用较小的初始学习率,如 0.001(batch_size:256,下同),以免较大的学习率破坏预训练权重。如果您的训练数据集规模相对较大(大于 10 万),我们建议你尝试更大的初始学习率,如 0.01 或者更大。
> 如果您觉得此文档对您有帮助,欢迎 star 我们的项目:[https://github.com/PaddlePaddle/PaddleClas](https://github.com/PaddlePaddle/PaddleClas)
> 如果您觉得此文档对您有帮助,欢迎star我们的项目:[https://github.com/PaddlePaddle/PaddleClas](https://github.com/PaddlePaddle/PaddleClas) <a name='10'></a>
## 参考文献 ## 10. 参考文献
[1]P. Goyal, P. Dolla ́r, R. B. Girshick, P. Noordhuis, L. Wesolowski, A. Kyrola, A. Tulloch, Y. Jia, and K. He. Accurate, large minibatch SGD: training imagenet in 1 hour. CoRR, abs/1706.02677, 2017. [1]P. Goyal, P. Dolla ́r, R. B. Girshick, P. Noordhuis, L. Wesolowski, A. Kyrola, A. Tulloch, Y. Jia, and K. He. Accurate, large minibatch SGD: training imagenet in 1 hour. CoRR, abs/1706.02677, 2017.
[2]C.Szegedy,V.Vanhoucke,S.Ioffe,J.Shlens,andZ.Wojna. Rethinking the inception architecture for computer vision. CoRR, abs/1512.00567, 2015. [2]C.Szegedy,V.Vanhoucke,S.Ioffe,J.Shlens,andZ.Wojna. Rethinking the inception architecture for computer vision. CoRR, abs/1512.00567, 2015.
# Twins # Twins
---
## 目录
## 概述 * [1. 概述](#1)
Twins网络包括Twins-PCPVT和Twins-SVT,其重点对空间注意力机制进行了精心设计,得到了简单却更为有效的方案。由于该体系结构仅涉及矩阵乘法,而目前的深度学习框架中对矩阵乘法有较高的优化程度,因此该体系结构十分高效且易于实现。并且,该体系结构在图像分类、目标检测和语义分割等多种下游视觉任务中都能够取得优异的性能。[论文地址](https://arxiv.org/abs/2104.13840) * [2. 精度、FLOPS 和参数量](#2)
## 精度、FLOPs和参数量 <a name='1'></a>
## 1. 概述
Twins 网络包括 Twins-PCPVT 和 Twins-SVT,其重点对空间注意力机制进行了精心设计,得到了简单却更为有效的方案。由于该体系结构仅涉及矩阵乘法,而目前的深度学习框架中对矩阵乘法有较高的优化程度,因此该体系结构十分高效且易于实现。并且,该体系结构在图像分类、目标检测和语义分割等多种下游视觉任务中都能够取得优异的性能。[论文地址](https://arxiv.org/abs/2104.13840)
<a name='2'></a>
## 2. 精度、FLOPs 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPs<br>(G) | Params<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPs<br>(G) | Params<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -14,4 +23,4 @@ Twins网络包括Twins-PCPVT和Twins-SVT,其重点对空间注意力机制进 ...@@ -14,4 +23,4 @@ Twins网络包括Twins-PCPVT和Twins-SVT,其重点对空间注意力机制进
| alt_gvt_base | 0.8294 | 0.9621 | 0.832 | - | 8.3 | 56 | | alt_gvt_base | 0.8294 | 0.9621 | 0.832 | - | 8.3 | 56 |
| alt_gvt_large | 0.8331 | 0.9642 | 0.837 | - | 14.8 | 99.2 | | alt_gvt_large | 0.8331 | 0.9642 | 0.837 | - | 14.8 | 99.2 |
**注**:与Reference的精度差异源于数据预处理不同。 **注**:与 Reference 的精度差异源于数据预处理不同。
# ViT与DeiT系列 # ViT 与 DeiT 系列
---
## 目录
## 概述 * [1. 概述](#1)
* [2. 精度、FLOPS 和参数量](#2)
ViT(Vision Transformer)系列模型是Google在2020年提出的,该模型仅使用标准的Transformer结构,完全抛弃了卷积结构,将图像拆分为多个patch后再输入到Transformer中,展示了Transformer在CV领域的潜力。[论文地址](https://arxiv.org/abs/2010.11929) <a name='1'></a>
DeiT(Data-efficient Image Transformers)系列模型是由FaceBook在2020年底提出的,针对ViT模型需要大规模数据集训练的问题进行了改进,最终在ImageNet上取得了83.1%的Top1精度。并且使用卷积模型作为教师模型,针对该模型进行知识蒸馏,在ImageNet数据集上可以达到85.2%的Top1精度。[论文地址](https://arxiv.org/abs/2012.12877) ## 1. 概述
ViT(Vision Transformer)系列模型是 Google 在 2020 年提出的,该模型仅使用标准的 Transformer 结构,完全抛弃了卷积结构,将图像拆分为多个 patch 后再输入到 Transformer 中,展示了 Transformer 在 CV 领域的潜力。[论文地址](https://arxiv.org/abs/2010.11929)
DeiT(Data-efficient Image Transformers)系列模型是由 FaceBook 在 2020 年底提出的,针对 ViT 模型需要大规模数据集训练的问题进行了改进,最终在 ImageNet 上取得了 83.1%的 Top1 精度。并且使用卷积模型作为教师模型,针对该模型进行知识蒸馏,在 ImageNet 数据集上可以达到 85.2% 的 Top1 精度。[论文地址](https://arxiv.org/abs/2012.12877)
## 精度、FLOPS和参数量
<a name='2'></a>
## 2. 精度、FLOPS 和参数量
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Params<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Params<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
...@@ -33,4 +40,4 @@ DeiT(Data-efficient Image Transformers)系列模型是由FaceBook在2020年 ...@@ -33,4 +40,4 @@ DeiT(Data-efficient Image Transformers)系列模型是由FaceBook在2020年
| DeiT_base_distilled_patch16_224 | 0.831 | 0.964 | 0.834 | 0.965 | | | | DeiT_base_distilled_patch16_224 | 0.831 | 0.964 | 0.834 | 0.965 | | |
| DeiT_base_distilled_patch16_384 | 0.851 | 0.973 | 0.852 | 0.972 | | | | DeiT_base_distilled_patch16_384 | 0.851 | 0.973 | 0.852 | 0.972 | | |
关于Params、FLOPs、Inference speed等信息,敬请期待。 关于 Params、FLOPs、Inference speed 等信息,敬请期待。
# 模型库概览 # 模型库概览
---
## 目录
## 概述 * [1. 概述](#1)
* [2. 评估环境](#2)
* [3. 预训练模型列表及下载地址](#3)
* [4. 参考文献](#4)
基于ImageNet1k分类数据集,PaddleClas支持的36种系列分类网络结构以及对应的175个图像分类预训练模型如下所示,训练技巧、每个系列网络结构的简单介绍和性能评估将在相应章节展现。 <a name='1'></a>
## 评估环境 ## 1. 概述
* CPU的评估环境基于骁龙855(SD855)。
* Intel CPU的评估环境基于Intel(R) Xeon(R) Gold 6148。 基于 ImageNet1k 分类数据集,PaddleClas 支持的 36 种系列分类网络结构以及对应的 175 个图像分类预训练模型如下所示,训练技巧、每个系列网络结构的简单介绍和性能评估将在相应章节展现。
* GPU评估环境基于V100和TensorRT。
<a name='2'></a>
## 2. 评估环境
* CPU 的评估环境基于骁龙 855(SD855)。
* Intel CPU 的评估环境基于 Intel(R) Xeon(R) Gold 6148。
* GPU 评估环境基于 V100 和 TensorRT。
![](../../images/models/T4_benchmark/t4.fp32.bs4.main_fps_top1.png) ![](../../images/models/T4_benchmark/t4.fp32.bs4.main_fps_top1.png)
...@@ -17,19 +28,20 @@ ...@@ -17,19 +28,20 @@
![](../../images/models/mobile_arm_top1.png) ![](../../images/models/mobile_arm_top1.png)
> 如果您觉得此文档对您有帮助,欢迎star我们的项目:[https://github.com/PaddlePaddle/PaddleClas](https://github.com/PaddlePaddle/PaddleClas) > 如果您觉得此文档对您有帮助,欢迎 star 我们的项目:[https://github.com/PaddlePaddle/PaddleClas](https://github.com/PaddlePaddle/PaddleClas)
<a name='3'></a>
## 预训练模型列表及下载地址 ## 3. 预训练模型列表及下载地址
- ResNet及其Vd系列 - ResNet 及其 Vd 系列
- ResNet系列<sup>[[1](#ref1)]</sup>([论文地址](http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html)) - ResNet 系列<sup>[[1](#ref1)]</sup>([论文地址](http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html))
- [ResNet18](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet18_pretrained.pdparams) - [ResNet18](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet18_pretrained.pdparams)
- [ResNet34](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet34_pretrained.pdparams) - [ResNet34](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet34_pretrained.pdparams)
- [ResNet50](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrained.pdparams) - [ResNet50](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrained.pdparams)
- [ResNet101](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet101_pretrained.pdparams) - [ResNet101](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet101_pretrained.pdparams)
- [ResNet152](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet152_pretrained.pdparams) - [ResNet152](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet152_pretrained.pdparams)
- ResNet_vc、ResNet_vd系列<sup>[[2](#ref2)]</sup>([论文地址](https://arxiv.org/abs/1812.01187)) - ResNet_vc、ResNet_vd 系列<sup>[[2](#ref2)]</sup>([论文地址](https://arxiv.org/abs/1812.01187))
- [ResNet50_vc](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_vc_pretrained.pdparams) - [ResNet50_vc](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_vc_pretrained.pdparams)
- [ResNet18_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet18_vd_pretrained.pdparams) - [ResNet18_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet18_vd_pretrained.pdparams)
- [ResNet34_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet34_vd_pretrained.pdparams) - [ResNet34_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet34_vd_pretrained.pdparams)
...@@ -45,7 +57,7 @@ ...@@ -45,7 +57,7 @@
- 轻量级模型系列 - 轻量级模型系列
- PP-LCNet系列<sup>[[28](#ref28)]</sup>([论文地址](https://arxiv.org/pdf/2109.15099.pdf)) - PP-LCNet 系列<sup>[[28](#ref28)]</sup>([论文地址](https://arxiv.org/pdf/2109.15099.pdf))
- [PPLCNet_x0_25](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_25_pretrained.pdparams) - [PPLCNet_x0_25](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_25_pretrained.pdparams)
- [PPLCNet_x0_35](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_35_pretrained.pdparams) - [PPLCNet_x0_35](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_35_pretrained.pdparams)
- [PPLCNet_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_5_pretrained.pdparams) - [PPLCNet_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_5_pretrained.pdparams)
...@@ -57,7 +69,7 @@ ...@@ -57,7 +69,7 @@
- [PPLCNet_x0_5_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_5_ssld_pretrained.pdparams) - [PPLCNet_x0_5_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_5_ssld_pretrained.pdparams)
- [PPLCNet_x1_0_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x1_0_ssld_pretrained.pdparams) - [PPLCNet_x1_0_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x1_0_ssld_pretrained.pdparams)
- [PPLCNet_x2_5_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x2_5_ssld_pretrained.pdparams) - [PPLCNet_x2_5_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x2_5_ssld_pretrained.pdparams)
- MobileNetV3系列<sup>[[3](#ref3)]</sup>([论文地址](https://arxiv.org/abs/1905.02244)) - MobileNetV3 系列<sup>[[3](#ref3)]</sup>([论文地址](https://arxiv.org/abs/1905.02244))
- [MobileNetV3_large_x0_35](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x0_35_pretrained.pdparams) - [MobileNetV3_large_x0_35](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x0_35_pretrained.pdparams)
- [MobileNetV3_large_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x0_5_pretrained.pdparams) - [MobileNetV3_large_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x0_5_pretrained.pdparams)
- [MobileNetV3_large_x0_75](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x0_75_pretrained.pdparams) - [MobileNetV3_large_x0_75](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x0_75_pretrained.pdparams)
...@@ -71,7 +83,7 @@ ...@@ -71,7 +83,7 @@
- [MobileNetV3_large_x1_0_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x1_0_ssld_pretrained.pdparams) - [MobileNetV3_large_x1_0_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x1_0_ssld_pretrained.pdparams)
- [MobileNetV3_large_x1_0_ssld_int8]()(coming soon) - [MobileNetV3_large_x1_0_ssld_int8]()(coming soon)
- [MobileNetV3_small_x1_0_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_small_x1_0_ssld_pretrained.pdparams) - [MobileNetV3_small_x1_0_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_small_x1_0_ssld_pretrained.pdparams)
- MobileNetV2系列<sup>[[4](#ref4)]</sup>([论文地址](https://arxiv.org/abs/1801.04381)) - MobileNetV2 系列<sup>[[4](#ref4)]</sup>([论文地址](https://arxiv.org/abs/1801.04381))
- [MobileNetV2_x0_25](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_x0_25_pretrained.pdparams) - [MobileNetV2_x0_25](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_x0_25_pretrained.pdparams)
- [MobileNetV2_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_x0_5_pretrained.pdparams) - [MobileNetV2_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_x0_5_pretrained.pdparams)
- [MobileNetV2_x0_75](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_x0_75_pretrained.pdparams) - [MobileNetV2_x0_75](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_x0_75_pretrained.pdparams)
...@@ -79,13 +91,13 @@ ...@@ -79,13 +91,13 @@
- [MobileNetV2_x1_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_x1_5_pretrained.pdparams) - [MobileNetV2_x1_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_x1_5_pretrained.pdparams)
- [MobileNetV2_x2_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_x2_0_pretrained.pdparams) - [MobileNetV2_x2_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_x2_0_pretrained.pdparams)
- [MobileNetV2_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_ssld_pretrained.pdparams) - [MobileNetV2_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_ssld_pretrained.pdparams)
- MobileNetV1系列<sup>[[5](#ref5)]</sup>([论文地址](https://arxiv.org/abs/1704.04861)) - MobileNetV1 系列<sup>[[5](#ref5)]</sup>([论文地址](https://arxiv.org/abs/1704.04861))
- [MobileNetV1_x0_25](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV1_x0_25_pretrained.pdparams) - [MobileNetV1_x0_25](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV1_x0_25_pretrained.pdparams)
- [MobileNetV1_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV1_x0_5_pretrained.pdparams) - [MobileNetV1_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV1_x0_5_pretrained.pdparams)
- [MobileNetV1_x0_75](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV1_x0_75_pretrained.pdparams) - [MobileNetV1_x0_75](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV1_x0_75_pretrained.pdparams)
- [MobileNetV1](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV1_pretrained.pdparams) - [MobileNetV1](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV1_pretrained.pdparams)
- [MobileNetV1_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV1_ssld_pretrained.pdparams) - [MobileNetV1_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV1_ssld_pretrained.pdparams)
- ShuffleNetV2系列<sup>[[6](#ref6)]</sup>([论文地址](https://arxiv.org/abs/1807.11164)) - ShuffleNetV2 系列<sup>[[6](#ref6)]</sup>([论文地址](https://arxiv.org/abs/1807.11164))
- [ShuffleNetV2_x0_25](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_x0_25_pretrained.pdparams) - [ShuffleNetV2_x0_25](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_x0_25_pretrained.pdparams)
- [ShuffleNetV2_x0_33](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_x0_33_pretrained.pdparams) - [ShuffleNetV2_x0_33](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_x0_33_pretrained.pdparams)
- [ShuffleNetV2_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_x0_5_pretrained.pdparams) - [ShuffleNetV2_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_x0_5_pretrained.pdparams)
...@@ -93,16 +105,16 @@ ...@@ -93,16 +105,16 @@
- [ShuffleNetV2_x1_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_x1_5_pretrained.pdparams) - [ShuffleNetV2_x1_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_x1_5_pretrained.pdparams)
- [ShuffleNetV2_x2_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_x2_0_pretrained.pdparams) - [ShuffleNetV2_x2_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_x2_0_pretrained.pdparams)
- [ShuffleNetV2_swish](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_swish_pretrained.pdparams) - [ShuffleNetV2_swish](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ShuffleNetV2_swish_pretrained.pdparams)
- GhostNet系列<sup>[[23](#ref23)]</sup>([论文地址](https://arxiv.org/pdf/1911.11907.pdf)) - GhostNet 系列<sup>[[23](#ref23)]</sup>([论文地址](https://arxiv.org/pdf/1911.11907.pdf))
- [GhostNet_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GhostNet_x0_5_pretrained.pdparams) - [GhostNet_x0_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GhostNet_x0_5_pretrained.pdparams)
- [GhostNet_x1_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GhostNet_x1_0_pretrained.pdparams) - [GhostNet_x1_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GhostNet_x1_0_pretrained.pdparams)
- [GhostNet_x1_3](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GhostNet_x1_3_pretrained.pdparams) - [GhostNet_x1_3](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GhostNet_x1_3_pretrained.pdparams)
- [GhostNet_x1_3_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GhostNet_x1_3_ssld_pretrained.pdparams) - [GhostNet_x1_3_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GhostNet_x1_3_ssld_pretrained.pdparams)
- MixNet系列<sup>[[29](#ref29)]</sup>([论文地址](https://arxiv.org/pdf/1907.09595.pdf)) - MixNet 系列<sup>[[29](#ref29)]</sup>([论文地址](https://arxiv.org/pdf/1907.09595.pdf))
- [MixNet_S](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixNet_S_pretrained.pdparams) - [MixNet_S](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixNet_S_pretrained.pdparams)
- [MixNet_M](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixNet_M_pretrained.pdparams) - [MixNet_M](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixNet_M_pretrained.pdparams)
- [MixNet_L](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixNet_L_pretrained.pdparams) - [MixNet_L](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixNet_L_pretrained.pdparams)
- ReXNet系列<sup>[[30](#ref30)]</sup>([论文地址](https://arxiv.org/pdf/2007.00992.pdf)) - ReXNet 系列<sup>[[30](#ref30)]</sup>([论文地址](https://arxiv.org/pdf/2007.00992.pdf))
- [ReXNet_1_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_1_0_pretrained.pdparams) - [ReXNet_1_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_1_0_pretrained.pdparams)
- [ReXNet_1_3](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_1_3_pretrained.pdparams) - [ReXNet_1_3](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_1_3_pretrained.pdparams)
- [ReXNet_1_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_1_5_pretrained.pdparams) - [ReXNet_1_5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_1_5_pretrained.pdparams)
...@@ -110,32 +122,32 @@ ...@@ -110,32 +122,32 @@
- [ReXNet_3_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_3_0_pretrained.pdparams) - [ReXNet_3_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ReXNet_3_0_pretrained.pdparams)
- SEResNeXt与Res2Net系列 - SEResNeXt 与 Res2Net 系列
- ResNeXt系列<sup>[[7](#ref7)]</sup>([论文地址](https://arxiv.org/abs/1611.05431)) - ResNeXt 系列<sup>[[7](#ref7)]</sup>([论文地址](https://arxiv.org/abs/1611.05431))
- [ResNeXt50_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt50_32x4d_pretrained.pdparams) - [ResNeXt50_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt50_32x4d_pretrained.pdparams)
- [ResNeXt50_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt50_64x4d_pretrained.pdparams) - [ResNeXt50_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt50_64x4d_pretrained.pdparams)
- [ResNeXt101_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_32x4d_pretrained.pdparams) - [ResNeXt101_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_32x4d_pretrained.pdparams)
- [ResNeXt101_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_64x4d_pretrained.pdparams) - [ResNeXt101_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_64x4d_pretrained.pdparams)
- [ResNeXt152_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt152_32x4d_pretrained.pdparams) - [ResNeXt152_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt152_32x4d_pretrained.pdparams)
- [ResNeXt152_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt152_64x4d_pretrained.pdparams) - [ResNeXt152_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt152_64x4d_pretrained.pdparams)
- ResNeXt_vd系列 - ResNeXt_vd 系列
- [ResNeXt50_vd_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt50_vd_32x4d_pretrained.pdparams) - [ResNeXt50_vd_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt50_vd_32x4d_pretrained.pdparams)
- [ResNeXt50_vd_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt50_vd_64x4d_pretrained.pdparams) - [ResNeXt50_vd_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt50_vd_64x4d_pretrained.pdparams)
- [ResNeXt101_vd_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_vd_32x4d_pretrained.pdparams) - [ResNeXt101_vd_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_vd_32x4d_pretrained.pdparams)
- [ResNeXt101_vd_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_vd_64x4d_pretrained.pdparams) - [ResNeXt101_vd_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_vd_64x4d_pretrained.pdparams)
- [ResNeXt152_vd_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt152_vd_32x4d_pretrained.pdparams) - [ResNeXt152_vd_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt152_vd_32x4d_pretrained.pdparams)
- [ResNeXt152_vd_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt152_vd_64x4d_pretrained.pdparams) - [ResNeXt152_vd_64x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt152_vd_64x4d_pretrained.pdparams)
- SE_ResNet_vd系列<sup>[[8](#ref8)]</sup>([论文地址](https://arxiv.org/abs/1709.01507)) - SE_ResNet_vd 系列<sup>[[8](#ref8)]</sup>([论文地址](https://arxiv.org/abs/1709.01507))
- [SE_ResNet18_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNet18_vd_pretrained.pdparams) - [SE_ResNet18_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNet18_vd_pretrained.pdparams)
- [SE_ResNet34_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNet34_vd_pretrained.pdparams) - [SE_ResNet34_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNet34_vd_pretrained.pdparams)
- [SE_ResNet50_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNet50_vd_pretrained.pdparams) - [SE_ResNet50_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNet50_vd_pretrained.pdparams)
- SE_ResNeXt系列 - SE_ResNeXt 系列
- [SE_ResNeXt50_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNeXt50_32x4d_pretrained.pdparams) - [SE_ResNeXt50_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNeXt50_32x4d_pretrained.pdparams)
- [SE_ResNeXt101_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNeXt101_32x4d_pretrained.pdparams) - [SE_ResNeXt101_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNeXt101_32x4d_pretrained.pdparams)
- SE_ResNeXt_vd系列 - SE_ResNeXt_vd 系列
- [SE_ResNeXt50_vd_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNeXt50_vd_32x4d_pretrained.pdparams) - [SE_ResNeXt50_vd_32x4d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_ResNeXt50_vd_32x4d_pretrained.pdparams)
- [SENet154_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SENet154_vd_pretrained.pdparams) - [SENet154_vd](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SENet154_vd_pretrained.pdparams)
- Res2Net系列<sup>[[9](#ref9)]</sup>([论文地址](https://arxiv.org/abs/1904.01169)) - Res2Net 系列<sup>[[9](#ref9)]</sup>([论文地址](https://arxiv.org/abs/1904.01169))
- [Res2Net50_26w_4s](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Res2Net50_26w_4s_pretrained.pdparams) - [Res2Net50_26w_4s](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Res2Net50_26w_4s_pretrained.pdparams)
- [Res2Net50_vd_26w_4s](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Res2Net50_vd_26w_4s_pretrained.pdparams) - [Res2Net50_vd_26w_4s](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Res2Net50_vd_26w_4s_pretrained.pdparams)
- [Res2Net50_vd_26w_4s_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Res2Net50_vd_26w_4s_ssld_pretrained.pdparams) - [Res2Net50_vd_26w_4s_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Res2Net50_vd_26w_4s_ssld_pretrained.pdparams)
...@@ -146,14 +158,14 @@ ...@@ -146,14 +158,14 @@
- [Res2Net200_vd_26w_4s_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Res2Net200_vd_26w_4s_ssld_pretrained.pdparams) - [Res2Net200_vd_26w_4s_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Res2Net200_vd_26w_4s_ssld_pretrained.pdparams)
- Inception系列 - Inception 系列
- GoogLeNet系列<sup>[[10](#ref10)]</sup>([论文地址](https://arxiv.org/pdf/1409.4842.pdf)) - GoogLeNet 系列<sup>[[10](#ref10)]</sup>([论文地址](https://arxiv.org/pdf/1409.4842.pdf))
- [GoogLeNet](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GoogLeNet_pretrained.pdparams) - [GoogLeNet](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/GoogLeNet_pretrained.pdparams)
- InceptionV3系列<sup>[[26](#ref26)]</sup>([论文地址](https://arxiv.org/abs/1512.00567)) - InceptionV3 系列<sup>[[26](#ref26)]</sup>([论文地址](https://arxiv.org/abs/1512.00567))
- [InceptionV3](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/InceptionV3_pretrained.pdparams) - [InceptionV3](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/InceptionV3_pretrained.pdparams)
- InceptionV4系列<sup>[[11](#ref11)]</sup>([论文地址](https://arxiv.org/abs/1602.07261)) - InceptionV4 系列<sup>[[11](#ref11)]</sup>([论文地址](https://arxiv.org/abs/1602.07261))
- [InceptionV4](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/InceptionV4_pretrained.pdparams) - [InceptionV4](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/InceptionV4_pretrained.pdparams)
- Xception系列<sup>[[12](#ref12)]</sup>([论文地址](http://openaccess.thecvf.com/content_cvpr_2017/html/Chollet_Xception_Deep_Learning_CVPR_2017_paper.html)) - Xception 系列<sup>[[12](#ref12)]</sup>([论文地址](http://openaccess.thecvf.com/content_cvpr_2017/html/Chollet_Xception_Deep_Learning_CVPR_2017_paper.html))
- [Xception41](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Xception41_pretrained.pdparams) - [Xception41](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Xception41_pretrained.pdparams)
- [Xception41_deeplab](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Xception41_deeplab_pretrained.pdparams) - [Xception41_deeplab](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Xception41_deeplab_pretrained.pdparams)
- [Xception65](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Xception65_pretrained.pdparams) - [Xception65](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Xception65_pretrained.pdparams)
...@@ -161,8 +173,8 @@ ...@@ -161,8 +173,8 @@
- [Xception71](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Xception71_pretrained.pdparams) - [Xception71](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Xception71_pretrained.pdparams)
- HRNet系列 - HRNet 系列
- HRNet系列<sup>[[13](#ref13)]</sup>([论文地址](https://arxiv.org/abs/1908.07919)) - HRNet 系列<sup>[[13](#ref13)]</sup>([论文地址](https://arxiv.org/abs/1908.07919))
- [HRNet_W18_C](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HRNet_W18_C_pretrained.pdparams) - [HRNet_W18_C](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HRNet_W18_C_pretrained.pdparams)
- [HRNet_W18_C_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HRNet_W18_C_ssld_pretrained.pdparams) - [HRNet_W18_C_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HRNet_W18_C_ssld_pretrained.pdparams)
- [HRNet_W30_C](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HRNet_W30_C_pretrained.pdparams) - [HRNet_W30_C](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HRNet_W30_C_pretrained.pdparams)
...@@ -174,14 +186,14 @@ ...@@ -174,14 +186,14 @@
- [HRNet_W64_C](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HRNet_W64_C_pretrained.pdparams) - [HRNet_W64_C](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HRNet_W64_C_pretrained.pdparams)
- [SE_HRNet_W64_C_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_HRNet_W64_C_ssld_pretrained.pdparams) - [SE_HRNet_W64_C_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SE_HRNet_W64_C_ssld_pretrained.pdparams)
- DPN与DenseNet系列 - DPN 与 DenseNet 系列
- DPN系列<sup>[[14](#ref14)]</sup>([论文地址](https://arxiv.org/abs/1707.01629)) - DPN 系列<sup>[[14](#ref14)]</sup>([论文地址](https://arxiv.org/abs/1707.01629))
- [DPN68](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DPN68_pretrained.pdparams) - [DPN68](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DPN68_pretrained.pdparams)
- [DPN92](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DPN92_pretrained.pdparams) - [DPN92](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DPN92_pretrained.pdparams)
- [DPN98](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DPN98_pretrained.pdparams) - [DPN98](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DPN98_pretrained.pdparams)
- [DPN107](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DPN107_pretrained.pdparams) - [DPN107](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DPN107_pretrained.pdparams)
- [DPN131](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DPN131_pretrained.pdparams) - [DPN131](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DPN131_pretrained.pdparams)
- DenseNet系列<sup>[[15](#ref15)]</sup>([论文地址](https://arxiv.org/abs/1608.06993)) - DenseNet 系列<sup>[[15](#ref15)]</sup>([论文地址](https://arxiv.org/abs/1608.06993))
- [DenseNet121](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet121_pretrained.pdparams) - [DenseNet121](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet121_pretrained.pdparams)
- [DenseNet161](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet161_pretrained.pdparams) - [DenseNet161](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet161_pretrained.pdparams)
- [DenseNet169](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet169_pretrained.pdparams) - [DenseNet169](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet169_pretrained.pdparams)
...@@ -189,8 +201,8 @@ ...@@ -189,8 +201,8 @@
- [DenseNet264](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet264_pretrained.pdparams) - [DenseNet264](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet264_pretrained.pdparams)
- EfficientNet与ResNeXt101_wsl系列 - EfficientNet 与 ResNeXt101_wsl 系列
- EfficientNet系列<sup>[[16](#ref16)]</sup>([论文地址](https://arxiv.org/abs/1905.11946)) - EfficientNet 系列<sup>[[16](#ref16)]</sup>([论文地址](https://arxiv.org/abs/1905.11946))
- [EfficientNetB0_small](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB0_small_pretrained.pdparams) - [EfficientNetB0_small](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB0_small_pretrained.pdparams)
- [EfficientNetB0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB0_pretrained.pdparams) - [EfficientNetB0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB0_pretrained.pdparams)
- [EfficientNetB1](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB1_pretrained.pdparams) - [EfficientNetB1](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB1_pretrained.pdparams)
...@@ -200,22 +212,22 @@ ...@@ -200,22 +212,22 @@
- [EfficientNetB5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB5_pretrained.pdparams) - [EfficientNetB5](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB5_pretrained.pdparams)
- [EfficientNetB6](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB6_pretrained.pdparams) - [EfficientNetB6](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB6_pretrained.pdparams)
- [EfficientNetB7](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB7_pretrained.pdparams) - [EfficientNetB7](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/EfficientNetB7_pretrained.pdparams)
- ResNeXt101_wsl系列<sup>[[17](#ref17)]</sup>([论文地址](https://arxiv.org/abs/1805.00932)) - ResNeXt101_wsl 系列<sup>[[17](#ref17)]</sup>([论文地址](https://arxiv.org/abs/1805.00932))
- [ResNeXt101_32x8d_wsl](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_32x8d_wsl_pretrained.pdparams) - [ResNeXt101_32x8d_wsl](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_32x8d_wsl_pretrained.pdparams)
- [ResNeXt101_32x16d_wsl](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_32x16d_wsl_pretrained.pdparams) - [ResNeXt101_32x16d_wsl](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_32x16d_wsl_pretrained.pdparams)
- [ResNeXt101_32x32d_wsl](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_32x32d_wsl_pretrained.pdparams) - [ResNeXt101_32x32d_wsl](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_32x32d_wsl_pretrained.pdparams)
- [ResNeXt101_32x48d_wsl](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_32x48d_wsl_pretrained.pdparams) - [ResNeXt101_32x48d_wsl](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeXt101_32x48d_wsl_pretrained.pdparams)
- [Fix_ResNeXt101_32x48d_wsl](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Fix_ResNeXt101_32x48d_wsl_pretrained.pdparams) - [Fix_ResNeXt101_32x48d_wsl](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/Fix_ResNeXt101_32x48d_wsl_pretrained.pdparams)
- ResNeSt与RegNet系列 - ResNeSt 与 RegNet 系列
- ResNeSt系列<sup>[[24](#ref24)]</sup>([论文地址](https://arxiv.org/abs/2004.08955)) - ResNeSt 系列<sup>[[24](#ref24)]</sup>([论文地址](https://arxiv.org/abs/2004.08955))
- [ResNeSt50_fast_1s1x64d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeSt50_fast_1s1x64d_pretrained.pdparams) - [ResNeSt50_fast_1s1x64d](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeSt50_fast_1s1x64d_pretrained.pdparams)
- [ResNeSt50](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeSt50_pretrained.pdparams) - [ResNeSt50](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNeSt50_pretrained.pdparams)
- RegNet系列<sup>[[25](#ref25)]</sup>([paper link](https://arxiv.org/abs/2003.13678)) - RegNet 系列<sup>[[25](#ref25)]</sup>([paper link](https://arxiv.org/abs/2003.13678))
- [RegNetX_4GF](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RegNetX_4GF_pretrained.pdparams) - [RegNetX_4GF](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RegNetX_4GF_pretrained.pdparams)
- Transformer系列 - Transformer 系列
- Swin-transformer系列<sup>[[27](#ref27)]</sup>([论文地址](https://arxiv.org/pdf/2103.14030.pdf)) - Swin-transformer 系列<sup>[[27](#ref27)]</sup>([论文地址](https://arxiv.org/pdf/2103.14030.pdf))
- [SwinTransformer_tiny_patch4_window7_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_tiny_patch4_window7_224_pretrained.pdparams) - [SwinTransformer_tiny_patch4_window7_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_tiny_patch4_window7_224_pretrained.pdparams)
- [SwinTransformer_small_patch4_window7_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_small_patch4_window7_224_pretrained.pdparams) - [SwinTransformer_small_patch4_window7_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_small_patch4_window7_224_pretrained.pdparams)
- [SwinTransformer_base_patch4_window7_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_base_patch4_window7_224_pretrained.pdparams) - [SwinTransformer_base_patch4_window7_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_base_patch4_window7_224_pretrained.pdparams)
...@@ -226,7 +238,7 @@ ...@@ -226,7 +238,7 @@
- [SwinTransformer_large_patch4_window12_384_22kto1k](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_large_patch4_window12_384_22kto1k_pretrained.pdparams) - [SwinTransformer_large_patch4_window12_384_22kto1k](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_large_patch4_window12_384_22kto1k_pretrained.pdparams)
- [SwinTransformer_large_patch4_window7_224_22k](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_large_patch4_window7_224_22k_pretrained.pdparams) - [SwinTransformer_large_patch4_window7_224_22k](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_large_patch4_window7_224_22k_pretrained.pdparams)
- [SwinTransformer_large_patch4_window7_224_22kto1k](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_large_patch4_window7_224_22kto1k_pretrained.pdparams) - [SwinTransformer_large_patch4_window7_224_22kto1k](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SwinTransformer_large_patch4_window7_224_22kto1k_pretrained.pdparams)
- ViT系列<sup>[[31](#ref31)]</sup>([论文地址](https://arxiv.org/pdf/2010.11929.pdf)) - ViT 系列<sup>[[31](#ref31)]</sup>([论文地址](https://arxiv.org/pdf/2010.11929.pdf))
- [ViT_small_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_small_patch16_224_pretrained.pdparams) - [ViT_small_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_small_patch16_224_pretrained.pdparams)
- [ViT_base_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_base_patch16_224_pretrained.pdparams) - [ViT_base_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_base_patch16_224_pretrained.pdparams)
- [ViT_base_patch16_384](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_base_patch16_384_pretrained.pdparams) - [ViT_base_patch16_384](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_base_patch16_384_pretrained.pdparams)
...@@ -234,7 +246,7 @@ ...@@ -234,7 +246,7 @@
- [ViT_large_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_large_patch16_224_pretrained.pdparams) - [ViT_large_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_large_patch16_224_pretrained.pdparams)
- [ViT_large_patch16_384](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_large_patch16_384_pretrained.pdparams) - [ViT_large_patch16_384](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_large_patch16_384_pretrained.pdparams)
- [ViT_large_patch32_384](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_large_patch32_384_pretrained.pdparams) - [ViT_large_patch32_384](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ViT_large_patch32_384_pretrained.pdparams)
- DeiT系列<sup>[[32](#ref32)]</sup>([论文地址](https://arxiv.org/pdf/2012.12877.pdf)) - DeiT 系列<sup>[[32](#ref32)]</sup>([论文地址](https://arxiv.org/pdf/2012.12877.pdf))
- [DeiT_tiny_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_tiny_patch16_224_pretrained.pdparams) - [DeiT_tiny_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_tiny_patch16_224_pretrained.pdparams)
- [DeiT_small_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_small_patch16_224_pretrained.pdparams) - [DeiT_small_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_small_patch16_224_pretrained.pdparams)
- [DeiT_base_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_base_patch16_224_pretrained.pdparams) - [DeiT_base_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_base_patch16_224_pretrained.pdparams)
...@@ -243,36 +255,36 @@ ...@@ -243,36 +255,36 @@
- [DeiT_small_distilled_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_small_distilled_patch16_224_pretrained.pdparams) - [DeiT_small_distilled_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_small_distilled_patch16_224_pretrained.pdparams)
- [DeiT_base_distilled_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_base_distilled_patch16_224_pretrained.pdparams) - [DeiT_base_distilled_patch16_224](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_base_distilled_patch16_224_pretrained.pdparams)
- [DeiT_base_distilled_patch16_384](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_base_distilled_patch16_384_pretrained.pdparams) - [DeiT_base_distilled_patch16_384](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DeiT_base_distilled_patch16_384_pretrained.pdparams)
- LeViT系列<sup>[[33](#ref33)]</sup>([论文地址](https://arxiv.org/pdf/2104.01136.pdf)) - LeViT 系列<sup>[[33](#ref33)]</sup>([论文地址](https://arxiv.org/pdf/2104.01136.pdf))
- [LeViT_128S](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_128S_pretrained.pdparams) - [LeViT_128S](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_128S_pretrained.pdparams)
- [LeViT_128](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_128_pretrained.pdparams) - [LeViT_128](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_128_pretrained.pdparams)
- [LeViT_192](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_192_pretrained.pdparams) - [LeViT_192](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_192_pretrained.pdparams)
- [LeViT_256](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_256_pretrained.pdparams) - [LeViT_256](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_256_pretrained.pdparams)
- [LeViT_384](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_384_pretrained.pdparams) - [LeViT_384](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/LeViT_384_pretrained.pdparams)
- Twins系列<sup>[[34](#ref34)]</sup>([论文地址](https://arxiv.org/pdf/2104.13840.pdf)) - Twins 系列<sup>[[34](#ref34)]</sup>([论文地址](https://arxiv.org/pdf/2104.13840.pdf))
- [pcpvt_small](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/pcpvt_small_pretrained.pdparams) - [pcpvt_small](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/pcpvt_small_pretrained.pdparams)
- [pcpvt_base](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/pcpvt_base_pretrained.pdparams) - [pcpvt_base](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/pcpvt_base_pretrained.pdparams)
- [pcpvt_large](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/pcpvt_large_pretrained.pdparams) - [pcpvt_large](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/pcpvt_large_pretrained.pdparams)
- [alt_gvt_small](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/alt_gvt_small_pretrained.pdparams) - [alt_gvt_small](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/alt_gvt_small_pretrained.pdparams)
- [alt_gvt_base](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/alt_gvt_base_pretrained.pdparams) - [alt_gvt_base](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/alt_gvt_base_pretrained.pdparams)
- [alt_gvt_large](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/alt_gvt_large_pretrained.pdparams) - [alt_gvt_large](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/alt_gvt_large_pretrained.pdparams)
- TNT系列<sup>[[35](#ref35)]</sup>([论文地址](https://arxiv.org/pdf/2103.00112.pdf)) - TNT 系列<sup>[[35](#ref35)]</sup>([论文地址](https://arxiv.org/pdf/2103.00112.pdf))
- [TNT_small](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/TNT_small_pretrained.pdparams) - [TNT_small](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/TNT_small_pretrained.pdparams)
- 其他模型 - 其他模型
- AlexNet系列<sup>[[18](#ref18)]</sup>([论文地址](https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)) - AlexNet 系列<sup>[[18](#ref18)]</sup>([论文地址](https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf))
- [AlexNet](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/AlexNet_pretrained.pdparams) - [AlexNet](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/AlexNet_pretrained.pdparams)
- SqueezeNet系列<sup>[[19](#ref19)]</sup>([论文地址](https://arxiv.org/abs/1602.07360)) - SqueezeNet 系列<sup>[[19](#ref19)]</sup>([论文地址](https://arxiv.org/abs/1602.07360))
- [SqueezeNet1_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SqueezeNet1_0_pretrained.pdparams) - [SqueezeNet1_0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SqueezeNet1_0_pretrained.pdparams)
- [SqueezeNet1_1](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SqueezeNet1_1_pretrained.pdparams) - [SqueezeNet1_1](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SqueezeNet1_1_pretrained.pdparams)
- VGG系列<sup>[[20](#ref20)]</sup>([论文地址](https://arxiv.org/abs/1409.1556)) - VGG 系列<sup>[[20](#ref20)]</sup>([论文地址](https://arxiv.org/abs/1409.1556))
- [VGG11](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/VGG11_pretrained.pdparams) - [VGG11](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/VGG11_pretrained.pdparams)
- [VGG13](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/VGG13_pretrained.pdparams) - [VGG13](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/VGG13_pretrained.pdparams)
- [VGG16](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/VGG16_pretrained.pdparams) - [VGG16](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/VGG16_pretrained.pdparams)
- [VGG19](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/VGG19_pretrained.pdparams) - [VGG19](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/VGG19_pretrained.pdparams)
- DarkNet系列<sup>[[21](#ref21)]</sup>([论文地址](https://arxiv.org/abs/1506.02640)) - DarkNet 系列<sup>[[21](#ref21)]</sup>([论文地址](https://arxiv.org/abs/1506.02640))
- [DarkNet53](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DarkNet53_pretrained.pdparams) - [DarkNet53](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DarkNet53_pretrained.pdparams)
- RepVGG系列<sup>[[36](#ref36)]</sup>([论文地址](https://arxiv.org/pdf/2101.03697.pdf)) - RepVGG 系列<sup>[[36](#ref36)]</sup>([论文地址](https://arxiv.org/pdf/2101.03697.pdf))
- [RepVGG_A0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_A0_pretrained.pdparams) - [RepVGG_A0](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_A0_pretrained.pdparams)
- [RepVGG_A1](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_A1_pretrained.pdparams) - [RepVGG_A1](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_A1_pretrained.pdparams)
- [RepVGG_A2](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_A2_pretrained.pdparams) - [RepVGG_A2](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_A2_pretrained.pdparams)
...@@ -283,12 +295,12 @@ ...@@ -283,12 +295,12 @@
- [RepVGG_B1g4](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_B1g4_pretrained.pdparams) - [RepVGG_B1g4](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_B1g4_pretrained.pdparams)
- [RepVGG_B2g4](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_B2g4_pretrained.pdparams) - [RepVGG_B2g4](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_B2g4_pretrained.pdparams)
- [RepVGG_B3g4](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_B3g4_pretrained.pdparams) - [RepVGG_B3g4](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RepVGG_B3g4_pretrained.pdparams)
- HarDNet系列<sup>[[37](#ref37)]</sup>([论文地址](https://arxiv.org/pdf/1909.00948.pdf)) - HarDNet 系列<sup>[[37](#ref37)]</sup>([论文地址](https://arxiv.org/pdf/1909.00948.pdf))
- [HarDNet39_ds](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet39_ds_pretrained.pdparams) - [HarDNet39_ds](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet39_ds_pretrained.pdparams)
- [HarDNet68_ds](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet68_ds_pretrained.pdparams) - [HarDNet68_ds](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet68_ds_pretrained.pdparams)
- [HarDNet68](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet68_pretrained.pdparams) - [HarDNet68](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet68_pretrained.pdparams)
- [HarDNet85](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet85_pretrained.pdparams) - [HarDNet85](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/HarDNet85_pretrained.pdparams)
- DLA系列<sup>[[38](#ref38)]</sup>([论文地址](https://arxiv.org/pdf/1707.06484.pdf)) - DLA 系列<sup>[[38](#ref38)]</sup>([论文地址](https://arxiv.org/pdf/1707.06484.pdf))
- [DLA102](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA102_pretrained.pdparams) - [DLA102](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA102_pretrained.pdparams)
- [DLA102x2](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA102x2_pretrained.pdparams) - [DLA102x2](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA102x2_pretrained.pdparams)
- [DLA102x](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA102x_pretrained.pdparams) - [DLA102x](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA102x_pretrained.pdparams)
...@@ -298,7 +310,7 @@ ...@@ -298,7 +310,7 @@
- [DLA60](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA60_pretrained.pdparams) - [DLA60](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA60_pretrained.pdparams)
- [DLA60x_c](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA60x_c_pretrained.pdparams) - [DLA60x_c](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA60x_c_pretrained.pdparams)
- [DLA60x](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA60x_pretrained.pdparams) - [DLA60x](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DLA60x_pretrained.pdparams)
- RedNet系列<sup>[[39](#ref39)]</sup>([论文地址](https://arxiv.org/pdf/2103.06255.pdf)) - RedNet 系列<sup>[[39](#ref39)]</sup>([论文地址](https://arxiv.org/pdf/2103.06255.pdf))
- [RedNet26](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RedNet26_pretrained.pdparams) - [RedNet26](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RedNet26_pretrained.pdparams)
- [RedNet38](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RedNet38_pretrained.pdparams) - [RedNet38](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RedNet38_pretrained.pdparams)
- [RedNet50](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RedNet50_pretrained.pdparams) - [RedNet50](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/RedNet50_pretrained.pdparams)
...@@ -307,9 +319,11 @@ ...@@ -307,9 +319,11 @@
**注意**:以上模型中EfficientNetB1-B7的预训练模型转自[pytorch版EfficientNet](https://github.com/lukemelas/EfficientNet-PyTorch),ResNeXt101_wsl系列预训练模型转自[官方repo](https://github.com/facebookresearch/WSL-Images),剩余预训练模型均基于飞桨训练得到的,并在configs里给出了相应的训练超参数。 **注意**:以上模型中 EfficientNetB1-B7 的预训练模型转自[pytorch 版 EfficientNet](https://github.com/lukemelas/EfficientNet-PyTorch),ResNeXt101_wsl 系列预训练模型转自[官方 repo](https://github.com/facebookresearch/WSL-Images),剩余预训练模型均基于飞桨训练得到的,并在 configs 里给出了相应的训练超参数。
<a name='4'></a>
## 参考文献 ## 4. 参考文献
<a name="ref1">[1]</a> He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778. <a name="ref1">[1]</a> He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
--- ---
图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析等,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等。 图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析等,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等。
一般来说,图像分类通过手工特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。在深度学习算法之前使用较多的是基于词袋(Bag of Words)模型的物体分类方法。而基于深度学习的图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN)近年来在图像领域取得了惊人的成绩,CNN直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于"输入-输出"直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。 一般来说,图像分类通过手工特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。在深度学习算法之前使用较多的是基于词袋(Bag of Words)模型的物体分类方法。而基于深度学习的图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN)近年来在图像领域取得了惊人的成绩,CNN 直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于“输入-输出”直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。
图像分类是计算机视觉里很基础但又重要的一个领域,其研究成果一直影响着计算机视觉甚至深度学习的发展,图像分类有很多子领域,如多标签分类、细粒度分类等,此处只对单标签图像分类做一个简述。 图像分类是计算机视觉里很基础但又重要的一个领域,其研究成果一直影响着计算机视觉甚至深度学习的发展,图像分类有很多子领域,如多标签分类、细粒度分类等,此处只对单标签图像分类做一个简述。
...@@ -10,86 +10,87 @@ ...@@ -10,86 +10,87 @@
## 目录 ## 目录
- [数据集介绍](#1) - [1. 数据集介绍](#1)
- [1.1 ImageNet-1k](#1.1) - [1.1 ImageNet-1k](#1.1)
- [1.2 CIFAR-10/CIFAR-100](#1.2) - [1.2 CIFAR-10/CIFAR-100](#1.2)
- [图像分类的流程](#2) - [2. 图像分类的流程](#2)
- [2.1 数据及其预处理](#2.1) - [2.1 数据及其预处理](#2.1)
- [2.2 模型准备](#2.2) - [2.2 模型准备](#2.2)
- [2.3 模型训练](#2.3) - [2.3 模型训练](#2.3)
- [2.3 模型评估](#2.4) - [2.4 模型评估](#2.4)
- [使用方法介绍](#3) - [3. 使用方法介绍](#3)
- [3.1 基于CPU/单卡GPU上的训练与评估](#3.1) - [3.1 基于 CPU /单卡 GPU 上的训练与评估](#3.1)
- [3.1.1 模型训练](#3.1.1) - [3.1.1 模型训练](#3.1.1)
- [3.1.2 模型微调](#3.1.2) - [3.1.2 模型微调](#3.1.2)
- [3.1.3 模型恢复训练](#3.1.3) - [3.1.3 模型恢复训练](#3.1.3)
- [3.1.4 模型评估](#3.1.4) - [3.1.4 模型评估](#3.1.4)
- [3.2 基于Linux+多卡GPU的模型训练与评估](#3.2) - [3.2 基于 Linux + 多卡 GPU 的模型训练与评估](#3.2)
- [3.2.1 模型训练](#3.2.1) - [3.2.1 模型训练](#3.2.1)
- [3.2.2 模型微调](#3.2.2) - [3.2.2 模型微调](#3.2.2)
- [3.2.3 模型恢复训练](#3.2.3) - [3.2.3 模型恢复训练](#3.2.3)
- [3.2.4 模型评估](#3.2.4) - [3.2.4 模型评估](#3.2.4)
- [3.3 使用预训练模型进行模型预测](#3.3) - [3.3 使用预训练模型进行模型预测](#3.3)
- [3.4 使用inference模型进行模型推理](#3.4) - [3.4 使用 inference 模型进行模型推理](#3.4)
<a name="1"></a> <a name="1"></a>
## 一、数据集介绍 ## 1. 数据集介绍
<a name="1.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> <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"></a>
## 二、图像分类的流程 ## 2. 图像分类的流程
将准备好的训练数据做相应的数据预处理后经过图像分类模型,模型的输出与真实标签做交叉熵损失函数,该损失函数描述了模型的收敛方向,遍历所有的图片数据输入模型,对最终损失函数通过某些优化器做相应的梯度下降,将梯度信息回传到模型中,更新模型的权重,如此循环往复遍历多次数据,即可得到一个图像分类的模型。 将准备好的训练数据做相应的数据预处理后经过图像分类模型,模型的输出与真实标签做交叉熵损失函数,该损失函数描述了模型的收敛方向,遍历所有的图片数据输入模型,对最终损失函数通过某些优化器做相应的梯度下降,将梯度信息回传到模型中,更新模型的权重,如此循环往复遍历多次数据,即可得到一个图像分类的模型。
<a name="2.1"></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> <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> <a name="2.3"></a>
### 2.3 模型训练 ### 2.3 模型训练
在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas提供了一些列的[训练调优方法](./train_strategy.md),可以快速助你获得高精度的模型。 在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas 提供了一些列的[训练调优方法](./train_strategy.md),可以快速助你获得高精度的模型。
<a name="2.4"></a> <a name="2.4"></a>
### 2.4 模型评估 ### 2.4 模型评估
当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是Top1-Acc或者Top5-Acc,该指标越高往往代表模型性能越好。 当训练得到一个模型之后,如何确定模型的好坏,需要将模型在验证集上进行评估。评估指标一般是 Top1-Acc 或者 Top5-Acc,该指标越高往往代表模型性能越好。
<a name="3"></a> <a name="3"></a>
## 三、使用方法介绍 ## 3. 使用方法介绍
请参考[安装指南](../installation/install_paddleclas.md)配置运行环境,并根据[快速开始](../quick_start/quick_start_classification_new_user.md)文档准备flower102数据集,本章节下面所有的实验均以flower102数据集为例。 请参考[安装指南](../installation/install_paddleclas.md)配置运行环境,并根据[快速开始](../quick_start/quick_start_classification_new_user.md)文档准备 flower102 数据集,本章节下面所有的实验均以 flower102 数据集为例。
PaddleClas目前支持的训练/评估环境如下: PaddleClas 目前支持的训练/评估环境如下:
```shell ```shell
└── CPU/单卡GPU └── CPU/单卡 GPU
   ├── Linux    ├── Linux
   └── Windows    └── Windows
└── 多卡GPU └── 多卡 GPU
└── Linux └── Linux
``` ```
<a name="3.1"></a> <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>
...@@ -104,13 +105,13 @@ python3 tools/train.py \ ...@@ -104,13 +105,13 @@ python3 tools/train.py \
-o Global.device=gpu -o Global.device=gpu
``` ```
其中,`-c`用于指定配置文件的路径,`-o`用于指定需要修改或者添加的参数,其中`-o Arch.pretrained=False`表示不使用预训练模型,`-o Global.device=gpu`表示使用GPU进行训练。如果希望使用CPU进行训练,则需要将`Global.device`设置为`cpu` 其中,`-c` 用于指定配置文件的路径,`-o` 用于指定需要修改或者添加的参数,其中 `-o Arch.pretrained=False` 表示不使用预训练模型,`-o Global.device=gpu` 表示使用 GPU 进行训练。如果希望使用 CPU 进行训练,则需要将 `Global.device` 设置为 `cpu`
更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](config_description.md) 更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](config_description.md)
运行上述命令,可以看到输出日志,示例如下: 运行上述命令,可以看到输出日志,示例如下:
* 如果在训练中使用了mixup或者cutmix的数据增广方式,那么日志中将不会打印top-1与top-k(默认为5)信息: * 如果在训练中使用了 mixup 或者 cutmix 的数据增广方式,那么日志中将不会打印 top-1 与 top-k(默认为 5)信息:
``` ```
... ...
[Train][Epoch 3/20][Avg]CELoss: 6.46287, loss: 6.46287 [Train][Epoch 3/20][Avg]CELoss: 6.46287, loss: 6.46287
...@@ -119,7 +120,7 @@ python3 tools/train.py \ ...@@ -119,7 +120,7 @@ python3 tools/train.py \
... ...
``` ```
* 如果训练过程中没有使用mixup或者cutmix的数据增广,那么除了上述信息外,日志中也会打印出top-1与top-k(默认为5)的信息: * 如果训练过程中没有使用 mixup 或者 cutmix 的数据增广,那么除了上述信息外,日志中也会打印出 top-1 与 top-k(默认为 5)的信息:
``` ```
... ...
...@@ -129,7 +130,7 @@ python3 tools/train.py \ ...@@ -129,7 +130,7 @@ python3 tools/train.py \
... ...
``` ```
训练期间也可以通过VisualDL实时观察loss变化,详见[VisualDL](../others/VisualDL.md) 训练期间也可以通过 VisualDL 实时观察 loss 变化,详见 [VisualDL](../others/VisualDL.md)
<a name="3.1.2"></a> <a name="3.1.2"></a>
#### 3.1.2 模型微调 #### 3.1.2 模型微调
...@@ -143,9 +144,9 @@ python3 tools/train.py \ ...@@ -143,9 +144,9 @@ python3 tools/train.py \
-o Global.device=gpu -o Global.device=gpu
``` ```
其中`Arch.pretrained`设置为`True`表示加载ImageNet的预训练模型,此外,`Arch.pretrained`也可以指定具体的模型权重文件的地址,使用时需要换成自己的预训练模型权重文件的路径。 其中 `Arch.pretrained` 设置为 `True` 表示加载 ImageNet 的预训练模型,此外,`Arch.pretrained` 也可以指定具体的模型权重文件的地址,使用时需要换成自己的预训练模型权重文件的路径。
我们也提供了大量基于`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>
...@@ -160,11 +161,11 @@ python3 tools/train.py \ ...@@ -160,11 +161,11 @@ python3 tools/train.py \
-o Global.device=gpu -o Global.device=gpu
``` ```
其中配置文件不需要做任何修改,只需要在继续训练时设置`Global.checkpoints`参数即可,表示加载的断点权重文件路径,使用该参数会同时加载保存的断点权重和学习率、优化器等信息。 其中配置文件不需要做任何修改,只需要在继续训练时设置 `Global.checkpoints` 参数即可,表示加载的断点权重文件路径,使用该参数会同时加载保存的断点权重和学习率、优化器等信息。
**注意** **注意**
* `-o Global.checkpoints`参数无需包含断点权重文件的后缀名,上述训练命令会在训练过程中生成如下所示的断点权重文件,若想从断点`5`继续训练,则`Global.checkpoints`参数只需设置为`"../output/MobileNetV3_large_x1_0/epoch_5"`,PaddleClas会自动补充后缀名。output目录下的文件结构如下所示: * `-o Global.checkpoints` 参数无需包含断点权重文件的后缀名,上述训练命令会在训练过程中生成如下所示的断点权重文件,若想从断点 `5` 继续训练,则 `Global.checkpoints` 参数只需设置为 `"../output/MobileNetV3_large_x1_0/epoch_5"`,PaddleClas 会自动补充后缀名。output 目录下的文件结构如下所示:
```shell ```shell
output output
...@@ -192,27 +193,28 @@ python3 tools/eval.py \ ...@@ -192,27 +193,28 @@ python3 tools/eval.py \
-o Global.pretrained_model=./output/MobileNetV3_large_x1_0/best_model -o Global.pretrained_model=./output/MobileNetV3_large_x1_0/best_model
``` ```
上述命令将使用`./configs/quick_start/MobileNetV3_large_x1_0.yaml`作为配置文件,对上述训练得到的模型`./output/MobileNetV3_large_x1_0/best_model`进行评估。你也可以通过更改配置文件中的参数来设置评估,也可以通过`-o`参数更新配置,如上所示。 上述命令将使用 `./configs/quick_start/MobileNetV3_large_x1_0.yaml` 作为配置文件,对上述训练得到的模型 `./output/MobileNetV3_large_x1_0/best_model` 进行评估。你也可以通过更改配置文件中的参数来设置评估,也可以通过 `-o` 参数更新配置,如上所示。
可配置的部分评估参数说明如下: 可配置的部分评估参数说明如下:
* `Arch.name`:模型名称 * `Arch.name`:模型名称
* `Global.pretrained_model`:待评估的模型预训练模型文件路径 * `Global.pretrained_model`:待评估的模型预训练模型文件路径
**注意:** 在加载待评估模型时,需要指定模型文件的路径,但无需包含文件后缀名,PaddleClas会自动补齐`.pdparams`的后缀,如[3.1.3 模型恢复训练](#3.1.3) **注意:** 在加载待评估模型时,需要指定模型文件的路径,但无需包含文件后缀名,PaddleClas 会自动补齐 `.pdparams` 的后缀,如 [3.1.3 模型恢复训练](#3.1.3)
<a name="3.2"></a> <a name="3.2"></a>
### 3.2 基于Linux+多卡GPU的模型训练与评估 ### 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> <a name="3.2.1"></a>
#### 3.2.1 模型训练 #### 3.2.1 模型训练
参考如下方式启动模型训练,`paddle.distributed.launch`通过设置`gpus`指定GPU运行卡号: 参考如下方式启动模型训练,`paddle.distributed.launch` 通过设置 `gpus` 指定 GPU 运行卡号:
```bash ```bash
# PaddleClas通过launch方式启动多卡多进程训练 # PaddleClas 通过 launch 方式启动多卡多进程训练
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \ python3 -m paddle.distributed.launch \
...@@ -221,7 +223,7 @@ python3 -m paddle.distributed.launch \ ...@@ -221,7 +223,7 @@ python3 -m paddle.distributed.launch \
-c ./ppcls/configs/quick_start/MobileNetV3_large_x1_0.yaml -c ./ppcls/configs/quick_start/MobileNetV3_large_x1_0.yaml
``` ```
输出日志信息的格式同上,详见[3.1.1 模型训练](#3.1.1) 输出日志信息的格式同上,详见 [3.1.1 模型训练](#3.1.1)
<a name="3.2.2"></a> <a name="3.2.2"></a>
#### 3.2.2 模型微调 #### 3.2.2 模型微调
...@@ -237,12 +239,12 @@ python3 -m paddle.distributed.launch \ ...@@ -237,12 +239,12 @@ python3 -m paddle.distributed.launch \
-o Arch.pretrained=True -o Arch.pretrained=True
``` ```
其中`Arch.pretrained``True``False`,当然也可以设置加载预训练权重文件的路径,使用时需要换成自己的预训练模型权重文件路径,也可以直接在配置文件中修改该路径。 其中 `Arch.pretrained``True``False`,当然也可以设置加载预训练权重文件的路径,使用时需要换成自己的预训练模型权重文件路径,也可以直接在配置文件中修改该路径。
30分钟玩转PaddleClas[尝鲜版](../quick_start/quick_start_classification_new_user.md)[进阶版](../quick_start/quick_start_classification_professional.md)中包含大量模型微调的示例,可以参考该章节在特定的数据集上进行模型微调。
30 分钟玩转 PaddleClas [尝鲜版](../quick_start/quick_start_classification_new_user.md)[进阶版](../quick_start/quick_start_classification_professional.md)中包含大量模型微调的示例,可以参考该章节在特定的数据集上进行模型微调。
<a name="3.2.3"></a> <a name="3.2.3"></a>
#### 3.2.3 模型恢复训练 #### 3.2.3 模型恢复训练
如果训练任务因为其他原因被终止,也可以加载断点权重文件继续训练。 如果训练任务因为其他原因被终止,也可以加载断点权重文件继续训练。
...@@ -258,9 +260,10 @@ python3 -m paddle.distributed.launch \ ...@@ -258,9 +260,10 @@ python3 -m paddle.distributed.launch \
-o Global.device=gpu -o Global.device=gpu
``` ```
其中配置文件不需要做任何修改,只需要在训练时设置`Global.checkpoints`参数即可,该参数表示加载的断点权重文件路径,使用该参数会同时加载保存的模型参数权重和学习率、优化器等信息,详见[3.1.3 模型恢复训练](#3.1.3) 其中配置文件不需要做任何修改,只需要在训练时设置 `Global.checkpoints` 参数即可,该参数表示加载的断点权重文件路径,使用该参数会同时加载保存的模型参数权重和学习率、优化器等信息,详见 [3.1.3 模型恢复训练](#3.1.3)
<a name="3.2.4"></a> <a name="3.2.4"></a>
#### 3.2.4 模型评估 #### 3.2.4 模型评估
可以通过以下命令进行模型评估。 可以通过以下命令进行模型评估。
...@@ -273,7 +276,7 @@ python3 -m paddle.distributed.launch \ ...@@ -273,7 +276,7 @@ python3 -m paddle.distributed.launch \
-o Global.pretrained_model=./output/MobileNetV3_large_x1_0/best_model -o Global.pretrained_model=./output/MobileNetV3_large_x1_0/best_model
``` ```
参数说明详见[3.1.4 模型评估](#3.1.4) 参数说明详见 [3.1.4 模型评估](#3.1.4)
<a name="3.3"></a> <a name="3.3"></a>
...@@ -294,9 +297,9 @@ python3 tools/infer.py \ ...@@ -294,9 +297,9 @@ python3 tools/infer.py \
<a name="3.4"></a> <a name="3.4"></a>
### 3.4 使用inference模型进行模型推理 ### 3.4 使用 inference 模型进行模型推理
通过导出inference模型,PaddlePaddle支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理: 通过导出 inference 模型,PaddlePaddle 支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理:
首先,对训练好的模型进行转换: 首先,对训练好的模型进行转换:
```bash ```bash
...@@ -306,17 +309,17 @@ python3 tools/export_model.py \ ...@@ -306,17 +309,17 @@ python3 tools/export_model.py \
``` ```
其中,`Global.pretrained_model`用于指定模型文件路径,该路径仍无需包含模型文件后缀名(如[3.1.3 模型恢复训练](#3.1.3))。 其中,`Global.pretrained_model` 用于指定模型文件路径,该路径仍无需包含模型文件后缀名(如 [3.1.3 模型恢复训练](#3.1.3))。
上述命令将生成模型结构文件`inference.pdmodel`)和模型权重文件(`inference.pdiparams`,然后可以使用预测引擎进行推理: 上述命令将生成模型结构文件(`inference.pdmodel`)和模型权重文件(`inference.pdiparams`),然后可以使用预测引擎进行推理:
进入deploy目录下: 进入 deploy 目录下:
```bash ```bash
cd deploy cd deploy
``` ```
执行命令进行预测,由于默认class_id_map_file是ImageNet数据集的映射文件,所以此处需要置None。 执行命令进行预测,由于默认 `class_id_map_file` 是 ImageNet 数据集的映射文件,所以此处需要置 None。
```bash ```bash
python3 python/predict_cls.py \ python3 python/predict_cls.py \
...@@ -328,13 +331,13 @@ python3 python/predict_cls.py \ ...@@ -328,13 +331,13 @@ python3 python/predict_cls.py \
``` ```
其中: 其中:
+ `Global.infer_imgs`:待预测的图片文件路径。 + `Global.infer_imgs`:待预测的图片文件路径。
+ `Global.inference_model_dir`:inference模型结构文件路径,如 `../inference/inference.pdmodel` + `Global.inference_model_dir`:inference 模型结构文件路径,如 `../inference/inference.pdmodel`
+ `Global.use_tensorrt`:是否使用 TesorRT 预测引擎,默认值:`False` + `Global.use_tensorrt`:是否使用 TesorRT 预测引擎,默认值:`False`
+ `Global.use_gpu`:是否使用 GPU 预测,默认值:`True` + `Global.use_gpu`:是否使用 GPU 预测,默认值:`True`
+ `Global.enable_mkldnn`:是否启用`MKL-DNN`加速,默认为`False`。注意`enable_mkldnn``use_gpu`同时为`True`时,将忽略`enable_mkldnn`,而使用GPU运行。 + `Global.enable_mkldnn`:是否启用 `MKL-DNN` 加速,默认为 `False`。注意 `enable_mkldnn``use_gpu` 同时为 `True` 时,将忽略 `enable_mkldnn`,而使用 GPU 运行。
+ `Global.use_fp16`:是否启用`FP16`,默认为`False` + `Global.use_fp16`:是否启用 `FP16`,默认为 `False`
注意: 如果使用`Transformer`系列模型,如`DeiT_***_384`, `ViT_***_384`等,请注意模型的输入数据尺寸,需要设置参数`resize_short=384`, `resize=384` 注意: 如果使用 `Transformer` 系列模型,如 `DeiT_***_384`, `ViT_***_384` 等,请注意模型的输入数据尺寸,需要设置参数 `resize_short=384`, `resize=384`
如果你希望提升评测模型速度,使用gpu评测时,建议开启TensorRT加速预测,使用cpu评测时,建议开启MKLDNN加速预测。 如果你希望提升评测模型速度,使用 GPU 评测时,建议开启 TensorRT 加速预测,使用 CPU 评测时,建议开启 MKLDNN 加速预测。
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
## 简介 ## 简介
本文档介绍了PaddleClas配置文件(`ppcls/configs/*.yaml`)中各参数的含义,以便您更快地自定义或修改超参数配置。 本文档介绍了 PaddleClas 配置文件(`ppcls/configs/*.yaml`)中各参数的含义,以便您更快地自定义或修改超参数配置。
...@@ -12,28 +12,29 @@ ...@@ -12,28 +12,29 @@
### 目录 ### 目录
- [分类模型](#1) - [1. 分类模型](#1)
- [1.1 全局配置(Global)](#1.1) - [1.1 全局配置(Global)](#1.1)
- [1.2 结构(Arch)](#1.2) - [1.2 结构(Arch)](#1.2)
- [1.3 损失函数(Loss)](#1.3) - [1.3 损失函数(Loss)](#1.3)
- [1.4 优化器(Optimizer)](#1.4) - [1.4 优化器(Optimizer)](#1.4)
- [1.5数据读取模块(DataLoader)](#1.5) - [1.5 数据读取模块(DataLoader)](#1.5)
- [1.5.1 dataset](#1.5.1) - [1.5.1 dataset](#1.5.1)
- [1.5.1 sampler](#1.5.2) - [1.5.2 sampler](#1.5.2)
- [1.5.1 loader](#1.5.3) - [1.5.3 loader](#1.5.3)
- [1.6 评估指标(Metric)](#1.6) - [1.6 评估指标(Metric)](#1.6)
- [蒸馏模型](#2) - [2. 蒸馏模型](#2)
- [2.1 结构(Arch)](#2.1) - [2.1 结构(Arch)](#2.1)
- [2.2 损失函数(Loss)](#2.2) - [2.2 损失函数(Loss)](#2.2)
- [2.3 评估指标(Metric)](#2.3) - [2.3 评估指标(Metric)](#2.3)
- [识别模型](#3) - [3. 识别模型](#3)
- [3.1 结构(Arch)](#3.1) - [3.1 结构(Arch)](#3.1)
- [3.2 评估指标(Metric)](#3.2) - [3.2 评估指标(Metric)](#3.2)
<a name="1"></a> <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> <a name="1.1"></a>
#### 1.1 全局配置(Global) #### 1.1 全局配置(Global)
...@@ -43,30 +44,30 @@ ...@@ -43,30 +44,30 @@
| checkpoints | 断点模型路径,用于恢复训练 | null | str | | checkpoints | 断点模型路径,用于恢复训练 | null | str |
| pretrained_model | 预训练模型路径 | null | str | | pretrained_model | 预训练模型路径 | null | str |
| output_dir | 保存模型路径 | "./output/" | str | | output_dir | 保存模型路径 | "./output/" | str |
| save_interval | 每隔多少个epoch保存模型 | 1 | int | | save_interval | 每隔多少个 epoch 保存模型 | 1 | int |
| eval_during_train| 是否在训练时进行评估 | True | bool | | eval_during_train| 是否在训练时进行评估 | True | bool |
| eval_interval | 每隔多少个epoch进行模型评估 | 1 | int | | eval_interval | 每隔多少个 epoch 进行模型评估 | 1 | int |
| epochs | 训练总epoch数 | | int | | epochs | 训练总 epoch 数 | | int |
| print_batch_step | 每隔多少个mini-batch打印输出 | 10 | int | | print_batch_step | 每隔多少个 mini-batch 打印输出 | 10 | int |
| use_visualdl | 是否是用visualdl可视化训练过程 | False | bool | | use_visualdl | 是否是用 visualdl 可视化训练过程 | False | bool |
| image_shape | 图片大小 | [3,224,224] | list, shape: (3,) | | image_shape | 图片大小 | [3, 224, 224] | list, shape: (3,) |
| save_inference_dir | inference模型的保存路径 | "./inference" | str | | save_inference_dir | inference 模型的保存路径 | "./inference" | str |
| eval_mode | eval的模式 | "classification" | "retrieval" | | eval_mode | eval 的模式 | "classification" | "retrieval" |
| to_static | 是否改为静态图模式 | False | True | | to_static | 是否改为静态图模式 | False | True |
| ues_dali | 是否使用dali库进行图像预处理 | False | True | | ues_dali | 是否使用 dali 库进行图像预处理 | False | True |
**注**`pretrained_model`也可以填写存放预训练模型的http地址。 **注**`pretrained_model` 也可以填写存放预训练模型的 http 地址。
<a name="1.2"></a> <a name="1.2"></a>
#### 1.2 结构(Arch) #### 1.2 结构(Arch)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| name | 模型结构名字 | ResNet50 | PaddleClas提供的模型结构 | | name | 模型结构名字 | ResNet50 | PaddleClas 提供的模型结构 |
| class_num | 分类数 | 1000 | int | | class_num | 分类数 | 1000 | int |
| pretrained | 预训练模型 | False | bool str | | pretrained | 预训练模型 | False | bool, str |
**注**:此处的pretrained可以设置为`True`或者`False`,也可以设置权重的路径。另外当`Global.pretrained_model`也设置相应路径时,此处的`pretrained`失效。 **注**:此处的 pretrained 可以设置为 `True` 或者 `False`,也可以设置权重的路径。另外当 `Global.pretrained_model` 也设置相应路径时,此处的 `pretrained` 失效。
<a name="1.3"></a> <a name="1.3"></a>
#### 1.3 损失函数(Loss) #### 1.3 损失函数(Loss)
...@@ -74,8 +75,8 @@ ...@@ -74,8 +75,8 @@
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| CELoss | 交叉熵损失函数 | —— | —— | | CELoss | 交叉熵损失函数 | —— | —— |
| 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> <a name="1.4"></a>
#### 1.4 优化器(Optimizer) #### 1.4 优化器(Optimizer)
...@@ -83,14 +84,14 @@ ...@@ -83,14 +84,14 @@
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| name | 优化器方法名 | "Momentum" | "RmsProp"等其他优化器 | | name | 优化器方法名 | "Momentum" | "RmsProp"等其他优化器 |
| momentum | momentum值 | 0.9 | float | | momentum | momentum 值 | 0.9 | float |
| lr.name | 学习率下降方式 | "Cosine" | "Linear"、"Piecewise"等其他下降方式 | | lr.name | 学习率下降方式 | "Cosine" | "Linear"、"Piecewise"等其他下降方式 |
| lr.learning_rate | 学习率初始值 | 0.1 | float | | lr.learning_rate | 学习率初始值 | 0.1 | float |
| lr.warmup_epoch | warmup轮数 | 0 | int,如5 | | lr.warmup_epoch | warmup 轮数 | 0 | int,如 5 |
| regularizer.name | 正则化方法名 | "L2" | ["L1", "L2"] | | regularizer.name | 正则化方法名 | "L2" | ["L1", "L2"] |
| regularizer.coeff | 正则化系数 | 0.00007 | float | | regularizer.coeff | 正则化系数 | 0.00007 | float |
**注**`lr.name`不同时,新增的参数可能也不同,如当`lr.name=Piecewise`时,需要添加如下参数: **注**`lr.name` 不同时,新增的参数可能也不同,如当 `lr.name=Piecewise` 时,需要添加如下参数:
``` ```
lr: lr:
...@@ -100,53 +101,53 @@ ...@@ -100,53 +101,53 @@
values: [0.1, 0.01, 0.001, 0.0001] values: [0.1, 0.01, 0.001, 0.0001]
``` ```
添加方法及参数请查看[learning_rate.py](../../../ppcls/optimizer/learning_rate.py) 添加方法及参数请查看 [learning_rate.py](../../../ppcls/optimizer/learning_rate.py)
<a name="1.5"></a> <a name="1.5"></a>
#### 1.5数据读取模块(DataLoader) #### 1.5 数据读取模块(DataLoader)
<a name="1.5.1"></a> <a name="1.5.1"></a>
##### 1.5.1 dataset ##### 1.5.1 dataset
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| name | 读取数据的类的名字 | ImageNetDataset | VeriWild等其他读取数据类的名字 | | name | 读取数据的类的名字 | ImageNetDataset | VeriWild 等其他读取数据类的名字 |
| image_root | 数据集存放的路径 | ./dataset/ILSVRC2012/ | str | | image_root | 数据集存放的路径 | ./dataset/ILSVRC2012/ | str |
| cls_label_path | 数据集标签list | ./dataset/ILSVRC2012/train_list.txt | str | | cls_label_path | 数据集标签 list | ./dataset/ILSVRC2012/train_list.txt | str |
| transform_ops | 单张图片的数据预处理 | —— | —— | | transform_ops | 单张图片的数据预处理 | —— | —— |
| batch_transform_ops | batch图片的数据预处理 | —— | —— | | batch_transform_ops | batch 图片的数据预处理 | —— | —— |
transform_ops中参数的意义: transform_ops 中参数的意义:
| 功能名字 | 参数名字 | 具体含义 | | 功能名字 | 参数名字 | 具体含义 |
|:---:|:---:|:---:| |:---:|:---:|:---:|
| DecodeImage | to_rgb | 数据转RGB | | DecodeImage | to_rgb | 数据转 RGB |
| | channel_first | 按CHW排列的图片数据 | | | channel_first | 按 CHW 排列的图片数据 |
| RandCropImage | size | 随机裁剪 | | RandCropImage | size | 随机裁剪 |
| RandFlipImage | | 随机翻转 | | RandFlipImage | | 随机翻转 |
| NormalizeImage | scale | 归一化scale值 | | NormalizeImage | scale | 归一化 scale 值 |
| | mean | 归一化均值 | | | mean | 归一化均值 |
| | std | 归一化方差 | | | std | 归一化方差 |
| | order | 归一化顺序 | | | order | 归一化顺序 |
| CropImage | size | 裁剪大小 | | CropImage | size | 裁剪大小 |
| ResizeImage | resize_short | 按短边调整大小 | | ResizeImage | resize_short | 按短边调整大小 |
batch_transform_ops中参数的含义: batch_transform_ops 中参数的含义:
| 功能名字 | 参数名字 | 具体含义 | | 功能名字 | 参数名字 | 具体含义 |
|:---:|:---:|:---:| |:---:|:---:|:---:|
| MixupOperator | alpha | Mixup参数值,该值越大增强越强 | | MixupOperator | alpha | Mixup 参数值,该值越大增强越强 |
<a name="1.5.2"></a> <a name="1.5.2"></a>
##### 1.5.2 sampler ##### 1.5.2 sampler
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| name | sampler类型 | DistributedBatchSampler | DistributedRandomIdentitySampler等其他Sampler | | name | sampler 类型 | DistributedBatchSampler | DistributedRandomIdentitySampler 等其他 Sampler |
| batch_size | 批大小 | 64 | int | | batch_size | 批大小 | 64 | int |
| 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> <a name="1.5.3"></a>
##### 1.5.3 loader ##### 1.5.3 loader
...@@ -157,7 +158,7 @@ batch_transform_ops中参数的含义: ...@@ -157,7 +158,7 @@ batch_transform_ops中参数的含义:
| use_shared_memory | 是否使用共享内存 | True | bool | | use_shared_memory | 是否使用共享内存 | True | bool |
<a name="1.6"></a> <a name="1.6"></a>
#### 1.6 评估指标(Metric) #### 1.6 评估指标(Metric)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
...@@ -168,18 +169,18 @@ batch_transform_ops中参数的含义: ...@@ -168,18 +169,18 @@ batch_transform_ops中参数的含义:
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| infer_imgs | 被infer的图像的地址 | docs/images/whl/demo.jpg | str | | infer_imgs | 被 infer 的图像的地址 | docs/images/whl/demo.jpg | str |
| batch_size | 批大小 | 10 | int | | batch_size | 批大小 | 10 | int |
| PostProcess.name | 后处理名字 | Topk | str | | PostProcess.name | 后处理名字 | Topk | str |
| PostProcess.topk | topk的值 | 5 | int | | PostProcess.topk | topk 的值 | 5 | int |
| PostProcess.class_id_map_file | class id和名字的映射文件 | ppcls/utils/imagenet1k_label_list.txt | str | | PostProcess.class_id_map_file | class id 和名字的映射文件 | ppcls/utils/imagenet1k_label_list.txt | str |
**注**:Infer模块的`transforms`的解释参考数据读取模块中的dataset中`transform_ops`的解释。 **注**:Infer 模块的 `transforms` 的解释参考数据读取模块中的 dataset 中 `transform_ops` 的解释。
<a name="2"></a> <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> <a name="2.1"></a>
#### 2.1 结构(Arch) #### 2.1 结构(Arch)
...@@ -190,48 +191,49 @@ batch_transform_ops中参数的含义: ...@@ -190,48 +191,49 @@ batch_transform_ops中参数的含义:
| class_num | 分类数 | 1000 | int | | class_num | 分类数 | 1000 | int |
| freeze_params_list | 冻结参数列表 | [True, False] | list | | freeze_params_list | 冻结参数列表 | [True, False] | list |
| models | 模型列表 | [Teacher, Student] | list | | models | 模型列表 | [Teacher, Student] | list |
| Teacher.name | 教师模型的名字 | MobileNetV3_large_x1_0 | PaddleClas中的模型 | | Teacher.name | 教师模型的名字 | MobileNetV3_large_x1_0 | PaddleClas 中的模型 |
| Teacher.pretrained | 教师模型预训练权重 | True | 布尔值或者预训练权重路径 | | Teacher.pretrained | 教师模型预训练权重 | True | 布尔值或者预训练权重路径 |
| Teacher.use_ssld | 教师模型预训练权重是否是ssld权重 | True | 布尔值 | | Teacher.use_ssld | 教师模型预训练权重是否是 ssld 权重 | True | 布尔值 |
| infer_model_name | 被infer模型的类型 | Student | Teacher | | infer_model_name | 被 infer 模型的类型 | Student | Teacher |
**注** **注**
1.list在yaml中体现如下: 1.list 在 yaml 中体现如下:
``` ```
freeze_params_list: freeze_params_list:
- True - True
- False - False
``` ```
2.Student的参数情况类似,不再赘述。 2.Student 的参数情况类似,不再赘述。
<a name="2.2"></a> <a name="2.2"></a>
#### 2.2 损失函数(Loss) #### 2.2 损失函数(Loss)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| DistillationCELoss | 蒸馏的交叉熵损失函数 | —— | —— | | DistillationCELoss | 蒸馏的交叉熵损失函数 | —— | —— |
| DistillationCELoss.weight | Loss权重 | 1.0 | float | | DistillationCELoss.weight | Loss 权重 | 1.0 | float |
| DistillationCELoss.model_name_pairs | ["Student", "Teacher"] | —— | —— | | DistillationCELoss.model_name_pairs | ["Student", "Teacher"] | —— | —— |
| DistillationGTCELoss.weight | 蒸馏的模型与真实Label的交叉熵损失函数 | —— | —— | | DistillationGTCELoss.weight | 蒸馏的模型与真实 Label 的交叉熵损失函数 | —— | —— |
| 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> <a name="2.3"></a>
#### 2.3 评估指标(Metric) #### 2.3 评估指标(Metric)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| DistillationTopkAcc | DistillationTopkAcc | 包含model_key和topk两个参数 | —— | | DistillationTopkAcc | DistillationTopkAcc | 包含 model_key 和 topk 两个参数 | —— |
| DistillationTopkAcc.model_key | 被评估的模型 | "Student" | "Teacher" | | DistillationTopkAcc.model_key | 被评估的模型 | "Student" | "Teacher" |
| DistillationTopkAcc.topk | Topk的值 | [1, 5] | list, int | | DistillationTopkAcc.topk | Topk 的值 | [1, 5] | list, int |
**注**`DistillationTopkAcc`与普通`TopkAcc`含义相同,只是只用在蒸馏任务中。 **注**`DistillationTopkAcc` 与普通 `TopkAcc` 含义相同,只是只用在蒸馏任务中。
<a name="3"></a> <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> <a name="3.1"></a>
#### 3.1 结构(Arch) #### 3.1 结构(Arch)
...@@ -239,30 +241,30 @@ batch_transform_ops中参数的含义: ...@@ -239,30 +241,30 @@ batch_transform_ops中参数的含义:
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
| :---------------: | :-----------------------: | :--------: | :----------------------------------------------------------: | | :---------------: | :-----------------------: | :--------: | :----------------------------------------------------------: |
| name | 模型结构 | "RecModel" | ["RecModel"] | | name | 模型结构 | "RecModel" | ["RecModel"] |
| infer_output_key | inference时的输出值 | “feature” | ["feature", "logits"] | | infer_output_key | inference 时的输出值 | “feature” | ["feature", "logits"] |
| infer_add_softmax | infercne是否添加softmax | False | [True, False] | | infer_add_softmax | infercne 是否添加 softmax | False | [True, False] |
| Backbone.name | Backbone的名字 | ResNet50_last_stage_stride1 | PaddleClas提供的其他backbone | | Backbone.name | Backbone 的名字 | ResNet50_last_stage_stride1 | PaddleClas 提供的其他 backbone |
| Backbone.pretrained | Backbone预训练模型 | True | 布尔值或者预训练模型路径 | | Backbone.pretrained | Backbone 预训练模型 | True | 布尔值或者预训练模型路径 |
| BackboneStopLayer.name | Backbone中的输出层名字 | True | Backbone中的特征输出层的`full_name` | | BackboneStopLayer.name | Backbone 中的输出层名字 | True | Backbone 中的特征输出层的 `full_name` |
| Neck.name | 网络Neck部分名字 | VehicleNeck | 需传入字典结构,Neck网络层的具体输入参数 | | Neck.name | 网络 Neck 部分名字 | VehicleNeck | 需传入字典结构,Neck 网络层的具体输入参数 |
| Neck.in_channels | 输入Neck部分的维度大小 | 2048 | 与BackboneStopLayer.name层的大小相同 | | Neck.in_channels | 输入 Neck 部分的维度大小 | 2048 | 与 BackboneStopLayer.name 层的大小相同 |
| Neck.out_channels | 输出Neck部分的维度大小,即特征维度大小 | 512 | int | | Neck.out_channels | 输出 Neck 部分的维度大小,即特征维度大小 | 512 | int |
| Head.name | 网络Head部分名字 | CircleMargin | Arcmargin等 | | Head.name | 网络 Head 部分名字 | CircleMargin | Arcmargin 等 |
| Head.embedding_size | 特征维度大小 | 512 | 与Neck.out_channels保持一致 | | Head.embedding_size | 特征维度大小 | 512 | 与 Neck.out_channels 保持一致 |
| Head.class_num | 类别数 | 3000 | int | | Head.class_num | 类别数 | 3000 | int |
| Head.margin | CircleMargin中的margin值 | 0.35 | float | | Head.margin | CircleMargin 中的 margin 值 | 0.35 | float |
| Head.scale | CircleMargin中的scale值 | 64 | int | | Head.scale | CircleMargin 中的 scale 值 | 64 | int |
**注** **注**
1.PaddleClas中,`Neck`部分是Backbone与embedding层的连接部分,`Head`部分是embedding层与分类层的连接部分。 1. PaddleClas 中,`Neck` 部分是 Backbone 与 embedding 层的连接部分,`Head` 部分是 embedding 层与分类层的连接部分。
2.`BackboneStopLayer.name`的获取方式可以通过将模型可视化后获取,可视化方式可以参考[Netron](https://github.com/lutzroeder/netron)或者[visualdl](https://github.com/PaddlePaddle/VisualDL) 2.`BackboneStopLayer.name` 的获取方式可以通过将模型可视化后获取,可视化方式可以参考 [Netron](https://github.com/lutzroeder/netron) 或者 [visualdl](https://github.com/PaddlePaddle/VisualDL)
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> <a name="3.2"></a>
#### 3.2 评估指标(Metric) #### 3.2 评估指标(Metric)
| 参数名字 | 具体含义 | 默认值 | 可选值 | | 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
......
# 图像识别 # 图像识别
--- ---
PaddleClas中,图像识别,是指给定一张查询图像,系统能够识别该查询图像类别。广义上,图像分类也是图像识别的一种。但是与普通图像识别不同的是,图像分类只能判别出模型已经学习的类别,如果需要添加新的类别,分类模型只能重新训练。PaddleClas中的图像识别,**对于陌生类别,只需要更新相应的检索库**,就能够正确的识别出查询图像的类别,而无需重新训练模型,这大大增加了识别系统的可用性,同时降低了更新模型的需求,方便用户部署应用。 PaddleClas 中,图像识别,是指给定一张查询图像,系统能够识别该查询图像类别。广义上,图像分类也是图像识别的一种。但是与普通图像识别不同的是,图像分类只能判别出模型已经学习的类别,如果需要添加新的类别,分类模型只能重新训练。PaddleClas 中的图像识别,**对于陌生类别,只需要更新相应的检索库**,就能够正确的识别出查询图像的类别,而无需重新训练模型,这大大增加了识别系统的可用性,同时降低了更新模型的需求,方便用户部署应用。
对于一张待查询图片,PaddleClas中的图像识别流程主要分为三部分: 对于一张待查询图片,PaddleClas 中的图像识别流程主要分为三部分:
1. 主体检测:对于给定一个查询图像,主体检测器首先检测出图像的物体,从而去掉无用背景信息,提高识别精度。 1. 主体检测:对于给定一个查询图像,主体检测器首先检测出图像的物体,从而去掉无用背景信息,提高识别精度。
2. 特征提取:对主体检测的各个候选区域,通过特征模型,进行特征提取 2. 特征提取:对主体检测的各个候选区域,通过特征模型,进行特征提取
...@@ -19,47 +19,47 @@ ...@@ -19,47 +19,47 @@
## 目录 ## 目录
- [主体检测](#主体检测) - [1. 主体检测](#1)
- [特征模型训练](#特征模型训练) - [2. 特征模型训练](#2)
- [2.1. 特征模型数据准备与处理](#特征模型数据准备与处理) - [2.1. 特征模型数据准备与处理](#2.1)
- [2. 特征模型基于单卡GPU上的训练与评估](#特征模型基于单卡GPU上的训练与评估) - [2. 2 特征模型基于单卡 GPU 上的训练与评估](#2.2)
- [2.1 特征模型训练](#特征模型训练) - [2.2.1 特征模型训练](#2.2.2)
- [2.2 特征模型恢复训练](#特征模型恢复训练) - [2.2.2 特征模型恢复训练](#2.2.2)
- [2.3 特征模型评估](#特征模型评估) - [2.2.3 特征模型评估](#2.2.3)
- [3. 特征模型导出inference模型](#特征模型导出inference模型) - [2.3 特征模型导出 inference 模型](#2.3)
- [特征检索](#特征检索) - [3. 特征检索](#3)
- [基础知识](#基础知识) - [4. 基础知识](#4)
<a name="主体检测"></a> <a name="1"></a>
## 一、主体检测 ## 1. 主体检测
主体检测训练过程基于 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/tree/develop) ,唯一的区别在于,主体检测任务中,所有的检测框均属于前景,在这里需要将标注文件中,检测框的 `category_id` 修改为1,同时将整个标注文件中的 `categories` 映射表修改为下面的格式,即整个类别映射表中只包含`前景`类别。 主体检测训练过程基于 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/tree/develop),唯一的区别在于,主体检测任务中,所有的检测框均属于前景,在这里需要将标注文件中,检测框的 `category_id` 修改为 1,同时将整个标注文件中的 `categories` 映射表修改为下面的格式,即整个类别映射表中只包含 `前景` 类别。
```json ```json
[{u'id': 1, u'name': u'foreground', u'supercategory': u'foreground'}] [{u'id': 1, u'name': u'foreground', u'supercategory': u'foreground'}]
``` ```
关于主体检测训练方法可以参考: [PaddleDetection训练教程](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/docs/tutorials/GETTING_STARTED_cn.md#4-%E8%AE%AD%E7%BB%83) 关于主体检测训练方法可以参考: [PaddleDetection 训练教程](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/docs/tutorials/GETTING_STARTED_cn.md#4-%E8%AE%AD%E7%BB%83)
更多关于 PaddleClas 中提供的主体检测的模型介绍与下载请参考:[主体检测教程](../image_recognition_pipeline/mainbody_detection.md) 更多关于 PaddleClas 中提供的主体检测的模型介绍与下载请参考:[主体检测教程](../image_recognition_pipeline/mainbody_detection.md)
<a name="特征模型训练"></a> <a name="2"></a>
## 二、特征模型训练 ## 2. 特征模型训练
<a name="特征模型数据准备与处理"></a> <a name="2.1"></a>
### 2.1 特征模型数据的准备与处理 ### 2.1 特征模型数据的准备与处理
* 进入PaddleClas目录。 * 进入 `PaddleClas` 目录。
```bash ```bash
## linux or mac, $path_to_PaddleClas表示PaddleClas的根目录,用户需要根据自己的真实目录修改 ## linux or mac, $path_to_PaddleClas 表示 PaddleClas 的根目录,用户需要根据自己的真实目录修改
cd $path_to_PaddleClas cd $path_to_PaddleClas
``` ```
* 进入`dataset`目录,为了快速体验PaddleClas图像检索模块,此处使用的数据集为[CUB_200_2011](http://vision.ucsd.edu/sites/default/files/WelinderEtal10_CUB-200.pdf),其是一个包含200类鸟的细粒度鸟类数据集。首先,下载CUB_200_2011数据集,下载方式请参考[官网](http://www.vision.caltech.edu/visipedia/CUB-200-2011.html) * 进入 `dataset` 目录,为了快速体验 PaddleClas 图像检索模块,此处使用的数据集为 [CUB_200_2011](http://vision.ucsd.edu/sites/default/files/WelinderEtal10_CUB-200.pdf),其是一个包含 200 类鸟的细粒度鸟类数据集。首先,下载 CUB_200_2011 数据集,下载方式请参考[官网](http://www.vision.caltech.edu/visipedia/CUB-200-2011.html)
```shell ```shell
# linux or mac # linux or mac
...@@ -71,28 +71,28 @@ cp {数据存放的路径}/CUB_200_2011.tgz . ...@@ -71,28 +71,28 @@ cp {数据存放的路径}/CUB_200_2011.tgz .
# 解压 # 解压
tar -xzvf CUB_200_2011.tgz tar -xzvf CUB_200_2011.tgz
#进入CUB_200_2011目录 #进入 CUB_200_2011 目录
cd CUB_200_2011 cd CUB_200_2011
``` ```
该数据集在用作图像检索任务时,通常将前100类当做训练集,后100类当做测试集,所以此处需要将下载的数据集做一些后处理,来更好的适应PaddleClas的图像检索训练。 该数据集在用作图像检索任务时,通常将前 100 类当做训练集,后 100 类当做测试集,所以此处需要将下载的数据集做一些后处理,来更好的适应 PaddleClas 的图像检索训练。
```shell ```shell
#新建train和test目录 #新建 train 和 test 目录
mkdir train && mkdir test mkdir train && mkdir test
#将数据分成训练集和测试集,前100类作为训练集,后100类作为测试集 #将数据分成训练集和测试集,前 100 类作为训练集,后 100 类作为测试集
ls images | awk -F "." '{if(int($1)<101)print "mv images/"$0" train/"int($1)}' | sh ls images | awk -F "." '{if(int($1)<101)print "mv images/"$0" train/"int($1)}' | sh
ls images | awk -F "." '{if(int($1)>100)print "mv images/"$0" test/"int($1)}' | sh ls images | awk -F "." '{if(int($1)>100)print "mv images/"$0" test/"int($1)}' | sh
#生成train_list和test_list #生成 train_list 和 test_list
tree -r -i -f train | grep jpg | awk -F "/" '{print $0" "int($2) " "NR}' > train_list.txt tree -r -i -f train | grep jpg | awk -F "/" '{print $0" "int($2) " "NR}' > train_list.txt
tree -r -i -f test | grep jpg | awk -F "/" '{print $0" "int($2) " "NR}' > test_list.txt tree -r -i -f test | grep jpg | awk -F "/" '{print $0" "int($2) " "NR}' > test_list.txt
``` ```
至此,现在已经得到`CUB_200_2011`的训练集(`train`目录)、测试集(`test`目录)、`train_list.txt``test_list.txt` 至此,现在已经得到 `CUB_200_2011` 的训练集(`train` 目录)、测试集(`test` 目录)、`train_list.txt``test_list.txt`
数据处理完毕后,`CUB_200_2011`中的`train`目录下应有如下结构: 数据处理完毕后,`CUB_200_2011` 中的 `train` 目录下应有如下结构:
``` ```
├── 1 ├── 1
...@@ -105,7 +105,7 @@ tree -r -i -f test | grep jpg | awk -F "/" '{print $0" "int($2) " "NR}' > test_l ...@@ -105,7 +105,7 @@ tree -r -i -f test | grep jpg | awk -F "/" '{print $0" "int($2) " "NR}' > test_l
... ...
``` ```
`train_list.txt`应为: `train_list.txt` 应为:
``` ```
train/99/Ovenbird_0137_92639.jpg 99 1 train/99/Ovenbird_0137_92639.jpg 99 1
...@@ -115,40 +115,40 @@ train/99/Ovenbird_0131_92559.jpg 99 4 ...@@ -115,40 +115,40 @@ train/99/Ovenbird_0131_92559.jpg 99 4
train/99/Ovenbird_0130_92452.jpg 99 5 train/99/Ovenbird_0130_92452.jpg 99 5
... ...
``` ```
其中,分隔符为空格" ", 三列数据的含义分别是训练数据的路径、训练数据的label信息、训练数据的unique id。 其中,分隔符为空格" ", 三列数据的含义分别是训练数据的路径、训练数据的 label 信息、训练数据的 unique id。
测试集格式与训练集格式相同。 测试集格式与训练集格式相同。
**注意** **注意**
*gallery dataset和query dataset相同时,为了去掉检索得到的第一个数据(检索图片本身无须评估),每个数据需要对应一个unique id,用于后续评测mAP、recall@1等指标。关于gallery dataset与query dataset的解析请参考[图像检索数据集介绍](#图像检索数据集介绍), 关于mAP、recall@1等评测指标请参考[图像检索评价指标](#图像检索评价指标) * gallery dataset 和 query dataset 相同时,为了去掉检索得到的第一个数据(检索图片本身无须评估),每个数据需要对应一个 unique id,用于后续评测 mAP、recall@1 等指标。关于 gallery dataset 与 query dataset 的解析请参考[图像检索数据集介绍](#图像检索数据集介绍), 关于 mAP、recall@1 等评测指标请参考[图像检索评价指标](#图像检索评价指标)
返回`PaddleClas`根目录 返回 `PaddleClas` 根目录
```shell ```shell
# linux or mac # linux or mac
cd ../../ cd ../../
``` ```
<a name="特征模型基于单卡GPU上的训练与评估"></a> <a name="2.2"></a>
### 2.2 特征模型GPU上的训练与评估 ### 2.2 特征模型 GPU 上的训练与评估
在基于单卡GPU上训练与评估,推荐使用`tools/train.py``tools/eval.py`脚本。 在基于单卡 GPU 上训练与评估,推荐使用 `tools/train.py``tools/eval.py` 脚本。
<a name="特征模型训练"></a> <a name="2.2.1"></a>
#### 2.2.1 特征模型训练 #### 2.2.1 特征模型训练
准备好配置文件之后,可以使用下面的方式启动图像检索任务的训练。PaddleClas训练图像检索任务的方法是度量学习,关于度量学习的解析请参考[度量学习](#度量学习) 准备好配置文件之后,可以使用下面的方式启动图像检索任务的训练。PaddleClas 训练图像检索任务的方法是度量学习,关于度量学习的解析请参考[度量学习](#度量学习)
```shell ```shell
# 单卡GPU # 单卡 GPU
python3 tools/train.py \ python3 tools/train.py \
-c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \ -c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \
-o Arch.Backbone.pretrained=True \ -o Arch.Backbone.pretrained=True \
-o Global.device=gpu -o Global.device=gpu
# 多卡GPU # 多卡 GPU
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch tools/train.py \ python3 -m paddle.distributed.launch tools/train.py \
-c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \ -c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \
...@@ -156,7 +156,7 @@ python3 -m paddle.distributed.launch tools/train.py \ ...@@ -156,7 +156,7 @@ python3 -m paddle.distributed.launch tools/train.py \
-o Global.device=gpu -o Global.device=gpu
``` ```
其中,`-c`用于指定配置文件的路径,`-o`用于指定需要修改或者添加的参数,其中`-o Arch.Backbone.pretrained=True`表示Backbone部分使用预训练模型,此外,`Arch.Backbone.pretrained`也可以指定具体的模型权重文件的地址,使用时需要换成自己的预训练模型权重文件的路径。`-o Global.device=gpu`表示使用GPU进行训练。如果希望使用CPU进行训练,则需要将`Global.device`设置为`cpu` 其中,`-c` 用于指定配置文件的路径,`-o` 用于指定需要修改或者添加的参数,其中 `-o Arch.Backbone.pretrained=True` 表示 Backbone 部分使用预训练模型,此外,`Arch.Backbone.pretrained` 也可以指定具体的模型权重文件的地址,使用时需要换成自己的预训练模型权重文件的路径。`-o Global.device=gpu` 表示使用 GPU 进行训练。如果希望使用 CPU 进行训练,则需要将 `Global.device` 设置为 `cpu`
更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](config_description.md) 更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](config_description.md)
...@@ -169,9 +169,9 @@ python3 -m paddle.distributed.launch tools/train.py \ ...@@ -169,9 +169,9 @@ python3 -m paddle.distributed.launch tools/train.py \
[Eval][Epoch 1][Avg]recall1: 0.46962, recall5: 0.75608, mAP: 0.21238 [Eval][Epoch 1][Avg]recall1: 0.46962, recall5: 0.75608, mAP: 0.21238
... ...
``` ```
此处配置文件的Backbone是MobileNetV1,如果想使用其他Backbone,可以重写参数`Arch.Backbone.name`,比如命令中增加`-o Arch.Backbone.name={其他Backbone}`。此外,由于不同模型`Neck`部分的输入维度不同,更换Backbone后可能需要改写此处的输入大小,改写方式类似替换Backbone的名字。 此处配置文件的 Backbone 是 MobileNetV1,如果想使用其他 Backbone,可以重写参数 `Arch.Backbone.name`,比如命令中增加 `-o Arch.Backbone.name={其他 Backbone}`。此外,由于不同模型 `Neck` 部分的输入维度不同,更换 Backbone 后可能需要改写此处的输入大小,改写方式类似替换 Backbone 的名字。
在训练Loss部分,此处使用了[CELoss](../../../ppcls/loss/celoss.py)[TripletLossV2](../../../ppcls/loss/triplet.py),配置文件如下: 在训练 Loss 部分,此处使用了 [CELoss](../../../ppcls/loss/celoss.py)[TripletLossV2](../../../ppcls/loss/triplet.py),配置文件如下:
``` ```
Loss: Loss:
...@@ -183,9 +183,9 @@ Loss: ...@@ -183,9 +183,9 @@ Loss:
margin: 0.5 margin: 0.5
``` ```
最终的总Loss是所有Loss的加权和,其中weight定义了特定Loss在最终总Loss的权重。如果想替换其他Loss,也可以在配置文件中更改Loss字段,目前支持的Loss请参考[Loss](../../../ppcls/loss) 最终的总 Loss 是所有 Loss 的加权和,其中 weight 定义了特定 Loss 在最终总 Loss 的权重。如果想替换其他 Loss,也可以在配置文件中更改 Loss 字段,目前支持的 Loss 请参考 [Loss](../../../ppcls/loss)
<a name="特征模型恢复训练"></a> <a name="2.2.2"></a>
#### 2.2.2 特征模型恢复训练 #### 2.2.2 特征模型恢复训练
...@@ -205,11 +205,11 @@ python3 -m paddle.distributed.launch tools/train.py \ ...@@ -205,11 +205,11 @@ python3 -m paddle.distributed.launch tools/train.py \
-o Global.device=gpu -o Global.device=gpu
``` ```
其中配置文件不需要做任何修改,只需要在继续训练时设置`Global.checkpoints`参数即可,表示加载的断点权重文件路径,使用该参数会同时加载保存的断点权重和学习率、优化器等信息。 其中配置文件不需要做任何修改,只需要在继续训练时设置 `Global.checkpoints` 参数即可,表示加载的断点权重文件路径,使用该参数会同时加载保存的断点权重和学习率、优化器等信息。
**注意** **注意**
* `-o Global.checkpoints`参数无需包含断点权重文件的后缀名,上述训练命令会在训练过程中生成如下所示的断点权重文件,若想从断点`5`继续训练,则`Global.checkpoints`参数只需设置为`"./output/RecModel/epoch_5"`,PaddleClas会自动补充后缀名。 * `-o Global.checkpoints` 参数无需包含断点权重文件的后缀名,上述训练命令会在训练过程中生成如下所示的断点权重文件,若想从断点 `5` 继续训练,则 `Global.checkpoints` 参数只需设置为 `"./output/RecModel/epoch_5"`,PaddleClas 会自动补充后缀名。
```shell ```shell
output/ output/
...@@ -225,7 +225,7 @@ python3 -m paddle.distributed.launch tools/train.py \ ...@@ -225,7 +225,7 @@ python3 -m paddle.distributed.launch tools/train.py \
. .
``` ```
<a name="特征模型评估"></a> <a name="2.2.3"></a>
#### 2.2.3 特征模型评估 #### 2.2.3 特征模型评估
...@@ -243,24 +243,24 @@ python3 -m paddle.distributed.launch tools/eval.py \ ...@@ -243,24 +243,24 @@ python3 -m paddle.distributed.launch tools/eval.py \
-o Global.pretrained_model=./output/RecModel/best_model -o Global.pretrained_model=./output/RecModel/best_model
``` ```
上述命令将使用`./configs/quick_start/MobileNetV1_retrieval.yaml`作为配置文件,对上述训练得到的模型`./output/RecModel/best_model`进行评估。你也可以通过更改配置文件中的参数来设置评估,也可以通过`-o`参数更新配置,如上所示。 上述命令将使用 `./configs/quick_start/MobileNetV1_retrieval.yaml` 作为配置文件,对上述训练得到的模型 `./output/RecModel/best_model` 进行评估。你也可以通过更改配置文件中的参数来设置评估,也可以通过 `-o` 参数更新配置,如上所示。
可配置的部分评估参数说明如下: 可配置的部分评估参数说明如下:
* `Arch.name`:模型名称 * `Arch.name`:模型名称
* `Global.pretrained_model`:待评估的模型的预训练模型文件路径,不同于`Global.Backbone.pretrained`,此处的预训练模型是整个模型的权重,而`Global.Backbone.pretrained`只是Backbone部分的权重。当需要做模型评估时,需要加载整个模型的权重。 * `Global.pretrained_model`:待评估的模型的预训练模型文件路径,不同于 `Global.Backbone.pretrained`,此处的预训练模型是整个模型的权重,而 `Global.Backbone.pretrained` 只是 Backbone 部分的权重。当需要做模型评估时,需要加载整个模型的权重。
* `Metric.Eval`:待评估的指标,默认评估recall@1、recall@5、mAP。当你不准备评测某一项指标时,可以将对应的试标从配置文件中删除;当你想增加某一项评测指标时,也可以参考[Metric](../../../ppcls/metric/metrics.py)部分在配置文件`Metric.Eval`中添加相关的指标。 * `Metric.Eval`:待评估的指标,默认评估 recall@1、recall@5、mAP。当你不准备评测某一项指标时,可以将对应的试标从配置文件中删除;当你想增加某一项评测指标时,也可以参考 [Metric](../../../ppcls/metric/metrics.py) 部分在配置文件 `Metric.Eval` 中添加相关的指标。
**注意:** **注意:**
* 在加载待评估模型时,需要指定模型文件的路径,但无需包含文件后缀名,PaddleClas会自动补齐`.pdparams`的后缀,如[2.2.2 特征模型恢复训练](#特征模型恢复训练) * 在加载待评估模型时,需要指定模型文件的路径,但无需包含文件后缀名,PaddleClas 会自动补齐 `.pdparams` 的后缀,如 [2.2.2 特征模型恢复训练](#2.2.2)
* Metric learning任务一般不评测TopkAcc。 * Metric learning 任务一般不评测 TopkAcc。
<a name="特征模型导出inference模型"></a> <a name="2.3"></a>
### 2.3 特征模型导出inference模型 ### 2.3 特征模型导出 inference 模型
通过导出inference模型,PaddlePaddle支持使用预测引擎进行预测推理。对训练好的模型进行转换: 通过导出 inference 模型,PaddlePaddle 支持使用预测引擎进行预测推理。对训练好的模型进行转换:
```bash ```bash
python3 tools/export_model.py \ python3 tools/export_model.py \
...@@ -269,30 +269,30 @@ python3 tools/export_model.py \ ...@@ -269,30 +269,30 @@ python3 tools/export_model.py \
-o Global.save_inference_dir=./inference -o Global.save_inference_dir=./inference
``` ```
其中,`Global.pretrained_model`用于指定模型文件路径,该路径仍无需包含模型文件后缀名(如[2.2.2 特征模型恢复训练](#特征模型恢复训练))。当执行后,会在当前目录下生成`./inference`目录,目录下包含`inference.pdiparams``inference.pdiparams.info``inference.pdmodel`文件。`Global.save_inference_dir`可以指定导出inference模型的路径。此处保存的inference模型在embedding特征层做了截断,即模型最终的输出为n维embedding特征。 其中,`Global.pretrained_model` 用于指定模型文件路径,该路径仍无需包含模型文件后缀名(如[2.2.2 特征模型恢复训练](#2.2.2))。当执行后,会在当前目录下生成 `./inference` 目录,目录下包含 `inference.pdiparams``inference.pdiparams.info``inference.pdmodel` 文件。`Global.save_inference_dir` 可以指定导出 inference 模型的路径。此处保存的 inference 模型在 embedding 特征层做了截断,即模型最终的输出为 n 维 embedding 特征。
上述命令将生成模型结构文件`inference.pdmodel`)和模型权重文件(`inference.pdiparams`),然后可以使用预测引擎进行推理。使用inference模型推理的流程可以参考[基于Python预测引擎预测推理](../inference_deployment/python_deploy.md) 上述命令将生成模型结构文件(`inference.pdmodel`)和模型权重文件(`inference.pdiparams`),然后可以使用预测引擎进行推理。使用 inference 模型推理的流程可以参考[基于 Python 预测引擎预测推理](../inference_deployment/python_deploy.md)
<a name="特征检索"></a> <a name="3"></a>
## 三、特征检索 ## 3. 特征检索
PaddleClas图像检索部分目前支持的环境如下: PaddleClas 图像检索部分目前支持的环境如下:
```shell ```shell
└── CPU/单卡GPU └── CPU/单卡 GPU
├── Linux ├── Linux
├── MacOS ├── MacOS
└── Windows └── Windows
``` ```
此部分使用了[Faiss](https://github.com/facebookresearch/faiss)作为检索库,其是一个高效的特征检索及聚类的库。此库中集成了多种相似度检索算法,以满足不同的检索场景。在PaddleClas中,支持三种检索算法: 此部分使用了 [Faiss](https://github.com/facebookresearch/faiss) 作为检索库,其是一个高效的特征检索及聚类的库。此库中集成了多种相似度检索算法,以满足不同的检索场景。在 PaddleClas 中,支持三种检索算法:
- **HNSW32**: 一种图索引方法。检索精度较高,速度较快。但是特征库只支持添加图像功能,不支持删除图像特征功能。(默认方法) - **HNSW32**: 一种图索引方法。检索精度较高,速度较快。但是特征库只支持添加图像功能,不支持删除图像特征功能。(默认方法)
- **IVF**:倒排索引检索方法。速度较快,但是精度略低。特征库支持增加、删除图像特功能。 - **IVF**:倒排索引检索方法。速度较快,但是精度略低。特征库支持增加、删除图像特功能。
- **FLAT**: 暴力检索算法。精度最高,但是数据量大时,检索速度较慢。特征库支持增加、删除图像特征功能。 - **FLAT**: 暴力检索算法。精度最高,但是数据量大时,检索速度较慢。特征库支持增加、删除图像特征功能。
详细介绍请参考[Faiss](https://github.com/facebookresearch/faiss)官方文档。 详细介绍请参考 [Faiss](https://github.com/facebookresearch/faiss) 官方文档。
具体安装方法如下: 具体安装方法如下:
...@@ -300,38 +300,38 @@ PaddleClas图像检索部分目前支持的环境如下: ...@@ -300,38 +300,38 @@ PaddleClas图像检索部分目前支持的环境如下:
pip install faiss-cpu==1.7.1post2 pip install faiss-cpu==1.7.1post2
``` ```
若使用时,不能正常引用,则`uninstall` 之后,重新`install`,尤其是`windows`下。 若使用时,不能正常引用,则 `uninstall` 之后,重新 `install`,尤其是 `windows` 下。
<a name="基础知识"></a> <a name="4"></a>
## 四、基础知识 ## 4. 基础知识
图像检索指的是给定一个包含特定实例(例如特定目标、场景、物品等)的查询图像,图像检索旨在从数据库图像中找到包含相同实例的图像。不同于图像分类,图像检索解决的是一个开集问题,训练集中可能不包含被识别的图像的类别。图像检索的整体流程为:首先将图像中表示为一个合适的特征向量,其次,对这些图像的特征向量用欧式距离或余弦距离进行最近邻搜索以找到底库中相似的图像,最后,可以使用一些后处理技术对检索结果进行微调,确定被识别图像的类别等信息。所以,决定一个图像检索算法性能的关键在于图像对应的特征向量的好坏。 图像检索指的是给定一个包含特定实例(例如特定目标、场景、物品等)的查询图像,图像检索旨在从数据库图像中找到包含相同实例的图像。不同于图像分类,图像检索解决的是一个开集问题,训练集中可能不包含被识别的图像的类别。图像检索的整体流程为:首先将图像中表示为一个合适的特征向量,其次,对这些图像的特征向量用欧式距离或余弦距离进行最近邻搜索以找到底库中相似的图像,最后,可以使用一些后处理技术对检索结果进行微调,确定被识别图像的类别等信息。所以,决定一个图像检索算法性能的关键在于图像对应的特征向量的好坏。
<a name="度量学习"></a> <a name="度量学习"></a>
- 度量学习(Metric Learning) - 度量学习(Metric Learning)
度量学习研究如何在一个特定的任务上学习一个距离函数,使得该距离函数能够帮助基于近邻的算法 (kNN、k-means等) 取得较好的性能。深度度量学习 (Deep Metric Learning )是度量学习的一种方法,它的目标是学习一个从原始特征到低维稠密的向量空间 (嵌入空间,embedding space) 的映射,使得同类对象在嵌入空间上使用常用的距离函数 (欧氏距离、cosine距离等) 计算的距离比较近,而不同类的对象之间的距离则比较远。深度度量学习在计算机视觉领域取得了非常多的成功的应用,比如人脸识别、商品识别、图像检索、行人重识别等。更详细的介绍请参考[此文档](../algorithm_introduction/metric_learning.md) 度量学习研究如何在一个特定的任务上学习一个距离函数,使得该距离函数能够帮助基于近邻的算法(kNN、k-means 等)取得较好的性能。深度度量学习(Deep Metric Learning)是度量学习的一种方法,它的目标是学习一个从原始特征到低维稠密的向量空间(嵌入空间,embedding space)的映射,使得同类对象在嵌入空间上使用常用的距离函数(欧氏距离、cosine 距离等)计算的距离比较近,而不同类的对象之间的距离则比较远。深度度量学习在计算机视觉领域取得了非常多的成功的应用,比如人脸识别、商品识别、图像检索、行人重识别等。更详细的介绍请参考[此文档](../algorithm_introduction/metric_learning.md)
<a name="图像检索数据集介绍"></a> <a name="图像检索数据集介绍"></a>
- 图像检索数据集介绍 - 图像检索数据集介绍
- 训练集合(train dataset):用来训练模型,使模型能够学习该集合的图像特征。 - 训练集合(train dataset):用来训练模型,使模型能够学习该集合的图像特征。
- 底库数据集合(gallery dataset):用来提供图像检索任务中的底库数据,该集合可与训练集或测试集相同,也可以不同,当与训练集相同时,测试集的类别体系应与训练集的类别体系相同。 - 底库数据集合(gallery dataset):用来提供图像检索任务中的底库数据,该集合可与训练集或测试集相同,也可以不同,当与训练集相同时,测试集的类别体系应与训练集的类别体系相同。
- 测试集合(query dataset):用来测试模型的好坏,通常要对测试集的每一张测试图片进行特征提取,之后和底库数据的特征进行距离匹配,得到识别结果,后根据识别结果计算整个测试集的指标。 - 测试集合(query dataset):用来测试模型的好坏,通常要对测试集的每一张测试图片进行特征提取,之后和底库数据的特征进行距离匹配,得到识别结果,后根据识别结果计算整个测试集的指标。
<a name="图像检索评价指标"></a> <a name="图像检索评价指标"></a>
- 图像检索评价指标 - 图像检索评价指标
<a name="召回率"></a> <a name="召回率"></a>
- 召回率(recall):表示预测为正例且标签为正例的个数 / 标签为正例的个数 - 召回率(recall):表示预测为正例且标签为正例的个数 / 标签为正例的个数
- recall@1:检索的top-1中预测正例且标签为正例的个数 / 标签为正例的个数 - recall@1:检索的 top-1 中预测正例且标签为正例的个数 / 标签为正例的个数
- recall@5:检索的top-5中所有预测正例且标签为正例的个数 / 标签为正例的个数 - recall@5:检索的 top-5 中所有预测正例且标签为正例的个数 / 标签为正例的个数
<a name="平均检索精度"></a> <a name="平均检索精度"></a>
- 平均检索精度(mAP) - 平均检索精度(mAP)
- AP: AP指的是不同召回率上的正确率的平均值 - AP: AP 指的是不同召回率上的正确率的平均值
- mAP: 测试集中所有图片对应的AP的的平均值 - mAP: 测试集中所有图片对应的 AP 的平均值
# 训练技巧 # 训练技巧
## 目录
- [1. 优化器的选择](#1)
- [2. 学习率以及学习率下降策略的选择](#2)
- [2.1 学习率的概念](#2.1)
- [2.2 学习率下降策略](#2.2)
- [2.3 warmup 策略](#2.3)
- [3. batch_size 的选择](#3)
- [4. weight_decay 的选择](#4)
- [5. label_smoothing 的选择](#5)
- [6.针对小模型更改图片的 crop 面积与拉伸变换程度](#6)
- [7.使用数据增广方式提升精度](#7)
- [8. 通过 train_acc 和 test_acc 确定调优策略](#8)
- [9.通过已有的预训练模型提升自己的数据集的精度](#9)
<a name="1"></a>
## 1.优化器的选择 ## 1.优化器的选择
自深度学习发展以来,就有很多关于优化器的研究者工作,优化器的目的是为了让损失函数尽可能的小,从而找到合适的参数来完成某项任务。目前业界主要用到的优化器有SGD、RMSProp、Adam、AdaDelt等,其中由于带momentum的SGD优化器广泛应用于学术界和工业界,所以我们发布的模型也大都使用该优化器来实现损失函数的梯度下降。带momentum的SGD优化器有两个劣势,其一是收敛速度慢,其二是初始学习率的设置需要依靠大量的经验,然而如果初始学习率设置得当并且迭代轮数充足,该优化器也会在众多的优化器中脱颖而出,使得其在验证集上获得更高的准确率。一些自适应学习率的优化器如Adam、RMSProp等,收敛速度往往比较快,但是最终的收敛精度会稍差一些。如果追求更快的收敛速度,我们推荐使用这些自适应学习率的优化器,如果追求更高的收敛精度,我们推荐使用带momentum的SGD优化器。 自深度学习发展以来,就有很多关于优化器的研究者工作,优化器的目的是为了让损失函数尽可能的小,从而找到合适的参数来完成某项任务。目前业界主要用到的优化器有 SGD、RMSProp、Adam、AdaDelt 等,其中由于带 momentum 的 SGD 优化器广泛应用于学术界和工业界,所以我们发布的模型也大都使用该优化器来实现损失函数的梯度下降。带 momentum 的 SGD 优化器有两个劣势,其一是收敛速度慢,其二是初始学习率的设置需要依靠大量的经验,然而如果初始学习率设置得当并且迭代轮数充足,该优化器也会在众多的优化器中脱颖而出,使得其在验证集上获得更高的准确率。一些自适应学习率的优化器如 Adam、RMSProp 等,收敛速度往往比较快,但是最终的收敛精度会稍差一些。如果追求更快的收敛速度,我们推荐使用这些自适应学习率的优化器,如果追求更高的收敛精度,我们推荐使用带 momentum 的 SGD 优化器。
<a name="2"></a>
## 2.学习率以及学习率下降策略的选择 ## 2.学习率以及学习率下降策略的选择
学习率的选择往往和优化器以及数据和任务有关系。这里主要介绍以momentum+SGD作为优化器训练ImageNet-1k的学习率以及学习率下降的选择。 学习率的选择往往和优化器以及数据和任务有关系。这里主要介绍以 momentum+SGD 作为优化器训练 ImageNet-1k 的学习率以及学习率下降的选择。
### 学习率的概念: <a name="2.1"></a>
### 2.1 学习率的概念:
学习率是通过损失函数的梯度调整网络权重的超参数的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。 学习率是通过损失函数的梯度调整网络权重的超参数的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。
### 学习率下降策略: <a name="2.2"></a>
在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是piecewise_decay,即阶梯式下降学习率,如在ResNet50标准的训练中,我们设置的初始学习率是0.1,每30epoch学习率下降到原来的1/10,一共迭代120epoch。除了piecewise_decay,很多研究者也提出了学习率的其他下降方式,如polynomial_decay(多项式下降)、exponential_decay(指数下降),cosine_decay(余弦下降)等,其中cosine_decay无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay和piecewise_decay的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较peicewise_decay更好一些。
### 2.2 学习率下降策略:
在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是 piecewise_decay,即阶梯式下降学习率,如在 ResNet50 标准的训练中,我们设置的初始学习率是 0.1,每 30 epoch 学习率下降到原来的 1/10,一共迭代 120 epoch。除了 piecewise_decay,很多研究者也提出了学习率的其他下降方式,如 polynomial_decay(多项式下降)、exponential_decay(指数下降)、cosine_decay(余弦下降)等,其中 cosine_decay 无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay 和 piecewise_decay 的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay 都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较 peicewise_decay 更好一些。
![](../../images/models/lr_decay.jpeg) ![](../../images/models/lr_decay.jpeg)
另外,从图中我们也可以看到,cosine_decay里学习率小的轮数较少,这样会影响到最终的精度,所以为了使得cosine_decay发挥更好的效果,建议迭代更多的轮数,如200轮。 另外,从图中我们也可以看到,cosine_decay 里学习率小的轮数较少,这样会影响到最终的精度,所以为了使得 cosine_decay 发挥更好的效果,建议迭代更多的轮数,如 200 轮。
<a name="2.3"></a>
### 2.3 warmup 策略
如果使用较大的 batch_size 训练神经网络时,我们建议您使用 warmup 策略。Warmup 策略顾名思义就是让学习率先预热一下,在训练初期我们不直接使用最大的学习率,而是用一个逐渐增大的学习率去训练网络,当学习率增大到最高点时,再使用学习率下降策略中提到的学习率下降方式衰减学习率的值。实验表明,在 batch_size 较大时,warmup 可以稳定提升模型的精度。在训练 MobileNetV3 等 batch_size 较大的实验中,我们默认将 warmup 中的 epoch 设置为 5,即先用 5 epoch 将学习率从 0 增加到最大值,再去做相应的学习率衰减。
<a name="3"></a>
### warmup策略 ## 3.batch_size 的选择
如果使用较大的batch_size训练神经网络时,我们建议您使用warmup策略。Warmup策略顾名思义就是让学习率先预热一下,在训练初期我们不直接使用最大的学习率,而是用一个逐渐增大的学习率去训练网络,当学习率增大到最高点时,再使用学习率下降策略中提到的学习率下降方式衰减学习率的值。实验表明,在batch_size较大时,warmup可以稳定提升模型的精度。在训练MobileNetV3等batch_size较大的实验中,我们默认将warmup中的epoch设置为5,即先用5epoch将学习率从0增加到最大值,再去做相应的学习率衰减 batch_size 是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络参与训练。在论文[1]中,作者通过实验发现,当 batch_size 的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练 ImageNet 数据时,大部分的神经网络选择的初始学习率为 0.1,batch_size 是 256,所以根据实际的模型大小和显存情况,可以将学习率设置为 0.1\*k, batch_size 设置为 256\*k
## 3.batch_size的选择 <a name="4"></a>
batch_size是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络参与训练。在论文[1]中,作者通过实验发现,当batch_size的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练ImageNet数据时,大部分的神经网络选择的初始学习率为0.1,batch_size是256,所以根据实际的模型大小和显存情况,可以将学习率设置为0.1\*k,batch_size设置为256\*k。
## 4.weight_decay的选择 ## 4.weight_decay 的选择
过拟合是机器学习中常见的一个名词,简单理解即为模型在训练数据上表现很好,但在测试数据上表现较差,在卷积神经网络中,同样存在过拟合的问题,为了避免过拟合,很多正则方式被提出,其中,weight_decay是其中一个广泛使用的避免过拟合的方式。Weight_decay等价于在最终的损失函数后添加L2正则化,L2正则化使得网络的权重倾向于选择更小的值,最终整个网络中的参数值更趋向于0,模型的泛化性能相应提高。在各大深度学习框架的实现中,该值表达的含义是L2正则前的系数,在paddle框架中,该值的名称是l2_decay,所以以下都称其为l2_decay。该系数越大,表示加入的正则越强,模型越趋于欠拟合状态。在训练ImageNet的任务中,大多数的网络将该参数值设置为1e-4,在一些小的网络如MobileNet系列网络中,为了避免网络欠拟合,该值设置为1e-5~4e-5之间。当然,该值的设置也和具体的数据集有关系,当任务的数据集较大时,网络本身趋向于欠拟合状态,可以将该值适当减小,当任务的数据集较小时,网络本身趋向于过拟合状态,可以将该值适当增大。下表展示了MobileNetV1_x0_25在ImageNet-1k上使用不同l2_decay的精度情况。由于MobileNetV1_x0_25是一个比较小的网络,所以l2_decay过大会使网络趋向于欠拟合状态,所以在该网络中,相对1e-4,3e-5是更好的选择。 过拟合是机器学习中常见的一个名词,简单理解即为模型在训练数据上表现很好,但在测试数据上表现较差,在卷积神经网络中,同样存在过拟合的问题,为了避免过拟合,很多正则方式被提出,其中,weight_decay 是其中一个广泛使用的避免过拟合的方式。Weight_decay 等价于在最终的损失函数后添加 L2 正则化,L2 正则化使得网络的权重倾向于选择更小的值,最终整个网络中的参数值更趋向于 0,模型的泛化性能相应提高。在各大深度学习框架的实现中,该值表达的含义是 L2 正则前的系数,在 paddle 框架中,该值的名称是 l2_decay,所以以下都称其为 l2_decay。该系数越大,表示加入的正则越强,模型越趋于欠拟合状态。在训练 ImageNet 的任务中,大多数的网络将该参数值设置为 1e-4,在一些小的网络如 MobileNet 系列网络中,为了避免网络欠拟合,该值设置为 1e-5~4e-5 之间。当然,该值的设置也和具体的数据集有关系,当任务的数据集较大时,网络本身趋向于欠拟合状态,可以将该值适当减小,当任务的数据集较小时,网络本身趋向于过拟合状态,可以将该值适当增大。下表展示了 MobileNetV1_x0_25 在 ImageNet-1k 上使用不同 l2_decay 的精度情况。由于 MobileNetV1_x0_25 是一个比较小的网络,所以 l2_decay 过大会使网络趋向于欠拟合状态,所以在该网络中,相对 1e-4, 3e-5 是更好的选择。
| 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 | | 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| MobileNetV1_x0_25 | 1e-4 | 43.79%/67.61% | 50.41%/74.70% | | MobileNetV1_x0_25 | 1e-4 | 43.79%/67.61% | 50.41%/74.70% |
| MobileNetV1_x0_25 | 3e-5 | 47.38%/70.83% | 51.45%/75.45% | | MobileNetV1_x0_25 | 3e-5 | 47.38%/70.83% | 51.45%/75.45% |
另外,该值的设置也和训练过程中是否使用其他正则化有关系。如果训练过程中的数据预处理比较复杂,相当于训练任务变的更难,可以将该值适当减小,下表展示了在ImageNet-1k上,ResNet50在使用randaugment预处理方式后使用不同l2_decay的精度。容易观察到,在任务变难后,使用更小的l2_decay有助于模型精度的提升。 另外,该值的设置也和训练过程中是否使用其他正则化有关系。如果训练过程中的数据预处理比较复杂,相当于训练任务变的更难,可以将该值适当减小,下表展示了在 ImageNet-1k 上, ResNet50 在使用 randaugment 预处理方式后使用不同 l2_decay 的精度。容易观察到,在任务变难后,使用更小的 l2_decay 有助于模型精度的提升。
| 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 | | 模型 | L2_decay | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| ResNet50 | 1e-4 | 75.13%/90.42% | 77.65%/93.79% | | ResNet50 | 1e-4 | 75.13%/90.42% | 77.65%/93.79% |
| ResNet50 | 7e-5 | 75.56%/90.55% | 78.04%/93.74% | | ResNet50 | 7e-5 | 75.56%/90.55% | 78.04%/93.74% |
综上所述,l2_decay可以根据具体的任务和模型去做相应的调整,通常简单的任务或者较大的模型,推荐使用较大的l2_decay,复杂的任务或者较小的模型,推荐使用较小的l2_decay。 综上所述,l2_decay 可以根据具体的任务和模型去做相应的调整,通常简单的任务或者较大的模型,推荐使用较大的 l2_decay,复杂的任务或者较小的模型,推荐使用较小的 l2_decay。
## 5.label_smoothing的选择 <a name="5"></a>
Label_smoothing是深度学习中的一种正则化方法,其全称是 Label Smoothing Regularization(LSR),即标签平滑正则化。在传统的分类任务计算损失函数时,是将真实的one hot标签与神经网络的输出做相应的交叉熵计算,而label_smoothing是将真实的one hot标签做一个标签平滑的处理,使得网络学习的标签不再是一个hard label,而是一个有概率值的soft label,其中在类别对应的位置的概率最大,其他位置概率是一个非常小的数。具体的计算方式参见论文[2]。在label_smoothing里,有一个epsilon的参数值,该值描述了将标签软化的程度,该值越大,经过label smoothing后的标签向量的标签概率值越小,标签越平滑,反之,标签越趋向于hard label,在训练ImageNet-1k的实验里通常将该值设置为0.1。
在训练ImageNet-1k的实验中,我们发现,ResNet50大小级别及其以上的模型在使用label_smooting后,精度有稳定的提升。下表展示了ResNet50_vd在使用label_smoothing前后的精度指标。 ## 5.label_smoothing 的选择
Label_smoothing 是深度学习中的一种正则化方法,其全称是 Label Smoothing Regularization(LSR),即标签平滑正则化。在传统的分类任务计算损失函数时,是将真实的 one hot 标签与神经网络的输出做相应的交叉熵计算,而 label_smoothing 是将真实的 one hot 标签做一个标签平滑的处理,使得网络学习的标签不再是一个 hard label,而是一个有概率值的 soft label,其中在类别对应的位置的概率最大,其他位置概率是一个非常小的数。具体的计算方式参见论文[2]。在 label_smoothing 里,有一个 epsilon 的参数值,该值描述了将标签软化的程度,该值越大,经过 label smoothing 后的标签向量的标签概率值越小,标签越平滑,反之,标签越趋向于 hard label,在训练 ImageNet-1k 的实验里通常将该值设置为 0.1。
在训练 ImageNet-1k 的实验中,我们发现,ResNet50 大小级别及其以上的模型在使用 label_smooting 后,精度有稳定的提升。下表展示了 ResNet50_vd 在使用 label_smoothing 前后的精度指标。
| 模型 | Use_label_smoothing | Test acc1 | | 模型 | Use_label_smoothing | Test acc1 |
|:--:|:--:|:--:| |:--:|:--:|:--:|
| ResNet50_vd | 0 | 77.9% | | ResNet50_vd | 0 | 77.9% |
| ResNet50_vd | 1 | 78.4% | | ResNet50_vd | 1 | 78.4% |
同时,由于label_smoohing相当于一种正则方式,在相对较小的模型上,精度提升不明显甚至会有所下降,下表展示了ResNet18在ImageNet-1k上使用label_smoothing前后的精度指标。可以明显看到,在使用label_smoothing后,精度有所下降。 同时,由于 label_smoohing 相当于一种正则方式,在相对较小的模型上,精度提升不明显甚至会有所下降,下表展示了 ResNet18 在 ImageNet-1k 上使用 label_smoothing 前后的精度指标。可以明显看到,在使用 label_smoothing 后,精度有所下降。
| 模型 | Use_label_smoohing | Train acc1/acc5 | Test acc1/acc5 | | 模型 | Use_label_smoohing | Train acc1/acc5 | Test acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| ResNet18 | 0 | 69.81%/87.70% | 70.98%/89.92% | | ResNet18 | 0 | 69.81%/87.70% | 70.98%/89.92% |
| ResNet18 | 1 | 68.00%/86.56% | 70.81%/89.89% | | ResNet18 | 1 | 68.00%/86.56% | 70.81%/89.89% |
综上所述,较大的模型使用 label_smoohing 可以有效提升模型的精度,较小的模型使用 label_smoohing 可能会降低模型的精度,所以在决定是否使用 label_smoohing 前,需要评估模型的大小和任务的难易程度。
综上所述,较大的模型使用label_smoohing可以有效提升模型的精度,较小的模型使用label_smoohing可能会降低模型的精度,所以在决定是否使用label_smoohing前,需要评估模型的大小和任务的难易程度。 <a name="6"></a>
## 6.针对小模型更改图片的crop面积与拉伸变换程度 ## 6.针对小模型更改图片的 crop 面积与拉伸变换程度
ImageNet-1k数据的标准预处理中,random_crop函数中定义了scale和ratio两个值,两个值分别确定了图片crop的大小和图片的拉伸程度,其中scale的默认取值范围是0.08-1(lower_scale-upper_scale),ratio的默认取值范围是3/4-4/3(lower_ratio-upper_ratio)。在非常小的网络训练中,此类数据增强会使得网络欠拟合,导致精度有所下降。为了提升网络的精度,可以使其数据增强变的更弱,即增大图片的crop区域或者减弱图片的拉伸变换程度。我们可以分别通过增大lower_scale的值或缩小lower_ratio与upper_scale的差距来实现更弱的图片变换。下表列出了使用不同lower_scale训练MobileNetV2_x0_25的精度,可以看到,增大图片的crop区域面积后训练精度和验证精度均有提升。 ImageNet-1k 数据的标准预处理中,random_crop 函数中定义了 scale 和 ratio 两个值,两个值分别确定了图片 crop 的大小和图片的拉伸程度,其中 scale 的默认取值范围是 0.08-1(lower_scale-upper_scale), ratio 的默认取值范围是 3/4-4/3(lower_ratio-upper_ratio)。在非常小的网络训练中,此类数据增强会使得网络欠拟合,导致精度有所下降。为了提升网络的精度,可以使其数据增强变的更弱,即增大图片的 crop 区域或者减弱图片的拉伸变换程度。我们可以分别通过增大 lower_scale 的值或缩小 lower_ratio 与 upper_scale 的差距来实现更弱的图片变换。下表列出了使用不同 lower_scale 训练 MobileNetV2_x0_25 的精度,可以看到,增大图片的 crop 区域面积后训练精度和验证精度均有提升。
| 模型 | Scale取值范围 | Train_acc1/acc5 | Test_acc1/acc5 | | 模型 | Scale 取值范围 | Train_acc1/acc5 | Test_acc1/acc5 |
|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|
| MobileNetV2_x0_25 | [0.08,1] | 50.36%/72.98% | 52.35%/75.65% | | MobileNetV2_x0_25 | [0.08,1] | 50.36%/72.98% | 52.35%/75.65% |
| MobileNetV2_x0_25 | [0.2,1] | 54.39%/77.08% | 53.18%/76.14% | | MobileNetV2_x0_25 | [0.2,1] | 54.39%/77.08% | 53.18%/76.14% |
## 7.使用数据增广方式提升精度 <a name="7"></a>
一般来说,数据集的规模对性能影响至关重要,但是图片的标注往往比较昂贵,所以有标注的图片数量往往比较稀少,在这种情况下,数据的增广尤为重要。在训练ImageNet-1k的标准数据增广中,主要使用了random_crop与random_flip两种数据增广方式,然而,近些年,越来越多的数据增广方式被提出,如cutout、mixup、cutmix、AutoAugment等。实验表明,这些数据的增广方式可以有效提升模型的精度,下表列出了ResNet50在8种不同的数据增广方式的表现,可以看出,相比baseline,所有的数据增广方式均有收益,其中cutmix是目前最有效的数据增广。更多数据增广的介绍请参考[**数据增广章节**](../algorithm_introduction/DataAugmentation.md)
## 7. 使用数据增广方式提升精度
一般来说,数据集的规模对性能影响至关重要,但是图片的标注往往比较昂贵,所以有标注的图片数量往往比较稀少,在这种情况下,数据的增广尤为重要。在训练 ImageNet-1k 的标准数据增广中,主要使用了 random_crop 与 random_flip 两种数据增广方式,然而,近些年,越来越多的数据增广方式被提出,如 cutout、mixup、cutmix、AutoAugment 等。实验表明,这些数据的增广方式可以有效提升模型的精度,下表列出了 ResNet50 在 8 种不同的数据增广方式的表现,可以看出,相比 baseline,所有的数据增广方式均有收益,其中 cutmix 是目前最有效的数据增广。更多数据增广的介绍请参考[**数据增广章节**](../algorithm_introduction/DataAugmentation.md)
| 模型 | 数据增广方式 | Test top-1 | | 模型 | 数据增广方式 | Test top-1 |
|:--:|:--:|:--:| |:--:|:--:|:--:|
...@@ -81,14 +116,20 @@ Label_smoothing是深度学习中的一种正则化方法,其全称是 Label S ...@@ -81,14 +116,20 @@ Label_smoothing是深度学习中的一种正则化方法,其全称是 Label S
| ResNet50 | Random-Erasing | 77.91% | | ResNet50 | Random-Erasing | 77.91% |
| ResNet50 | Hide-and-Seek | 77.43% | | ResNet50 | Hide-and-Seek | 77.43% |
## 8. 通过train_acc和test_acc确定调优策略 <a name="8"></a>
在训练网络的过程中,通常会打印每一个epoch的训练集准确率和验证集准确率,二者刻画了该模型在两个数据集上的表现。通常来说,训练集的准确率比验证集准确率微高或者二者相当是比较不错的状态。如果发现训练集的准确率比验证集高很多,说明在这个任务上已经过拟合,需要在训练过程中加入更多的正则,如增大l2_decay的值,加入更多的数据增广策略,加入label_smoothing策略等;如果发现训练集的准确率比验证集低一些,说明在这个任务上可能欠拟合,需要在训练过程中减弱正则效果,如减小l2_decay的值,减少数据增广方式,增大图片crop区域面积,减弱图片拉伸变换,去除label_smoothing等。
## 8. 通过 train_acc 和 test_acc 确定调优策略
在训练网络的过程中,通常会打印每一个 epoch 的训练集准确率和验证集准确率,二者刻画了该模型在两个数据集上的表现。通常来说,训练集的准确率比验证集准确率微高或者二者相当是比较不错的状态。如果发现训练集的准确率比验证集高很多,说明在这个任务上已经过拟合,需要在训练过程中加入更多的正则,如增大 l2_decay 的值,加入更多的数据增广策略,加入 label_smoothing 策略等;如果发现训练集的准确率比验证集低一些,说明在这个任务上可能欠拟合,需要在训练过程中减弱正则效果,如减小 l2_decay 的值,减少数据增广方式,增大图片 crop 区域面积,减弱图片拉伸变换,去除 label_smoothing 等。
<a name="9"></a>
## 9.通过已有的预训练模型提升自己的数据集的精度 ## 9.通过已有的预训练模型提升自己的数据集的精度
在现阶段计算机视觉领域中,加载预训练模型来训练自己的任务已成为普遍的做法,相比从随机初始化开始训练,加载预训练模型往往可以提升特定任务的精度。一般来说,业界广泛使用的预训练模型是通过训练128万张图片1000类的ImageNet-1k数据集得到的,该预训练模型的fc层权重是是一个k\*1000的矩阵,其中k是fc层以前的神经元数,在加载预训练权重时,无需加载fc层的权重。在学习率方面,如果您的任务训练的数据集特别小(如小于1千张),我们建议你使用较小的初始学习率,如0.001(batch_size:256,下同),以免较大的学习率破坏预训练权重。如果您的训练数据集规模相对较大(大于10万),我们建议你尝试更大的初始学习率,如0.01或者更大。
在现阶段计算机视觉领域中,加载预训练模型来训练自己的任务已成为普遍的做法,相比从随机初始化开始训练,加载预训练模型往往可以提升特定任务的精度。一般来说,业界广泛使用的预训练模型是通过训练 128 万张图片 1000 类的 ImageNet-1k 数据集得到的,该预训练模型的 fc 层权重是一个 k\*1000 的矩阵,其中 k 是 fc 层以前的神经元数,在加载预训练权重时,无需加载 fc 层的权重。在学习率方面,如果您的任务训练的数据集特别小(如小于 1 千张),我们建议你使用较小的初始学习率,如 0.001(batch_size:256,下同),以免较大的学习率破坏预训练权重。如果您的训练数据集规模相对较大(大于 10 万),我们建议你尝试更大的初始学习率,如 0.01 或者更大。
> 如果您觉得此文档对您有帮助,欢迎star我们的项目:[https://github.com/PaddlePaddle/PaddleClas](https://github.com/PaddlePaddle/PaddleClas) > 如果您觉得此文档对您有帮助,欢迎 star 我们的项目:[https://github.com/PaddlePaddle/PaddleClas](https://github.com/PaddlePaddle/PaddleClas)
## 参考文献 ## 参考文献
[1]P. Goyal, P. Dolla ́r, R. B. Girshick, P. Noordhuis, L. Wesolowski, A. Kyrola, A. Tulloch, Y. Jia, and K. He. Accurate, large minibatch SGD: training imagenet in 1 hour. CoRR, abs/1706.02677, 2017. [1]P. Goyal, P. Dolla ́r, R. B. Girshick, P. Noordhuis, L. Wesolowski, A. Kyrola, A. Tulloch, Y. Jia, and K. He. Accurate, large minibatch SGD: training imagenet in 1 hour. CoRR, abs/1706.02677, 2017.
......
# 使用VisualDL可视化训练过程 # 使用 VisualDL 可视化训练过程
--------
## 目录
* [1. 前言](#1)
* [2. 在 PaddleClas 中使用 VisualDL](#2)
* [2.1 设置 config 文件并启动训练](#2.1)
* [2.2 启动 VisualDL](#2.2)
## 前言 <a name='1'></a>
VisualDL是飞桨可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。可帮助用户更清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型优化。更多细节请查看[VisualDL](https://github.com/PaddlePaddle/VisualDL/)
## 在PaddleClas中使用VisualDL ## 1. 前言
现在PaddleClas支持在训练阶段使用VisualDL查看训练过程中学习率(learning rate)、损失值(loss)以及准确率(accuracy)的变化情况 VisualDL 是飞桨可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。可帮助用户更清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型优化。更多细节请查看[VisualDL](https://github.com/PaddlePaddle/VisualDL/)
### 设置config文件并启动训练 <a name='2'></a>
在PaddleClas中使用VisualDL,只需在训练配置文件(config文件)中设置字段 `Global.use_visualdl``True`
## 2. 在 PaddleClas 中使用 VisualDL
现在 PaddleClas 支持在训练阶段使用 VisualDL 查看训练过程中学习率(learning rate)、损失值(loss)以及准确率(accuracy)的变化情况。
<a name='2.1'></a>
### 2.1 设置 config 文件并启动训练
在 PaddleClas 中使用 VisualDL,只需在训练配置文件(config 文件)中设置字段 `Global.use_visualdl``True`
```yaml ```yaml
# config.yaml # config.yaml
...@@ -22,21 +34,22 @@ PaddleClas 会将 VisualDL 的日志保存在 `Global.output_dir` 字段指定 ...@@ -22,21 +34,22 @@ PaddleClas 会将 VisualDL 的日志保存在 `Global.output_dir` 字段指定
```shell ```shell
python3 tools/train.py -c config.yaml python3 tools/train.py -c config.yaml
``` ```
<a name='2.2'></a>
### 启动VisualDL ### 2.2 启动 VisualDL
在启动训练程序后,可以在新的终端session中启动VisualDL服务: 在启动训练程序后,可以在新的终端 session 中启动 VisualDL 服务:
```shell ```shell
visualdl --logdir ./output/vdl/ visualdl --logdir ./output/vdl/
``` ```
上述命令中,参数`--logdir`用于指定保存 VisualDL 日志的目录,VisualDL将遍历并且迭代寻找指定目录的子目录,将所有实验结果进行可视化。也同样可以使用下述参数设定VisualDL服务的ip及端口号: 上述命令中,参数`--logdir` 用于指定保存 VisualDL 日志的目录,VisualDL 将遍历并且迭代寻找指定目录的子目录,将所有实验结果进行可视化。也同样可以使用下述参数设定 VisualDL 服务的 ip 及端口号:
* `--host`:设定IP,默认为127.0.0.1 * `--host`:设定 IP,默认为 127.0.0.1
* `--port`:设定端口,默认为8040 * `--port`:设定端口,默认为 8040
更多参数信息,请查看[VisualDL](https://github.com/PaddlePaddle/VisualDL/blob/develop/README_CN.md#2-%E5%90%AF%E5%8A%A8%E9%9D%A2%E6%9D%BF) 更多参数信息,请查看[VisualDL](https://github.com/PaddlePaddle/VisualDL/blob/develop/README_CN.md#2-%E5%90%AF%E5%8A%A8%E9%9D%A2%E6%9D%BF)
在启动VisualDL后,即可在浏览器中查看训练过程,输入地址`127.0.0.1:8840` 在启动 VisualDL 后,即可在浏览器中查看训练过程,输入地址 `127.0.0.1:8840`
<div align="center"> <div align="center">
<img src="../../images/VisualDL/train_loss.png" width="400"> <img src="../../images/VisualDL/train_loss.png" width="400">
......
### 赛事支持 ### 赛事支持
PaddleClas的建设源于百度实际视觉业务应用的淬炼和视觉前沿能力的探索,助力多个视觉重点赛事取得领先成绩,并且持续推进更多的前沿视觉问题的解决和落地应用。 PaddleClas 的建设源于百度实际视觉业务应用的淬炼和视觉前沿能力的探索,助力多个视觉重点赛事取得领先成绩,并且持续推进更多的前沿视觉问题的解决和落地应用。
* 2018年Kaggle Open Images V4图像目标检测挑战赛冠军 * 2018 年 Kaggle Open Images V4 图像目标检测挑战赛冠军
* 2019年Kaggle Open Images V5图像目标检测挑战赛亚军 * 2019 年 Kaggle Open Images V5 图像目标检测挑战赛亚军
* 技术报告可以参考:[https://arxiv.org/pdf/1911.07171.pdf](https://arxiv.org/pdf/1911.07171.pdf) * 技术报告可以参考:[https://arxiv.org/pdf/1911.07171.pdf](https://arxiv.org/pdf/1911.07171.pdf)
* 详细文档与开源的模型可以参考:[OIDV5目标检测github地址](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.2/static/docs/featured_model/champion_model/OIDV5_BASELINE_MODEL.md) * 详细文档与开源的模型可以参考:[OIDV5目标检测 github 地址](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.2/static/docs/featured_model/champion_model/OIDV5_BASELINE_MODEL.md)
* 2019年Kaggle地标检索挑战赛亚军 * 2019 年 Kaggle 地标检索挑战赛亚军
* 技术报告可以参考:[https://arxiv.org/abs/1906.03990](https://arxiv.org/abs/1906.03990) * 技术报告可以参考:[https://arxiv.org/abs/1906.03990](https://arxiv.org/abs/1906.03990)
* 详细文档与开源的模型可以参考:[2019地标检索和识别github地址](https://github.com/PaddlePaddle/Research/tree/master/CV/landmark) * 详细文档与开源的模型可以参考:[2019地标检索和识别 github 地址](https://github.com/PaddlePaddle/Research/tree/master/CV/landmark)
* 2019年Kaggle地标识别挑战赛亚军 * 2019 年 Kaggle 地标识别挑战赛亚军
* 技术报告可以参考:[https://arxiv.org/abs/1906.03990](https://arxiv.org/abs/1906.03990) * 技术报告可以参考:[https://arxiv.org/abs/1906.03990](https://arxiv.org/abs/1906.03990)
* 详细文档与开源的模型可以参考:[2019地标检索和识别github地址](https://github.com/PaddlePaddle/Research/tree/master/CV/landmark) * 详细文档与开源的模型可以参考:[2019地标检索和识别 github 地址](https://github.com/PaddlePaddle/Research/tree/master/CV/landmark)
* 首届多媒体信息识别技术竞赛中印刷文本OCR、人脸识别和地标识别三项任务A级证书 * 首届多媒体信息识别技术竞赛中印刷文本 OCR、人脸识别和地标识别三项任务 A 级证书
# 特征图可视化指南 # 特征图可视化指南
-----
## 目录
## 一、概述 * [1. 概述](#1)
* [2. 准备工作](#2)
* [3. 修改模型](#3)
* [4. 结果](#4)
<a name='1'></a>
## 1. 概述
特征图是输入图片在卷积网络中的特征表达,对特征图的研究可以有利于我们对于模型的理解与设计,所以基于动态图我们使用本工具来可视化特征图。 特征图是输入图片在卷积网络中的特征表达,对特征图的研究可以有利于我们对于模型的理解与设计,所以基于动态图我们使用本工具来可视化特征图。
## 二、准备工作 <a name='2'></a>
## 2. 准备工作
首先需要选定研究的模型,本文设定ResNet50作为研究模型,将模型组网代码[resnet.py](../../../ppcls/arch/backbone/legendary_models/resnet.py)拷贝到[目录](../../../ppcls/utils/feature_maps_visualization/)下,并下载[ResNet50预训练模型](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrained.pdparams),或使用以下命令下载。 首先需要选定研究的模型,本文设定 ResNet50 作为研究模型,将模型组网代码[resnet.py](../../../ppcls/arch/backbone/legendary_models/resnet.py)拷贝到[目录](../../../ppcls/utils/feature_maps_visualization/)下,并下载[ResNet50 预训练模型](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrained.pdparams),或使用以下命令下载。
```bash ```bash
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrained.pdparams wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrained.pdparams
...@@ -14,11 +25,13 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrain ...@@ -14,11 +25,13 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrain
其他模型网络结构代码及预训练模型请自行下载:[模型库](../../../ppcls/arch/backbone/)[预训练模型](../models/models_intro.md) 其他模型网络结构代码及预训练模型请自行下载:[模型库](../../../ppcls/arch/backbone/)[预训练模型](../models/models_intro.md)
## 三、修改模型 <a name='3'></a>
找到我们所需要的特征图位置,设置self.fm将其fetch出来,本文以resnet50中的stem层之后的特征图为例。 ## 3. 修改模型
在ResNet50的forward函数中指定要可视化的特征图 找到我们所需要的特征图位置,设置 self.fm 将其 fetch 出来,本文以 resnet50 中的 stem 层之后的特征图为例。
在 ResNet50 的 forward 函数中指定要可视化的特征图
```python ```python
def forward(self, x): def forward(self, x):
...@@ -59,11 +72,13 @@ python tools/feature_maps_visualization/fm_vis.py \ ...@@ -59,11 +72,13 @@ python tools/feature_maps_visualization/fm_vis.py \
+ `-i`:待预测的图片文件路径,如 `./test.jpeg` + `-i`:待预测的图片文件路径,如 `./test.jpeg`
+ `-c`:特征图维度,如 `5` + `-c`:特征图维度,如 `5`
+ `-p`:权重文件路径,如 `./ResNet50_pretrained` + `-p`:权重文件路径,如 `./ResNet50_pretrained`
+ `--interpolation`: 图像插值方式, 默认值 1 + `--interpolation`: 图像插值方式,默认值 1
+ `--save_path`:保存路径,如:`./tools/` + `--save_path`:保存路径,如:`./tools/`
+ `--use_gpu`:是否使用 GPU 预测,默认值:True + `--use_gpu`:是否使用 GPU 预测,默认值:True
## 四、结果 <a name='4'></a>
## 4. 结果
* 输入图片: * 输入图片:
...@@ -82,6 +97,6 @@ python tools/feature_maps_visualization/fm_vis.py \ ...@@ -82,6 +97,6 @@ python tools/feature_maps_visualization/fm_vis.py \
--use_gpu=False --use_gpu=False
``` ```
* 输出特征图保存为`output.png`,如下所示。 * 输出特征图保存为 `output.png`,如下所示。
![](../../images/feature_maps/feature_visualization_output.jpg) ![](../../images/feature_maps/feature_visualization_output.jpg)
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
<img src="../../images/recognition/more_demo_images/output_cartoon/zhangchulan-007.jpeg" width = "400" /> <img src="../../images/recognition/more_demo_images/output_cartoon/zhangchulan-007.jpeg" width = "400" />
</div> </div>
- logo识别 - logo 识别
<div align="center"> <div align="center">
<img src="../images/recognition/more_demo_images/output_logo/cctv_4.jpg" width = "400" /> <img src="../images/recognition/more_demo_images/output_logo/cctv_4.jpg" width = "400" />
</div> </div>
......
# Paddle-Lite # Paddle-Lite
---
## 目录
## 一、简介 * [1. 简介](#1)
* [2. 评估步骤](#2)
* [2.1 导出 inference 模型](#2.1)
* [2.2 benchmark 二进制文件下载](#2.2)
* [2.3 模型速度 benchmark](#2.3)
* [2.4 模型优化与速度评估](#2.4)
<a name='1'></a>
## 1. 简介
[Paddle-Lite](https://github.com/PaddlePaddle/Paddle-Lite) 是飞桨推出的一套功能完善、易用性强且性能卓越的轻量化推理引擎。 [Paddle-Lite](https://github.com/PaddlePaddle/Paddle-Lite) 是飞桨推出的一套功能完善、易用性强且性能卓越的轻量化推理引擎。
轻量化体现在使用较少比特数用于表示神经网络的权重和激活,能够大大降低模型的体积,解决终端设备存储空间有限的问题,推理性能也整体优于其他框架。 轻量化体现在使用较少比特数用于表示神经网络的权重和激活,能够大大降低模型的体积,解决终端设备存储空间有限的问题,推理性能也整体优于其他框架。
[PaddleClas](https://github.com/PaddlePaddle/PaddleClas) 使用 Paddle-Lite 进行了[移动端模型的性能评估](../models/Mobile.md),本部分以`ImageNet1k`数据集的`MobileNetV1`模型为例,介绍怎样使用`Paddle-Lite`,在移动端(基于骁龙855的安卓开发平台)对进行模型速度评估。 [PaddleClas](https://github.com/PaddlePaddle/PaddleClas) 使用 Paddle-Lite 进行了[移动端模型的性能评估](../models/Mobile.md),本部分以 `ImageNet1k` 数据集的 `MobileNetV1` 模型为例,介绍怎样使用 `Paddle-Lite`,在移动端(基于骁龙855的安卓开发平台)对进行模型速度评估。
<a name='2'></a>
## 二、评估步骤 ## 2. 评估步骤
### 2.1 导出inference模型 <a name='2.1'></a>
* 首先需要将训练过程中保存的模型存储为用于预测部署的固化模型,可以使用`tools/export_model.py`导出inference模型,具体使用方法如下。 ### 2.1 导出 inference 模型
* 首先需要将训练过程中保存的模型存储为用于预测部署的固化模型,可以使用 `tools/export_model.py` 导出 inference 模型,具体使用方法如下。
```shell ```shell
python tools/export_model.py \ python tools/export_model.py \
...@@ -22,38 +36,41 @@ python tools/export_model.py \ ...@@ -22,38 +36,41 @@ python tools/export_model.py \
在上述命令中,通过参数 `Arch.pretrained` 指定训练过程中保存的模型参数文件,也可以指定参数 `Arch.pretrained=True` 加载 PaddleClas 提供的基于 ImageNet1k 的预训练模型参数,最终在 `inference/MobileNetV1` 文件夹下会保存得到 `inference.pdmodel``inference.pdiparmas` 文件。 在上述命令中,通过参数 `Arch.pretrained` 指定训练过程中保存的模型参数文件,也可以指定参数 `Arch.pretrained=True` 加载 PaddleClas 提供的基于 ImageNet1k 的预训练模型参数,最终在 `inference/MobileNetV1` 文件夹下会保存得到 `inference.pdmodel``inference.pdiparmas` 文件。
<a name='2.2'></a>
### 2.2 benchmark二进制文件下载 ### 2.2 benchmark 二进制文件下载
* 使用adb(Android Debug Bridge)工具可以连接Android手机与PC端,并进行开发调试等。安装好adb,并确保PC端和手机连接成功后,使用以下命令可以查看手机的ARM版本,并基于此选择合适的预编译库。 * 使用 adb(Android Debug Bridge)工具可以连接 Android 手机与 PC 端,并进行开发调试等。安装好 adb,并确保 PC 端和手机连接成功后,使用以下命令可以查看手机的 ARM 版本,并基于此选择合适的预编译库。
```shell ```shell
adb shell getprop ro.product.cpu.abi adb shell getprop ro.product.cpu.abi
``` ```
* 下载benchmark_bin文件 * 下载 benchmark_bin 文件
请根据所用Android手机的ARM版本选择,ARM版本为v8,则使用以下命令下载: 请根据所用 Android 手机的 ARM 版本选择,ARM 版本为 v8,则使用以下命令下载:
```shell ```shell
wget -c https://paddle-inference-dist.bj.bcebos.com/PaddleLite/benchmark_0/benchmark_bin_v8 wget -c https://paddle-inference-dist.bj.bcebos.com/PaddleLite/benchmark_0/benchmark_bin_v8
``` ```
如果查看的ARM版本为v7,则需要下载v7版本的benchmark_bin文件,下载命令如下: 如果查看的 ARM 版本为 v7,则需要下载 v7 版本的 benchmark_bin 文件,下载命令如下:
```shell ```shell
wget -c https://paddle-inference-dist.bj.bcebos.com/PaddleLite/benchmark_0/benchmark_bin_v7 wget -c https://paddle-inference-dist.bj.bcebos.com/PaddleLite/benchmark_0/benchmark_bin_v7
``` ```
### 2.3 模型速度benchmark <a name='2.3'></a>
### 2.3 模型速度 benchmark
PC端和手机连接成功后,使用下面的命令开始模型评估。 PC 端和手机连接成功后,使用下面的命令开始模型评估。
``` ```
sh deploy/lite/benchmark/benchmark.sh ./benchmark_bin_v8 ./inference result_armv8.txt true sh deploy/lite/benchmark/benchmark.sh ./benchmark_bin_v8 ./inference result_armv8.txt true
``` ```
其中`./benchmark_bin_v8`为benchmark二进制文件路径,`./inference`为所有需要评测的模型的路径,`result_armv8.txt`为保存的结果文件,最后的参数`true`表示在评估之后会首先进行模型优化。最终在当前文件夹下会输出`result_armv8.txt`的评估结果文件,具体信息如下。 其中 `./benchmark_bin_v8` 为 benchmark 二进制文件路径,`./inference` 为所有需要评测的模型的路径,`result_armv8.txt` 为保存的结果文件,最后的参数 `true` 表示在评估之后会首先进行模型优化。最终在当前文件夹下会输出 `result_armv8.txt` 的评估结果文件,具体信息如下。
``` ```
PaddleLite Benchmark PaddleLite Benchmark
...@@ -67,15 +84,16 @@ Threads=4 Warmup=10 Repeats=30 ...@@ -67,15 +84,16 @@ Threads=4 Warmup=10 Repeats=30
MobileNetV1 min = 10.03200 max = 9.94300 average = 9.97627 MobileNetV1 min = 10.03200 max = 9.94300 average = 9.97627
``` ```
这里给出了不同线程数下的模型预测速度,单位为FPS,以线程数为1为例,MobileNetV1在骁龙855上的平均速度为`30.79750FPS` 这里给出了不同线程数下的模型预测速度,单位为 FPS,以线程数为 1 为例,MobileNetV1 在骁龙855上的平均速度为 `30.79750FPS`
<a name='2.4'></a>
### 2.4 模型优化与速度评估 ### 2.4 模型优化与速度评估
*2.3节中提到了在模型评估之前对其进行优化,在这里也可以首先对模型进行优化,再直接加载优化后的模型进行速度评估。 * 2.3 节中提到了在模型评估之前对其进行优化,在这里也可以首先对模型进行优化,再直接加载优化后的模型进行速度评估。
* Paddle-Lite 提供了多种策略来自动优化原始的训练模型,其中包括量化、子图融合、混合调度、Kernel优选等等方法。为了使优化过程更加方便易用,Paddle-Lite提供了opt 工具来自动完成优化步骤,输出一个轻量的、最优的可执行模型。可以在[Paddle-Lite模型优化工具页面](https://paddle-lite.readthedocs.io/zh/latest/user_guides/model_optimize_tool.html)下载。在这里以`macOS`开发环境为例,下载[opt_mac](https://paddlelite-data.bj.bcebos.com/model_optimize_tool/opt_mac)模型优化工具,并使用下面的命令对模型进行优化。 * Paddle-Lite 提供了多种策略来自动优化原始的训练模型,其中包括量化、子图融合、混合调度、Kernel 优选等等方法。为了使优化过程更加方便易用,Paddle-Lite 提供了 opt 工具来自动完成优化步骤,输出一个轻量的、最优的可执行模型。可以在[Paddle-Lite 模型优化工具页面](https://paddle-lite.readthedocs.io/zh/latest/user_guides/model_optimize_tool.html)下载。在这里以 `macOS` 开发环境为例,下载[opt_mac](https://paddlelite-data.bj.bcebos.com/model_optimize_tool/opt_mac)模型优化工具,并使用下面的命令对模型进行优化。
...@@ -92,15 +110,15 @@ mkdir ${opt_models_dir} ...@@ -92,15 +110,15 @@ mkdir ${opt_models_dir}
--optimize_out=${opt_models_dir}/MobileNetV1 --optimize_out=${opt_models_dir}/MobileNetV1
``` ```
其中`model_file``param_file`分别是导出的inference模型结构文件与参数文件地址,转换成功后,会在`opt_models`文件夹下生成`MobileNetV1.nb`文件。 其中 `model_file``param_file` 分别是导出的 inference 模型结构文件与参数文件地址,转换成功后,会在 `opt_models` 文件夹下生成 `MobileNetV1.nb` 文件。
使用benchmark_bin文件加载优化后的模型进行评估,具体的命令如下。 使用 benchmark_bin 文件加载优化后的模型进行评估,具体的命令如下。
```shell ```shell
bash benchmark.sh ./benchmark_bin_v8 ./opt_models result_armv8.txt bash benchmark.sh ./benchmark_bin_v8 ./opt_models result_armv8.txt
``` ```
最终`result_armv8.txt`中结果如下: 最终 `result_armv8.txt` 中结果如下:
``` ```
PaddleLite Benchmark PaddleLite Benchmark
...@@ -114,6 +132,6 @@ Threads=4 Warmup=10 Repeats=30 ...@@ -114,6 +132,6 @@ Threads=4 Warmup=10 Repeats=30
MobileNetV1_lite min = 10.00600 max = 9.90000 average = 9.96177 MobileNetV1_lite min = 10.00600 max = 9.90000 average = 9.96177
``` ```
以线程数为1为例,MobileNetV1在骁龙855上的平均速度为`30.84173 ms` 以线程数为 1 为例,MobileNetV1 在骁龙855上的平均速度为 `30.84173 ms`
更加具体的参数解释与Paddle-Lite使用方法可以参考 [Paddle-Lite 文档](https://paddle-lite.readthedocs.io/zh/latest/) 更加具体的参数解释与 Paddle-Lite 使用方法可以参考 [Paddle-Lite 文档](https://paddle-lite.readthedocs.io/zh/latest/)
# 图像分类昆仑模型介绍(持续更新中) # 图像分类昆仑模型介绍(持续更新中)
------
## 目录
* [1. 前言](#1)
* [2. 昆仑训练](#2)
* [2.1 ResNet50](#2.1)
* [2.2 MobileNetV3](#2.2)
* [2.3 HRNet](#2.3)
* [2.4 VGG16/19](#2.4)
## 前言 <a name='1'></a>
* 本文档介绍了目前昆仑支持的模型以及如何在昆仑设备上训练这些模型。支持昆仑的PaddlePaddle安装参考install_kunlun(https://github.com/PaddlePaddle/FluidDoc/blob/develop/doc/paddle/install/install_Kunlun_zh.md) ## 1. 前言
## 昆仑训练 * 本文档介绍了目前昆仑支持的模型以及如何在昆仑设备上训练这些模型。支持昆仑的 PaddlePaddle 安装参考 install_kunlun(https://github.com/PaddlePaddle/FluidDoc/blob/develop/doc/paddle/install/install_Kunlun_zh.md)
* 数据来源和预训练模型参考[quick_start](../quick_start/quick_start_classification_new_user.md)。昆仑训练效果与CPU/GPU对齐。
### ResNet50 <a name='2'></a>
## 2. 昆仑训练
* 数据来源和预训练模型参考[quick_start](../quick_start/quick_start_classification_new_user.md)。昆仑训练效果与 CPU/GPU 对齐。
<a name='2.1'></a>
### 2.1 ResNet50
* 命令: * 命令:
```shell ```shell
...@@ -18,9 +32,11 @@ python3.7 ppcls/static/train.py \ ...@@ -18,9 +32,11 @@ python3.7 ppcls/static/train.py \
-o is_distributed=False -o is_distributed=False
``` ```
cpu/gpu训练的区别是加上-o use_xpu=True, 表示执行在昆仑设备上。 cpu/gpu 训练的区别是加上 -o use_xpu=True, 表示执行在昆仑设备上。
### MobileNetV3 <a name='2.2'></a>
### 2.2 MobileNetV3
* 命令: * 命令:
```shell ```shell
...@@ -31,7 +47,9 @@ python3.7 ppcls/static/train.py \ ...@@ -31,7 +47,9 @@ python3.7 ppcls/static/train.py \
-o is_distributed=False -o is_distributed=False
``` ```
### HRNet <a name='2.3'></a>
### 2.3 HRNet
* 命令: * 命令:
```shell ```shell
...@@ -42,8 +60,9 @@ python3.7 ppcls/static/train.py \ ...@@ -42,8 +60,9 @@ python3.7 ppcls/static/train.py \
-o use_gpu=False -o use_gpu=False
``` ```
<a name='2.4'></a>
### VGG16/19 ### 2.4 VGG16/19
* 命令: * 命令:
```shell ```shell
......
# 使用DALI加速训练 # 使用 DALI 加速训练
----
## 目录
* [1. 前言](#1)
* [2. 安装 DALI](#2)
* [3. 使用 DALI](#3)
* [4. 使用 FP16 训练](#4)
## 前言 <a name='1'></a>
[NVIDIA数据加载库](https://docs.nvidia.com/deeplearning/dali/user-guide/docs/index.html)(The NVIDIA Data Loading Library,DALI)是用于数据加载和预处理的开源库,用于加速深度学习训练、推理过程,它可以直接构建飞桨Paddle的DataLoader数据读取器。
由于深度学习程序在训练阶段依赖大量数据,这些数据需要经过加载、预处理等操作后,才能送入训练程序,而这些操作通常在CPU完成,因此限制了训练速度进一步提高,特别是在batch_size较大时,数据读取可能成为训练速度的瓶颈。DALI可以基于GPU的高并行特性实现数据加载及预处理操作,可以进一步提高训练速度。 ## 1. 前言
[NVIDIA 数据加载库](https://docs.nvidia.com/deeplearning/dali/user-guide/docs/index.html)(The NVIDIA Data Loading Library,DALI)是用于数据加载和预处理的开源库,用于加速深度学习训练、推理过程,它可以直接构建飞桨 Paddle 的 DataLoader 数据读取器。
## 安装DALI 由于深度学习程序在训练阶段依赖大量数据,这些数据需要经过加载、预处理等操作后,才能送入训练程序,而这些操作通常在 CPU 完成,因此限制了训练速度进一步提高,特别是在 batch_size 较大时,数据读取可能成为训练速度的瓶颈。 DALI 可以基于 GPU 的高并行特性实现数据加载及预处理操作,可以进一步提高训练速度。
目前DALI仅支持Linux x64平台,且CUDA版本大于等于10.2。
* 对于CUDA 10: <a name='2'></a>
## 2.安装 DALI
目前 DALI 仅支持 Linux x64 平台,且 CUDA 版本大于等于 10.2。
* 对于 CUDA 10:
pip install --extra-index-url https://developer.download.nvidia.com/compute/redist nvidia-dali-cuda100 pip install --extra-index-url https://developer.download.nvidia.com/compute/redist nvidia-dali-cuda100
* 对于CUDA 11.0: * 对于 CUDA 11.0:
pip install --extra-index-url https://developer.download.nvidia.com/compute/redist nvidia-dali-cuda110 pip install --extra-index-url https://developer.download.nvidia.com/compute/redist nvidia-dali-cuda110
关于更多DALI安装的信息,可以参考[DALI官方](https://docs.nvidia.com/deeplearning/dali/user-guide/docs/installation.html) 关于更多 DALI 安装的信息,可以参考[DALI 官方](https://docs.nvidia.com/deeplearning/dali/user-guide/docs/installation.html)
## 使用DALI <a name='3'></a>
PaddleClas支持在静态图训练方式中使用DALI加速,由于DALI仅支持GPU训练,因此需要设置GPU,且DALI需要占用GPU显存,需要为DALI预留显存。使用DALI训练只需在训练配置文件中设置字段`use_dali=True`,或通过以下命令启动训练即可:
## 3. 使用 DALI
PaddleClas 支持在静态图训练方式中使用 DALI 加速,由于 DALI 仅支持 GPU 训练,因此需要设置 GPU,且 DALI 需要占用 GPU 显存,需要为 DALI 预留显存。使用 DALI 训练只需在训练配置文件中设置字段 `use_dali=True`,或通过以下命令启动训练即可:
```shell ```shell
# 设置用于训练的GPU卡号 # 设置用于训练的 GPU 卡号
export CUDA_VISIBLE_DEVICES="0" export CUDA_VISIBLE_DEVICES="0"
python ppcls/static/train.py -c ppcls/configs/ImageNet/ResNet/ResNet50.yaml -o use_dali=True python ppcls/static/train.py -c ppcls/configs/ImageNet/ResNet/ResNet50.yaml -o use_dali=True
...@@ -31,10 +43,10 @@ python ppcls/static/train.py -c ppcls/configs/ImageNet/ResNet/ResNet50.yaml -o u ...@@ -31,10 +43,10 @@ python ppcls/static/train.py -c ppcls/configs/ImageNet/ResNet/ResNet50.yaml -o u
也可以使用多卡训练: 也可以使用多卡训练:
```shell ```shell
# 设置用于训练的GPU卡号 # 设置用于训练的 GPU 卡号
export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7"
# 设置用于神经网络训练的显存大小,可根据具体情况设置,一般可设置为0.8或0.7,剩余显存则预留DALI使用 # 设置用于神经网络训练的显存大小,可根据具体情况设置,一般可设置为 0.8 或 0.7,剩余显存则预留 DALI 使用
export FLAGS_fraction_of_gpu_memory_to_use=0.80 export FLAGS_fraction_of_gpu_memory_to_use=0.80
python -m paddle.distributed.launch \ python -m paddle.distributed.launch \
...@@ -44,8 +56,10 @@ python -m paddle.distributed.launch \ ...@@ -44,8 +56,10 @@ python -m paddle.distributed.launch \
-o use_dali=True -o use_dali=True
``` ```
## 使用FP16训练 <a name='4'></a>
在上述基础上,使用FP16半精度训练,可以进一步提高速度,可以参考下面的配置与运行命令。
## 4. 使用 FP16 训练
在上述基础上,使用 FP16 半精度训练,可以进一步提高速度,可以参考下面的配置与运行命令。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
......
# 图像分类迁移学习 # 图像分类迁移学习
迁移学习是机器学习领域的一个重要分支,广泛应用于文本、图像等各种领域,此处我们主要介绍的是图像分类领域的迁移学习,也就是我们常说的域迁移,比如将 ImageNet 分类模型迁移到我们自己场景的图像分类任务上,如花卉分类。 迁移学习是机器学习领域的一个重要分支,广泛应用于文本、图像等各种领域,此处我们主要介绍的是图像分类领域的迁移学习,也就是我们常说的域迁移,比如将 ImageNet 分类模型迁移到我们自己场景的图像分类任务上,如花卉分类。
## 一、 超参搜索 ----------
## 目录
* [1. 超参搜索](#1)
* [1.1 网格搜索](#1.1)
* [1.2 贝叶斯搜索](#1.2)
* [2. 大规模分类模型](#2)
* [3. 参考文献](#3)
<a name='1'></a>
## 1. 超参搜索
ImageNet 作为业界常用的图像分类数据被大家广泛使用,已经总结出一系列经验性的超参,使用这些超参往往能够得到不错的训练精度,而这些经验性的参数在迁移到自己的业务中时,有时效果不佳。有两种常用的超参搜索方法可以用于获得更好的模型超参。 ImageNet 作为业界常用的图像分类数据被大家广泛使用,已经总结出一系列经验性的超参,使用这些超参往往能够得到不错的训练精度,而这些经验性的参数在迁移到自己的业务中时,有时效果不佳。有两种常用的超参搜索方法可以用于获得更好的模型超参。
<a name='1.1'></a>
### 1.1 网格搜索 ### 1.1 网格搜索
网格搜索,即穷举搜索,通过查找搜索空间内所有的点,确定最优值。方法简单有效,但当搜索空间较大时,需要消耗大量的计算资源。 网格搜索,即穷举搜索,通过查找搜索空间内所有的点,确定最优值。方法简单有效,但当搜索空间较大时,需要消耗大量的计算资源。
<a name='1.2'></a>
### 1.2 贝叶斯搜索 ### 1.2 贝叶斯搜索
贝叶斯搜索,即贝叶斯优化,在搜索空间中随机选取超参数点,采用高斯过程,即根据上一个超参数点的结果,更新当前的先验信息,计算前面n个超参数点的后验概率分布,得到搜索空间中每一个超参数点的期望均值和方差,其中期望均值越大表示接近最优指标的可能性越大,方差越大表示不确定性越大。通常将选择期望均值大的超参数点称为`exporitation`,选择方差大的超参数点称为`exploration`。在贝叶斯优化中通过定义`acquisition function`权衡期望均值和方差。贝叶斯搜索认为当前选择的超参数点是处于最大值可能出现的位置。 贝叶斯搜索,即贝叶斯优化,在搜索空间中随机选取超参数点,采用高斯过程,即根据上一个超参数点的结果,更新当前的先验信息,计算前面 n 个超参数点的后验概率分布,得到搜索空间中每一个超参数点的期望均值和方差,其中期望均值越大表示接近最优指标的可能性越大,方差越大表示不确定性越大。通常将选择期望均值大的超参数点称为 `exporitation`,选择方差大的超参数点称为 `exploration`。在贝叶斯优化中通过定义 `acquisition function` 权衡期望均值和方差。贝叶斯搜索认为当前选择的超参数点是处于最大值可能出现的位置。
------ ------
基于上述两种搜索方案,我们在8个开源数据集上将固定一组参数实验以及两种搜索方案做了对比实验,参照[1]的实验方案,我们对4个超参数进行搜索,搜索空间及实验结果如下所示: 基于上述两种搜索方案,我们在 8 个开源数据集上将固定一组参数实验以及两种搜索方案做了对比实验,参照[1]的实验方案,我们对 4 个超参数进行搜索,搜索空间及实验结果如下所示:
- 固定参数: - 固定参数:
``` ```
初始学习率lr=0.003,l2 decay=1e-4,label smoothing=False,mixup=False 初始学习率 lr=0.003,l2 decay=1e-4,label smoothing=False,mixup=False
``` ```
- 超参搜索空间: - 超参搜索空间:
``` ```
初始学习率lr: [0.1, 0.03, 0.01, 0.003, 0.001, 0.0003, 0.0001] 初始学习率 lr: [0.1, 0.03, 0.01, 0.003, 0.001, 0.0003, 0.0001]
L2 decay: [1e-3, 3e-4, 1e-4, 3e-5, 1e-5, 3e-6, 1e-6] L2 decay: [1e-3, 3e-4, 1e-4, 3e-5, 1e-5, 3e-6, 1e-6]
...@@ -36,7 +51,7 @@ Label smoothing: [False, True] ...@@ -36,7 +51,7 @@ Label smoothing: [False, True]
Mixup: [False, True] Mixup: [False, True]
``` ```
网格搜索的搜索次数为196次,而贝叶斯搜索通过设置最大迭代次数(`max_iter`)和是否重复搜索(`de_duplication`)来确定搜索次数。我们设计了系列实验,baseline为ImageNet1k校验集Top1 Acc为79.12%的ResNet50_vd预训练模型,并固定超参,在新数据集上finetune得到的模型。下表给出了固定参数、网格搜索以及贝叶斯搜索的精度与搜索次数对比。 网格搜索的搜索次数为 196 次,而贝叶斯搜索通过设置最大迭代次数(`max_iter`)和是否重复搜索(`de_duplication`)来确定搜索次数。我们设计了系列实验,baseline 为 ImageNet1k 校验集 Top1 Acc 为 79.12% 的 ResNet50_vd 预训练模型,并固定超参,在新数据集上 finetune 得到的模型。下表给出了固定参数、网格搜索以及贝叶斯搜索的精度与搜索次数对比。
- 精度与搜索次数对比: - 精度与搜索次数对比:
...@@ -52,22 +67,24 @@ Mixup: [False, True] ...@@ -52,22 +67,24 @@ Mixup: [False, True]
| FGVC Aircraft | 80.32% | 88.45% | 196 | 88.36% | 20 | | FGVC Aircraft | 80.32% | 88.45% | 196 | 88.36% | 20 |
- 上述实验验证了贝叶斯搜索相比网格搜索,在减少搜索次数10倍左右条件下,精度只下降0%~0.4%。 - 上述实验验证了贝叶斯搜索相比网格搜索,在减少搜索次数 10 倍左右条件下,精度只下降 0%~0.4%。
- 当搜索空间进一步扩大时,例如将是否进行AutoAugment,RandAugment,Cutout, Cutmix以及Dropout这些正则化策略作为选择时,贝叶斯搜索能够在获取较优精度的前提下,有效地降低搜索次数。 - 当搜索空间进一步扩大时,例如将是否进行 AutoAugment,RandAugment,Cutout,Cutmix 以及 Dropout 这些正则化策略作为选择时,贝叶斯搜索能够在获取较优精度的前提下,有效地降低搜索次数。
## 二、 大规模分类模型 <a name='2'></a>
在实际应用中,由于训练数据的匮乏,往往将ImageNet1k数据集训练的分类模型作为预训练模型,进行图像分类的迁移学习。为了进一步助力解决实际问题,基于ResNet50_vd, 百度开源了自研的大规模分类预训练模型,其中训练数据为10万个类别,4300万张图片。10万类预训练模型的下载地址:[**下载地址**](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_vd_10w_pretrained.pdparams) ## 2. 大规模分类模型
我们在6个自有采集的数据集上进行迁移学习实验,采用一组固定参数以及网格搜索方式,其中训练轮数设置为20epochs,选用ResNet50_vd模型,ImageNet预训练精度为79.12%。实验数据集参数以及模型精度的对比结果如下: 在实际应用中,由于训练数据的匮乏,往往将 ImageNet1k 数据集训练的分类模型作为预训练模型,进行图像分类的迁移学习。为了进一步助力解决实际问题,基于 ResNet50_vd, 百度开源了自研的大规模分类预训练模型,其中训练数据为 10 万个类别,4300 万张图片。10 万类预训练模型的下载地址:[**下载地址**](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_vd_10w_pretrained.pdparams)
我们在 6 个自有采集的数据集上进行迁移学习实验,采用一组固定参数以及网格搜索方式,其中训练轮数设置为 20 epochs,选用 ResNet50_vd 模型,ImageNet 预训练精度为 79.12%。实验数据集参数以及模型精度的对比结果如下:
固定参数: 固定参数:
``` ```
初始学习率lr=0.001,l2 decay=1e-4,label smoothing=False,mixup=False 初始学习率 lr=0.001,l2 decay=1e-4,label smoothing=False,mixup=False
``` ```
| 数据集 | 数据统计 | **ImageNet预训练模型 <br />固定参数Top-1/参数搜索Top-1** | **大规模分类预训练模型<br />固定参数Top-1/参数搜索Top-1** | | 数据集 | 数据统计 | **ImageNet 预训练模型 <br />固定参数 Top-1/参数搜索 Top-1** | **大规模分类预训练模型<br />固定参数 Top-1/参数搜索 Top-1** |
| --------------- | ----------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------- | | --------------- | ----------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------- |
| 花卉 | class:102<br />train:5789<br />valid:2396 | 0.7779/0.9883 | 0.9892/0.9954 | | 花卉 | class:102<br />train:5789<br />valid:2396 | 0.7779/0.9883 | 0.9892/0.9954 |
| 手绘简笔画 | Class:18<br />train:1007<br />valid:432 | 0.8795/0.9196 | 0.9107/0.9219 | | 手绘简笔画 | Class:18<br />train:1007<br />valid:432 | 0.8795/0.9196 | 0.9107/0.9219 |
...@@ -76,10 +93,10 @@ Mixup: [False, True] ...@@ -76,10 +93,10 @@ Mixup: [False, True]
| 椅子 | class:5<br />train:169<br />valid:78 | 0.8557/0.9688 | 0.9077/0.9792 | | 椅子 | class:5<br />train:169<br />valid:78 | 0.8557/0.9688 | 0.9077/0.9792 |
| 地质 | class:4<br />train:671<br />valid:296 | 0.5719/0.8094 | 0.6781/0.8219 | | 地质 | class:4<br />train:671<br />valid:296 | 0.5719/0.8094 | 0.6781/0.8219 |
- 通过上述的实验验证了当使用一组固定参数时,相比于ImageNet预训练模型,使用大规模分类模型作为预训练模型在大多数情况下能够提升模型在新的数据集上得效果,通过参数搜索可以进一步提升精度。 - 通过上述的实验验证了当使用一组固定参数时,相比于 ImageNet 预训练模型,使用大规模分类模型作为预训练模型在大多数情况下能够提升模型在新的数据集上得效果,通过参数搜索可以进一步提升精度。
## 参考文献 <a name='3'></a>
## 3. 参考文献
[1] Kornblith, Simon, Jonathon Shlens, and Quoc V. Le. "Do better imagenet models transfer better?." *Proceedings of the IEEE conference on computer vision and pattern recognition*. 2019. [1] Kornblith, Simon, Jonathon Shlens, and Quoc V. Le. "Do better imagenet models transfer better?." *Proceedings of the IEEE conference on computer vision and pattern recognition*. 2019.
......
...@@ -8,49 +8,49 @@ ...@@ -8,49 +8,49 @@
- 2021.06.22,23,24 PaddleClas官方研发团队带来技术深入解读三日直播课。课程回放:[https://aistudio.baidu.com/aistudio/course/introduce/24519](https://aistudio.baidu.com/aistudio/course/introduce/24519) - 2021.06.22,23,24 PaddleClas官方研发团队带来技术深入解读三日直播课。课程回放:[https://aistudio.baidu.com/aistudio/course/introduce/24519](https://aistudio.baidu.com/aistudio/course/introduce/24519)
- 2021.06.16 PaddleClas v2.2版本升级,集成Metric learning,向量检索等组件。新增商品识别、动漫人物识别、车辆识别和logo识别等4个图像识别应用。新增LeViT、Twins、TNT、DLA、HarDNet、RedNet系列30个预训练模型。 - 2021.06.16 PaddleClas v2.2版本升级,集成Metric learning,向量检索等组件。新增商品识别、动漫人物识别、车辆识别和logo识别等4个图像识别应用。新增LeViT、Twins、TNT、DLA、HarDNet、RedNet系列30个预训练模型。
- 2021.04.15 - 2021.04.15
- 添加`MixNet_L``ReXNet_3_0`系列模型,在ImageNet-1k上`MixNet` 模型Top1 Acc可达78.6%,`ReXNet`模型可达82.09% - 添加 `MixNet_L``ReXNet_3_0` 系列模型,在 ImageNet-1k 上 `MixNet` 模型 Top1 Acc 可达 78.6%,`ReXNet` 模型可达 82.09%
- 2021.01.27 - 2021.01.27
* 添加ViT与DeiT模型,在ImageNet上,ViT模型Top-1 Acc可达81.05%,DeiT模型可达85.5%。 * 添加 ViT 与 DeiT 模型,在 ImageNet 上,ViT 模型 Top-1 Acc 可达 81.05%,DeiT 模型可达 85.5%。
- 2021.01.08 - 2021.01.08
* 添加whl包及其使用说明,直接安装paddleclas whl包,即可快速完成模型预测。 * 添加 whl 包及其使用说明,直接安装 paddleclas whl 包,即可快速完成模型预测。
- 2020.12.16 - 2020.12.16
* 添加对cpp预测的tensorRT支持,预测加速更明显。 * 添加对 cpp 预测的 tensorRT 支持,预测加速更明显。
- 2020.12.06 - 2020.12.06
* 添加SE_HRNet_W64_C_ssld模型,在ImageNet上Top-1 Acc可达0.8475。 * 添加 SE_HRNet_W64_C_ssld 模型,在 ImageNet 上 Top-1 Acc 可达 0.8475。
- 2020.11.23 - 2020.11.23
* 添加GhostNet_x1_3_ssld模型,在ImageNet上Top-1 Acc可达0.7938。 * 添加 GhostNet_x1_3_ssld 模型,在 ImageNet 上 Top-1 Acc 可达 0.7938。
- 2020.11.09 - 2020.11.09
* 添加InceptionV3结构和模型,在ImageNet上Top-1 Acc可达0.791。 * 添加 InceptionV3 结构和模型,在 ImageNet 上 Top-1 Acc 可达 0.791。
- 2020.10.20 - 2020.10.20
* 添加Res2Net50_vd_26w_4s_ssld模型,在ImageNet上Top-1 Acc可达0.831;添加Res2Net101_vd_26w_4s_ssld模型,在ImageNet上Top-1 Acc可达0.839。 * 添加 Res2Net50_vd_26w_4s_ssld 模型,在 ImageNet 上 Top-1 Acc 可达 0.831;添加 Res2Net101_vd_26w_4s_ssld 模型,在 ImageNet 上 Top-1 Acc 可达 0.839。
- 2020.10.12 - 2020.10.12
* 添加Paddle-Lite demo。 * 添加 Paddle-Lite demo。
- 2020.10.10 - 2020.10.10
* 添加cpp inference demo。 * 添加 cpp inference demo。
* 添加FAQ30问。 * 添加 FAQ 30 问。
- 2020.09.17 - 2020.09.17
* 添加HRNet_W48_C_ssld模型,在ImageNet上Top-1 Acc可达0.836;添加ResNet34_vd_ssld模型,在ImageNet上Top-1 Acc可达0.797。 * 添加 HRNet_W48_C_ssld 模型,在 ImageNet 上 Top-1 Acc 可达 0.836;添加 ResNet34_vd_ssld 模型,在 ImageNet 上 Top-1 Acc 可达 0.797。
* 2020.09.07 * 2020.09.07
* 添加HRNet_W18_C_ssld模型,在ImageNet上Top-1 Acc可达0.81162;添加MobileNetV3_small_x0_35_ssld模型,在ImageNet上Top-1 Acc可达0.5555。 * 添加 HRNet_W18_C_ssld 模型,在 ImageNet 上 Top-1 Acc 可达 0.81162;添加 MobileNetV3_small_x0_35_ssld 模型,在 ImageNet 上 Top-1 Acc 可达 0.5555。
* 2020.07.14 * 2020.07.14
* 添加Res2Net200_vd_26w_4s_ssld模型,在ImageNet上Top-1 Acc可达85.13%。 * 添加 Res2Net200_vd_26w_4s_ssld 模型,在 ImageNet 上 Top-1 Acc 可达 85.13%。
* 添加Fix_ResNet50_vd_ssld_v2模型,,在ImageNet上Top-1 Acc可达84.0%。 * 添加 Fix_ResNet50_vd_ssld_v2 模型,,在 ImageNet 上 Top-1 Acc 可达 84.0%。
* 2020.06.17 * 2020.06.17
* 添加英文文档。 * 添加英文文档。
* 2020.06.12 * 2020.06.12
* 添加对windows和CPU环境的训练与评估支持。 * 添加对 windows 和 CPU 环境的训练与评估支持。
* 2020.05.17 * 2020.05.17
* 添加混合精度训练。 * 添加混合精度训练。
* 2020.05.09 * 2020.05.09
* 添加Paddle Serving使用文档。 * 添加 Paddle Serving 使用文档。
* 添加Paddle-Lite使用文档。 * 添加 Paddle-Lite 使用文档。
* 添加T4 GPU的FP32/FP16预测速度benchmark。 * 添加 T4 GPU 的 FP32/FP16 预测速度 benchmark。
* 2020.04.10: * 2020.04.10:
* 第一次提交。 * 第一次提交。
# 版本更新信息 # 版本更新信息
----------
## 目录
* [1. v2.3](#1)
* [2. v2.2](#2)
## v2.3 <a name='1'></a>
## 1. v2.3
- 模型更新 - 模型更新
- 添加轻量化模型预训练权重,包括检测模型、特征模型 - 添加轻量化模型预训练权重,包括检测模型、特征模型
- 发布PP-LCNet系列模型,此系列模型是专门在CPU上设计运行的自研模型 - 发布 PP-LCNet 系列模型,此系列模型是专门在 CPU 上设计运行的自研模型
- SwinTransformer、Twins、Deit支持从scrach直接训练,达到论文精度 - SwinTransformer、Twins、Deit 支持从 scrach 直接训练,达到论文精度
- 框架基础能力 - 框架基础能力
- 添加DeepHash模块,支持特征模型直接输出二值特征 - 添加 DeepHash 模块,支持特征模型直接输出二值特征
- 添加PKSampler,特征模型不能多机多卡的训练的问题 - 添加 PKSampler,特征模型不能多机多卡的训练的问题
- 支持PaddleSlim:支持分类模型、特征模型的量化、裁剪训练及离线量化功能 - 支持 PaddleSlim:支持分类模型、特征模型的量化、裁剪训练及离线量化功能
- Legendary models支持模型中间结果输出 - Legendary models 支持模型中间结果输出
- 支持多标签分类训练 - 支持多标签分类训练
- 预测部署 - 预测部署
- 使用Faiss替换原有特征检索库,提升平台适配性 - 使用 Faiss 替换原有特征检索库,提升平台适配性
- 支持PaddleServing:支持分类模型、图像识别流程的部署 - 支持 PaddleServing:支持分类模型、图像识别流程的部署
- 推荐库版本 - 推荐库版本
- python版本:3.7 - python 版本:3.7
- PaddlePaddle版本:2.1.3 - PaddlePaddle 版本:2.1.3
- PaddleSlim版本:2.2.0 - PaddleSlim 版本:2.2.0
- PaddleServing版本:0.6.1 - PaddleServing 版本:0.6.1
<a name='2'></a>
## v2.2 ## 2. v2.2
- 模型更新 - 模型更新
- 添加LeViT、Twins、TNT、DLA、HardNet、RedNet、SwinTransfomer模型 - 添加 LeViT、Twins、TNT、DLA、HardNet、RedNet、SwinTransfomer 模型
- 框架基础能力 - 框架基础能力
- 将分类模型分为两类 - 将分类模型分为两类
- legendary models:引入TheseusLayer基类,及增加了修改网络功能接口,同时支持网络截断输出功能 - legendary models:引入 TheseusLayer 基类,及增加了修改网络功能接口,同时支持网络截断输出功能
- model zoo:其他普通分类模型 - model zoo:其他普通分类模型
- 添加Metric Learning算法支持 - 添加 Metric Learning 算法支持
- 添加多种相关Loss算法,及基础网络模块gears(支持与backbone、loss组合)方便使用 - 添加多种相关 Loss 算法,及基础网络模块 gears(支持与 backbone、loss 组合)方便使用
- 同时支持普通分类及metric learning相关任务训练 - 同时支持普通分类及 metric learning 相关任务训练
- 支持静态图训练 - 支持静态图训练
- 分类训练支持dali加速 - 分类训练支持 dali 加速
- 支持fp16训练 - 支持 fp16 训练
- 应用更新 - 应用更新
- 添加商品识别、车辆识别(车辆细粒度分类、车辆ReID)、logo识别、动漫人物识别应用具体案例及相关模型 - 添加商品识别、车辆识别(车辆细粒度分类、车辆 ReID)、logo 识别、动漫人物识别应用具体案例及相关模型
- 添加图像识别完整pipeline,包含检测模块、特征提取模块、向量检索模块 - 添加图像识别完整 pipeline,包含检测模块、特征提取模块、向量检索模块
- 预测部署 - 预测部署
- 添加百度自研向量检索模块Mobius,支持图像识别系统预测部署 - 添加百度自研向量检索模块 Mobius,支持图像识别系统预测部署
- 图像识别,建立特征库支持 batch_size>1 - 图像识别,建立特征库支持 batch_size>1
- 文档更新 - 文档更新
- 添加图像识别相关文档 - 添加图像识别相关文档
- 修复之前文档bug - 修复之前文档 bug
- 推荐库版本 - 推荐库版本
- python版本:3.7 - python 版本:3.7
- PaddlePaddle:2.1.2 - PaddlePaddle:2.1.2
# 30分钟玩转PaddleClas(尝鲜版) # 30 分钟玩转 PaddleClas(尝鲜版)
此教程主要针对初级用户,即深度学习相关理论知识处于入门阶段,具有一定的 Python 基础,能够阅读简单代码的用户。此内容主要包括使用 PaddleClas 进行图像分类网络训练及模型预测。 此教程主要针对初级用户,即深度学习相关理论知识处于入门阶段,具有一定的 Python 基础,能够阅读简单代码的用户。此内容主要包括使用 PaddleClas 进行图像分类网络训练及模型预测。
--- ---
## 目录
- [1. 基础知识](#1)
- [2. 环境安装与配置](#2)
- [3. 数据的准备与处理](#3)
- [4. 模型训练](#4)
- [4.1 使用 CPU 进行模型训练](#4.1)
- [4.1.1 不使用预训练模型进行训练](#4.1.1)
- [4.1.2 使用预训练模型进行训练](#4.1.2)
- [4.2 使用 GPU 进行模型训练](#4.2)
- [4.2.1 不使用预训练模型进行训练](#4.2.1)
- [4.2.2 使用预训练模型进行训练](#4.2.2)
- [5. 模型预测](#5)
<a name="1"></a>
## 1. 基础知识 ## 1. 基础知识
图像分类顾名思义就是一个模式分类问题,是计算机视觉中最基础的任务,它的目标是将不同的图像,划分到不同的类别。以下会对整个模型训练过程中需要了解到的一些概念做简单的解释,希望能够对初次体验 PaddleClas 的你有所帮助: 图像分类顾名思义就是一个模式分类问题,是计算机视觉中最基础的任务,它的目标是将不同的图像,划分到不同的类别。以下会对整个模型训练过程中需要了解到的一些概念做简单的解释,希望能够对初次体验 PaddleClas 的你有所帮助:
...@@ -36,10 +50,10 @@ ...@@ -36,10 +50,10 @@
## 3. 数据的准备与处理 ## 3. 数据的准备与处理
进入PaddleClas目录: 进入 PaddleClas 目录:
```shell ```shell
# linux or mac, $path_to_PaddleClas表示PaddleClas的根目录,用户需要根据自己的真实目录修改 # linux or mac, $path_to_PaddleClas 表示 PaddleClas 的根目录,用户需要根据自己的真实目录修改
cd $path_to_PaddleClas cd $path_to_PaddleClas
``` ```
...@@ -56,9 +70,9 @@ unzip flowers102.zip ...@@ -56,9 +70,9 @@ unzip flowers102.zip
没有安装 `wget` 命令或者在 Windows 中下载的话,需要将地址拷贝到浏览器中下载,并进行解压到目录 `PaddleClas/dataset/` 下面即可。 没有安装 `wget` 命令或者在 Windows 中下载的话,需要将地址拷贝到浏览器中下载,并进行解压到目录 `PaddleClas/dataset/` 下面即可。
解压完成后,在目录 `PaddleClas/dataset/flowers102` 下有用于训练和测试的三个 `.txt` 文件:`train_list.txt`(训练集,1020张图)、`val_list.txt`(验证集,1020张图)、`train_extra_list.txt`(更大的训练集,7169张图)。文件中每行格式:**图像相对路径** **图像的label_id**(注意:中间有空格),此外还有flowers102数据集 label id 与类别名称的映射文件:`flowers102_label_list.txt` 解压完成后,在目录 `PaddleClas/dataset/flowers102` 下有用于训练和测试的三个 `.txt` 文件:`train_list.txt`(训练集,1020 张图)、`val_list.txt`(验证集,1020 张图)、`train_extra_list.txt`(更大的训练集,7169 张图)。文件中每行格式:**图像相对路径** **图像的 label_id**(注意:中间有空格),此外还有 flowers102 数据集 label id 与类别名称的映射文件:`flowers102_label_list.txt`
flowers102数据集的图像文件存放在 `dataset/flowers102/jpg` 目录中,图像示例如下: flowers102 数据集的图像文件存放在 `dataset/flowers102/jpg` 目录中,图像示例如下:
<div align="center"> <div align="center">
<img src="../../images/quick_start/Examples-Flower-102.png" width = "800" /> <img src="../../images/quick_start/Examples-Flower-102.png" width = "800" />
...@@ -69,27 +83,26 @@ flowers102数据集的图像文件存放在 `dataset/flowers102/jpg` 目录中 ...@@ -69,27 +83,26 @@ flowers102数据集的图像文件存放在 `dataset/flowers102/jpg` 目录中
```shell ```shell
# linux or mac # linux or mac
cd ../../ cd ../../
# windoes直接打开PaddleClas根目录即可 # windoes 直接打开 PaddleClas 根目录即可
``` ```
## 4. 模型训练 ## 4. 模型训练
<a name="4.1"></a> <a name="4.1"></a>
### 4.1 使用 CPU 进行模型训练
### 4.1 使用CPU进行模型训练 由于使用 CPU 来进行模型训练,计算速度较慢,因此,此处以 ShuffleNetV2_x0_25 为例。此模型计算量较小,在 CPU 上计算速度较快。但是也因为模型较小,训练好的模型精度也不会太高。
由于使用CPU来进行模型训练,计算速度较慢,因此,此处以 ShuffleNetV2_x0_25 为例。此模型计算量较小,在 CPU 上计算速度较快。但是也因为模型较小,训练好的模型精度也不会太高。
#### 4.1.1 不使用预训练模型 #### 4.1.1 不使用预训练模型
```shell ```shell
# windows在cmd中进入PaddleClas根目录,执行此命令 # windows 在 cmd 中进入 PaddleClas 根目录,执行此命令
python tools/train.py -c ./ppcls/configs/quick_start/new_user/ShuffleNetV2_x0_25.yaml python tools/train.py -c ./ppcls/configs/quick_start/new_user/ShuffleNetV2_x0_25.yaml
``` ```
- `-c` 参数是指定训练的配置文件路径,训练的具体超参数可查看`yaml`文件 - `-c` 参数是指定训练的配置文件路径,训练的具体超参数可查看 `yaml` 文件
- `yaml``Global.device` 参数设置为`cpu`,即使用CPU进行训练(若不设置,此参数默认为`True` - `yaml` 文件中 `Global.device` 参数设置为 `cpu`,即使用 CPU 进行训练(若不设置,此参数默认为 `True`
- `yaml`文件中`epochs`参数设置为20,说明对整个数据集进行20个epoch迭代,预计训练20分钟左右(不同CPU,训练时间略有不同),此时训练模型不充分。若提高训练模型精度,请将此参数设大,如**40**,训练时间也会相应延长 - `yaml` 文件中 `epochs` 参数设置为 20,说明对整个数据集进行 20 个 epoch 迭代,预计训练 20 分钟左右(不同 CPU,训练时间略有不同),此时训练模型不充分。若提高训练模型精度,请将此参数设大,如**40**,训练时间也会相应延长
#### 4.1.2 使用预训练模型 #### 4.1.2 使用预训练模型
...@@ -101,7 +114,8 @@ python tools/train.py -c ./ppcls/configs/quick_start/new_user/ShuffleNetV2_x0_25 ...@@ -101,7 +114,8 @@ python tools/train.py -c ./ppcls/configs/quick_start/new_user/ShuffleNetV2_x0_25
可以使用将使用与不使用预训练模型训练进行对比,观察 loss 的下降情况。 可以使用将使用与不使用预训练模型训练进行对比,观察 loss 的下降情况。
### 4.2 使用GPU进行模型训练 <a name="4.2"></a>
### 4.2 使用 GPU 进行模型训练
由于 GPU 训练速度更快,可以使用更复杂模型,因此以 ResNet50_vd 为例。与 ShuffleNetV2_x0_25 相比,此模型计算量较大,训练好的模型精度也会更高。 由于 GPU 训练速度更快,可以使用更复杂模型,因此以 ResNet50_vd 为例。与 ShuffleNetV2_x0_25 相比,此模型计算量较大,训练好的模型精度也会更高。
...@@ -125,13 +139,14 @@ python tools/train.py -c ./ppcls/configs/quick_start/new_user/ShuffleNetV2_x0_25 ...@@ -125,13 +139,14 @@ python tools/train.py -c ./ppcls/configs/quick_start/new_user/ShuffleNetV2_x0_25
python tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml python tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml
``` ```
训练完成后,验证集的`Top1 Acc`曲线如下所示,最高准确率为0.2735。训练精度曲线下图所示 训练完成后,验证集的 `Top1 Acc` 曲线如下所示,最高准确率为 0.2735。训练精度曲线下图所示
<div align="center"> <div align="center">
<img src="../../images/quick_start/r50_vd_acc.png" width = "800" /> <img src="../../images/quick_start/r50_vd_acc.png" width = "800" />
</div> </div>
#### 4.2.1 使用预训练模型进行训练 <a name="4.2.2"></a>
#### 4.2.2 使用预训练模型进行训练
基于 ImageNet1k 分类预训练模型进行微调,训练脚本如下所示 基于 ImageNet1k 分类预训练模型进行微调,训练脚本如下所示
...@@ -139,7 +154,7 @@ python tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml ...@@ -139,7 +154,7 @@ python tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml
python tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml -o Arch.pretrained=True python tools/train.py -c ./ppcls/configs/quick_start/ResNet50_vd.yaml -o Arch.pretrained=True
``` ```
**注**:此训练脚本使用 GPU,如使用 CPU 可按照上文中[4.1 使用CPU进行模型训练](#4.1)所示,进行修改。 **注**:此训练脚本使用 GPU,如使用 CPU 可按照上文中[4.1 使用 CPU 进行模型训练](#4.1)所示,进行修改。
验证集的 `Top1 Acc` 曲线如下所示,最高准确率为 `0.9402`,加载预训练模型之后,flowers102 数据集精度大幅提升,绝对精度涨幅超过 65%。 验证集的 `Top1 Acc` 曲线如下所示,最高准确率为 `0.9402`,加载预训练模型之后,flowers102 数据集精度大幅提升,绝对精度涨幅超过 65%。
......
# 30分钟玩转PaddleClas(进阶版) # 30 分钟玩转 PaddleClas(进阶版)
此处提供了专业用户在linux操作系统上使用PaddleClas的快速上手教程,主要内容基于CIFAR-100数据集,快速体验不同模型的训练、加载不同预训练模型、SSLD知识蒸馏方案和数据增广的效果。请事先参考[安装指南](../installation/install_paddleclas.md)配置运行环境和克隆PaddleClas代码。 此处提供了专业用户在 linux 操作系统上使用 PaddleClas 的快速上手教程,主要内容基于 CIFAR-100 数据集,快速体验不同模型的训练、加载不同预训练模型、SSLD 知识蒸馏方案和数据增广的效果。请事先参考[安装指南](../installation/install_paddleclas.md)配置运行环境和克隆 PaddleClas 代码。
------
## 一、数据和模型准备 ## 目录
- [1. 数据和模型准备](#1)
- [1.1 数据准备](#1.1)
- [1.1.1 准备 CIFAR100](#1.1.1)
- [2. 模型训练](#2)
- [2.1 单标签训练](#2.1)
- [2.1.1 零基础训练:不加载预训练模型的训练](#2.1.1)
- [2.1.2 迁移学习](#2.1.2)
- [3. 数据增广](#3)
- [3.1 数据增广的尝试-Mixup](#3.1)
- [4. 知识蒸馏](#4)
- [5. 模型评估与推理](#5)
- [5.1 单标签分类模型评估与推理](#5.1)
- [5.1.1 单标签分类模型评估](#5.1.1)
- [5.1.2 单标签分类模型预测](#5.1.2)
- [5.1.3 单标签分类使用 inference 模型进行模型推理](#5.1.3)
<a name="1"></a>
## 1. 数据和模型准备
<a name="1.1"></a>
### 1.1 数据准备 ### 1.1 数据准备
* 进入PaddleClas目录。 * 进入 PaddleClas 目录。
``` ```
cd path_to_PaddleClas cd path_to_PaddleClas
``` ```
#### 1.1.1 准备CIFAR100 <a name="1.1.1"></a>
* 进入`dataset/`目录,下载并解压CIFAR100数据集。 #### 1.1.1 准备 CIFAR100
* 进入 `dataset/` 目录,下载并解压 CIFAR100 数据集。
```shell ```shell
cd dataset cd dataset
...@@ -25,14 +50,19 @@ tar -xf CIFAR100.tar ...@@ -25,14 +50,19 @@ tar -xf CIFAR100.tar
cd ../ cd ../
``` ```
<a name="2"></a>
## 2. 模型训练
## 二、模型训练 <a name="2.1"></a>
### 2.1 单标签训练 ### 2.1 单标签训练
<a name="2.1.1"></a>
#### 2.1.1 零基础训练:不加载预训练模型的训练 #### 2.1.1 零基础训练:不加载预训练模型的训练
* 基于ResNet50_vd模型,训练脚本如下所示。 * 基于 ResNet50_vd 模型,训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -43,13 +73,14 @@ python3 -m paddle.distributed.launch \ ...@@ -43,13 +73,14 @@ python3 -m paddle.distributed.launch \
-o Global.output_dir="output_CIFAR" -o Global.output_dir="output_CIFAR"
``` ```
验证集的最高准确率为 0.415 左右。
验证集的最高准确率为0.415左右。 <a name="2.1.2"></a>
#### 2.1.2 迁移学习 #### 2.1.2 迁移学习
* 基于ImageNet1k分类预训练模型ResNet50_vd_pretrained(准确率79.12\%)进行微调,训练脚本如下所示。 * 基于 ImageNet1k 分类预训练模型 ResNet50_vd_pretrained(准确率 79.12%)进行微调,训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -61,9 +92,9 @@ python3 -m paddle.distributed.launch \ ...@@ -61,9 +92,9 @@ python3 -m paddle.distributed.launch \
-o Arch.pretrained=True -o Arch.pretrained=True
``` ```
验证集最高准确率为0.718左右,加载预训练模型之后,CIFAR100数据集精度大幅提升,绝对精度涨幅30\% 验证集最高准确率为 0.718 左右,加载预训练模型之后,CIFAR100 数据集精度大幅提升,绝对精度涨幅 30%。
* 基于ImageNet1k分类预训练模型ResNet50_vd_ssld_pretrained(准确率82.39\%)进行微调,训练脚本如下所示。 * 基于 ImageNet1k 分类预训练模型 ResNet50_vd_ssld_pretrained(准确率 82.39%)进行微调,训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -76,9 +107,9 @@ python3 -m paddle.distributed.launch \ ...@@ -76,9 +107,9 @@ python3 -m paddle.distributed.launch \
-o Arch.use_ssld=True -o Arch.use_ssld=True
``` ```
最终CIFAR100验证集上精度指标为0.73,相对于79.12\%预训练模型的微调结构,新数据集指标可以再次提升1.2\% 最终 CIFAR100 验证集上精度指标为 0.73,相对于 79.12% 预训练模型的微调结构,新数据集指标可以再次提升 1.2%。
* 替换backbone为MobileNetV3_large_x1_0进行微调,训练脚本如下所示。 * 替换 backbone 为 MobileNetV3_large_x1_0 进行微调,训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -90,16 +121,20 @@ python3 -m paddle.distributed.launch \ ...@@ -90,16 +121,20 @@ python3 -m paddle.distributed.launch \
-o Arch.pretrained=True -o Arch.pretrained=True
``` ```
验证集最高准确率为0.601左右, 较ResNet50_vd低近12%。 验证集最高准确率为 0.601 左右, 较 ResNet50_vd 低近 12%。
<a name="3"></a>
## 三、数据增广
PaddleClas包含了很多数据增广的方法,如Mixup、Cutout、RandomErasing等,具体的方法可以参考[数据增广的章节](../algorithm_introduction/DataAugmentation.md) ## 3. 数据增广
### 数据增广的尝试-Mixup PaddleClas 包含了很多数据增广的方法,如 Mixup、Cutout、RandomErasing 等,具体的方法可以参考[数据增广的章节](../algorithm_introduction/DataAugmentation.md)
基于`3.3节`中的训练方法,结合Mixup的数据增广方式进行训练,具体的训练脚本如下所示。 <a name="3.1"></a>
### 3.1 数据增广的尝试-Mixup
基于[数据增广的章节](../algorithm_introduction/DataAugmentation.md) `3.3 节` 中的训练方法,结合 Mixup 的数据增广方式进行训练,具体的训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -111,28 +146,29 @@ python3 -m paddle.distributed.launch \ ...@@ -111,28 +146,29 @@ python3 -m paddle.distributed.launch \
``` ```
最终CIFAR100验证集上的精度为0.73,使用数据增广可以使得模型精度再次提升约1.2\% 最终 CIFAR100 验证集上的精度为 0.73,使用数据增广可以使得模型精度再次提升约 1.2%。
* **注意** * **注意**
* 其他数据增广的配置文件可以参考`ppcls/configs/DataAugment`中的配置文件。 * 其他数据增广的配置文件可以参考 `ppcls/configs/ImageNet/DataAugment/` 中的配置文件。
* 训练 CIFAR100 的迭代轮数较少,因此进行训练时,验证集的精度指标可能会有 1% 左右的波动。
* 训练CIFAR100的迭代轮数较少,因此进行训练时,验证集的精度指标可能会有1\%左右的波动。 <a name="4"></a>
## 四、知识蒸馏 ## 4. 知识蒸馏
PaddleClas包含了自研的SSLD知识蒸馏方案,具体的内容可以参考[知识蒸馏章节](../algorithm_introduction/knowledge_distillation.md), 本小节将尝试使用知识蒸馏技术对MobileNetV3_large_x1_0模型进行训练,使用`2.1.2小节`训练得到的ResNet50_vd模型作为蒸馏所用的教师模型,首先将`2.1.2小节`训练得到的ResNet50_vd模型保存到指定目录,脚本如下。 PaddleClas 包含了自研的 SSLD 知识蒸馏方案,具体的内容可以参考[知识蒸馏章节](../algorithm_introduction/knowledge_distillation.md), 本小节将尝试使用知识蒸馏技术对 MobileNetV3_large_x1_0 模型进行训练,使用 `2.1.2 小节` 训练得到的 ResNet50_vd 模型作为蒸馏所用的教师模型,首先将 `2.1.2 小节` 训练得到的 ResNet50_vd 模型保存到指定目录,脚本如下。
```shell ```shell
mkdir pretrained mkdir pretrained
cp -r output_CIFAR/ResNet50_vd/best_model.pdparams ./pretrained/ cp -r output_CIFAR/ResNet50_vd/best_model.pdparams ./pretrained/
``` ```
配置文件中模型名字、教师模型哈学生模型的配置、预训练地址配置以及freeze_params配置如下,其中freeze_params_list中的两个值分别代表教师模型和学生模型是否冻结参数训练。 配置文件中模型名字、教师模型和学生模型的配置、预训练地址配置以及 freeze_params 配置如下,其中 `freeze_params_list` 中的两个值分别代表教师模型和学生模型是否冻结参数训练。
```yaml ```yaml
Arch: Arch:
...@@ -152,7 +188,8 @@ Arch: ...@@ -152,7 +188,8 @@ Arch:
pretrained: True pretrained: True
``` ```
Loss配置如下,其中训练Loss是学生模型的输出和教师模型的输出的交叉熵、验证Loss是学生模型的输出和真实标签的交叉熵。 Loss 配置如下,其中训练 Loss 是学生模型的输出和教师模型的输出的交叉熵、验证 Loss 是学生模型的输出和真实标签的交叉熵。
```yaml ```yaml
Loss: Loss:
Train: Train:
...@@ -178,19 +215,23 @@ python3 -m paddle.distributed.launch \ ...@@ -178,19 +215,23 @@ python3 -m paddle.distributed.launch \
``` ```
最终CIFAR100验证集上的精度为64.4\%,使用教师模型进行知识蒸馏,MobileNetV3的精度涨幅4.3\% 最终 CIFAR100 验证集上的精度为 64.4%,使用教师模型进行知识蒸馏,MobileNetV3 的精度涨幅 4.3%。
* **注意** * **注意**
* 蒸馏过程中,教师模型使用的预训练模型为CIFAR100数据集上的训练结果,学生模型使用的是ImageNet1k数据集上精度为75.32\%的MobileNetV3_large_x1_0预训练模型。 * 蒸馏过程中,教师模型使用的预训练模型为 CIFAR100 数据集上的训练结果,学生模型使用的是 ImageNet1k 数据集上精度为 75.32% 的 MobileNetV3_large_x1_0 预训练模型。
* 该蒸馏过程无须使用真实标签,所以可以使用更多的无标签数据,在使用过程中,可以将无标签数据生成假的 `train_list.txt`,然后与真实的 `train_list.txt` 进行合并, 用户可以根据自己的数据自行体验。
* 该蒸馏过程无须使用真实标签,所以可以使用更多的无标签数据,在使用过程中,可以将无标签数据生成假的train_list.txt,然后与真实的train_list.txt进行合并, 用户可以根据自己的数据自行体验。 <a name="5"></a>
## 5. 模型评估与推理
## 五、模型评估与推理 <a name="5.1"></a>
### 5.1 单标签分类模型评估与推理 ### 5.1 单标签分类模型评估与推理
<a name="5.1.1"></a>
#### 5.1.1 单标签分类模型评估。 #### 5.1.1 单标签分类模型评估。
训练好模型之后,可以通过以下命令实现对模型精度的评估。 训练好模型之后,可以通过以下命令实现对模型精度的评估。
...@@ -201,6 +242,8 @@ python3 tools/eval.py \ ...@@ -201,6 +242,8 @@ python3 tools/eval.py \
-o Global.pretrained_model="output_CIFAR/ResNet50_vd/best_model" -o Global.pretrained_model="output_CIFAR/ResNet50_vd/best_model"
``` ```
<a name="5.1.2"></a>
#### 5.1.2 单标签分类模型预测 #### 5.1.2 单标签分类模型预测
模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测: 模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测:
...@@ -212,10 +255,11 @@ python3 tools/infer.py \ ...@@ -212,10 +255,11 @@ python3 tools/infer.py \
-o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model -o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model
``` ```
<a name="5.1.3"></a>
#### 5.1.3 单标签分类使用inference模型进行模型推理 #### 5.1.3 单标签分类使用 inference 模型进行模型推理
通过导出inference模型,PaddlePaddle支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理: 通过导出 inference 模型,PaddlePaddle 支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理:
首先,对训练好的模型进行转换: 首先,对训练好的模型进行转换:
```bash ```bash
...@@ -224,16 +268,17 @@ python3 tools/export_model.py \ ...@@ -224,16 +268,17 @@ python3 tools/export_model.py \
-o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model -o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model
``` ```
* 默认会在`inference`文件夹下生成`inference.pdiparams``inference.pdmodel``inference.pdiparams.info`文件。 * 默认会在 `inference` 文件夹下生成 `inference.pdiparams``inference.pdmodel``inference.pdiparams.info` 文件。
使用预测引擎进行推理: 使用预测引擎进行推理:
进入deploy目录下: 进入 deploy 目录下:
```bash ```bash
cd deploy cd deploy
``` ```
更改inference_cls.yaml文件,由于训练CIFAR100采用的分辨率是32x32,所以需要改变相关的分辨率,最终配置文件中的图像预处理如下:
更改 `inference_cls.yaml` 文件,由于训练 CIFAR100 采用的分辨率是 32x32,所以需要改变相关的分辨率,最终配置文件中的图像预处理如下:
```yaml ```yaml
PreProcess: PreProcess:
...@@ -250,7 +295,7 @@ PreProcess: ...@@ -250,7 +295,7 @@ PreProcess:
- ToCHWImage: - ToCHWImage:
``` ```
执行命令进行预测,由于默认class_id_map_file是ImageNet数据集的映射文件,所以此处需要置None。 执行命令进行预测,由于默认 `class_id_map_file` 是 ImageNet 数据集的映射文件,所以此处需要置 None。
```bash ```bash
python3 python/predict_cls.py \ python3 python/predict_cls.py \
......
# 多标签分类quick start # 多标签分类 quick start
基于[NUS-WIDE-SCENE](https://lms.comp.nus.edu.sg/wp-content/uploads/2019/research/nuswide/NUS-WIDE.html)数据集,体验多标签分类的训练、评估、预测的过程,该数据集是NUS-WIDE数据集的一个子集。请首先安装PaddlePaddle和PaddleClas,具体安装步骤可详看[Paddle 安装文档](../installation/install_paddle.md)[PaddleClas 安装文档](../installation/install_paddleclas.md) 基于 [NUS-WIDE-SCENE](https://lms.comp.nus.edu.sg/wp-content/uploads/2019/research/nuswide/NUS-WIDE.html) 数据集,体验多标签分类的训练、评估、预测的过程,该数据集是 NUS-WIDE 数据集的一个子集。请首先安装 PaddlePaddle 和 PaddleClas,具体安装步骤可详看 [Paddle 安装文档](../installation/install_paddle.md)[PaddleClas 安装文档](../installation/install_paddleclas.md)
## 目录 ## 目录
* [数据和模型准备](#1) * [1. 数据和模型准备](#1)
* [模型训练](#2) * [2. 模型训练](#2)
* [模型评估](#3) * [3. 模型评估](#3)
* [模型预测](#4) * [4. 模型预测](#4)
* [基于预测引擎预测](#5) * [5. 基于预测引擎预测](#5)
* [5.1 导出inference model](#5.1) * [5.1 导出 inference model](#5.1)
* [5.2 基于预测引擎预测](#5.2) * [5.2 基于预测引擎预测](#5.2)
<a name="1"></a> <a name="1"></a>
## 一、数据和模型准备 ## 1. 数据和模型准备
* 进入PaddleClas目录。 * 进入 `PaddleClas` 目录。
``` ```
cd path_to_PaddleClas cd path_to_PaddleClas
``` ```
* 创建并进入`dataset/NUS-WIDE-SCENE`目录,下载并解压NUS-WIDE-SCENE数据集。 * 创建并进入 `dataset/NUS-WIDE-SCENE` 目录,下载并解压 NUS-WIDE-SCENE 数据集。
```shell ```shell
mkdir dataset/NUS-WIDE-SCENE mkdir dataset/NUS-WIDE-SCENE
...@@ -31,14 +31,14 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/data/NUS-SCENE-dataset.ta ...@@ -31,14 +31,14 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/data/NUS-SCENE-dataset.ta
tar -xf NUS-SCENE-dataset.tar tar -xf NUS-SCENE-dataset.tar
``` ```
* 返回`PaddleClas`根目录 * 返回 `PaddleClas` 根目录
``` ```
cd ../../ cd ../../
``` ```
<a name="2"></a> <a name="2"></a>
## 二、模型训练 ## 2. 模型训练
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -48,10 +48,11 @@ python3 -m paddle.distributed.launch \ ...@@ -48,10 +48,11 @@ python3 -m paddle.distributed.launch \
-c ./ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml -c ./ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml
``` ```
训练10epoch之后,验证集最好的正确率应该在0.95左右。 训练 10 epoch 之后,验证集最好的正确率应该在 0.95 左右。
<a name="3"></a> <a name="3"></a>
## 三、模型评估
## 3. 模型评估
```bash ```bash
python3 tools/eval.py \ python3 tools/eval.py \
...@@ -60,7 +61,7 @@ python3 tools/eval.py \ ...@@ -60,7 +61,7 @@ python3 tools/eval.py \
``` ```
<a name="4"></a> <a name="4"></a>
## 四、模型预测 ## 4. 模型预测
```bash ```bash
python3 tools/infer.py \ python3 tools/infer.py \
...@@ -74,22 +75,22 @@ python3 tools/infer.py \ ...@@ -74,22 +75,22 @@ python3 tools/infer.py \
``` ```
<a name="5"></a> <a name="5"></a>
## 五、基于预测引擎预测 ## 5. 基于预测引擎预测
<a name="5.1"></a> <a name="5.1"></a>
### 5.1 导出inference model ### 5.1 导出 inference model
```bash ```bash
python3 tools/export_model.py \ python3 tools/export_model.py \
-c ./ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml \ -c ./ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml \
-o Arch.pretrained="./output/MobileNetV1/best_model" -o Arch.pretrained="./output/MobileNetV1/best_model"
``` ```
inference model的路径默认在当前路径下`./inference` inference model 的路径默认在当前路径下 `./inference`
<a name="5.2"></a> <a name="5.2"></a>
### 5.2 基于预测引擎预测 ### 5.2 基于预测引擎预测
首先进入deploy目录下: 首先进入 `deploy` 目录下:
```bash ```bash
cd ./deploy cd ./deploy
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* [1. 环境配置](#环境配置) * [1. 环境配置](#环境配置)
* [2. 图像识别体验](#图像识别体验) * [2. 图像识别体验](#图像识别体验)
* [2.1 下载、解压inference 模型与demo数据](#2.1) * [2.1 下载、解压 inference 模型与 demo 数据](#2.1)
* [2.2 瓶装饮料识别与检索](#瓶装饮料识别与检索) * [2.2 瓶装饮料识别与检索](#瓶装饮料识别与检索)
* [2.2.1 识别单张图像](#识别单张图像) * [2.2.1 识别单张图像](#识别单张图像)
* [2.2.2 基于文件夹的批量识别](#基于文件夹的批量识别) * [2.2.2 基于文件夹的批量识别](#基于文件夹的批量识别)
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
## 1. 环境配置 ## 1. 环境配置
* 安装:请先参考[Paddle安装教程](../installation/install_paddle.md) 以及 [PaddleClas安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。 * 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
* 进入 `deploy` 运行目录。本部分所有内容与命令均需要在 `deploy` 目录下运行,可以通过下面的命令进入 `deploy` 目录。 * 进入 `deploy` 运行目录。本部分所有内容与命令均需要在 `deploy` 目录下运行,可以通过下面的命令进入 `deploy` 目录。
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
<a name="轻量级通用主体检测模型与轻量级通用识别模型"></a> <a name="轻量级通用主体检测模型与轻量级通用识别模型"></a>
| 模型简介 | 推荐场景 | inference模型 | 预测配置文件 | 构建索引库的配置文件 | | 模型简介 | 推荐场景 | inference 模型 | 预测配置文件 | 构建索引库的配置文件 |
| ------------ | ------------- | -------- | ------- | -------- | | ------------ | ------------- | -------- | ------- | -------- |
| 轻量级通用主体检测模型 | 通用场景 |[tar 格式文件下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.tar) [zip 格式文件下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.zip) | - | - | | 轻量级通用主体检测模型 | 通用场景 |[tar 格式文件下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.tar) [zip 格式文件下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.zip) | - | - |
| 轻量级通用识别模型 | 通用场景 | [tar 格式下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/general_PPLCNet_x2_5_lite_v1.0_infer.tar) [zip 格式文件下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/general_PPLCNet_x2_5_lite_v1.0_infer.zip) | [inference_general.yaml](../../../deploy/configs/inference_general.yaml) | [build_general.yaml](../../../deploy/configs/build_general.yaml) | | 轻量级通用识别模型 | 通用场景 | [tar 格式下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/general_PPLCNet_x2_5_lite_v1.0_infer.tar) [zip 格式文件下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/general_PPLCNet_x2_5_lite_v1.0_infer.zip) | [inference_general.yaml](../../../deploy/configs/inference_general.yaml) | [build_general.yaml](../../../deploy/configs/build_general.yaml) |
...@@ -52,17 +52,17 @@ ...@@ -52,17 +52,17 @@
**注意** **注意**
1. windows 环境下如果没有安装 wget , 可以按照下面的步骤安装 wget 与 tar 命令,也可以在下载模型时将链接复制到浏览器中下载,并解压放置在相应目录下; linux 或者 macOS 用户可以右键点击,然后复制下载链接,即可通过 `wget` 命令下载。 1. windows 环境下如果没有安装 wget, 可以按照下面的步骤安装 wget 与 tar 命令,也可以在下载模型时将链接复制到浏览器中下载,并解压放置在相应目录下; linux 或者 macOS 用户可以右键点击,然后复制下载链接,即可通过 `wget` 命令下载。
2. 如果 macOS 环境下没有安装 `wget` 命令,可以运行下面的命令进行安装。 2. 如果 macOS 环境下没有安装 `wget` 命令,可以运行下面的命令进行安装。
```shell ```shell
# 安装 homebrew # 安装 homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"; ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)";
# 安装wget # 安装 wget
brew install wget brew install wget
``` ```
4. 如果希望在 windows 环境下安装 wget ,可以参考:[链接](https://www.cnblogs.com/jeshy/p/10518062.html);如果希望在 windows 环境中安装 tar 命令,可以参考:[链接](https://www.cnblogs.com/chooperman/p/14190107.html) 4. 如果希望在 windows 环境下安装 wget,可以参考:[链接](https://www.cnblogs.com/jeshy/p/10518062.html);如果希望在 windows 环境中安装 tar 命令,可以参考:[链接](https://www.cnblogs.com/chooperman/p/14190107.html)
* 可以按照下面的命令下载并解压数据与模型 * 可以按照下面的命令下载并解压数据与模型
...@@ -70,11 +70,11 @@ brew install wget ...@@ -70,11 +70,11 @@ brew install wget
```shell ```shell
mkdir models mkdir models
cd models cd models
# 下载识别inference模型并解压 # 下载识别 inference 模型并解压
wget {模型下载链接地址} && tar -xf {压缩包的名称} wget {模型下载链接地址} && tar -xf {压缩包的名称}
cd .. cd ..
# 下载demo数据并解压 # 下载 demo 数据并解压
wget {数据下载链接地址} && tar -xf {压缩包的名称} wget {数据下载链接地址} && tar -xf {压缩包的名称}
``` ```
...@@ -107,7 +107,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_da ...@@ -107,7 +107,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_da
├── ... ├── ...
``` ```
其中 `gallery` 文件夹中存放的是用于构建索引库的原始图像,`index` 表示基于原始图像构建得到的索引库信息, `test_images` 文件夹中存放的是用于测试识别效果的图像列表。 其中 `gallery` 文件夹中存放的是用于构建索引库的原始图像,`index` 表示基于原始图像构建得到的索引库信息,`test_images` 文件夹中存放的是用于测试识别效果的图像列表。
`models` 文件夹下应有如下文件结构: `models` 文件夹下应有如下文件结构:
...@@ -125,7 +125,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_da ...@@ -125,7 +125,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_da
**注意** **注意**
如果使用服务端通用识别模型, Demo 数据需要重新提取特征、够建索引,方式如下: 如果使用服务端通用识别模型,Demo 数据需要重新提取特征、够建索引,方式如下:
```shell ```shell
# 下面是使用下载的服务端商品识别模型进行索引库构建 # 下面是使用下载的服务端商品识别模型进行索引库构建
...@@ -144,7 +144,7 @@ python3.7 python/build_gallery.py -c configs/build_general.yaml -o Global.rec_in ...@@ -144,7 +144,7 @@ python3.7 python/build_gallery.py -c configs/build_general.yaml -o Global.rec_in
pip install faiss-cpu==1.7.1post2 pip install faiss-cpu==1.7.1post2
``` ```
若使用时,不能正常引用,则 `uninstall` 之后,重新 `install` ,尤其是 windows 下。 若使用时,不能正常引用,则 `uninstall` 之后,重新 `install`,尤其是 windows 下。
<a name="识别单张图像"></a> <a name="识别单张图像"></a>
...@@ -153,9 +153,9 @@ pip install faiss-cpu==1.7.1post2 ...@@ -153,9 +153,9 @@ pip install faiss-cpu==1.7.1post2
运行下面的命令,对图像 `./drink_dataset_v1.0/test_images/nongfu_spring.jpeg` 进行识别与检索 运行下面的命令,对图像 `./drink_dataset_v1.0/test_images/nongfu_spring.jpeg` 进行识别与检索
```shell ```shell
# 使用下面的命令使用GPU进行预测 # 使用下面的命令使用 GPU 进行预测
python3.7 python/predict_system.py -c configs/inference_general.yaml python3.7 python/predict_system.py -c configs/inference_general.yaml
# 使用下面的命令使用CPU进行预测 # 使用下面的命令使用 CPU 进行预测
python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.use_gpu=False python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.use_gpu=False
``` ```
...@@ -172,9 +172,9 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.u ...@@ -172,9 +172,9 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.u
[{'bbox': [244, 49, 509, 964], 'rec_docs': '农夫山泉-饮用天然水', 'rec_scores': 0.7585664}] [{'bbox': [244, 49, 509, 964], 'rec_docs': '农夫山泉-饮用天然水', 'rec_scores': 0.7585664}]
``` ```
其中bbox表示检测出的主体所在位置,rec_docs表示索引库中与检测框最为相似的类别,rec_scores表示对应的置信度。 其中 `bbox` 表示检测出的主体所在位置,`rec_docs` 表示索引库中与检测框最为相似的类别,`rec_scores` 表示对应的置信度。
检测的可视化结果也保存在`output`文件夹下,对于本张图像,识别结果可视化如下所示。 检测的可视化结果也保存在 `output` 文件夹下,对于本张图像,识别结果可视化如下所示。
<div align="center"> <div align="center">
<img src="../../images/recognition/drink_data_demo/output/nongfu_spring.jpeg" width = "400" /> <img src="../../images/recognition/drink_data_demo/output/nongfu_spring.jpeg" width = "400" />
...@@ -187,7 +187,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.u ...@@ -187,7 +187,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.u
如果希望预测文件夹内的图像,可以直接修改配置文件中的 `Global.infer_imgs` 字段,也可以通过下面的 `-o` 参数修改对应的配置。 如果希望预测文件夹内的图像,可以直接修改配置文件中的 `Global.infer_imgs` 字段,也可以通过下面的 `-o` 参数修改对应的配置。
```shell ```shell
# 使用下面的命令使用GPU进行预测,如果希望使用CPU预测,可以在命令后面添加 -o Global.use_gpu=False # 使用下面的命令使用 GPU 进行预测,如果希望使用 CPU 预测,可以在命令后面添加 -o Global.use_gpu=False
python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.infer_imgs="./drink_dataset_v1.0/test_images/" python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.infer_imgs="./drink_dataset_v1.0/test_images/"
``` ```
...@@ -209,7 +209,7 @@ Inference: 150.06470680236816 ms per batch image ...@@ -209,7 +209,7 @@ Inference: 150.06470680236816 ms per batch image
... ...
``` ```
所有图像的识别结果可视化图像也保存在 `output`文件夹内。 所有图像的识别结果可视化图像也保存在 `output` 文件夹内。
更多地,可以通过修改 `Global.rec_inference_model_dir` 字段来更改识别 inference 模型的路径,通过修改 `IndexProcess.index_dir` 字段来更改索引库索引的路径。 更多地,可以通过修改 `Global.rec_inference_model_dir` 字段来更改识别 inference 模型的路径,通过修改 `IndexProcess.index_dir` 字段来更改索引库索引的路径。
...@@ -247,7 +247,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.i ...@@ -247,7 +247,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.i
然后需要编辑记录了图像路径和标签信息的文本文件,这里 PaddleClas 将更正后的标签信息文件放在了 `drink_dataset_v1.0/gallery/drink_label_all.txt` 文件中。可以与默认的 `drink_dataset_v1.0/gallery/drink_label.txt` 标签文件进行对比,添加了光明和三元系列牛奶的索引图像。 然后需要编辑记录了图像路径和标签信息的文本文件,这里 PaddleClas 将更正后的标签信息文件放在了 `drink_dataset_v1.0/gallery/drink_label_all.txt` 文件中。可以与默认的 `drink_dataset_v1.0/gallery/drink_label.txt` 标签文件进行对比,添加了光明和三元系列牛奶的索引图像。
每一行的文本中,第一个字段表示图像的相对路径,第二个字段表示图像对应的标签信息,中间用 `\t` 键分隔开(注意:有些编辑器会将 `tab` 自动转换为 `空格` ,这种情况下会导致文件解析报错)。 每一行的文本中,第一个字段表示图像的相对路径,第二个字段表示图像对应的标签信息,中间用 `\t` 键分隔开(注意:有些编辑器会将 `tab` 自动转换为 `空格`,这种情况下会导致文件解析报错)。
<a name="建立新的索引库"></a> <a name="建立新的索引库"></a>
...@@ -259,7 +259,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.i ...@@ -259,7 +259,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.i
python3.7 python/build_gallery.py -c configs/build_general.yaml -o IndexProcess.data_file="./drink_dataset_v1.0/gallery/drink_label_all.txt" -o IndexProcess.index_dir="./drink_dataset_v1.0/index_all" python3.7 python/build_gallery.py -c configs/build_general.yaml -o IndexProcess.data_file="./drink_dataset_v1.0/gallery/drink_label_all.txt" -o IndexProcess.index_dir="./drink_dataset_v1.0/index_all"
``` ```
最终新的索引信息保存在文件夹 `./drink_dataset_v1.0/index_all` 中。 最终新的索引信息保存在文件夹 `./drink_dataset_v1.0/index_all` 中。具体 `yaml` 请参考[向量检索文档](../image_recognition_pipeline/vector_search.md)
<a name="基于新的索引库的图像识别"></a> <a name="基于新的索引库的图像识别"></a>
...@@ -290,14 +290,14 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.i ...@@ -290,14 +290,14 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.i
目前,我们更推荐您使用[轻量级通用主体检测模型与轻量级通用识别模型](#轻量级通用主体检测模型与轻量级通用识别模型),以获得更好的测试结果。但是如果您希望体验服务端识别模型,服务器端通用主体检测模型与各方向识别模型、测试数据下载地址以及对应的配置文件地址如下。 目前,我们更推荐您使用[轻量级通用主体检测模型与轻量级通用识别模型](#轻量级通用主体检测模型与轻量级通用识别模型),以获得更好的测试结果。但是如果您希望体验服务端识别模型,服务器端通用主体检测模型与各方向识别模型、测试数据下载地址以及对应的配置文件地址如下。
| 模型简介 | 推荐场景 | inference模型 | 预测配置文件 | 构建索引库的配置文件 | | 模型简介 | 推荐场景 | inference 模型 | 预测配置文件 | 构建索引库的配置文件 |
| ------------ | ------------- | -------- | ------- | -------- | | ------------ | ------------- | -------- | ------- | -------- |
| 通用主体检测模型 | 通用场景 |[模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar) | - | - | | 通用主体检测模型 | 通用场景 |[模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar) | - | - |
| Logo 识别模型 | Logo场景 | [模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/logo_rec_ResNet50_Logo3K_v1.0_infer.tar) | [inference_logo.yaml](../../../deploy/configs/inference_logo.yaml) | [build_logo.yaml](../../../deploy/configs/build_logo.yaml) | | Logo 识别模型 | Logo 场景 | [模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/logo_rec_ResNet50_Logo3K_v1.0_infer.tar) | [inference_logo.yaml](../../../deploy/configs/inference_logo.yaml) | [build_logo.yaml](../../../deploy/configs/build_logo.yaml) |
| 动漫人物识别模型 | 动漫人物场景 | [模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/cartoon_rec_ResNet50_iCartoon_v1.0_infer.tar) | [inference_cartoon.yaml](../../../deploy/configs/inference_cartoon.yaml) | [build_cartoon.yaml](../../../deploy/configs/build_cartoon.yaml) | | 动漫人物识别模型 | 动漫人物场景 | [模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/cartoon_rec_ResNet50_iCartoon_v1.0_infer.tar) | [inference_cartoon.yaml](../../../deploy/configs/inference_cartoon.yaml) | [build_cartoon.yaml](../../../deploy/configs/build_cartoon.yaml) |
| 车辆细分类模型 | 车辆场景 | [模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/vehicle_cls_ResNet50_CompCars_v1.0_infer.tar) | [inference_vehicle.yaml](../../../deploy/configs/inference_vehicle.yaml) | [build_vehicle.yaml](../../../deploy/configs/build_vehicle.yaml) | | 车辆细分类模型 | 车辆场景 | [模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/vehicle_cls_ResNet50_CompCars_v1.0_infer.tar) | [inference_vehicle.yaml](../../../deploy/configs/inference_vehicle.yaml) | [build_vehicle.yaml](../../../deploy/configs/build_vehicle.yaml) |
| 商品识别模型 | 商品场景 | [模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/product_ResNet50_vd_aliproduct_v1.0_infer.tar) | [inference_product.yaml](../../../deploy/configs/inference_product.yaml) | [build_product.yaml](../../../deploy/configs/build_product.yaml) | | 商品识别模型 | 商品场景 | [模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/product_ResNet50_vd_aliproduct_v1.0_infer.tar) | [inference_product.yaml](../../../deploy/configs/inference_product.yaml) | [build_product.yaml](../../../deploy/configs/build_product.yaml) |
| 车辆ReID模型 | 车辆ReID场景 | [模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/vehicle_reid_ResNet50_VERIWild_v1.0_infer.tar) | - | - | | 车辆 ReID 模型 | 车辆 ReID 场景 | [模型下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/vehicle_reid_ResNet50_VERIWild_v1.0_infer.tar) | - | - |
```shell ```shell
cd PaddleClas/deploy/ cd PaddleClas/deploy/
...@@ -315,7 +315,7 @@ wget {识别模型下载链接地址} && tar -xf {压缩包的名称} ...@@ -315,7 +315,7 @@ wget {识别模型下载链接地址} && tar -xf {压缩包的名称}
使用如下命令下载各方向识别模型的测试数据: 使用如下命令下载各方向识别模型的测试数据:
```shell ```shell
# 回到deploy目录下 # 回到 deploy 目录下
cd .. cd ..
# 下载测试数据并解压 # 下载测试数据并解压
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_en_v1.1.tar && tar -xf recognition_demo_data_en_v1.1.tar wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_en_v1.1.tar && tar -xf recognition_demo_data_en_v1.1.tar
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册