diff --git a/deploy/utils/predictor.py b/deploy/utils/predictor.py index 9a38ccd18981c1ddd5dfc75152fa1d31f71d2b06..948b1859870d622ad370de1935775b0179a606b7 100644 --- a/deploy/utils/predictor.py +++ b/deploy/utils/predictor.py @@ -60,8 +60,12 @@ class Predictor(object): config = Config(model_file, params_file) - if args.use_gpu: + if args.get("use_gpu", False): config.enable_use_gpu(args.gpu_mem, 0) + elif args.get("use_npu", False): + config.enable_npu() + elif args.get("use_xpu", False): + config.enable_xpu() else: config.disable_gpu() if args.enable_mkldnn: diff --git a/docs/images/quick_start/android_demo/android_nongfu_spring.JPG b/docs/images/quick_start/android_demo/android_nongfu_spring.JPG index e5bd2ac356e2d126e998d48ed2781ba1743fb242..9c1d4ffc87082dfb73c5634f3d5454f72f8c1d98 100644 Binary files a/docs/images/quick_start/android_demo/android_nongfu_spring.JPG and b/docs/images/quick_start/android_demo/android_nongfu_spring.JPG differ diff --git a/docs/zh_CN/PPShiTu/PPShiTuV2_introduction.md b/docs/zh_CN/PPShiTu/PPShiTuV2_introduction.md index 148a27eff7dba1a072c9c9b5b9ef5f747962e78f..31ceabb6ee6dc06060017005f0d40b7be9891100 100644 --- a/docs/zh_CN/PPShiTu/PPShiTuV2_introduction.md +++ b/docs/zh_CN/PPShiTu/PPShiTuV2_introduction.md @@ -2,154 +2,250 @@ ## 目录 -- [PP-ShiTuV2简介](#pp-shituv2简介) - - [数据集介绍](#数据集介绍) - - [模型训练](#模型训练) - - [模型评估](#模型评估) - - [模型推理](#模型推理) - - [模型部署](#模型部署) -- [模块介绍](#模块介绍) - - [主体检测模型](#主体检测模型) - - [特征提取模型](#特征提取模型) - - [训练数据集优化与扩充](#训练数据集优化与扩充) - - [骨干网络优化](#骨干网络优化) - - [网络结构优化](#网络结构优化) - - [数据增强优化](#数据增强优化) +- [1. PP-ShiTuV2模型和应用场景介绍](#1-pp-shituv2模型和应用场景介绍) +- [2. 模型快速体验](#2-模型快速体验) + - [2.1 PP-ShiTu android demo 快速体验](#21-pp-shitu-android-demo-快速体验) + - [2.2 命令行代码快速体验](#22-命令行代码快速体验) +- [3 模块介绍与训练](#3-模块介绍与训练) + - [3.1 主体检测](#31-主体检测) + - [3.2 特征提取](#32-特征提取) + - [3.3 向量检索](#33-向量检索) +- [4. 推理部署](#4-推理部署) + - [4.1 推理模型准备](#41-推理模型准备) + - [4.1.1 基于训练得到的权重导出 inference 模型](#411-基于训练得到的权重导出-inference-模型) + - [4.1.2 直接下载 inference 模型](#412-直接下载-inference-模型) + - [4.2 测试数据准备](#42-测试数据准备) + - [4.3 基于 Python 预测引擎推理](#43-基于-python-预测引擎推理) + - [4.3.1 预测单张图像](#431-预测单张图像) + - [4.3.2 基于文件夹的批量预测](#432-基于文件夹的批量预测) + - [4.3 基于 C++ 预测引擎推理](#43-基于-c-预测引擎推理) + - [4.4 服务化部署](#44-服务化部署) + - [4.5 端侧部署](#45-端侧部署) + - [4.6 Paddle2ONNX 模型转换与预测](#46-paddle2onnx-模型转换与预测) - [参考文献](#参考文献) -## PP-ShiTuV2简介 +## 1. PP-ShiTuV2模型和应用场景介绍 -PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别系统,相比 PP-ShiTuV1 具有更高的识别精度、更强的泛化能力以及相近的推理速度*。该系统主要针对**训练数据集**、特征提取两个部分进行优化,使用了更优的骨干网络、损失函数与训练策略。使得 PP-ShiTuV2 在多个实际应用场景上的检索性能有显著提升。 +PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别系统,由主体检测、特征提取、向量检索三个模块构成,相比 PP-ShiTuV1 具有更高的识别精度、更强的泛化能力以及相近的推理速度*。主要针对训练数据集、特征提取两个部分进行优化,使用了更优的骨干网络、损失函数与训练策略,使得 PP-ShiTuV2 在多个实际应用场景上的检索性能有显著提升。 + +**本文档提供了用户使用 PaddleClas 的 PP-ShiTuV2 图像识别方案进行快速构建轻量级、高精度、可落地的图像识别pipeline。该pipeline可以广泛应用于商场商品识别场景、安防人脸或行人识别场景、海量图像检索过滤等场景中。**
-### 数据集介绍 +下表列出了 PP-ShiTuV2 用不同的模型结构与训练策略所得到的相关指标, -我们将训练数据进行了合理扩充与优化,更多细节请参考 [PP-ShiTuV2 数据集](../image_recognition_pipeline/feature_extraction.md#4-实验部分)。 +| 模型 | 存储(主体检测+特征提取) | product | +| :--------- | :---------------------- | :------------------ | +| | | recall@1 | +| PP-ShiTuV1 | 64(30+34)MB | 66.8% | +| PP-ShiTuV2 | 49(30+19) | 73.8% | -下面以 [PP-ShiTuV2](../image_recognition_pipeline/feature_extraction.md#4-实验部分) 的数据集为例,介绍 PP-ShiTuV2 模型的训练、评估、推理流程。 +**注:** +- recall及mAP指标的介绍可以参考 [常用指标](../algorithm_introduction/reid.md#22-常用指标)。 +- 延时是基于 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 测试得到,开启 MKLDNN 加速策略,线程数为10。 -### 模型训练 +## 2. 模型快速体验 -首先下载好 [PP-ShiTuV2 数据集](../image_recognition_pipeline/feature_extraction.md#4-实验部分) 中的17个数据集并手动进行合并、生成标注文本文件 `train_reg_all_data_v2.txt`,最后放置到 `dataset` 目录下。 +### 2.1 PP-ShiTu android demo 快速体验 -合并后的文件夹结构如下所示: +可以通过扫描二维码或者 [点击链接](https://paddle-imagenet-models-name.bj.bcebos.com/demos/PP-ShiTu.apk) 下载并安装APP -```python -dataset/ -├── Aliproduct/ # Aliproduct数据集文件夹 -├── SOP/ # SOPt数据集文件夹 -├── ... -├── Products-10k/ # Products-10k数据集文件夹 -├── ... -└── train_reg_all_data_v2.txt # 标注文本文件 -``` -生成的 `train_reg_all_data_v2.txt` 内容如下所示: +
-```log -... -Aliproduct/train/50029/1766228.jpg 50029 -Aliproduct/train/50029/1764348.jpg 50029 -... -Products-10k/train/88823.jpg 186440 -Products-10k/train/88824.jpg 186440 -... -``` +然后将以下体验图片保存到手机上: -然后在终端运行以下命令进行训练: +
-```shell -# 使用0号GPU进行单卡训练 -export CUDA_VISIBLE_DEVICES=0 -python3.7 tools/train.py \ --c ./ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml - -# 使用0,1,2,3,4,5,6,7号GPU进行8卡分布式训练 -export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 -python3.7 -m paddle.distributed.launch tools/train.py \ --c ./ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml -``` -**注:** 在训练时默认会开启`eval_during_train`,每训练完 `eval_interval` 个epoch就会在配置文件中 `Eval` 指定的数据集上(默认为 Aliproduct )进行模型评估并计算得到参考指标。 +打开安装好的APP,点击下方“**本地识别**”按钮,选择上面这张保存的图片,再点击确定,就能得到如下识别结果: + +
-### 模型评估 +### 2.2 命令行代码快速体验 -参考 [模型评估](../image_recognition_pipeline/feature_extraction.md#53-模型评估) +- 首先按照以下命令,安装paddlepaddle和faiss + ```shell + # 如果您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装 + python3.7 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple -### 模型推理 + # 如果您的机器是CPU,请运行以下命令安装 + python3.7 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple -参考 [Python模型推理](../quick_start/quick_start_recognition.md#22-图像识别体验) 和 [C++ 模型推理](../../../deploy/cpp_shitu/readme.md) + # 安装 faiss 库 + python3.7 -m pip install faiss-cpu==1.7.1post2 + ``` -### 模型部署 +- 然后按照以下命令,安装paddleclas whl包 + ```shell + # 进入到PaddleClas根目录下 + cd PaddleClas -参考 [模型部署](../inference_deployment/recognition_serving_deploy.md#3-图像识别服务部署) + # 安装paddleclas + python3.7 setup.py install + ``` -## 模块介绍 +- 然后执行以下命令下载并解压好demo数据,最后执行一行命令体验图像识别 -### 主体检测模型 + ```shell + # 下载并解压demo数据 + wget -nc https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v2.0.tar && tar -xf drink_dataset_v2.0.tar -主体检测模型使用 `PicoDet-LCNet_x2_5`,详细信息参考:[picodet_lcnet_x2_5_640_mainbody](../image_recognition_pipeline/mainbody_detection.md)。 + # 执行识别命令 + paddleclas \ + --model_name=PP-ShiTuV2 \ + --infer_imgs=./drink_dataset_v2.0/test_images/100.jpeg \ + --index_dir=./drink_dataset_v2.0/index/ \ + --data_file=./drink_dataset_v2.0/gallery/drink_label.txt + ``` -### 特征提取模型 +## 3 模块介绍与训练 -#### 训练数据集优化与扩充 +### 3.1 主体检测 -在 PP-ShiTuV1 所用训练数据集的基础上,我们去掉了使用范围较小的 iCartoonFace 数据集,同时加入了更多常见、使用范围更广的数据集,如 bird400、Cars、Products-10k、fruits-262。 +主体检测是目前应用非常广泛的一种检测技术,它指的是检测出图片中一个或者多个主体的坐标位置,然后将图像中的对应区域裁剪下来进行识别。主体检测是识别任务的前序步骤,输入图像经过主体检测后再进行识别,可以过滤复杂背景,有效提升识别精度。 -#### 骨干网络优化 +考虑到检测速度、模型大小、检测精度等因素,最终选择 PaddleDetection 自研的轻量级模型 `PicoDet-LCNet_x2_5` 作为 PP-ShiTuV2 的主体检测模型 -我们将骨干网络从 `PPLCNet_x2_5` 替换成了 [`PPLCNetV2_base`](../models/PP-LCNetV2.md),相比 `PPLCNet_x2_5`, `PPLCNetV2_base` 基本保持了较高的分类精度,并减少了40%的推理时间*。 +主体检测模型的数据集、训练、评估、推理等详细信息可以参考文档:[picodet_lcnet_x2_5_640_mainbody](../image_recognition_pipeline/mainbody_detection.md)。 + +### 3.2 特征提取 + +特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的 [向量检索](./vector_search.md) 。考虑到特征提取模型的速度、模型大小、特征提取性能等因素,最终选择 PaddleClas 自研的 [`PPLCNetV2_base`](../models/PP-LCNetV2.md) 作为特征提取网络。相比 PP-ShiTuV1 所使用的 `PPLCNet_x2_5`, `PPLCNetV2_base` 基本保持了较高的分类精度,并减少了40%的推理时间*。 **注:** *推理环境基于 Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz 硬件平台,OpenVINO 推理平台。 -#### 网络结构优化 +在实验过程中我们也发现可以对 `PPLCNetV2_base` 进行适当的改进,在保持速度基本不变的情况下,让其在识别任务中得到更高的性能,包括:去掉 `PPLCNetV2_base` 末尾的 `ReLU` 和 `FC`、将最后一个 stage(RepDepthwiseSeparable) 的 stride 改为1。 + +特征提取模型的数据集、训练、评估、推理等详细信息可以参考文档:[PPLCNetV2_base_ShiTu](../image_recognition_pipeline/feature_extraction.md)。 -我们对 `PPLCNetV2_base` 结构做了微调,并加入了在行人重检测、地标检索、人脸识别等任务上较为通用有效的优化调整。主要包括以下几点: +### 3.3 向量检索 -1. `PPLCNetV2_base` 结构微调:实验发现网络末尾的 [`ReLU`](../../../ppcls/arch/backbone/legendary_models/pp_lcnet_v2.py#L322) 对检索性能有较大影响, [`FC`](../../../ppcls/arch/backbone/legendary_models/pp_lcnet_v2.py#L325) 也会导致检索性能轻微掉点,因此我们去掉了 BackBone 末尾的 `ReLU` 和 `FC`。 +向量检索技术在图像识别、图像检索中应用比较广泛。其主要目标是对于给定的查询向量,在已经建立好的向量库中进行特征向量的相似度或距离计算,返回候选向量的相似度排序结果。 -2. `last stride=1`:只将最后一个 stage 的 stride 改为1,即不进行下采样,以此增加最后输出的特征图的语义信息,同时不对推理速度产生太大影响。 +在 PP-ShiTuV2 识别系统中,我们使用了 [Faiss](https://github.com/facebookresearch/faiss) 向量检索开源库对此部分进行支持,其具有适配性好、安装方便、算法丰富、同时支持CPU与GPU的优点。 -3. `BN Neck`:在全局池化层后加入一个 `BatchNorm1D` 结构,对特征向量的每个维度进行标准化,使得模型更快地收敛。 +PP-ShiTuV2 系统中关于 Faiss 向量检索库的安装及使用可以参考文档:[vector search](../image_recognition_pipeline/vector_search.md)。 + +## 4. 推理部署 + +### 4.1 推理模型准备 +Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用 MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于 Paddle Inference 推理引擎的介绍,可以参考 [Paddle Inference官网教程](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/infer/inference/inference_cn.html)。 + +当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型。本案例提供了两种获得 inference 模型的方法,如果希望得到和文档相同的结果,请选择 [直接下载 inference 模型](#412-直接下载-inference-模型) 的方式。 + +#### 4.1.1 基于训练得到的权重导出 inference 模型 +- 主体检测模型权重导出请参考文档 [主体检测推理模型准备](../image_recognition_pipeline/mainbody_detection.md#41-推理模型准备),或者参照 [4.1.2](#412-直接下载-inference-模型) 直接下载解压即可。 + +- 特征提取模型权重导出可以参考以下命令: + ```shell + python3.7 tools/export_model.py \ + -c ./ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml \ + -o Global.pretrained_model="https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/PPShiTuV2/general_PPLCNetV2_base_pretrained_v1.0.pdparams" \ + -o Global.save_inference_dir=deploy/models/GeneralRecognitionV2_PPLCNetV2_base` + ``` + 执行完该脚本后会在 `deploy/models/` 下生成 `GeneralRecognitionV2_PPLCNetV2_base` 文件夹,具有如下文件结构: + + ```log + deploy/models/ + ├── GeneralRecognitionV2_PPLCNetV2_base + │ ├── inference.pdiparams + │ ├── inference.pdiparams.info + │ └── inference.pdmodel + ``` + +#### 4.1.2 直接下载 inference 模型 + +[4.1.1 小节](#411-基于训练得到的权重导出-inference-模型) 提供了导出 inference 模型的方法,此处提供我们导出好的 inference 模型,可以按以下命令,下载模型到指定位置解压进行体验。 + +```shell +cd deploy/models + +# 下载主体检测inference模型并解压 +wget -nc https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.tar && tar -xf picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.tar + +# 下载特征提取inference模型并解压 +wget -nc https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/PP-ShiTuV2/general_PPLCNetV2_base_pretrained_v1.0_infer.tar && tar -xf general_PPLCNetV2_base_pretrained_v1. +``` - | 模型 | training data | recall@1%(mAP%) | - | :----------------------------------------------------------------- | :---------------- | :-------------- | - | PP-ShiTuV1 | PP-ShiTuV1 数据集 | 63.0(51.5) | - | PP-ShiTuV1+`PPLCNetV2_base`+`last_stride=1`+`BNNeck`+`TripletLoss` | PP-ShiTuV1 数据集 | 72.3(60.5) | +### 4.2 测试数据准备 -4. `TripletAngularMarginLoss`:我们基于原始的 `TripletLoss` (困难三元组损失)进行了改进,将优化目标从 L2 欧几里得空间更换成余弦空间,并额外加入了 anchor 与 positive/negtive 之间的硬性距离约束,让训练与测试的目标更加接近,提升模型的泛化能力。 +准备好主体检测、特征提取模型之后,还需要准备作为输入的测试数据,可以执行以下命令下载并解压测试数据。 - | 模型 | training data | recall@1%(mAP%) | - | :------------------------------------------------------------------------------ | :---------------- | :-------------- | - | PP-ShiTuV1+`PPLCNetV2_base`+`last_stride=1`+`BNNeck`+`TripletLoss` | PP-ShiTuV2 数据集 | 71.9(60.2) | - | PP-ShiTuV1+`PPLCNetV2_base`+`last_stride=1`+`BNNeck`+`TripletAngularMarginLoss` | PP-ShiTuV2 数据集 | 73.7(61.0) | +```shell +# 返回deploy +cd ../ + +# 下载测试数据drink_dataset_v2.0,并解压 +wget -nc https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v2.0.tar && tar -xf drink_dataset_v2.0.tar +``` + +### 4.3 基于 Python 预测引擎推理 + +#### 4.3.1 预测单张图像 + +然后执行以下命令对单张图像 `./drink_dataset_v2.0/test_images/100.jpeg` 进行识别。 + +```shell +# 执行下面的命令使用 GPU 进行预测 +python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.infer_imgs="./drink_dataset_v2.0/test_images/100.jpeg" + +# 执行下面的命令使用 CPU 进行预测 +python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.infer_imgs="./drink_dataset_v2.0/test_images/100.jpeg" -o Global.use_gpu=False +``` + +最终输出结果如下。 + +```log +[{'bbox': [437, 71, 660, 728], 'rec_docs': '元气森林', 'rec_scores': 0.7740249}, {'bbox': [221, 72, 449, 701], 'rec_docs': '元气森林', 'rec_scores': 0.6950992}, {'bbox': [794, 104, 979, 652], 'rec_docs': '元气森林', 'rec_scores': 0.6305153}] +``` + +#### 4.3.2 基于文件夹的批量预测 + +如果希望预测文件夹内的图像,可以直接修改配置文件中的 Global.infer_imgs 字段,也可以通过下面的 -o 参数修改对应的配置。 + +```shell +# 使用下面的命令使用 GPU 进行预测 +python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.infer_imgs="./drink_dataset_v2.0/test_images" +# 使用下面的命令使用 CPU 进行预测 +python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.infer_imgs="./drink_dataset_v2.0/test_images" -o Global.use_gpu=False +``` + +终端中会输出该文件夹内所有图像的分类结果,如下所示。 + +```log +... +[{'bbox': [0, 0, 600, 600], 'rec_docs': '红牛-强化型', 'rec_scores': 0.74081033}] +Inference: 120.39852142333984 ms per batch image +[{'bbox': [0, 0, 514, 436], 'rec_docs': '康师傅矿物质水', 'rec_scores': 0.6918598}] +Inference: 32.045602798461914 ms per batch image +[{'bbox': [138, 40, 573, 1198], 'rec_docs': '乐虎功能饮料', 'rec_scores': 0.68214047}] +Inference: 113.41428756713867 ms per batch image +[{'bbox': [328, 7, 467, 272], 'rec_docs': '脉动', 'rec_scores': 0.60406065}] +Inference: 122.04337120056152 ms per batch image +[{'bbox': [242, 82, 498, 726], 'rec_docs': '味全_每日C', 'rec_scores': 0.5428652}] +Inference: 37.95266151428223 ms per batch image +[{'bbox': [437, 71, 660, 728], 'rec_docs': '元气森林', 'rec_scores': 0.7740249}, {'bbox': [221, 72, 449, 701], 'rec_docs': '元气森林', 'rec_scores': 0.6950992}, {'bbox': [794, 104, 979, 652], 'rec_docs': '元气森林', 'rec_scores': 0.6305153}] +... +``` -#### 数据增强优化 +其中 `bbox` 表示检测出的主体所在位置,`rec_docs` 表示索引库中与检测框最为相似的类别,`rec_scores` 表示对应的相似度。 -我们考虑到实际相机拍摄时目标主体可能出现一定的旋转而不一定能保持正立状态,因此我们在数据增强中加入了适当的 [随机旋转增强](../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L117),以提升模型在真实场景中的检索能力。 +### 4.3 基于 C++ 预测引擎推理 +PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考 [服务器端 C++ 预测](../../../deploy/cpp_shitu/readme.md) 来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考 [基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md) 完成相应的预测库编译和模型预测工作。 -结合以上3个优化点,最终在多个数据集的实验结果如下: +### 4.4 服务化部署 +Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考 [Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。 - | 模型 | product* | - | :--------- | :------------------ | - | - | recall@1%(mAP%) | - | PP-ShiTuV1 | 63.0(51.5) | - | PP-ShiTuV2 | 73.7(61.0) | +PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考 [模型服务化部署](../inference_deployment/recognition_serving_deploy.md) 来完成相应的部署工作。 - | 模型 | Aliproduct | VeRI-Wild | LogoDet-3k | iCartoonFace | SOP | Inshop | - | :--------- | :-------------- | :-------------- | :-------------- | :-------------- | :-------------- | :-------------- | - | - | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | - | PP-ShiTuV1 | 83.9(83.2) | 88.7(60.1) | 86.1(73.6) | 84.1(72.3) | 79.7(58.6) | 89.1(69.4) | - | PP-ShiTuV2 | 84.2(83.3) | 87.8(68.8) | 88.0(63.2) | 53.6(27.5) | 77.6(55.3) | 90.8(74.3) | +### 4.5 端侧部署 +Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考 [Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。 - | 模型 | gldv2 | imdb_face | iNat | instre | sketch | sop* | - | :--------- | :-------------- | :-------------- | :-------------- | :-------------- | :-------------- | :-------------- | - | - | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | - | PP-ShiTuV1 | 98.2(91.6) | 28.8(8.42) | 12.6(6.1) | 72.0(50.4) | 27.9(9.5) | 97.6(90.3) | - | PP-ShiTuV2 | 98.1(90.5) | 35.9(11.2) | 38.6(23.9) | 87.7(71.4) | 39.3(15.6) | 98.3(90.9) | +### 4.6 Paddle2ONNX 模型转换与预测 +Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考 [Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。 -**注:** product数据集是为了验证PP-ShiTu的泛化性能而制作的数据集,所有的数据都没有在训练和测试集中出现。该数据包含8个大类(人脸、化妆品、地标、红酒、手表、车、运动鞋、饮料),299个小类。测试时,使用299个小类的标签进行测试;sop数据集来自[GPR1200: A Benchmark for General-Purpose Content-Based Image Retrieval](https://arxiv.org/abs/2111.13122),可视为“SOP”数据集的子集。 +PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考 [Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md) 来完成相应的部署工作。 ## 参考文献 1. Schall, Konstantin, et al. "GPR1200: A Benchmark for General-Purpose Content-Based Image Retrieval." International Conference on Multimedia Modeling. Springer, Cham, 2022. diff --git a/docs/zh_CN/image_recognition_pipeline/feature_extraction.md b/docs/zh_CN/image_recognition_pipeline/feature_extraction.md index 0ae9f8bf913831440cdf6e5e51bc59dd357e9a15..f037dc25a72f2d0f452194fe15879b8c7edced90 100644 --- a/docs/zh_CN/image_recognition_pipeline/feature_extraction.md +++ b/docs/zh_CN/image_recognition_pipeline/feature_extraction.md @@ -10,6 +10,7 @@ - [3.2 Neck](#32-neck) - [3.3 Head](#33-head) - [3.4 Loss](#34-loss) + - [3.5 Data Augmentation](#35-data-augmentation) - [4. 实验部分](#4-实验部分) - [5. 自定义特征提取](#5-自定义特征提取) - [5.1 数据准备](#51-数据准备) @@ -46,11 +47,14 @@ #### 3.1 Backbone -Backbone 部分采用了 [PP-LCNetV2_base](../models/PP-LCNetV2.md),其针对Intel CPU端的性能优化探索了多个有效的结构设计方案,最终实现了在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的 SOTA 模型。 +Backbone 部分采用了 [PP-LCNetV2_base](../models/PP-LCNetV2.md),其在 `PPLCNet_V1` 的基础上,加入了包括Rep 策略、PW 卷积、Shortcut、激活函数改进、SE 模块改进等多个优化点,使得最终分类精度与 `PPLCNet_x2_5` 相近,且推理延时减少了40%*。在实验过程中我们对 `PPLCNetV2_base` 进行了适当的改进,在保持速度基本不变的情况下,让其在识别任务中得到更高的性能,包括:去掉 `PPLCNetV2_base` 末尾的 `ReLU` 和 `FC`、将最后一个 stage(RepDepthwiseSeparable) 的 stride 改为1。 + + +**注:** *推理环境基于 Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz 硬件平台,OpenVINO 推理平台。 #### 3.2 Neck -Neck 部分采用了 [BN Neck](../../../ppcls/arch/gears/bnneck.py),对 Backbone 抽取得到的特征的每个维度进行标准化操作,减少了同时优化度量学习损失和分类损失的难度。 +Neck 部分采用了 [BN Neck](../../../ppcls/arch/gears/bnneck.py),对 Backbone 抽取得到的特征的每个维度进行标准化操作,减少了同时优化度量学习损失函数和分类损失函数的难度,加快收敛速度。 #### 3.3 Head @@ -58,13 +62,17 @@ Head 部分选用 [FC Layer](../../../ppcls/arch/gears/fc.py),使用分类头 #### 3.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)。 +Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py) 和 [TripletAngularMarginLoss](../../../ppcls/loss/tripletangularmarginloss.py),在训练时以分类损失和基于角度的三元组损失来指导网络进行优化。我们基于原始的 TripletLoss (困难三元组损失)进行了改进,将优化目标从 L2 欧几里得空间更换成余弦空间,并加入了 anchor 与 positive/negtive 之间的硬性距离约束,让训练与测试的目标更加接近,提升模型的泛化能力。详细的配置文件见 [GeneralRecognitionV2_PPLCNetV2_base.yaml](../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L63-77)。 + +#### 3.5 Data Augmentation + +我们考虑到实际相机拍摄时目标主体可能出现一定的旋转而不一定能保持正立状态,因此我们在数据增强中加入了适当的 [随机旋转增强](../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L117),以提升模型在真实场景中的检索能力。 ## 4. 实验部分 -我们对原有的训练数据进行了合理扩充与优化,最终使用如下 16 个公开数据集的汇总: +我们对原有的训练数据进行了合理扩充与优化,最终使用如下 17 个公开数据集的汇总: | 数据集 | 数据量 | 类别数 | 场景 | 数据集地址 | | :--------------------- | :-----: | :------: | :---: | :----------------------------------------------------------------------------------: | @@ -89,16 +97,13 @@ Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py) 和 [Tripl 最终的模型精度指标如下表所示: - | 模型 | Aliproduct | VeRI-Wild | LogoDet-3k | iCartoonFace | SOP | Inshop | - | :--------- | :-------------- | :-------------- | :-------------- | :-------------- | :-------------- | :-------------- | - | - | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | - | PP-ShiTuV2 | 84.2(83.3) | 87.8(68.8) | 88.0(63.2) | 53.6(27.5) | 77.6(55.3) | 90.8(74.3) | - - | 模型 | gldv2 | imdb_face | iNat | instre | sketch | sop* | - | :--------- | :-------------- | :-------------- | :-------------- | :-------------- | :-------------- | :-------------- | - | - | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | recall@1%(mAP%) | - | PP-ShiTuV2 | 98.1(90.5) | 35.9(11.2) | 38.6(23.9) | 87.7(71.4) | 39.3(15.6) | 98.3(90.9) | +| 模型 | 延时(ms) | 存储(MB) | product* | | Aliproduct | | VeRI-Wild | | LogoDet-3k | | iCartoonFace | | SOP | | Inshop | | gldv2 | | imdb_face | | iNat | | instre | | sketch | | sop | | +| :--------------------- | :------- | :------- | :------------------ | :--- | ---------- | ---- | --------- | ---- | ---------- | ---- | ------------ | ---- | -------- | ---- | -------- | ---- | -------- | ---- | --------- | ---- | -------- | ---- | -------- | ---- | -------- | ---- | -------- | ---- | +| | | | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | recall@1 | mAP | +| PP-ShiTuV1_general_rec | 5.0 | 34 | 65.9 | 54.3 | 83.9 | 83.2 | 88.7 | 60.1 | 86.1 | 73.6 | 84.1 | 72.3 | 79.7 | 58.6 | 89.1 | 69.4 | 98.2 | 91.6 | 28.8 | 8.42 | 12.6 | 6.1 | 72.0 | 50.4 | 27.9 | 9.5 | 97.6 | 90.3 | +| PP-ShiTuV2_general_rec | 6.1 | 19 | 73.7 | 61.0 | 84.2 | 83.3 | 87.8 | 68.8 | 88.0 | 63.2 | 53.6 | 27.5 | 77.6 | 55.3 | 90.8 | 74.3 | 98.1 | 90.5 | 35.9 | 11.2 | 38.6 | 23.9 | 87.7 | 71.4 | 39.3 | 15.6 | 98.3 | 90.9 | +* product数据集是为了验证PP-ShiTu的泛化性能而制作的数据集,所有的数据都没有在训练和测试集中出现。该数据包含7个大类(化妆品、地标、红酒、手表、车、运动鞋、饮料),250个小类。测试时,使用250个小类的标签进行测试;sop数据集来自[GPR1200: A Benchmark for General-Purpose Content-Based Image Retrieval](https://arxiv.org/abs/2111.13122),可视为“SOP”数据集的子集。 * 预训练模型地址:[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` 与 `mAP` * 速度评测机器的 CPU 具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz` diff --git a/docs/zh_CN/inference_deployment/export_model.md b/docs/zh_CN/inference_deployment/export_model.md index 4e2d98e9310602b4df7c0bedee32be88b7cf8fef..e7c204112d742bc8426c9e212b7b47ba232944c8 100644 --- a/docs/zh_CN/inference_deployment/export_model.md +++ b/docs/zh_CN/inference_deployment/export_model.md @@ -46,7 +46,7 @@ python tools/export_model.py \ ## 3. 主体检测模型导出 -主体检测模型的导出,可以参考[主题检测介绍](../image_recognition_pipeline/mainbody_detection.md)。 +主体检测模型的导出,可以参考[主体检测介绍](../image_recognition_pipeline/mainbody_detection.md)。 ## 4. 识别模型导出 diff --git a/docs/zh_CN/quick_start/quick_start_recognition.md b/docs/zh_CN/quick_start/quick_start_recognition.md index 72b8d7000f13a6de2c2b3ebe61798d8e5dc801af..daceda4477d58272382178b9370f934e4b7afa17 100644 --- a/docs/zh_CN/quick_start/quick_start_recognition.md +++ b/docs/zh_CN/quick_start/quick_start_recognition.md @@ -122,7 +122,9 @@ 注意:由于部分解压缩软件在解压上述 `tar` 格式文件时存在问题,建议非命令行用户下载 `zip` 格式文件并解压。`tar` 格式文件建议使用命令 `tar -xf xxx.tar` 解压。 -本章节 demo 数据下载地址如下: [drink_dataset_v2.0.tar(瓶装饮料数据)](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v2.0.tar)。 +本章节 demo 数据下载地址如下: [drink_dataset_v2.0.tar(瓶装饮料数据)](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v2.0.tar), + +下面以 **drink_dataset_v2.0.tar** 为例介绍PC端的 PP-ShiTu 快速体验流程。用户也可以自行下载并解压其它场景的数据进行体验:[22种场景数据下载](../introduction/ppshitu_application_scenarios.md#1-应用场景介绍)。 如果希望体验服务端主体检测和各垂类方向的识别模型,可以参考 [2.4 服务端识别模型列表](#24-服务端识别模型列表) diff --git a/test_tipc/test_train_inference_python_npu.sh b/test_tipc/test_train_inference_python_npu.sh new file mode 100644 index 0000000000000000000000000000000000000000..bc6386b75dd9c74a100989b5f5ac0e81e4aadca1 --- /dev/null +++ b/test_tipc/test_train_inference_python_npu.sh @@ -0,0 +1,46 @@ +#!/bin/bash +source test_tipc/common_func.sh + +function readlinkf() { + perl -MCwd -e 'print Cwd::abs_path shift' "$1"; +} + +function func_parser_config() { + strs=$1 + IFS=" " + array=(${strs}) + tmp=${array[2]} + echo ${tmp} +} + +BASEDIR=$(dirname "$0") +REPO_ROOT_PATH=$(readlinkf ${BASEDIR}/../) + +FILENAME=$1 + +# change gpu to npu in tipc txt configs +sed -i "s/Global.device:gpu/Global.device:npu/g" $FILENAME +sed -i "s/Global.use_gpu/Global.use_npu/g" $FILENAME +dataline=`cat $FILENAME` + +# parser params +IFS=$'\n' +lines=(${dataline}) + +# replace inference config file +inference_py=$(func_parser_value "${lines[39]}") +inference_config=$(func_parser_config ${inference_py}) +sed -i 's/use_gpu: True/use_npu: True/g' "$REPO_ROOT_PATH/deploy/$inference_config" + +# replace training config file +grep -n 'tools/.*yaml' $FILENAME | cut -d ":" -f 1 \ +| while read line_num ; do + train_cmd=$(func_parser_value "${lines[line_num-1]}") + trainer_config=$(func_parser_config ${train_cmd}) + sed -i 's/device: gpu/device: npu/g' "$REPO_ROOT_PATH/$trainer_config" +done + +# pass parameters to test_train_inference_python.sh +cmd="bash test_tipc/test_train_inference_python.sh ${FILENAME} $2" +echo $cmd +eval $cmd diff --git a/test_tipc/test_train_inference_python_xpu.sh b/test_tipc/test_train_inference_python_xpu.sh new file mode 100644 index 0000000000000000000000000000000000000000..24968b1688e788adb1414e2f44d55b11e174d4fc --- /dev/null +++ b/test_tipc/test_train_inference_python_xpu.sh @@ -0,0 +1,46 @@ +#!/bin/bash +source test_tipc/common_func.sh + +function readlinkf() { + perl -MCwd -e 'print Cwd::abs_path shift' "$1"; +} + +function func_parser_config() { + strs=$1 + IFS=" " + array=(${strs}) + tmp=${array[2]} + echo ${tmp} +} + +BASEDIR=$(dirname "$0") +REPO_ROOT_PATH=$(readlinkf ${BASEDIR}/../) + +FILENAME=$1 + +# change gpu to xpu in tipc txt configs +sed -i "s/Global.device:gpu/Global.device:xpu/g" $FILENAME +sed -i "s/Global.use_gpu/Global.use_xpu/g" $FILENAME +dataline=`cat $FILENAME` + +# parser params +IFS=$'\n' +lines=(${dataline}) + +# replace inference config file +inference_py=$(func_parser_value "${lines[39]}") +inference_config=$(func_parser_config ${inference_py}) +sed -i 's/use_gpu: True/use_xpu: True/g' "$REPO_ROOT_PATH/deploy/$inference_config" + +# replace training config file +grep -n 'tools/.*yaml' $FILENAME | cut -d ":" -f 1 \ +| while read line_num ; do + train_cmd=$(func_parser_value "${lines[line_num-1]}") + trainer_config=$(func_parser_config ${train_cmd}) + sed -i 's/device: gpu/device: xpu/g' "$REPO_ROOT_PATH/$trainer_config" +done + +# pass parameters to test_train_inference_python.sh +cmd="bash test_tipc/test_train_inference_python.sh ${FILENAME} $2" +echo $cmd +eval $cmd