提交 6e0aa193 编写于 作者: H HydrogenSulfate

update related docs and yamls for PP-ShiTuV2

上级 6cd62518
...@@ -22,7 +22,7 @@ PreProcess: ...@@ -22,7 +22,7 @@ PreProcess:
scale: 0.00392157 scale: 0.00392157
mean: [0.485, 0.456, 0.406] mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225] std: [0.229, 0.224, 0.225]
order: '' order: ""
channel_num: 3 channel_num: 3
- ToCHWImage: - ToCHWImage:
......
...@@ -43,7 +43,7 @@ RecPreProcess: ...@@ -43,7 +43,7 @@ RecPreProcess:
scale: 0.00392157 scale: 0.00392157
mean: [0.485, 0.456, 0.406] mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225] std: [0.229, 0.224, 0.225]
order: '' order: ""
- ToCHWImage: - ToCHWImage:
RecPostProcess: null RecPostProcess: null
......
...@@ -43,7 +43,7 @@ RecPreProcess: ...@@ -43,7 +43,7 @@ RecPreProcess:
scale: 0.00392157 scale: 0.00392157
mean: [0.485, 0.456, 0.406] mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225] std: [0.229, 0.224, 0.225]
order: '' order: ""
- ToCHWImage: - ToCHWImage:
RecPostProcess: null RecPostProcess: null
......
...@@ -22,7 +22,7 @@ RecPreProcess: ...@@ -22,7 +22,7 @@ RecPreProcess:
scale: 0.00392157 scale: 0.00392157
mean: [0.485, 0.456, 0.406] mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225] std: [0.229, 0.224, 0.225]
order: '' order: ""
- ToCHWImage: - ToCHWImage:
RecPostProcess: null RecPostProcess: null
...@@ -6,11 +6,19 @@ ...@@ -6,11 +6,19 @@
- [1. 摘要](#1-摘要) - [1. 摘要](#1-摘要)
- [2. 介绍](#2-介绍) - [2. 介绍](#2-介绍)
- [3. 方法](#3-方法) - [3. 方法](#3-方法)
- [3.1 Backbone](#31-backbone) - [3.1 PP-ShiTuV1](#31-pp-shituv1)
- [3.2 Neck](#32-neck) - [3.1.1 Backbone](#311-backbone)
- [3.3 Head](#33-head) - [3.1.2 Neck](#312-neck)
- [3.4 Loss](#34-loss) - [3.1.3 Head](#313-head)
- [3.1.4 Loss](#314-loss)
- [3.2 PP-ShiTuV2](#32-pp-shituv2)
- [3.2.1 Backbone](#321-backbone)
- [3.2.2 Neck](#322-neck)
- [3.2.3 Head](#323-head)
- [3.2.4 Loss](#324-loss)
- [4. 实验部分](#4-实验部分) - [4. 实验部分](#4-实验部分)
- [4.1 PP-ShiTuV1](#41-pp-shituv1)
- [4.2 PP-ShiTuV2](#42-pp-shituv2)
- [5. 自定义特征提取](#5-自定义特征提取) - [5. 自定义特征提取](#5-自定义特征提取)
- [5.1 数据准备](#51-数据准备) - [5.1 数据准备](#51-数据准备)
- [5.2 模型训练](#52-模型训练) - [5.2 模型训练](#52-模型训练)
...@@ -37,37 +45,59 @@ ...@@ -37,37 +45,59 @@
- **Backbone**: 用于提取输入图像初步特征的骨干网络,一般由配置文件中的 [`Backbone`](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml#L26-L29) 以及 [`BackboneStopLayer`](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml#L30-L31) 字段共同指定。 - **Backbone**: 用于提取输入图像初步特征的骨干网络,一般由配置文件中的 [`Backbone`](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml#L26-L29) 以及 [`BackboneStopLayer`](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml#L30-L31) 字段共同指定。
- **Neck**: 用以特征增强及特征维度变换。可以是一个简单的 FC Layer,用来做特征维度变换;也可以是较复杂的 FPN 结构,用以做特征增强,一般由配置文件中的 [`Neck`](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml#L32-L35)字段指定。 - **Neck**: 用以特征增强及特征维度变换。可以是一个简单的 FC Layer,用来做特征维度变换;也可以是较复杂的 FPN 结构,用以做特征增强,一般由配置文件中的 [`Neck`](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml#L32-L35)字段指定。
- **Head**: 用来将 feature 转化为 logits,让模型在训练阶段能以分类任务的形式进行训练。除了常用的 FC Layer 外,还可以替换为 cosmargin, arcmargin, circlemargin 等模块,一般由配置文件中的 [`Head`](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml#L36-L41)字段指定。 - **Head**: 用来将 `Neck` 的输出 feature 转化为 logits,让模型在训练阶段能以分类任务的形式进行训练。除了常用的 FC Layer 外,还可以替换为 [CosMargin](../../../ppcls/arch/gears/cosmargin.py), [ArcMargin](../../../ppcls/arch/gears/arcmargin.py), [CircleMargin](../../../ppcls/arch/gears/circlemargin.py) 等模块,一般由配置文件中的 [`Head`](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml#L36-L41) 字段指定。
- **Loss**: 指定所使用的 Loss 函数。我们将 Loss 设计为组合 loss 的形式,可以方便地将 Classification Loss 和 Metric learning Loss 组合在一起,一般由配置文件中的 [`Loss`](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml#L44-L50)字段指定。 - **Loss**: 指定所使用的 Loss 函数。我们将 Loss 设计为组合 loss 的形式,可以方便地将 Classification Loss 和 Metric learning Loss 组合在一起,一般由配置文件中的 [`Loss`](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml#L44-L50) 字段指定。
<a name="3"></a> <a name="3"></a>
## 3. 方法 ## 3. 方法
### 3.1 Backbone ### 3.1 PP-ShiTuV1
#### 3.1.1 Backbone
Backbone 部分采用了 [PP_LCNet_x2_5](../models/PP-LCNet.md),其针对Intel CPU端的性能优化探索了多个有效的结构设计方案,最终实现了在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的 SOTA 模型。 Backbone 部分采用了 [PP_LCNet_x2_5](../models/PP-LCNet.md),其针对Intel CPU端的性能优化探索了多个有效的结构设计方案,最终实现了在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的 SOTA 模型。
### 3.2 Neck #### 3.1.2 Neck
Neck 部分采用了 [FC Layer](../../../ppcls/arch/gears/fc.py),对 Backbone 抽取得到的特征进行降维,减少了特征存储的成本与计算量。 Neck 部分采用了 [FC Layer](../../../ppcls/arch/gears/fc.py),对 Backbone 抽取得到的特征进行降维,减少了特征存储的成本与计算量。
### 3.3 Head #### 3.1.3 Head
Head 部分选用 [ArcMargin](../../../ppcls/arch/gears/arcmargin.py),在训练时通过指定margin,增大同类特征之间的角度差异再进行分类,进一步提升抽取特征的表征能力。 Head 部分选用 [ArcMargin](../../../ppcls/arch/gears/arcmargin.py),在训练时通过指定margin,增大同类特征之间的角度差异再进行分类,进一步提升抽取特征的表征能力。
### 3.4 Loss #### 3.1.4 Loss
Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py),在训练时以分类任务的损失函数来指导网络进行优化。详细的配置文件见[通用识别配置文件](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml) Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py),在训练时以分类任务的损失函数来指导网络进行优化。详细的配置文件见[通用识别配置文件](../../../ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml)
### 3.2 PP-ShiTuV2
#### 3.2.1 Backbone
Backbone 部分采用了 [PP-LCNetV2_base](../models/PP-LCNetV2.md),其针对Intel CPU端的性能优化探索了多个有效的结构设计方案,最终实现了在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的 SOTA 模型。
#### 3.2.2 Neck
Neck 部分采用了 [BN Neck](../../../ppcls/arch/gears/bnneck.py),对 Backbone 抽取得到的特征的每个维度进行标准化操作,减少了同时优化度量学习损失和分类损失的难度。
#### 3.2.3 Head
Head 部分选用 [FC Layer](../../../ppcls/arch/gears/fc.py),使用分类头将 feature 转换成 logits 供后续计算分类损失。
#### 3.2.4 Loss
Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py)[TripletAngularMarginLoss](../../../ppcls/loss/tripletangularmarginloss.py),在训练时以分类损失和基于角度的三元组损失来指导网络进行优化。详细的配置文件见[GeneralRecognitionV2_PPLCNetV2_base.yaml](../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L63-77)
<a name="4"></a> <a name="4"></a>
## 4. 实验部分 ## 4. 实验部分
### 4.1 PP-ShiTuV1
训练数据为如下 7 个公开数据集的汇总: 训练数据为如下 7 个公开数据集的汇总:
| 数据集 | 数据量 | 类别数 | 场景 | 数据集地址 | | 数据集 | 数据量 | 类别数 | 场景 | 数据集地址 |
| :----------: | :-----: | :------: | :------: | :--------------------------------------------------------------------------: | | :----------- | :-----: | :------: | :------: | :--------------------------------------------------------------------------: |
| Aliproduct | 2498771 | 50030 | 商品 | [地址](https://retailvisionworkshop.github.io/recognition_challenge_2020/) | | Aliproduct | 2498771 | 50030 | 商品 | [地址](https://retailvisionworkshop.github.io/recognition_challenge_2020/) |
| GLDv2 | 1580470 | 81313 | 地标 | [地址](https://github.com/cvdfoundation/google-landmark) | | GLDv2 | 1580470 | 81313 | 地标 | [地址](https://github.com/cvdfoundation/google-landmark) |
| VeRI-Wild | 277797 | 30671 | 车辆 | [地址](https://github.com/PKU-IMRE/VERI-Wild) | | VeRI-Wild | 277797 | 30671 | 车辆 | [地址](https://github.com/PKU-IMRE/VERI-Wild) |
...@@ -75,9 +105,9 @@ Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py),在训 ...@@ -75,9 +105,9 @@ Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py),在训
| iCartoonFace | 389678 | 5013 | 动漫人物 | [地址](http://challenge.ai.iqiyi.com/detail?raceId=5def69ace9fcf68aef76a75d) | | iCartoonFace | 389678 | 5013 | 动漫人物 | [地址](http://challenge.ai.iqiyi.com/detail?raceId=5def69ace9fcf68aef76a75d) |
| SOP | 59551 | 11318 | 商品 | [地址](https://cvgl.stanford.edu/projects/lifted_struct/) | | SOP | 59551 | 11318 | 商品 | [地址](https://cvgl.stanford.edu/projects/lifted_struct/) |
| Inshop | 25882 | 3997 | 商品 | [地址](http://mmlab.ie.cuhk.edu.hk/projects/DeepFashion.html) | | Inshop | 25882 | 3997 | 商品 | [地址](http://mmlab.ie.cuhk.edu.hk/projects/DeepFashion.html) |
| **Total** | **5M** | **185K** | ---- | ---- | | **Total** | **5M** | **185K** | - | - |
最终的模型效果如下表所示: 最终的模型精度指标如下表所示:
| 模型 | Aliproduct | VeRI-Wild | LogoDet-3K | iCartoonFace | SOP | Inshop | Latency(ms) | | 模型 | Aliproduct | VeRI-Wild | LogoDet-3K | iCartoonFace | SOP | Inshop | Latency(ms) |
| :-----------------------------: | :--------: | :-------: | :--------: | :----------: | :---: | :----: | :---------: | | :-----------------------------: | :--------: | :-------: | :--------: | :----------: | :---: | :----: | :---------: |
...@@ -88,14 +118,49 @@ Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py),在训 ...@@ -88,14 +118,49 @@ Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py),在训
* 速度评测机器的 CPU 具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz` * 速度评测机器的 CPU 具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz`
* 速度指标的评测条件为: 开启 MKLDNN, 线程数设置为 10 * 速度指标的评测条件为: 开启 MKLDNN, 线程数设置为 10
### 4.2 PP-ShiTuV2
训练数据为如下 7 个公开数据集的汇总:
| 数据集 | 数据量 | 类别数 | 场景 | 数据集地址 |
| :--------------------- | :-----: | :------: | :---: | :----------------------------------------------------------------------------------: |
| Aliproduct | 2498771 | 50030 | 商品 | [地址](https://retailvisionworkshop.github.io/recognition_challenge_2020/) |
| GLDv2 | 1580470 | 81313 | 地标 | [地址](https://github.com/cvdfoundation/google-landmark) |
| VeRI-Wild | 277797 | 30671 | 车辆 | [地址](https://github.com/PKU-IMRE/VERI-Wild) |
| LogoDet-3K | 155427 | 3000 | Logo | [地址](https://github.com/Wangjing1551/LogoDet-3K-Dataset) |
| SOP | 59551 | 11318 | 商品 | [地址](https://cvgl.stanford.edu/projects/lifted_struct/) |
| Inshop | 25882 | 3997 | 商品 | [地址](http://mmlab.ie.cuhk.edu.hk/projects/DeepFashion.html) |
| bird400 | 58388 | 400 | 商品 | [地址](https://www.kaggle.com/datasets/gpiosenka/100-bird-species) |
| 104flows | 12753 | 104 | 商品 | [地址](https://www.robots.ox.ac.uk/~vgg/data/flowers/102/) |
| Cars | 58315 | 112 | 商品 | [地址](https://ai.stanford.edu/~jkrause/cars/car_dataset.html) |
| Fashion Product Images | 44441 | 47 | 商品 | [地址](https://www.kaggle.com/datasets/paramaggarwal/fashion-product-images-dataset) |
| flowerrecognition | 24123 | 59 | 商品 | [地址](https://www.kaggle.com/datasets/aymenktari/flowerrecognition) |
| food-101 | 101000 | 101 | 商品 | [地址](https://data.vision.ee.ethz.ch/cvl/datasets_extra/food-101/) |
| fruits-262 | 225639 | 262 | 商品 | [地址](https://www.kaggle.com/datasets/aelchimminut/fruits262) |
| inaturalist | 265213 | 1010 | 商品 | [地址](https://github.com/visipedia/inat_comp/tree/master/2017) |
| indoor-scenes | 15588 | 67 | 商品 | [地址](https://www.kaggle.com/datasets/itsahmad/indoor-scenes-cvpr-2019) |
| Products-10k | 141931 | 9691 | 商品 | [地址](https://products-10k.github.io/) |
| CompCars | 16016 | 431 | 商品 | [地址](http://​​​​​​http://ai.stanford.edu/~jkrause/cars/car_dataset.html​) |
| **Total** | **6M** | **192K** | - | - |
最终的模型精度指标如下表所示:
| 模型 | Aliproduct | VeRI-Wild | LogoDet-3K | SOP | Inshop | imdb_face | iNat | instre | sketch | Latency(ms) |
| :---------------------------------: | :--------: | :-------: | :--------: | :---: | :----: | :-------: | :---: | :----: | :----: | :---------: |
| GeneralRecognitionV2_PPLCNetV2_base | 0.842 | 0.878 | 0.880 | 0.776 | 0.908 | 0.359 | 0.386 | 0.877 | 0.393 | 5.0 |
* 预训练模型地址:[general_PPLCNetV2_base_pretrained_v1.0.pdparams](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/PPShiTuV2/general_PPLCNetV2_base_pretrained_v1.0.pdparams)
* 采用的评测指标为:`Recall@1`
* 速度评测机器的 CPU 具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz`
* 速度指标的评测条件为: 开启 MKLDNN, 线程数设置为 10
<a name="5"></a> <a name="5"></a>
## 5. 自定义特征提取 ## 5. 自定义特征提取
自定义特征提取,是指依据自己的任务,重新训练特征提取模型。 自定义特征提取,是指依据自己的任务,重新训练特征提取模型。
下面基于`GeneralRecognition_PPLCNet_x2_5.yaml`配置文件,介绍主要的四个步骤:1)数据准备;2)模型训练;3)模型评估;4)模型推理 下面基于 `GeneralRecognition_PPLCNet_x2_5.yaml` 配置文件,介绍主要的四个步骤:1)数据准备;2)模型训练;3)模型评估;4)模型推理
<a name="5.1"></a> <a name="5.1"></a>
......
# Python 预测推理 # Python3.7 预测推理
---
首先请参考文档[环境准备](../installation/install_paddleclas.md)配置运行环境。 首先请参考文档[环境准备](../installation/install_paddleclas.md)配置运行环境。
...@@ -13,47 +11,50 @@ ...@@ -13,47 +11,50 @@
- [2.3 PP-ShiTu PipeLine推理](#2.3) - [2.3 PP-ShiTu PipeLine推理](#2.3)
<a name="1"></a> <a name="1"></a>
## 1. 图像分类推理 ## 1. 图像分类推理
首先请参考文档[模型导出](./export_model.md)准备 inference 模型,然后进入 PaddleClas 的 `deploy` 目录下: 首先请参考文档[模型导出](./export_model.md)准备 inference 模型,然后进入 PaddleClas 的 `deploy` 目录下:
```shell ```shell
cd /path/to/PaddleClas/deploy cd PaddleClas/deploy
``` ```
使用以下命令进行预测: 使用以下命令进行预测:
```shell ```shell
python python/predict_cls.py -c configs/inference_cls.yaml python3.7 python/predict_cls.py -c configs/inference_cls.yaml
``` ```
在配置文件 `configs/inference_cls.yaml` 中有以下字段用于配置预测参数: 在配置文件 `configs/inference_cls.yaml` 中有以下字段用于配置预测参数:
* `Global.infer_imgs`:待预测的图片文件路径; * `Global.infer_imgs`:待预测的图片文件(夹)路径;
* `Global.inference_model_dir`:inference 模型文件所在目录,该目录下需要有文件 `inference.pdmodel``inference.pdiparams` 两个文件; * `Global.inference_model_dir`:inference 模型文件所在文件夹的路径,该文件夹下需要有文件 `inference.pdmodel``inference.pdiparams` 两个文件;
* `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`
* `Global.use_tensorrt`:是否使用 TesorRT 预测引擎,默认为 `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 的映射文件,默认为 `../ppcls/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="2"></a> <a name="2"></a>
## 2. PP-ShiTu模型推理 ## 2. PP-ShiTu模型推理
PP-ShiTu整个Pipeline包含三部分:主体检测、特提取模型、特征检索。其中主体检测、特征模型可以单独推理使用。单独主体检测详见[2.1](#2.1),特征提取模型单独推理详见[2.2](#2.2), PP-ShiTu整体推理详见[2.3](#2.3) PP-ShiTu整个Pipeline包含三部分:主体检测、特征提取模型、特征检索。其中主体检测模型、特征提取模型可以单独推理使用。单独使用主体检测详见[主体检测模型推理](#2.1),特征提取模型单独推理详见[特征提取模型推理](#2.2), PP-ShiTu整体推理详见[PP-ShiTu PipeLine推理](#2.3)
<a name="2.1"></a> <a name="2.1"></a>
### 2.1 主体检测模型推理 ### 2.1 主体检测模型推理
进入 PaddleClas 的 `deploy` 目录下: 进入 PaddleClas 的 `deploy` 目录下:
```shell ```shell
cd /path/to/PaddleClas/deploy cd PaddleClas/deploy
``` ```
准备 PaddleClas 提供的主体检测 inference 模型: 准备 PaddleClas 提供的主体检测 inference 模型:
...@@ -61,28 +62,28 @@ cd /path/to/PaddleClas/deploy ...@@ -61,28 +62,28 @@ cd /path/to/PaddleClas/deploy
```shell ```shell
mkdir -p models mkdir -p models
# 下载通用检测 inference 模型并解压 # 下载通用检测 inference 模型并解压
wget -P ./models/ https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar wget -nc -P ./models/ https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar
tar -xf ./models/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar -C ./models/ tar -xf ./models/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar -C ./models/
``` ```
使用以下命令进行预测: 使用以下命令进行预测:
```shell ```shell
python python/predict_det.py -c configs/inference_det.yaml python3.7 python/predict_det.py -c configs/inference_det.yaml
``` ```
在配置文件 `configs/inference_det.yaml` 中有以下字段用于配置预测参数: 在配置文件 `configs/inference_det.yaml` 中有以下字段用于配置预测参数:
* `Global.infer_imgs`:待预测的图片文件路径; * `Global.infer_imgs`:待预测的图片文件路径;
* `Global.use_gpu`: 是否使用 GPU 预测,默认为 `True` * `Global.use_gpu`: 是否使用 GPU 预测,默认为 `True`
<a name="2.2"></a> <a name="2.2"></a>
### 2.2 特征提取模型推理 ### 2.2 特征提取模型推理
下面以商品特征提取为例,介绍特征提取模型推理。首先进入 PaddleClas 的 `deploy` 目录下: 下面以商品图片的特征提取为例,介绍特征提取模型推理。首先进入 PaddleClas 的 `deploy` 目录下:
```shell ```shell
cd /path/to/PaddleClas/deploy cd PaddleClas/deploy
``` ```
准备 PaddleClas 提供的商品特征提取 inference 模型: 准备 PaddleClas 提供的商品特征提取 inference 模型:
...@@ -90,13 +91,24 @@ cd /path/to/PaddleClas/deploy ...@@ -90,13 +91,24 @@ cd /path/to/PaddleClas/deploy
```shell ```shell
mkdir -p models mkdir -p models
# 下载商品特征提取 inference 模型并解压 # 下载商品特征提取 inference 模型并解压
wget -P ./models/ https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/product_ResNet50_vd_aliproduct_v1.0_infer.tar wget -nc -P ./models/ https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/product_ResNet50_vd_aliproduct_v1.0_infer.tar
tar -xf ./models/product_ResNet50_vd_aliproduct_v1.0_infer.tar -C ./models/ tar -xf ./models/product_ResNet50_vd_aliproduct_v1.0_infer.tar -C ./models/
``` ```
使用以下命令进行预测:
```shell
python3.7 python/predict_rec.py -c configs/inference_rec.yaml
```
上述预测命令可以得到一个 512 维的特征向量,直接输出在在命令行中。 上述预测命令可以得到一个 512 维的特征向量,直接输出在在命令行中。
在配置文件 `configs/inference_det.yaml` 中有以下字段用于配置预测参数:
* `Global.infer_imgs`:待预测的图片文件路径;
* `Global.use_gpu`: 是否使用 GPU 预测,默认为 `True`
<a name="2.3"></a> <a name="2.3"></a>
### 2.3. PP-ShiTu PipeLine推理 ### 2.3. PP-ShiTu PipeLine推理
主体检测、特征提取和向量检索的串联预测,可以参考图像识别[快速体验](../quick_start/quick_start_recognition.md) 主体检测、特征提取和向量检索的串联预测,可以参考[图像识别快速开始](../quick_start/quick_start_recognition.md)
# 图像识别 # 图像识别
---
在 PaddleClas 中,图像识别,是指给定一张查询图像,系统能够识别该查询图像类别。广义上,图像分类也是图像识别的一种。但是与普通图像识别不同的是,图像分类只能判别出模型已经学习的类别,如果需要添加新的类别,分类模型只能重新训练。PaddleClas 中的图像识别,**对于陌生类别,只需要更新相应的检索库**,就能够正确的识别出查询图像的类别,而无需重新训练模型,这大大增加了识别系统的可用性,同时降低了更新模型的需求,方便用户部署应用。 在 PaddleClas 中,**图像识别**是指给定一张查询图像,系统能够识别该查询图像类别。广义上,图像分类也是图像识别的一种。但图像分类只能判断模型学习过的类别,如果需要添加新的类别,分类模型只能重新训练,这显然会增加实际应用的成本,限制了应用场景。
因此 PaddleClas 通过主体检测+特征提取+特征检索的方式来实现图像识别,其好处是**对于陌生类别,只需要更新相应的检索库**,就能够正确的识别出查询图像的类别,而无需重新训练模型,这大大增加了识别系统的可用性,同时降低了更新模型的需求,方便用户部署应用。
对于一张待查询图片,PaddleClas 中的图像识别流程主要分为三部分: 对于一张待查询图片,PaddleClas 中的图像识别流程主要分为三部分:
1. 主体检测:对于给定一个查询图像,主体检测器首先检测出图像的物体,从而去掉无用背景信息,提高识别精度。 1. 主体检测:对于一张给定的查询图像,主体检测器检测出图像中的主体候选区域,过滤掉无用的背景信息,提高后续识别精度。
2. 特征提取:对主体检测的各个候选区域,通过特征模型,进行特征提取 2. 特征提取:将主体检测的各个候选区域裁剪出来,输入到通过特征提取模型中进行特征提取。
3. 特征检索:将提取的特征与特征库中的向量进行相似度比对,得到其标签信息 3. 特征检索:将提取的特征与特征库中的向量进行相似度比对,计算其相似度和标签信息。
完整的图像识别系统,如下图所示
<img src="../../images/structure.png"/>
其中特征库,需要利用已经标注好的图像数据集提前建立。完整的图像识别系统,如下图所示 在Android端或PC端体验整体图像识别系统,或查看特征库建立方法,可以参考 [图像识别快速开始文档](../quick_start/quick_start_recognition.md)
![](../../images/structure.jpg) 以下内容,主要对上述三个步骤的训练部分进行介绍。
体验整体图像识别系统,或查看特征库建立方法,详见[图像识别快速开始文档](../quick_start/quick_start_recognition.md)。其中,图像识别快速开始文档主要讲解整体流程的使用过程。以下内容,主要对上述三个步骤的训练部分进行介绍。
首先,请参考[安装指南](../installation/install_paddleclas.md)配置运行环境。 在训练开始之前,请参考 [安装指南](../installation/install_paddleclas.md) 配置运行环境。
## 目录 ## 目录
- [1. 主体检测](#1) - [1. 主体检测](#1-主体检测)
- [2. 特征模型训练](#2) - [2. 特征提取模型训练](#2-特征提取模型训练)
- [2.1. 特征模型数据准备与处理](#2.1) - [2.1 特征提取模型数据的准备与处理](#21-特征提取模型数据的准备与处理)
- [2. 2 特征模型基于单卡 GPU 上的训练与评估](#2.2) - [2.2 特征提取模型在 GPU 上的训练与评估](#22-特征提取模型在-gpu-上的训练与评估)
- [2.2.1 特征模型训练](#2.2.2) - [2.2.1 特征提取模型训练](#221-特征提取模型训练)
- [2.2.2 特征模型恢复训练](#2.2.2) - [2.2.2 特征提取模型恢复训练](#222-特征提取模型恢复训练)
- [2.2.3 特征模型评估](#2.2.3) - [2.2.3 特征提取模型评估](#223-特征提取模型评估)
- [2.3 特征模型导出 inference 模型](#2.3) - [2.3 特征提取模型导出 inference 模型](#23-特征提取模型导出-inference-模型)
- [3. 特征检索](#3) - [3. 特征检索](#3-特征检索)
- [4. 基础知识](#4) - [4. 基础知识](#4-基础知识)
<a name="1"></a> <a name="1"></a>
...@@ -38,142 +43,143 @@ ...@@ -38,142 +43,143 @@
[{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) 关于主体检测数据集构造与模型训练方法可以参考: [30分钟快速上手PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/docs/tutorials/GETTING_STARTED_cn.md#30%E5%88%86%E9%92%9F%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8Bpaddledetection)
更多关于 PaddleClas 中提供的主体检测的模型介绍与下载请参考:[主体检测教程](../image_recognition_pipeline/mainbody_detection.md) 更多关于 PaddleClas 中提供的主体检测的模型介绍与下载请参考:[主体检测教程](../image_recognition_pipeline/mainbody_detection.md)
<a name="2"></a> <a name="2"></a>
## 2. 特征模型训练 ## 2. 特征提取模型训练
为了快速体验 PaddleClas 图像检索模块,以下使用经典的200类鸟类细粒度分类数据集 [CUB_200_2011](http://vision.ucsd.edu/sites/default/files/WelinderEtal10_CUB-200.pdf) 为例,介绍特征提取模型训练过程。CUB_200_2011 下载方式请参考 [CUB_200_2011官网](https://www.vision.caltech.edu/datasets/cub_200_2011/)
<a name="2.1"></a> <a name="2.1"></a>
### 2.1 特征模型数据的准备与处理 ### 2.1 特征提取模型数据的准备与处理
* 进入 `PaddleClas` 目录 * 进入 `PaddleClas` 目录
```bash ```shell
## linux or mac, $path_to_PaddleClas 表示 PaddleClas 的根目录,用户需要根据自己的真实目录修改 cd 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` 目录
```shell ```shell
# linux or mac # 进入dataset目录
cd dataset cd dataset
# 将下载后的数据拷贝到此目录 # 将下载后的数据拷贝到dataset目录下
cp {数据存放的路径}/CUB_200_2011.tgz . 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 CUB_200_2011/train/
│ ├── Black_Footed_Albatross_0001_796111.jpg ├── 1
│ ├── Black_Footed_Albatross_0002_55.jpg │ ├── Black_Footed_Albatross_0001_796111.jpg
│ ├── Black_Footed_Albatross_0002_55.jpg
... ...
├── 10 ├── 10
│ ├── Red_Winged_Blackbird_0001_3695.jpg │ ├── Red_Winged_Blackbird_0001_3695.jpg
│ ├── Red_Winged_Blackbird_0005_5636.jpg │ ├── Red_Winged_Blackbird_0005_5636.jpg
... ...
``` ```
`train_list.txt` 应为:
``` `train_list.txt` 应为:
train/99/Ovenbird_0137_92639.jpg 99 1
train/99/Ovenbird_0136_92859.jpg 99 2
train/99/Ovenbird_0135_93168.jpg 99 3
train/99/Ovenbird_0131_92559.jpg 99 4
train/99/Ovenbird_0130_92452.jpg 99 5
...
```
其中,分隔符为空格" ", 三列数据的含义分别是训练数据的路径、训练数据的 label 信息、训练数据的 unique id。
测试集格式与训练集格式相同。 ```
train/99/Ovenbird_0137_92639.jpg 99 1
train/99/Ovenbird_0136_92859.jpg 99 2
train/99/Ovenbird_0135_93168.jpg 99 3
train/99/Ovenbird_0131_92559.jpg 99 4
train/99/Ovenbird_0130_92452.jpg 99 5
...
```
其中,分隔符为空格`" "`, 三列数据的含义分别是`训练数据的相对路径``训练数据的 label 标签``训练数据的 unique id`。测试集格式与训练集格式相同。
**注意** * 构建完毕后返回 `PaddleClas` 根目录
* 当 gallery dataset 和 query dataset 相同时,为了去掉检索得到的第一个数据(检索图片本身无须评估),每个数据需要对应一个 unique id,用于后续评测 mAP、recall@1 等指标。关于 gallery dataset 与 query dataset 的解析请参考[图像检索数据集介绍](#图像检索数据集介绍), 关于 mAP、recall@1 等评测指标请参考[图像检索评价指标](#图像检索评价指标) ```shell
# linux or mac
cd ../../
```
返回 `PaddleClas` 根目录 **注意**
```shell * 当 gallery dataset 和 query dataset 相同时,为了去掉检索得到的第一个数据(检索图片本身不能出现在gallery中),每个数据需要对应一个 unique id(一般使用从1开始的自然数为unique id,如1,2,3,...),用于后续评测 `mAP``recall@1` 等指标。关于 gallery dataset 与 query dataset 的解析请参考[图像检索数据集介绍](#图像检索数据集介绍), 关于 `mAP``recall@1` 等评测指标请参考[图像检索评价指标](#图像检索评价指标)
# linux or mac
cd ../../
```
<a name="2.2"></a> <a name="2.2"></a>
### 2.2 特征模型 GPU 上的训练与评估 ### 2.2 特征提取模型在 GPU 上的训练与评估
在基于单卡 GPU 上训练与评估,推荐使用 `tools/train.py``tools/eval.py` 脚本。
PaddleClas 支持使用 VisualDL 可视化训练过程。VisualDL 是飞桨可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。可帮助用户更清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型优化。更多细节请查看[VisualDL](../others/VisualDL.md) 下面以 MobileNetV1 模型为例,介绍特征提取模型在 GPU 上的训练与评估流程
<a name="2.2.1"></a> <a name="2.2.1"></a>
#### 2.2.1 特征模型训练 #### 2.2.1 特征提取模型训练
准备好配置文件之后,可以使用下面的方式启动图像检索任务的训练。PaddleClas 训练图像检索任务的方法是度量学习,关于度量学习的解析请参考[度量学习](#度量学习) 准备好配置文件之后,可以使用下面的方式启动图像检索任务的训练。PaddleClas 训练图像检索任务的方法是度量学习,关于度量学习的解析请参考[度量学习](#度量学习)
```shell ```shell
# 单卡 GPU # 单卡 GPU
python3 tools/train.py \ python3.7 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.7 -m paddle.distributed.launch 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
``` ```
其中,`-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 在训练开始前会加载预训练模型;`-o Arch.Backbone.pretrained` 也可以指定为模型权重文件的路径,使用时换成自己的预训练模型权重文件的路径即可;`-o Global.device=gpu` 表示使用 GPU 进行训练。如果希望使用 CPU 进行训练,则设置 `-o Global.device=cpu`即可
更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](config_description.md) 更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](config_description.md)
运行上述命令,可以看到输出日志,示例如下: 运行上述训练命令,可以看到输出日志,示例如下:
``` ```log
... ...
[Train][Epoch 1/50][Avg]CELoss: 6.59110, TripletLossV2: 0.54044, loss: 7.13154 [Train][Epoch 1/50][Avg]CELoss: 6.59110, TripletLossV2: 0.54044, loss: 7.13154
... ...
[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 后可能需要改写 `Neck` 的输入大小,改写方式类似替换 Backbone 的名字。
在训练 Loss 部分,此处使用了 [CELoss](../../../ppcls/loss/celoss.py)[TripletLossV2](../../../ppcls/loss/triplet.py),配置文件如下: 在训练 Loss 部分,此处使用了 [CELoss](../../../ppcls/loss/celoss.py)[TripletLossV2](../../../ppcls/loss/triplet.py),配置文件如下:
``` ```yaml
Loss: Loss:
Train: Train:
- CELoss: - CELoss:
...@@ -183,43 +189,46 @@ Loss: ...@@ -183,43 +189,46 @@ 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/__init__.py)
<a name="2.2.2"></a> <a name="2.2.2"></a>
#### 2.2.2 特征模型恢复训练 #### 2.2.2 特征提取模型恢复训练
如果训练任务因为其他原因被终止,可以加载断点权重文件,继续训练: 如果训练任务因为其他原因被终止,且训练过程中有保存权重文件,可以加载断点权重文件,继续训练:
```shell ```shell
# 单卡 # 单卡恢复训练
python3 tools/train.py \ python33.7 tools/train.py \
-c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \ -c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \
-o Global.checkpoints="./output/RecModel/epoch_5" \ -o Global.checkpoints="./output/RecModel/epoch_5" \
-o Global.device=gpu -o Global.device=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.7 -m paddle.distributed.launch tools/train.py \
-c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \ -c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \
-o Global.checkpoints="./output/RecModel/epoch_5" \ -o Global.checkpoints="./output/RecModel/epoch_5" \
-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` 后的参数无需包含断点权重文件的后缀名,上述训练命令会在训练过程中生成如下所示的断点权重文件,若想从断点 `epoch_5` 继续训练,则 `Global.checkpoints` 参数只需设置为 `"./output/RecModel/epoch_5"`,PaddleClas 会自动补充后缀名。
```shell `epoch_5.pdparams`所在目录如下所示:
```log
output/ output/
└── RecModel └── RecModel
├── best_model.pdopt ├── best_model.pdopt
├── best_model.pdparams ├── best_model.pdparams
├── best_model.pdstates ├── best_model.pdstates
├── epoch_1.pdopt ├── epoch_5.pdopt
├── epoch_1.pdparams ├── epoch_5.pdparams
├── epoch_1.pdstates ├── epoch_5.pdstates
. .
. .
. .
...@@ -227,51 +236,51 @@ python3 -m paddle.distributed.launch tools/train.py \ ...@@ -227,51 +236,51 @@ python3 -m paddle.distributed.launch tools/train.py \
<a name="2.2.3"></a> <a name="2.2.3"></a>
#### 2.2.3 特征模型评估 #### 2.2.3 特征提取模型评估
可以通过以下命令进行模型评估。 可以通过以下命令进行指定模型进行评估。
```bash ```bash
# 单卡 # 单卡评估
python3 tools/eval.py \ python3.7 tools/eval.py \
-c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \ -c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \
-o Global.pretrained_model=./output/RecModel/best_model -o Global.pretrained_model=./output/RecModel/best_model
# 多卡
# 多卡评估
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch tools/eval.py \ python3.7 -m paddle.distributed.launch tools/eval.py \
-c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \ -c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \
-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.pdparams` 进行评估。你也可以通过更改配置文件中的参数来设置评估,也可以通过 `-o` 参数更新配置,如上所示。
可配置的部分评估参数说明如下: 可配置的部分评估参数说明如下:
* `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 特征模型恢复训练](#2.2.2) * 在加载待评估模型时,需要指定模型文件的路径,但无需包含文件后缀名,PaddleClas 会自动补齐 `.pdparams` 的后缀,如 [2.2.2 特征提取模型恢复训练](#2.2.2)
* Metric learning 任务一般不评测 TopkAcc * Metric learning 任务一般不评测 `TopkAcc` 指标
<a name="2.3"></a> <a name="2.3"></a>
### 2.3 特征模型导出 inference 模型 ### 2.3 特征提取模型导出 inference 模型
通过导出 inference 模型,PaddlePaddle 支持使用预测引擎进行预测推理。对训练好的模型进行转换: 通过导出 inference 模型,PaddlePaddle 支持使用预测引擎进行预测推理。对训练好的模型进行转换:
```bash ```bash
python3 tools/export_model.py \ python3.7 tools/export_model.py \
-c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \ -c ./ppcls/configs/quick_start/MobileNetV1_retrieval.yaml \
-o Global.pretrained_model=output/RecModel/best_model \ -o Global.pretrained_model=output/RecModel/best_model \
-o Global.save_inference_dir=./inference -o Global.save_inference_dir=./inference
``` ```
其中,`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 特征。 其中,`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 维特征。
上述命令将生成模型结构文件(`inference.pdmodel`)和模型权重文件(`inference.pdiparams`),然后可以使用预测引擎进行推理。使用 inference 模型推理的流程可以参考[基于 Python 预测引擎预测推理](../inference_deployment/python_deploy.md) 有了上述命令将生成的模型结构文件(`inference.pdmodel`)和模型权重文件(`inference.pdiparams`),接下来就可以使用预测引擎进行推理。使用 inference 模型推理的流程可以参考[基于 Python 预测引擎预测推理](../inference_deployment/python_deploy.md)
<a name="3"></a> <a name="3"></a>
...@@ -279,14 +288,14 @@ python3 tools/export_model.py \ ...@@ -279,14 +288,14 @@ python3 tools/export_model.py \
PaddleClas 图像检索部分目前支持的环境如下: PaddleClas 图像检索部分目前支持的环境如下:
```shell | 操作系统 | 推理硬件 |
└── CPU/单卡 GPU | :------- | :------- |
├── Linux | Linux | CPU/GPU |
├── MacOS | Windows | CPU/GPU |
└── Windows | MacOS | CPU/GPU |
```
此部分使用了 [Faiss](https://github.com/facebookresearch/faiss) 作为检索库,其是一个高效的特征检索及聚类的库。此库中集成了多种相似度检索算法,以满足不同的检索场景。在 PaddleClas 中,支持三种检索算法:
此部分使用了第三方开源库 [Faiss](https://github.com/facebookresearch/faiss) 作为检索工具,它是一个高效的特征检索与聚类的库,集成了多种相似度检索算法,以满足不同的检索场景。PaddleClas 目前支持三种检索算法:
- **HNSW32**: 一种图索引方法。检索精度较高,速度较快。但是特征库只支持添加图像功能,不支持删除图像特征功能。(默认方法) - **HNSW32**: 一种图索引方法。检索精度较高,速度较快。但是特征库只支持添加图像功能,不支持删除图像特征功能。(默认方法)
- **IVF**:倒排索引检索方法。速度较快,但是精度略低。特征库支持增加、删除图像特功能。 - **IVF**:倒排索引检索方法。速度较快,但是精度略低。特征库支持增加、删除图像特功能。
...@@ -296,22 +305,27 @@ PaddleClas 图像检索部分目前支持的环境如下: ...@@ -296,22 +305,27 @@ PaddleClas 图像检索部分目前支持的环境如下:
具体安装方法如下: 具体安装方法如下:
```python ```shell
pip install faiss-cpu==1.7.1post2 python3.7 -m pip install faiss-cpu==1.7.1post2
``` ```
若使用时,不能正常引用,则 `uninstall` 之后,重新 `install`,尤其是 `windows` 下。 若无法正常使用faiss,可以按以下命令先将其卸载,然后重新安装(Windows系统中该问题比较常见)。
```shell
python3.7 -m pip uninstall faiss-cpu
python3.7 -m pip install faiss-cpu==1.7.1post2
```
<a name="4"></a> <a name="4"></a>
## 4. 基础知识 ## 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>
...@@ -319,19 +333,17 @@ pip install faiss-cpu==1.7.1post2 ...@@ -319,19 +333,17 @@ pip install faiss-cpu==1.7.1post2
- 训练集合(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@k`:检索的 top-k 结果中预测为正例且标签为正例的个数 / 标签为正例的个数
- recall@1:检索的 top-1 中预测正例且标签为正例的个数 / 标签为正例的个数
- recall@5:检索的 top-5 中所有预测正例且标签为正例的个数 / 标签为正例的个数
<a name="平均检索精度"></a> <a name="平均检索精度"></a>
- 平均检索精度(mAP) - 平均检索精度(mAP)
- AP: AP 指的是不同召回率上的正确率的平均值 - `AP`: AP 指的是不同召回率上的正确率的平均值
- mAP: 测试集中所有图片对应的 AP 的平均值 - `mAP`: 测试集中所有图片对应的 AP 的平均值
...@@ -60,7 +60,7 @@ Optimizer: ...@@ -60,7 +60,7 @@ Optimizer:
verbose: False verbose: False
last_epoch: -1 last_epoch: -1
regularizer: regularizer:
name: 'L2' name: "L2"
coeff: 0.0005 coeff: 0.0005
# data loader for train and eval # data loader for train and eval
...@@ -82,7 +82,7 @@ DataLoader: ...@@ -82,7 +82,7 @@ DataLoader:
scale: 0.00392157 scale: 0.00392157
mean: [0.485, 0.456, 0.406] mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225] std: [0.229, 0.224, 0.225]
order: '' order: ""
- RandomErasing: - RandomErasing:
EPSILON: 0.5 EPSILON: 0.5
sl: 0.02 sl: 0.02
...@@ -115,7 +115,7 @@ DataLoader: ...@@ -115,7 +115,7 @@ DataLoader:
scale: 0.00392157 scale: 0.00392157
mean: [0.485, 0.456, 0.406] mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225] std: [0.229, 0.224, 0.225]
order: '' order: ""
sampler: sampler:
name: DistributedBatchSampler name: DistributedBatchSampler
batch_size: 64 batch_size: 64
...@@ -140,7 +140,7 @@ DataLoader: ...@@ -140,7 +140,7 @@ DataLoader:
scale: 1.0/255.0 scale: 1.0/255.0
mean: [0.485, 0.456, 0.406] mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225] std: [0.229, 0.224, 0.225]
order: '' order: ""
sampler: sampler:
name: DistributedBatchSampler name: DistributedBatchSampler
batch_size: 64 batch_size: 64
...@@ -155,4 +155,3 @@ Metric: ...@@ -155,4 +155,3 @@ Metric:
- Recallk: - Recallk:
topk: [1, 5] topk: [1, 5]
- mAP: {} - mAP: {}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册