@@ -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裁剪
+
+## 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)。
![](../../images/algorithm_introduction/fpgm.png)
@@ -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)。
diff --git a/docs/zh_CN/data_preparation/classification_dataset.md b/docs/zh_CN/data_preparation/classification_dataset.md
index d64158d98b6469b3d1c6d3bb466b37109154f19c..b743fa21d8785116f1159968f0977aef26ba70cd 100644
--- a/docs/zh_CN/data_preparation/classification_dataset.md
+++ b/docs/zh_CN/data_preparation/classification_dataset.md
@@ -6,16 +6,16 @@
## 目录
-- [数据集格式说明](#数据集格式说明)
-- [图像分类任务常见数据集介绍](#图像分类任务常见数据集介绍)
- - [2.1 ImageNet1k](#ImageNet1k)
- - [2.2 Flowers102](#Flowers102)
- - [2.3 CIFAR10 / CIFAR100](#CIFAR10/CIFAR100)
- - [2.4 MNIST](#MNIST)
- - [2.5 NUS-WIDE](#NUS-WIDE)
+- [1. 数据集格式说明](#1)
+- [2. 图像分类任务常见数据集介绍](#2)
+ - [2.1 ImageNet1k](#2.1)
+ - [2.2 Flowers102](#2.2)
+ - [2.3 CIFAR10 / CIFAR100](#2.3)
+ - [2.4 MNIST](#2.4)
+ - [2.5 NUS-WIDE](#2.5)
-
-## 一、数据集格式说明
+
+## 1. 数据集格式说明
PaddleClas 使用 `txt` 格式文件指定训练集和测试集,以 `ImageNet1k` 数据集为例,其中 `train_list.txt` 和 `val_list.txt` 的格式形如:
@@ -30,12 +30,12 @@ train/n01440764/n01440764_10026.JPEG 0
val/ILSVRC2012_val_00000001.JPEG 65
...
```
-
-## 二、 图像分类任务常见数据集介绍
+
+## 2. 图像分类任务常见数据集介绍
这里整理了常用的图像分类任务数据集,持续更新中,欢迎各位小伙伴补充完善~
-
+
### 2.1 ImageNet1k
[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/
|_ val_list.txt
```
-
+
### 2.2 Flowers102
数据集 | 训练集大小 | 测试集大小 | 类别数 | 备注|
@@ -101,21 +101,21 @@ PaddleClas/dataset/flowers102/
|_ val_list.txt
```
-
+
### 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
-
+
### 2.4 MNIST
-MMNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例。其包含 60000 张图片数据,50000 张作为训练集,10000 张作为验证集,每张图片的大小为 28 * 28。
+MMNIST 是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例。其包含 60000 张图片数据,50000 张作为训练集,10000 张作为验证集,每张图片的大小为 28 * 28。
数据集地址:http://yann.lecun.com/exdb/mnist/
-
+
### 2.5 NUS-WIDE
NUS-WIDE 是一个多分类数据集。该数据集包含 269648 张图片, 81 个类别, 每张图片被标记为该 81 个类别中的某一类或某几类。
diff --git a/docs/zh_CN/data_preparation/recognition_dataset.md b/docs/zh_CN/data_preparation/recognition_dataset.md
index 506c6227fa7f69866a737022760bb00877c9dd59..19274abd2ceef9c100116e79cd3192bcc0b31869 100644
--- a/docs/zh_CN/data_preparation/recognition_dataset.md
+++ b/docs/zh_CN/data_preparation/recognition_dataset.md
@@ -7,18 +7,18 @@
## 目录
-- [数据集格式说明](#数据集格式说明)
-- [图像识别任务常见数据集介绍](#图像识别任务常见数据集介绍)
- - [2.1 通用图像识别数据集](#通用图像识别数据集)
- - [2.2 垂类图像识别数据集](#垂类图像识别数据集)
- - [2.2.1 动漫人物识别](#动漫人物识别)
- - [2.2.2 商品识别](#商品识别)
- - [2.2.3 Logo识别](#Logo识别)
- - [2.2.4 车辆识别](#车辆识别)
+- [1. 数据集格式说明](#1)
+- [2. 图像识别任务常见数据集介绍](#2)
+ - [2.1 通用图像识别数据集](#2.1)
+ - [2.2 垂类图像识别数据集](#2.2)
+ - [2.2.1 动漫人物识别](#2.2.1)
+ - [2.2.2 商品识别](#2.2.2)
+ - [2.2.3 Logo 识别](#2.2.3)
+ - [2.2.4 车辆识别](#2.2.4)
-
-## 一、数据集格式说明
+
+## 1. 数据集格式说明
与分类任务数据集不同,图像检索任务的数据集分为以下三部分:
@@ -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
# 采用"空格"作为分隔符号
@@ -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`。
-
-## 二、图像识别任务常见数据集介绍
+
+## 2. 图像识别任务常见数据集介绍
这里整理了常用的图像识别任务数据集,持续更新中,欢迎各位小伙伴补充完善~
-
+
### 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/
- 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
-- 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
-- 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
-
+
### 2.2 垂类图像识别数据集
-
+
#### 2.2.1 动漫人物识别
-+ iCartoonFace: iCartoonFace是由爱奇艺开放的目前全球最大的手工标注卡通人物检测数据集与识别数据集,它包含超过5013个卡通人物、389678张高质量实景图片。相比于其他数据集,它具有大规模、高质量、多样性丰富、挑战难度大等特点,是目前研究动漫人物识别最常用的数据集之一。
++ iCartoonFace: iCartoonFace 是由爱奇艺开放的目前全球最大的手工标注卡通人物检测数据集与识别数据集,它包含超过 5013 个卡通人物、389678 张高质量实景图片。相比于其他数据集,它具有大规模、高质量、多样性丰富、挑战难度大等特点,是目前研究动漫人物识别最常用的数据集之一。
地址: 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/
-+ 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
-
+
#### 2.2.2 商品识别
-+ AliProduct: AliProduct数据集是目前开源最大的商品数据集,它是一个SKU级别的图像分类数据集, 包含5万类别、300万张商品图像,商品图像的类别和总量均为业界之最。此数据集中涵盖了大量的生活用品、食物等,数据集中没有人工标注,数据较脏,数据分布较不均衡,且有很多相似的商品图片。
++ AliProduct: AliProduct 数据集是目前开源最大的商品数据集,它是一个 SKU 级别的图像分类数据集, 包含 5 万类别、300 万张商品图像,商品图像的类别和总量均为业界之最。此数据集中涵盖了大量的生活用品、食物等,数据集中没有人工标注,数据较脏,数据分布较不均衡,且有很多相似的商品图片。
地址: 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
-+ DeepFashion-Inshop: 同通用图像识别数据集中的In-shop Clothes
++ DeepFashion-Inshop: 同通用图像识别数据集中的 In-shop Clothes
-
-### 2.2.3 Logo识别
-+ Logo-2K+: Logo-2K+是一个仅用于logo图像识别的数据集,其包含10个大类,2341个小类和167140张图片。
+
+### 2.2.3 Logo 识别
++ Logo-2K+: Logo-2K+是一个仅用于 logo 图像识别的数据集,其包含 10 个大类,2341 个小类和 167140 张图片。
地址: 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/
-
+
### 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/
-+ BoxCars: 此数据集共包含21250辆车、63750张图像、27个汽车制造商、148个细类别,此数据集全部来自监控数据。
++ BoxCars: 此数据集共包含 21250 辆车、63750 张图像、27 个汽车制造商、148 个细类别,此数据集全部来自监控数据。
地址: 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
diff --git a/docs/zh_CN/image_recognition_pipeline/feature_extraction.md b/docs/zh_CN/image_recognition_pipeline/feature_extraction.md
index 620f25865b4473af3c8c35663496f683808574a0..ca20fd02bdd73febd78e72969851bd0bec2311e1 100644
--- a/docs/zh_CN/image_recognition_pipeline/feature_extraction.md
+++ b/docs/zh_CN/image_recognition_pipeline/feature_extraction.md
@@ -1,18 +1,41 @@
# 特征提取
+
+## 目录
+
+- [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)
+
+
+
## 1. 简介
-特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的[向量检索](./vector_search.md)。好的特征需要具备相似度保持性,即在特征空间中,相似度高的图片对其特征相似度要比较高(距离比较近),相似度低的图片对,其特征相似度要比较小(距离比较远)。[Deep Metric Learning](../algorithm_introduction/metric_learning.md)用以研究如何通过深度学习的方法获得具有强表征能力的特征。
+
+特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的[向量检索](./vector_search.md)。好的特征需要具备相似度保持性,即在特征空间中,相似度高的图片对其特征相似度要比较高(距离比较近),相似度低的图片对,其特征相似度要比较小(距离比较远)。[Deep Metric Learning](../algorithm_introduction/metric_learning.md) 用以研究如何通过深度学习的方法获得具有强表征能力的特征。
+
+
## 2. 网络结构
-为了图像识别任务的灵活定制,我们将整个网络分为Backbone、 Neck、 Head以及Loss部分,整体结构如下图所示:
+为了图像识别任务的灵活定制,我们将整个网络分为 Backbone、 Neck、 Head 以及 Loss 部分,整体结构如下图所示:
![](../../images/feature_extraction_framework.png)
图中各个模块的功能为:
-- **Backbone**: 指定所使用的骨干网络。 值得注意的是,PaddleClas提供的基于ImageNet的预训练模型,最后一层的输出为1000, 我们需要依据所需的特征维度定制最后一层的输出。
-- **Neck**: 用以特征增强及特征维度变换。 这儿的Neck,可以是一个简单的Linear Layer,用来做特征维度变换;也可以是较复杂的FPN结构,用以做特征增强。
-- **Head**: 用来将feature转化为logits。 除了常用的Fc Layer外,还可以替换为cosmargin, arcmargin, circlemargin等模块。
-- **Loss**: 指定所使用的Loss函数。 我们将Loss设计为组合loss的形式, 可以方便得将Classification Loss和Pair_wise Loss组合在一起。
+
+- **Backbone**: 指定所使用的骨干网络。 值得注意的是,PaddleClas 提供的基于 ImageNet 的预训练模型,最后一层的输出为 1000, 我们需要依据所需的特征维度定制最后一层的输出。
+- **Neck**: 用以特征增强及特征维度变换。 这儿的 Neck,可以是一个简单的 Linear Layer,用来做特征维度变换;也可以是较复杂的 FPN 结构,用以做特征增强。
+- **Head**: 用来将 feature 转化为 logits。 除了常用的 Fc Layer 外,还可以替换为 cosmargin, arcmargin, circlemargin 等模块。
+- **Loss**: 指定所使用的 Loss 函数。 我们将 Loss 设计为组合 loss 的形式, 可以方便得将 Classification Loss 和 Pair_wise Loss 组合在一起。
+
+
## 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/) |
@@ -30,16 +53,23 @@
PP-LCNet-2.5x | 0.839 | 0.888 | 0.861 | 0.841 | 0.793 | 0.892 | 5.0
* 采用的评测指标为:`Recall@1`
* 速度评测机器的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)
+
+
# 4. 自定义特征提取
+
自定义特征提取,是指依据自己的任务,重新训练特征提取模型。主要包含四个步骤:1)数据准备;2)模型训练;3)模型评估;4)模型推理。
+
+
+
## 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)。在启动模型训练之前,需要在配置文件中修改数据配置相关的内容, 主要包括数据集的地址以及类别数量。对应到配置文件中的位置如下所示:
```
Head:
- name: ArcMargin
+ name: ArcMargin
embedding_size: 512
class_num: 185341 #此处表示类别数
```
@@ -52,21 +82,23 @@ PP-LCNet-2.5x | 0.839 | 0.888 | 0.861 | 0.841 | 0.793 | 0.892 | 5.0
```
```
Query:
- dataset:
+ dataset:
name: VeriWild
image_root: ./dataset/Aliproduct/. #此处表示query数据集所在的目录
cls_label_path: ./dataset/Aliproduct/val_list.txt. #此处表示query数据集label文件的地址
```
```
Gallery:
- dataset:
+ dataset:
name: VeriWild
image_root: ./dataset/Aliproduct/ #此处表示gallery数据集所在的目录
cls_label_path: ./dataset/Aliproduct/val_list.txt. #此处表示gallery数据集label文件的地址
```
+
## 4.2 模型训练
+
- 单机单卡训练
```shell
export CUDA_VISIBLE_DEVICES=0
@@ -79,8 +111,9 @@ python -m paddle.distributed.launch \
--gpus="0,1,2,3" tools/train.py \
-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
export CUDA_VISIBLE_DEVICES=0,1,2,3
@@ -90,7 +123,10 @@ python -m paddle.distributed.launch \
-o Global.checkpoint="output/RecModel/latest"
```
+
+
## 4.3 模型评估
+
- 单卡评估
```shell
export CUDA_VISIBLE_DEVICES=0
@@ -109,17 +145,28 @@ python -m paddle.distributed.launch \
```
**推荐:** 建议使用多卡评估。多卡评估方式可以利用多卡并行计算快速得到整体数据集的特征集合,能够加速评估的过程。
+
+
## 4.4 模型推理
+
推理过程包括两个步骤: 1)导出推理模型; 2)获取特征向量
+
+
+
### 4.4.1 导出推理模型
+
```
python tools/export_model \
-c ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml \
-o Global.pretrained_model="output/RecModel/best_model"
```
-生成的推理模型位于`inference`目录,里面包含三个文件,分别为`inference.pdmodel`、`inference.pdiparams`、`inference.pdiparams.info`。
-其中: `inference.pdmodel`用来存储推理模型的结构, `inference.pdiparams`和 `inference.pdiparams.info`用来存储推理模型相关的参数信息。
+生成的推理模型位于 `inference` 目录,里面包含三个文件,分别为 `inference.pdmodel`、`inference.pdiparams`、`inference.pdiparams.info`。
+其中: `inference.pdmodel` 用来存储推理模型的结构, `inference.pdiparams` 和 `inference.pdiparams.info` 用来存储推理模型相关的参数信息。
+
+
+
### 4.4.2 获取特征向量
+
```
cd deploy
python python/predict_rec.py \
diff --git a/docs/zh_CN/image_recognition_pipeline/mainbody_detection.md b/docs/zh_CN/image_recognition_pipeline/mainbody_detection.md
index ae360df7372bcd4a566ad382bfbd50c5ddb9038d..9f5dee6e8846598712d77ea2f449c3cb93fd369e 100644
--- a/docs/zh_CN/image_recognition_pipeline/mainbody_detection.md
+++ b/docs/zh_CN/image_recognition_pipeline/mainbody_detection.md
@@ -5,6 +5,23 @@
本部分主要从数据集、模型选择和模型训练 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)
+
+
## 1. 数据集
@@ -15,15 +32,16 @@
| Objects365 | 170W | 6k | 通用场景 | [地址](https://www.objects365.org/overview.html) |
| COCO2017 | 12W | 5k | 通用场景 | [地址](https://cocodataset.org/) |
| 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/) |
在实际训练的过程中,将所有数据集混合在一起。由于是主体检测,这里将所有标注出的检测框对应的类别都修改为 `前景` 的类别,最终融合的数据集中只包含 1 个类别,即前景。
+
## 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 以及它们的模型大小、预测速度对比信息。
@@ -37,10 +55,11 @@
* 速度评测机器的CPU具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz`,速度指标为开启 mkldnn ,线程数设置为 10 测试得到。
* 主体检测的预处理过程较为耗时,平均每张图在上述机器上的时间在 40~55 ms 左右,没有包含在上述的预测耗时统计中。
+
### 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)
- [Generalized Focal Loss](https://arxiv.org/abs/2006.04388)
@@ -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)。
-在轻量级主体检测任务中,为了更好地兼顾检测速度与效果,我们使用 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) 完全一致。将数据集更换为自定义的主体检测数据集,进行训练,最终得到检测模型。
+
### 2.2 服务端主体检测模型
-PP-YOLO 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) 提出,从骨干网络、数据增广、正则化策略、损失函数、后处理等多个角度对 yolov3 模型进行深度优化,最终在"速度-精度"方面达到了业界领先的水平。具体地,优化的策略如下。
+PP-YOLO 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) 提出,从骨干网络、数据增广、正则化策略、损失函数、后处理等多个角度对 yolov3 模型进行深度优化,最终在“速度-精度”方面达到了业界领先的水平。具体地,优化的策略如下。
- 更优的骨干网络: 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)
- [Exponential Moving Average](https://www.investopedia.com/terms/e/ema.asp)
- [IoU Loss](https://arxiv.org/pdf/1902.09630.pdf)
@@ -73,14 +93,17 @@ PP-YOLO 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection)
在服务端主体检测任务中,为了保证检测效果,我们使用 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) ,更换为自定义的主体检测数据集,进行训练,最终得到检测模型。
+
## 3. 模型训练
-本节主要介绍怎样基于PaddleDetection,基于自己的数据集,训练主体检测模型。
+本节主要介绍怎样基于 PaddleDetection,基于自己的数据集,训练主体检测模型。
+
+
### 3.1 环境准备
-下载PaddleDetection代码,安装requirements。
+下载 PaddleDetection 代码,安装 requirements。
```shell
cd
@@ -93,16 +116,20 @@ pip install -r requirements.txt
更多安装教程,请参考: [安装文档](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/docs/tutorials/INSTALL_cn.md)
+
+
### 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
[{u'id': 1, u'name': u'foreground', u'supercategory': u'foreground'}]
```
+
+
### 3.3 配置文件改动和说明
我们使用 `configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml` 配置进行训练,配置文件摘要如下:
@@ -116,7 +143,7 @@ pip install -r requirements.txt
```
coco_detection.yml:主要说明了训练数据和验证数据的路径
-runtime.yml:主要说明了公共的运行参数,比如是否使用GPU、每多少个epoch存储checkpoint等
+runtime.yml:主要说明了公共的运行参数,比如是否使用GPU、每多少个 epoch 存储 checkpoint 等
optimizer_365e.yml:主要说明了学习率和优化器的配置
@@ -129,6 +156,7 @@ ppyolov2_reader.yml:主要说明数据读取器配置,如 batch size,并
此外,也可以根据实际情况,修改上述文件,比如,如果显存溢出,可以将 batch size 和学习率等比缩小等。
+
### 3.4 启动训练
@@ -142,7 +170,7 @@ export CUDA_VISIBLE_DEVICES=0
python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml
```
-* GPU多卡训练
+* GPU 多卡训练
```bash
export CUDA_VISIBLE_DEVICES=0,1,2,3
@@ -152,7 +180,7 @@ python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/ppy
--eval:表示边训练边验证。
-* (**推荐**)模型微调
+* (**推荐**)模型微调
如果希望加载 PaddleClas 中已经训练好的主体检测模型,在自己的数据集上进行模型微调,可以使用下面的命令进行训练。
```bash
@@ -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
```
-注意:如果遇到 "`Out of memory error`" 问题, 尝试在 `ppyolov2_reader.yml` 文件中调小`batch_size`,同时等比例调小学习率。
+注意:如果遇到 "`Out of memory error`" 问题, 尝试在 `ppyolov2_reader.yml` 文件中调小 `batch_size`,同时等比例调小学习率。
+
### 3.5 模型预测与调试
@@ -184,6 +213,8 @@ python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --infer
`--draw_threshold` 是个可选参数. 根据 [NMS](https://ieeexplore.ieee.org/document/1699659) 的计算,不同阈值会产生不同的结果 `keep_top_k` 表示设置输出目标的最大数量,默认值为 100 ,用户可以根据自己的实际情况进行设定。
+
+
### 3.6 模型导出与预测部署。
执行导出模型脚本:
@@ -194,7 +225,7 @@ 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` 。
-注意: `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)
diff --git a/docs/zh_CN/image_recognition_pipeline/vector_search.md b/docs/zh_CN/image_recognition_pipeline/vector_search.md
index 6d13783dd7c603aa36226c86a2877a8afd5c9b4b..af99587a586754664f2e7330ddc86f12bcc68d14 100644
--- a/docs/zh_CN/image_recognition_pipeline/vector_search.md
+++ b/docs/zh_CN/image_recognition_pipeline/vector_search.md
@@ -1,17 +1,38 @@
# 向量检索
-向量检索技术在图像识别、图像检索中应用比较广泛。其主要目标是,对于给定的查询向量,在已经建立好的向量库中,与库中所有的待查询向量,进行特征向量的相似度或距离计算,得到相似度排序。在图像识别系统中,我们使用[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系统
-- 安装方便: 支持`python`接口,直接使用`pip`安装
+- 适配性好:支持 Windos、Linux、MacOS 系统
+- 安装方便: 支持 `python` 接口,直接使用 `pip` 安装
- 算法丰富:支持多种检索算法,满足不同场景的需求
-- 同时支持CPU、GPU,能够加速检索过程
+- 同时支持 CPU、GPU,能够加速检索过程
-值得注意的是,为了更好是适配性,目前版本,`PaddleClas`中暂时**只使用CPU进行向量检索**。
+值得注意的是,为了更好是适配性,目前版本,`PaddleClas` 中暂时**只使用 CPU 进行向量检索**。
-本文档主要主要介绍PaddleClas中检索模块的安装、使用的检索算法,及使用过程中的相关配置文件中参数介绍。
+
+
![](../../images/structure.jpg)
+
-## 一、检索库安装
+如上图中所示,向量检索部分,在整个 `PP-ShiTu` 系统中有两部分内容
+
+- 图中绿色部分:建立检索库,供检索时查询使用,同时提供增、删等功能
+- 图中蓝色部分:检索功能,即给定一张图的特征向量,返回库中相似图像的 label
+
+本文档主要主要介绍 PaddleClas 中检索模块的安装、使用的检索算法、建库流程的及相关配置文件中参数介绍。
+
+--------------------------
+
+## 目录
+
+- [1. 检索库安装](#1)
+- [2. 使用的检索算法](#2)
+- [3. 使用及配置文档介绍](#3)
+ - [3.1 建库及配置文件参数](#3.1)
+ - [3.2 检索配置文件参数](#3.2)
+
+
+
+## 1. 检索库安装
`Faiss`具体安装方法如下:
@@ -19,25 +40,44 @@
pip install faiss-cpu==1.7.1post2
```
-若使用时,不能正常引用,则`uninstall` 之后,重新`install`,尤其是`windows`下。
+若使用时,不能正常引用,则 `uninstall` 之后,重新 `install`,尤其是 `windows` 下。
-## 二、使用的检索算法
+
-目前`PaddleClas`中检索模块,支持如下三种检索算法
+## 2. 使用的检索算法
+
+目前 `PaddleClas` 中检索模块,支持如下三种检索算法
- **HNSW32**: 一种图索引方法。检索精度较高,速度较快。但是特征库只支持添加图像功能,不支持删除图像特征功能。(默认方法)
- **IVF**:倒排索引检索方法。速度较快,但是精度略低。特征库支持增加、删除图像特征功能。
- **FLAT**: 暴力检索算法。精度最高,但是数据量大时,检索速度较慢。特征库支持增加、删除图像特征功能。
-每种检索算法,满足不同场景。其中`HNSW32`为默认方法,此方法的检索精度、检索速度可以取得一个较好的平衡,具体算法介绍可以查看[官方文档](https://github.com/facebookresearch/faiss/wiki)。
+每种检索算法,满足不同场景。其中 `HNSW32` 为默认方法,此方法的检索精度、检索速度可以取得一个较好的平衡,具体算法介绍可以查看[官方文档](https://github.com/facebookresearch/faiss/wiki)。
+
+
-## 三、相关配置文档参数介绍
+## 3. 使用及配置文档介绍
-涉及检索模块配置文件位于:`deploy/configs/`下,其中`build_*.yaml`是建立特征库的相关配置文件,`inference_*.yaml`是检索或者分类的推理配置文件。
+涉及检索模块配置文件位于:`deploy/configs/` 下,其中 `build_*.yaml` 是建立特征库的相关配置文件,`inference_*.yaml` 是检索或者分类的推理配置文件。
-### 3.1 建库配置文件参数
+
-示例建库的配置如下
+### 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
# indexing engine config
@@ -56,13 +96,19 @@ IndexProcess:
- **index_dir**:构建的特征库所存放的文件夹
- **image_root**:构建特征库所需要的标注图像所存储的文件夹位置
- **data_file**:构建特征库所需要的标注图像的数据列表,每一行的格式:relative_path label
-- **index_operation**: 此次运行建库的操作:`new`新建,`append`将data_file的图像特征添加到特征库中,`remove`将data_file的图像从特征库中删除
-- **delimiter**:**data_file**中每一行的间隔符
-- **dist_type**: 特征匹配过程中使用的相似度计算方式。`IP`内积相似度计算方式,`L2`欧式距离计算方法
+- **index_operation**: 此次运行建库的操作:`new` 新建,`append` 将 data_file 的图像特征添加到特征库中,`remove` 将 data_file 的图像从特征库中删除
+- **delimiter**:**data_file** 中每一行的间隔符
+- **dist_type**: 特征匹配过程中使用的相似度计算方式。例如 `IP` 内积相似度计算方式,`L2` 欧式距离计算方法
- **embedding_size**:特征维度
+
+
### 3.2 检索配置文件参数
+将检索的过程融合到 `PP-ShiTu` 的整体流程中,请参考 [README](../../../README_ch.md) 中 `PP-ShiTu图像识别系统介绍` 部分。检索具体使用操作请参考[识别快速开始文档](../quick_start/quick_start_recognition.md)。
+
+其中,检索部分配置如下,整体检索配置文件,请参考 `deploy/configs/inference_*.yaml` 文件。
+
```yaml
IndexProcess:
index_dir: "./recognition_demo_data_v1.1/gallery_logo/index/"
@@ -72,5 +118,5 @@ IndexProcess:
与建库配置文件不同,新参数主要如下:
-- `return_k`: 检索结果返回`k`个结果
+- `return_k`: 检索结果返回 `k` 个结果
- `score_thres`: 检索匹配的阈值
diff --git a/docs/zh_CN/inference_deployment/cpp_deploy.md b/docs/zh_CN/inference_deployment/cpp_deploy.md
index 7c30ad0a5f8df0ac8a7d8bbfe855bc3a3b02946e..d9260843550bc8483ba01dc0a966b5c7b7fe7ace 100644
--- a/docs/zh_CN/inference_deployment/cpp_deploy.md
+++ b/docs/zh_CN/inference_deployment/cpp_deploy.md
@@ -1,20 +1,20 @@
-# 服务器端C++预测
+# 服务器端 C++ 预测
-本教程将介绍在服务器端部署PaddleClas分类模型的详细步骤,识别模型部署方式将在近期支持,敬请期待。
+本教程将介绍在服务器端部署 PaddleClas 分类模型的详细步骤,识别模型部署方式将在近期支持,敬请期待。
---
## 目录
-- [准备环境](#1)
- - [1.1编译opencv库](#1.1)
- - [1.2准备环境](#1.2)
+- [1. 准备环境](#1)
+ - [1.1 编译 opencv 库](#1.1)
+ - [1.2 准备环境](#1.2)
- [1.2.1 预测库源码编译](#1.2.1)
- [1.2.2 直接下载安装](#1.2.2)
-- [编译](#2)
+- [2. 编译](#2)
- [2.1 编译 PaddleClas C++ 预测 demo](#2.1)
- [2.2 编译 config lib 预测库与 cls lib 预测库](#2.2)
-- [运行](#3)
+- [3. 运行](#3)
- [3.1 准备 inference model](#3.1)
- [3.2 运行 demo](#3.2)
@@ -23,12 +23,12 @@
## 1. 准备环境
- 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)。
-### 1.1 编译opencv库
+### 1.1 编译 opencv 库
* 首先需要从 opencv 官网上下载在 Linux 环境下源码编译的包,以 3.4.7 版本为例,下载及解压缩命令如下:
@@ -95,9 +95,9 @@ opencv3/
#### 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
git clone https://github.com/PaddlePaddle/Paddle.git
@@ -140,7 +140,7 @@ build/paddle_inference_install_dir/
#### 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` 数学运算库;
@@ -269,13 +269,13 @@ inference/
### 3.2 运行 demo
首先修改 `tools/config.txt` 中对应字段:
-* use_gpu:是否使用GPU;
-* gpu_id:使用的GPU卡号;
+* use_gpu:是否使用 GPU;
+* gpu_id:使用的 GPU 卡号;
* gpu_mem:显存;
* cpu_math_library_num_threads:底层科学计算库所用线程的数量;
-* use_mkldnn:是否使用MKLDNN加速;
-* use_tensorrt: 是否使用tensorRT进行加速;
-* use_fp16:是否使用半精度浮点数进行计算,该选项仅在use_tensorrt为true时有效;
+* use_mkldnn:是否使用 MKLDNN 加速;
+* use_tensorrt: 是否使用 tensorRT 进行加速;
+* use_fp16:是否使用半精度浮点数进行计算,该选项仅在 use_tensorrt 为 true 时有效;
* cls_model_path:预测模型结构文件路径;
* cls_params_path:预测模型参数文件路径;
* resize_short_size:预处理时图像缩放大小;
diff --git a/docs/zh_CN/inference_deployment/cpp_deploy_on_windows.md b/docs/zh_CN/inference_deployment/cpp_deploy_on_windows.md
index a51df747762259ae6e602978c08745f8b750ac47..22458c51b18dc87e9b01412d663f1ec8dfa652d4 100755
--- a/docs/zh_CN/inference_deployment/cpp_deploy_on_windows.md
+++ b/docs/zh_CN/inference_deployment/cpp_deploy_on_windows.md
@@ -1,16 +1,28 @@
# 基于 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)。
-
-## 1. 前置条件
+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)
+
+
+## 1. 前置条件
* 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+
请确保系统已经正确安装并配置好上述基本软件,其中:
- * 在安装 `Visual Studio 2019` 时,`工作负载` 需要勾选 `使用C++的桌面开发`;
- * CUDA需要正确安装并设置系统环境变量;
- * CMake需要正确安装并将路径添加到系统环境变量中。
+ * 在安装 `Visual Studio 2019` 时,`工作负载` 需要勾选 `使用 C++的桌面开发`;
+ * CUDA 需要正确安装并设置系统环境变量;
+ * CMake 需要正确安装并将路径添加到系统环境变量中。
以下示例基于 `Visual Studio 2019 Community` 版本,以工作目录为 `D:\projects` 进行演示。
@@ -27,13 +39,14 @@ PaddlePaddle C++ 预测库针对不同的 `CPU `和 `CUDA` 版本提供了不同
```
paddle_inference_install_dir
-├── paddle # paddle核心库和头文件
+├── paddle # paddle 核心库和头文件
├── third_party # 第三方依赖库和头文件
└── version.txt # 版本和编译信息
```
-**注意**:需要将 `Paddle预测库` 的路径(`D:\projects\paddle_inference_install_dir\paddle\lib`)添加到系统环境变量 `Path` 中。
+**注意**:需要将 `Paddle 预测库` 的路径(`D:\projects\paddle_inference_install_dir\paddle\lib`)添加到系统环境变量 `Path` 中。
+
### 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) ;
@@ -44,7 +57,6 @@ paddle_inference_install_dir
* 新建,将 OpenCV 路径填入并保存,如 `D:\projects\opencv\build\x64\vc14\bin`;
-
## 2. 使用 Visual Studio 2019 编译
1. 打开 Visual Studio 2019 Community,点击 `继续但无需代码`
@@ -59,7 +71,7 @@ paddle_inference_install_dir
![step2.2](../../images/inference_deployment/vs2019_step3.png)
-3. 点击:`项目`->`CMake设置`
+3. 点击:`项目`->`CMake 设置`
![step3](../../images/inference_deployment/vs2019_step4.png)
@@ -69,10 +81,10 @@ paddle_inference_install_dir
| ----------------------------- | ------------------ | ----------- |
| CMAKE_BACKWARDS_COMPATIBILITY | 3.17 | [√] |
| CMAKE_BUILD_TYPE | RelWithDebInfo | [√] |
-| CUDA_LIB | CUDA的库路径 | [√] |
-| CUDNN_LIB | CUDNN的库路径 | [√] |
-| OpenCV_DIR | OpenCV的安装路径 | [√] |
-| PADDLE_LIB | Paddle预测库的路径 | [√] |
+| CUDA_LIB | CUDA 的库路径 | [√] |
+| CUDNN_LIB | CUDNN 的库路径 | [√] |
+| OpenCV_DIR | OpenCV 的安装路径 | [√] |
+| PADDLE_LIB | Paddle 预测库的路径 | [√] |
| WITH_GPU | [√] | [√] |
| WITH_MKL | [√] | [√] |
| WITH_STATIC_LIB | [√] | [√] |
@@ -83,16 +95,16 @@ paddle_inference_install_dir
**注意**:
* `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`:该路径取决于CUDA与CUDNN的安装位置。
+ * `CUDA_LIB`和`CUDNN_LIB`:该路径取决于 CUDA 与 CUDNN 的安装位置。
* `OpenCV_DIR`:该路径下需要有`.cmake`文件,一般为`opencv/build/`;
* `PADDLE_LIB`:该路径下需要有`CMakeCache.txt`文件,一般为`paddle_inference_install_dir/`。
* 在使用 `CPU` 版预测库时,请不要勾选 `WITH_GPU` - `保存到 JSON`。
![step4](../../images/inference_deployment/vs2019_step5.png)
-设置完成后,点击上图中 `保存并生成CMake缓存以加载变量`。
+设置完成后,点击上图中 `保存并生成 CMake 缓存以加载变量`。
5. 点击`生成`->`全部生成`
@@ -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\` 目录下生成静态链接库文件,静态链接库文件可用于二次开发。
+
## 3. 预测
+
### 3.1 准备 inference model
首先需要准备 inference model,关于将模型导出为 inference model 的具体步骤,可以参考 [模型导出](./export_model.md) 文档。假设导出的预测模型文件放在 `./inference` 目录下,则目录结构如下。
@@ -114,16 +128,17 @@ inference/
**注意**:上述文件中,`cls_infer.pdmodel` 文件存储了模型网络结构信息,`cls_infer.pdiparams` 文件存储了模型参数权重信息。在运行预测时,注意两个文件的路径需要分别设置为配置文件 `tools/config.txt` 中的字段 `cls_model_path` 和 `cls_params_path` 的值。
+
### 3.2 运行预测
首先修改 `tools/config.txt` 中对应字段:
-* use_gpu:是否使用GPU;
-* gpu_id:使用的GPU卡号;
+* use_gpu:是否使用 GPU;
+* gpu_id:使用的 GPU 卡号;
* gpu_mem:显存;
* cpu_math_library_num_threads:底层科学计算库所用线程的数量;
-* use_mkldnn:是否使用MKLDNN加速;
-* use_tensorrt: 是否使用tensorRT进行加速;
-* use_fp16:是否使用半精度浮点数进行计算,该选项仅在use_tensorrt为true时有效;
+* use_mkldnn:是否使用 MKLDNN 加速;
+* use_tensorrt: 是否使用 tensorRT 进行加速;
+* use_fp16:是否使用半精度浮点数进行计算,该选项仅在 use_tensorrt 为 true 时有效;
* cls_model_path:预测模型结构文件路径;
* cls_params_path:预测模型参数文件路径;
* resize_short_size:预处理时图像缩放大小;
@@ -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`)为需要预测的图片路径。
注意,需要在配置文件中正确设置预测参数,包括所用模型文件的路径(`cls_model_path` 和 `cls_params_path`)。
-
-### 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);
* 如果需要使用 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)。