From 6c4852acd353fad84f5fd7a51a9a7d8f29048790 Mon Sep 17 00:00:00 2001
From: HydrogenSulfate <490868991@qq.com>
Date: Thu, 1 Sep 2022 06:31:22 +0000
Subject: [PATCH] update PP-ShiTuV2 inference/serving code and docs, reformat
yamls
---
deploy/cpp_shitu/readme.md | 312 ++++++++++--------
deploy/paddleserving/recognition/config.yml | 7 +-
.../recognition/pipeline_http_client.py | 11 +-
.../recognition/recognition_web_service.py | 29 +-
.../feature_extraction.md | 6 +-
.../recognition_serving_deploy.md | 36 +-
.../GeneralRecognition_PPLCNet_x2_5.yaml | 18 +-
7 files changed, 227 insertions(+), 192 deletions(-)
diff --git a/deploy/cpp_shitu/readme.md b/deploy/cpp_shitu/readme.md
index 97315ec3..84886a05 100644
--- a/deploy/cpp_shitu/readme.md
+++ b/deploy/cpp_shitu/readme.md
@@ -1,6 +1,6 @@
# 服务器端C++预测
-本教程将介绍在服务器端部署PP-ShiTU的详细步骤。
+本教程将介绍在服务器端部署PP-ShiTu的详细步骤。
## 目录
@@ -30,39 +30,39 @@
- 下载最新版本cmake
-```shell
-# 当前版本最新为3.22.0,根据实际情况自行下载,建议最新版本
-wget https://github.com/Kitware/CMake/releases/download/v3.22.0/cmake-3.22.0.tar.gz
-tar xf cmake-3.22.0.tar.gz
-```
+ ```shell
+ # 当前版本最新为3.22.0,根据实际情况自行下载,建议最新版本
+ wget https://github.com/Kitware/CMake/releases/download/v3.22.0/cmake-3.22.0.tar.gz
+ tar -xf cmake-3.22.0.tar.gz
+ ```
-最终可以在当前目录下看到`cmake-3.22.0/`的文件夹。
+ 最终可以在当前目录下看到`cmake-3.22.0/`的文件夹。
-- 编译cmake,首先设置came源码路径(`root_path`)以及安装路径(`install_path`),`root_path`为下载的came源码路径,`install_path`为came的安装路径。在本例中,源码路径即为当前目录下的`cmake-3.22.0/`。
+- 编译cmake,首先设置cmake源码路径(`root_path`)以及安装路径(`install_path`),`root_path`为下载的cmake源码路径,`install_path`为cmake的安装路径。在本例中,源码路径即为当前目录下的`cmake-3.22.0/`。
-```shell
-cd ./cmake-3.22.0
-export root_path=$PWD
-export install_path=${root_path}/cmake
-```
+ ```shell
+ cd ./cmake-3.22.0
+ export root_path=$PWD
+ export install_path=${root_path}/cmake
+ ```
-- 然后在cmake源码路径下,按照下面的方式进行编译
+- 然后在cmake源码路径下,执行以下命令进行编译
-```shell
-./bootstrap --prefix=${install_path}
-make -j
-make install
-```
+ ```shell
+ ./bootstrap --prefix=${install_path}
+ make -j
+ make install
+ ```
-- 设置环境变量
+- 编译安装cmake完成后,设置cmake的环境变量供后续程序使用
-```shell
-export PATH=${install_path}/bin:$PATH
-#检查是否正常使用
-cmake --version
-```
+ ```shell
+ export PATH=${install_path}/bin:$PATH
+ #检查是否正常使用
+ cmake --version
+ ```
-此时,cmake就可以使用了
+此时cmake就可以正常使用了
@@ -70,61 +70,66 @@ cmake --version
* 首先需要从opencv官网上下载在Linux环境下源码编译的包,以3.4.7版本为例,下载及解压缩命令如下:
-```
-wget https://github.com/opencv/opencv/archive/3.4.7.tar.gz
-tar -xvf 3.4.7.tar.gz
-```
+ ```shell
+ wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/test/opencv-3.4.7.tar.gz
+ tar -xvf 3.4.7.tar.gz
+ ```
-最终可以在当前目录下看到`opencv-3.4.7/`的文件夹。
+ 最终可以在当前目录下看到`opencv-3.4.7/`的文件夹。
* 编译opencv,首先设置opencv源码路径(`root_path`)以及安装路径(`install_path`),`root_path`为下载的opencv源码路径,`install_path`为opencv的安装路径。在本例中,源码路径即为当前目录下的`opencv-3.4.7/`。
-```shell
-cd ./opencv-3.4.7
-export root_path=$PWD
-export install_path=${root_path}/opencv3
-```
-
-* 然后在opencv源码路径下,按照下面的方式进行编译。
+ ```shell
+ # 进入deploy/cpp_shitu目录
+ cd deploy/cpp_shitu
-```shell
-rm -rf build
-mkdir build
-cd build
+ # 安装opencv
+ cd ./opencv-3.4.7
+ export root_path=$PWD
+ export install_path=${root_path}/opencv3
+ ```
-cmake .. \
- -DCMAKE_INSTALL_PREFIX=${install_path} \
- -DCMAKE_BUILD_TYPE=Release \
- -DBUILD_SHARED_LIBS=OFF \
- -DWITH_IPP=OFF \
- -DBUILD_IPP_IW=OFF \
- -DWITH_LAPACK=OFF \
- -DWITH_EIGEN=OFF \
- -DCMAKE_INSTALL_LIBDIR=lib64 \
- -DWITH_ZLIB=ON \
- -DBUILD_ZLIB=ON \
- -DWITH_JPEG=ON \
- -DBUILD_JPEG=ON \
- -DWITH_PNG=ON \
- -DBUILD_PNG=ON \
- -DWITH_TIFF=ON \
- -DBUILD_TIFF=ON
+* 然后在opencv源码路径下,按照下面的方式进行编译。
-make -j
-make install
-```
+ ```shell
+ rm -rf build
+ mkdir build
+ cd build
+
+ cmake .. \
+ -DCMAKE_INSTALL_PREFIX=${install_path} \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DBUILD_SHARED_LIBS=OFF \
+ -DWITH_IPP=OFF \
+ -DBUILD_IPP_IW=OFF \
+ -DWITH_LAPACK=OFF \
+ -DWITH_EIGEN=OFF \
+ -DCMAKE_INSTALL_LIBDIR=lib64 \
+ -DWITH_ZLIB=ON \
+ -DBUILD_ZLIB=ON \
+ -DWITH_JPEG=ON \
+ -DBUILD_JPEG=ON \
+ -DWITH_PNG=ON \
+ -DBUILD_PNG=ON \
+ -DWITH_TIFF=ON \
+ -DBUILD_TIFF=ON
+
+ make -j
+ make install
+ ```
* `make install`完成之后,会在该文件夹下生成opencv头文件和库文件,用于后面的PaddleClas代码编译。
-以opencv3.4.7版本为例,最终在安装路径下的文件结构如下所示。**注意**:不同的opencv版本,下述的文件结构可能不同。
+ 以opencv3.4.7版本为例,最终在安装路径下的文件结构如下所示。**注意**:不同的opencv版本,下述的文件结构可能不同。
-```
-opencv3/
-|-- bin
-|-- include
-|-- lib64
-|-- share
-```
+ ```log
+ opencv3/
+ ├── bin
+ ├── include
+ ├── lib
+ ├── lib64
+ └── share
+ ```
@@ -139,44 +144,48 @@ opencv3/
* 如果希望获取最新预测库特性,可以从Paddle github上克隆最新代码,源码编译预测库。
* 可以参考[Paddle预测库官网](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/05_inference_deployment/inference/build_and_install_lib_cn.html#id16)的说明,从github上获取Paddle代码,然后进行编译,生成最新的预测库。使用git获取代码方法如下。
-```shell
-git clone https://github.com/PaddlePaddle/Paddle.git
-```
+ ```shell
+ # 进入deploy/cpp_shitu目录
+ cd deploy/cpp_shitu
-* 进入Paddle目录后,使用如下方法编译。
+ git clone https://github.com/PaddlePaddle/Paddle.git
+ ```
-```shell
-rm -rf build
-mkdir build
-cd build
+* 进入Paddle目录后,使用如下方法编译。
-cmake .. \
- -DWITH_CONTRIB=OFF \
- -DWITH_MKL=ON \
- -DWITH_MKLDNN=ON \
- -DWITH_TESTING=OFF \
- -DCMAKE_BUILD_TYPE=Release \
- -DWITH_INFERENCE_API_TEST=OFF \
- -DON_INFER=ON \
- -DWITH_PYTHON=ON
-make -j
-make inference_lib_dist
-```
+ ```shell
+ rm -rf build
+ mkdir build
+ cd build
+
+ cmake .. \
+ -DWITH_CONTRIB=OFF \
+ -DWITH_MKL=ON \
+ -DWITH_MKLDNN=ON \
+ -DWITH_TESTING=OFF \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DWITH_INFERENCE_API_TEST=OFF \
+ -DON_INFER=ON \
+ -DWITH_PYTHON=ON
+
+ make -j
+ make inference_lib_dist
+ ```
-更多编译参数选项可以参考[Paddle C++预测库官网](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/05_inference_deployment/inference/build_and_install_lib_cn.html#id16)。
+ 更多编译参数选项可以参考[Paddle C++预测库官网](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/05_inference_deployment/inference/build_and_install_lib_cn.html#id16)。
* 编译完成之后,可以在`build/paddle_inference_install_dir/`文件下看到生成了以下文件及文件夹。
-```
-build/paddle_inference_install_dir/
-|-- CMakeCache.txt
-|-- paddle
-|-- third_party
-|-- version.txt
-```
+ ```log
+ build/paddle_inference_install_dir/
+ ├── CMakeCache.txt
+ ├── paddle
+ ├── third_party
+ └── version.txt
+ ```
-其中`paddle`就是之后进行C++预测时所需的Paddle库,`version.txt`中包含当前预测库的版本信息。
+ 其中`paddle`就是之后进行C++预测时所需的Paddle库,`version.txt`中包含当前预测库的版本信息。
@@ -187,33 +196,41 @@ build/paddle_inference_install_dir/
以`https://paddle-inference-lib.bj.bcebos.com/2.1.1-gpu-cuda10.2-cudnn8.1-mkl-gcc8.2/paddle_inference.tgz`的`develop`版本为例,使用下述命令下载并解压:
-```shell
-wget https://paddle-inference-lib.bj.bcebos.com/2.1.1-gpu-cuda10.2-cudnn8.1-mkl-gcc8.2/paddle_inference.tgz
+ ```shell
+ # 进入deploy/cpp_shitu目录
+ cd deploy/cpp_shitu
-tar -xvf paddle_inference.tgz
-```
+ wget https://paddle-inference-lib.bj.bcebos.com/2.1.1-gpu-cuda10.2-cudnn8.1-mkl-gcc8.2/paddle_inference.tgz
+
+ tar -xvf paddle_inference.tgz
+ ```
-最终会在当前的文件夹中生成`paddle_inference/`的子文件夹。
+ 最终会在当前的文件夹中生成`paddle_inference/`的子文件夹。
### 1.4 安装faiss库
+在安装`faiss`前,请安装`openblas`,`ubuntu`系统中安装命令如下:
+
```shell
- # 下载 faiss
- git clone https://github.com/facebookresearch/faiss.git
- cd faiss
- export faiss_install_path=$PWD/faiss_install
- cmake -B build . -DFAISS_ENABLE_PYTHON=OFF -DCMAKE_INSTALL_PREFIX=${faiss_install_path}
- make -C build -j faiss
- make -C build install
+apt-get install libopenblas-dev
```
-在安装`faiss`前,请安装`openblas`,`ubuntu`系统中安装命令如下:
+然后按照以下命令编译并安装faiss
```shell
-apt-get install libopenblas-dev
+# 进入deploy/cpp_shitu目录
+cd deploy/cpp_shitu
+
+# 下载 faiss
+git clone https://github.com/facebookresearch/faiss.git
+cd faiss
+export faiss_install_path=$PWD/faiss_install
+cmake -B build . -DFAISS_ENABLE_PYTHON=OFF -DCMAKE_INSTALL_PREFIX=${faiss_install_path}
+make -C build -j faiss
+make -C build install
```
注意本教程以安装faiss cpu版本为例,安装时请参考[faiss](https://github.com/facebookresearch/faiss)官网文档,根据需求自行安装。
@@ -224,12 +241,14 @@ apt-get install libopenblas-dev
编译命令如下,其中Paddle C++预测库、opencv等其他依赖库的地址需要换成自己机器上的实际地址。同时,编译过程中需要下载编译`yaml-cpp`等C++库,请保持联网环境。
-
```shell
+# 进入deploy/cpp_shitu目录
+cd deploy/cpp_shitu
+
sh tools/build.sh
```
-具体地,`tools/build.sh`中内容如下,请根据具体路径修改。
+具体地,`tools/build.sh`中内容如下,请根据具体路径和配置情况进行修改。
```shell
OPENCV_DIR=${opencv_install_dir}
@@ -261,14 +280,13 @@ cd ..
上述命令中,
-* `OPENCV_DIR`为opencv编译安装的地址(本例中为`opencv-3.4.7/opencv3`文件夹的路径);
-* `LIB_DIR`为下载的Paddle预测库(`paddle_inference`文件夹),或编译生成的Paddle预测库(`build/paddle_inference_install_dir`文件夹)的路径;
-* `CUDA_LIB_DIR`为cuda库文件地址,在docker中为`/usr/local/cuda/lib64`;
-* `CUDNN_LIB_DIR`为cudnn库文件地址,在docker中为`/usr/lib/x86_64-linux-gnu/`。
-* `TENSORRT_DIR`是tensorrt库文件地址,在dokcer中为`/usr/local/TensorRT6-cuda10.0-cudnn7/`,TensorRT需要结合GPU使用。
-* `FAISS_DIR`是faiss的安装地址
-* `FAISS_WITH_MKL`是指在编译faiss的过程中,是否使用了mkldnn,本文档中编译faiss,没有使用,而使用了openblas,故设置为`OFF`,若使用了mkldnn,则为`ON`.
-
+* `OPENCV_DIR`:opencv编译安装的地址(本例中为`opencv-3.4.7/opencv3`文件夹的路径);
+* `LIB_DIR`:下载的Paddle预测库(`paddle_inference`文件夹),或编译生成的Paddle预测库(`build/paddle_inference_install_dir`文件夹)的路径;
+* `CUDA_LIB_DIR`:cuda库文件地址,在docker中为`/usr/local/cuda/lib64`;
+* `CUDNN_LIB_DIR`:cudnn库文件地址,在docker中为`/usr/lib/x86_64-linux-gnu/`。
+* `TENSORRT_DIR`:tensorrt库文件地址,在dokcer中为`/usr/local/TensorRT6-cuda10.0-cudnn7/`,TensorRT需要结合GPU使用。
+* `FAISS_DIR`:faiss的安装地址
+* `FAISS_WITH_MKL`:指在编译faiss的过程中是否使用mkldnn,本文档中编译faiss没有使用,而使用了openblas,故设置为`OFF`,若使用了mkldnn则为`ON`.
在执行上述命令,编译完成之后,会在当前路径下生成`build`文件夹,其中生成一个名为`pp_shitu`的可执行文件。
@@ -276,60 +294,68 @@ cd ..
## 3. 运行demo
-- 请参考[识别快速开始文档](../../docs/zh_CN/quick_start/quick_start_recognition.md),下载好相应的 轻量级通用主体检测模型、轻量级通用识别模型及瓶装饮料测试数据并解压。
+- 按照如下命令下载好相应的轻量级通用主体检测模型、轻量级通用识别模型及瓶装饮料测试数据并解压。
```shell
+ # 进入deploy目录
+ cd deploy/
+
mkdir models
cd models
+
+ # 下载并解压主体检测模型
wget 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
- wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/general_PPLCNet_x2_5_lite_v1.0_infer.tar
- tar -xf general_PPLCNet_x2_5_lite_v1.0_infer.tar
+
+ # 下载并解压特征提取模型
+ wget 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.0_infer.tar
cd ..
mkdir data
cd data
- wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v1.0.tar
- tar -xf drink_dataset_v1.0.tar
+ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v2.0.tar
+ tar -xf drink_dataset_v2.0.tar
cd ..
```
- 将相应的yaml文件拷到当前文件夹下
```shell
- cp ../configs/inference_drink.yaml .
+ cp ../configs/inference_drink.yaml ./
```
-- 将`inference_drink.yaml`中的相对路径,改成基于本目录的路径或者绝对路径。涉及到的参数有
+- 将`inference_drink.yaml`中的相对路径,改成基于 `deploy/cpp_shitu` 目录的相对路径或者绝对路径。涉及到的参数有
- - Global.infer_imgs :此参数可以是具体的图像地址,也可以是图像集所在的目录
- - Global.det_inference_model_dir : 检测模型存储目录
- - Global.rec_inference_model_dir : 识别模型存储目录
- - IndexProcess.index_dir : 检索库的存储目录,在示例中,检索库在下载的demo数据中。
+ - `Global.infer_imgs` :此参数可以是具体的图像地址,也可以是图像集所在的目录
+ - `Global.det_inference_model_dir` : 检测模型存储目录
+ - `Global.rec_inference_model_dir` : 识别模型存储目录
+ - `IndexProcess.index_dir` : 检索库的存储目录,在示例中,检索库在下载的demo数据中。
-- 字典转换
+- 标签文件转换
- 由于python的检索库的字典,使用`pickle`进行的序列化存储,导致C++不方便读取,因此进行转换
+ 由于python的检索库的字典是使用`pickle`转换得到的序列化存储结果,导致C++不方便读取,因此需要先转换成普通的文本文件。
```shell
- python tools/transform_id_map.py -c inference_drink.yaml
+ python3.7 tools/transform_id_map.py -c inference_drink.yaml
```
- 转换成功后,在`IndexProcess.index_dir`目录下生成`id_map.txt`,方便c++ 读取。
+ 转换成功后,在`IndexProcess.index_dir`目录下生成`id_map.txt`,以便在C++推理时读取。
- 执行程序
```shell
./build/pp_shitu -c inference_drink.yaml
- # or
- ./build/pp_shitu -config inference_drink.yaml
```
- 若对图像集进行检索,则可能得到,如下结果。注意,此结果只做展示,具体以实际运行结果为准。
+ 以 `drink_dataset_v2.0/test_images/nongfu_spring.jpeg` 作为输入图像,则执行上述推理命令可以得到如下结果
- 同时,需注意的是,由于opencv 版本问题,会导致图像在预处理的过程中,resize产生细微差别,导致python 和c++结果,轻微不同,如bbox相差几个像素,检索结果小数点后3位diff等。但不会改变最终检索label。
+ ```log
+ ../../deploy/drink_dataset_v2.0/test_images/nongfu_spring.jpeg:
+ result0: bbox[0, 0, 729, 1094], score: 0.688691, label: 农夫山泉-饮用天然水
+ ```
- ![](../../docs/images/quick_start/shitu_c++_result.png)
+ 由于python和C++的opencv实现存在部分不同,可能导致python推理和C++推理结果有微小差异。但基本不影响最终的检索结果。
diff --git a/deploy/paddleserving/recognition/config.yml b/deploy/paddleserving/recognition/config.yml
index e4108006..b099fe54 100644
--- a/deploy/paddleserving/recognition/config.yml
+++ b/deploy/paddleserving/recognition/config.yml
@@ -16,9 +16,8 @@ op:
#当op配置没有server_endpoints时,从local_service_conf读取本地服务配置
local_service_conf:
-
#uci模型路径
- model_config: ../../models/general_PPLCNet_x2_5_lite_v1.0_serving
+ model_config: ../../models/general_PPLCNetV2_base_pretrained_v1.0_serving
#计算硬件类型: 空缺时由devices决定(CPU/GPU),0=cpu, 1=gpu, 2=tensorRT, 3=arm cpu, 4=kunlun xpu
device_type: 1
@@ -37,7 +36,7 @@ op:
local_service_conf:
client_type: local_predictor
device_type: 1
- devices: '0'
+ devices: "0"
fetch_list:
- - save_infer_model/scale_0.tmp_1
+ - save_infer_model/scale_0.tmp_1
model_config: ../../models/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_serving/
diff --git a/deploy/paddleserving/recognition/pipeline_http_client.py b/deploy/paddleserving/recognition/pipeline_http_client.py
index efc0f3af..dd6fa291 100644
--- a/deploy/paddleserving/recognition/pipeline_http_client.py
+++ b/deploy/paddleserving/recognition/pipeline_http_client.py
@@ -1,17 +1,20 @@
-import requests
-import json
import base64
+import json
import os
-imgpath = "../../drink_dataset_v1.0/test_images/001.jpeg"
+import requests
+
+imgpath = "../../drink_dataset_v2.0/test_images/001.jpeg"
+
def cv2_to_base64(image):
return base64.b64encode(image).decode('utf8')
+
if __name__ == "__main__":
url = "http://127.0.0.1:18081/recognition/prediction"
- with open(os.path.join(".", imgpath), 'rb') as file:
+ with open(os.path.join(".", imgpath), 'rb') as file:
image_data1 = file.read()
image = cv2_to_base64(image_data1)
data = {"key": ["image"], "value": [image]}
diff --git a/deploy/paddleserving/recognition/recognition_web_service.py b/deploy/paddleserving/recognition/recognition_web_service.py
index 4a3478b6..ccbe8a86 100644
--- a/deploy/paddleserving/recognition/recognition_web_service.py
+++ b/deploy/paddleserving/recognition/recognition_web_service.py
@@ -11,17 +11,24 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-from paddle_serving_server.web_service import WebService, Op
+import base64
+import json
import logging
-import numpy as np
+import os
+import pickle
import sys
+
import cv2
-from paddle_serving_app.reader import *
-import base64
-import os
import faiss
-import pickle
-import json
+import numpy as np
+from paddle_serving_app.reader import BGR2RGB
+from paddle_serving_app.reader import Div
+from paddle_serving_app.reader import Normalize
+from paddle_serving_app.reader import RCNNPostprocess
+from paddle_serving_app.reader import Resize
+from paddle_serving_app.reader import Sequential
+from paddle_serving_app.reader import Transpose
+from paddle_serving_server.web_service import Op, WebService
class DetOp(Op):
@@ -101,8 +108,8 @@ class RecOp(Op):
def init_op(self):
self.seq = Sequential([
BGR2RGB(), Resize((224, 224)), Div(255),
- Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225],
- False), Transpose((2, 0, 1))
+ Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225], False),
+ Transpose((2, 0, 1))
])
index_dir = "../../drink_dataset_v1.0/index"
@@ -136,7 +143,7 @@ class RecOp(Op):
})
self.det_boxes = boxes
- #construct batch images for rec
+ # construct batch images for rec
imgs = []
for box in boxes:
box = [int(x) for x in box["bbox"]]
@@ -192,7 +199,7 @@ class RecOp(Op):
pred["rec_scores"] = scores[i][0]
results.append(pred)
- #do nms
+ # do NMS
results = self.nms_to_rec_results(results, self.rec_nms_thresold)
return {"result": str(results)}, None, ""
diff --git a/docs/zh_CN/image_recognition_pipeline/feature_extraction.md b/docs/zh_CN/image_recognition_pipeline/feature_extraction.md
index 9b0b3a4e..5f2a2462 100644
--- a/docs/zh_CN/image_recognition_pipeline/feature_extraction.md
+++ b/docs/zh_CN/image_recognition_pipeline/feature_extraction.md
@@ -120,7 +120,7 @@ Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py) 和 [Tripl
### 4.2 PP-ShiTuV2
-训练数据为如下 7 个公开数据集的汇总:
+训练数据为如下 16 个公开数据集的汇总:
| 数据集 | 数据量 | 类别数 | 场景 | 数据集地址 |
| :--------------------- | :-----: | :------: | :---: | :----------------------------------------------------------------------------------: |
@@ -147,10 +147,10 @@ Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py) 和 [Tripl
| 模型 | 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 |
+| GeneralRecognitionV2_PPLCNetV2_base | 0.842 | 0.878 | 0.880 | 0.776 | 0.908 | 0.359 | 0.386 | 0.877 | 0.393 | TODO |
* 预训练模型地址:[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`
+* 采用的评测指标为:`Recall@1` 与 `mAP`
* 速度评测机器的 CPU 具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz`
* 速度指标的评测条件为: 开启 MKLDNN, 线程数设置为 10
diff --git a/docs/zh_CN/inference_deployment/recognition_serving_deploy.md b/docs/zh_CN/inference_deployment/recognition_serving_deploy.md
index f823f7f2..da9ece0f 100644
--- a/docs/zh_CN/inference_deployment/recognition_serving_deploy.md
+++ b/docs/zh_CN/inference_deployment/recognition_serving_deploy.md
@@ -79,8 +79,8 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
mkdir models
cd models
# 下载并解压通用识别模型
- wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/general_PPLCNet_x2_5_lite_v1.0_infer.tar
- tar -xf general_PPLCNet_x2_5_lite_v1.0_infer.tar
+ wget 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.0_infer.tar
# 下载并解压通用检测模型
wget 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
@@ -89,22 +89,22 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
```shell
# 转换通用识别模型
python3.7 -m paddle_serving_client.convert \
- --dirname ./general_PPLCNet_x2_5_lite_v1.0_infer/ \
+ --dirname ./general_PPLCNetV2_base_pretrained_v1.0_infer/ \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
- --serving_server ./general_PPLCNet_x2_5_lite_v1.0_serving/ \
- --serving_client ./general_PPLCNet_x2_5_lite_v1.0_client/
+ --serving_server ./general_PPLCNetV2_base_pretrained_v1.0_serving/ \
+ --serving_client ./general_PPLCNetV2_base_pretrained_v1.0_client/
```
上述命令的参数含义与[#3.1 模型转换](#3.1)相同
- 通用识别 inference 模型转换完成后,会在当前文件夹多出 `general_PPLCNet_x2_5_lite_v1.0_serving/` 和 `general_PPLCNet_x2_5_lite_v1.0_client/` 的文件夹,具备如下结构:
+ 通用识别 inference 模型转换完成后,会在当前文件夹多出 `general_PPLCNetV2_base_pretrained_v1.0_serving/` 和 `general_PPLCNetV2_base_pretrained_v1.0_client/` 的文件夹,具备如下结构:
```shell
- ├── general_PPLCNet_x2_5_lite_v1.0_serving/
+ ├── general_PPLCNetV2_base_pretrained_v1.0_serving/
│ ├── inference.pdiparams
│ ├── inference.pdmodel
│ ├── serving_server_conf.prototxt
│ └── serving_server_conf.stream.prototxt
│
- └── general_PPLCNet_x2_5_lite_v1.0_client/
+ └── general_PPLCNetV2_base_pretrained_v1.0_client/
├── serving_client_conf.prototxt
└── serving_client_conf.stream.prototxt
```
@@ -119,7 +119,7 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
```
上述命令的参数含义与[#3.1 模型转换](#3.1)相同
- 识别推理模型转换完成后,会在当前文件夹多出 `general_PPLCNet_x2_5_lite_v1.0_serving/` 和 `general_PPLCNet_x2_5_lite_v1.0_client/` 的文件夹。分别修改 `general_PPLCNet_x2_5_lite_v1.0_serving/` 和 `general_PPLCNet_x2_5_lite_v1.0_client/` 目录下的 `serving_server_conf.prototxt` 中的 `alias` 名字: 将 `fetch_var` 中的 `alias_name` 改为 `features`。 修改后的 `serving_server_conf.prototxt` 内容如下
+ 识别推理模型转换完成后,会在当前文件夹多出 `general_PPLCNetV2_base_pretrained_v1.0_serving/` 和 `general_PPLCNetV2_base_pretrained_v1.0_client/` 的文件夹。分别修改 `general_PPLCNetV2_base_pretrained_v1.0_serving/` 和 `general_PPLCNetV2_base_pretrained_v1.0_client/` 目录下的 `serving_server_conf.prototxt` 中的 `alias` 名字: 将 `fetch_var` 中的 `alias_name` 改为 `features`。 修改后的 `serving_server_conf.prototxt` 内容如下
```log
feed_var {
@@ -132,7 +132,7 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
shape: 224
}
fetch_var {
- name: "save_infer_model/scale_0.tmp_1"
+ name: "batch_norm_25.tmp_2"
alias_name: "features"
is_lod_tensor: false
fetch_type: 1
@@ -165,7 +165,7 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
# 回到deploy目录
cd ../
# 下载构建完成的检索库 index
- wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v1.0.tar
+ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v2.0.tar
# 解压构建完成的检索库 index
tar -xf drink_dataset_v1.0.tar
```
@@ -175,7 +175,7 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
**注意:** 识别服务涉及到多个模型,出于性能考虑采用 PipeLine 部署方式。Pipeline 部署方式当前不支持 windows 平台。
- 进入到工作目录
```shell
- cd ./deploy/paddleserving/recognition
+ cd ./paddleserving/recognition
```
paddleserving 目录包含启动 Python Pipeline 服务、C++ Serving 服务和发送预测请求的代码,包括:
```shell
@@ -204,7 +204,7 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
```
成功运行后,模型预测的结果会打印在客户端中,如下所示:
```log
- {'err_no': 0, 'err_msg': '', 'key': ['result'], 'value': ["[{'bbox': [345, 95, 524, 576], 'rec_docs': '红牛-强化型', 'rec_scores': 0.79903316}]"], 'tensors': []}
+ {'err_no': 0, 'err_msg': '', 'key': ['result'], 'value': ["[{'bbox': [0, 0, 600, 600], 'rec_docs': '红牛-强化型', 'rec_scores': 0.7408101}]"], 'tensors': []}
```
@@ -218,7 +218,7 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
# 一键编译安装Serving server、设置 SERVING_BIN
source ./build_server.sh python3.7
```
- **注:**[build_server.sh](../build_server.sh#L55-L62)所设定的路径可能需要根据实际机器上的环境如CUDA、python版本等作一定修改,然后再编译;如果执行`build_server.sh`过程中遇到非网络原因的报错,则可以手动将脚本中的命令逐条复制到终端执行。
+ **注:** [build_server.sh](../build_server.sh#L55-L62) 所设定的路径可能需要根据实际机器上的环境如CUDA、python版本等作一定修改,然后再编译;如果执行 `build_server.sh` 过程中遇到非网络原因的报错,则可以手动将脚本中的命令逐条复制到终端执行。
- C++ Serving使用的输入输出格式与Python不同,因此需要执行以下命令,将4个文件复制到下的文件覆盖掉[3.1](#31-模型转换)得到文件夹中的对应4个prototxt文件。
```shell
@@ -226,8 +226,8 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
cd PaddleClas/deploy/
# 覆盖prototxt文件
- \cp ./paddleserving/recognition/preprocess/general_PPLCNet_x2_5_lite_v1.0_serving/*.prototxt ./models/general_PPLCNet_x2_5_lite_v1.0_serving/
- \cp ./paddleserving/recognition/preprocess/general_PPLCNet_x2_5_lite_v1.0_client/*.prototxt ./models/general_PPLCNet_x2_5_lite_v1.0_client/
+ \cp ./paddleserving/recognition/preprocess/general_PPLCNetV2_base_pretrained_v1.0_serving/*.prototxt ./models/general_PPLCNetV2_base_pretrained_v1.0_serving/
+ \cp ./paddleserving/recognition/preprocess/general_PPLCNetV2_base_pretrained_v1.0_client/*.prototxt ./models/general_PPLCNetV2_base_pretrained_v1.0_client/
\cp ./paddleserving/recognition/preprocess/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_client/*.prototxt ./models/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_client/
\cp ./paddleserving/recognition/preprocess/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_serving/*.prototxt ./models/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_serving/
```
@@ -235,7 +235,7 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
- 启动服务:
```shell
# 进入工作目录
- cd PaddleClas/deploy/paddleserving/recognition
+ cd ./paddleserving/recognition
# 端口号默认为9400;运行日志默认保存在 log_PPShiTu.txt 中
# CPU部署
@@ -254,7 +254,7 @@ python3.7 -m pip install paddle-serving-server-gpu==0.7.0.post112 # GPU with CUD
WARNING: Logging before InitGoogleLogging() is written to STDERR
I0614 03:01:36.273097 6084 naming_service_thread.cpp:202] brpc::policy::ListNamingService("127.0.0.1:9400"): added 1
I0614 03:01:37.393564 6084 general_model.cpp:490] [client]logid=0,client_cost=1107.82ms,server_cost=1101.75ms.
- [{'bbox': [345, 95, 524, 585], 'rec_docs': '红牛-强化型', 'rec_scores': 0.8073724}]
+ [{'bbox': [0, 0, 600, 600], 'rec_docs': '红牛-强化型', 'rec_scores': 0.7508101}]
```
- 关闭服务
diff --git a/ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml b/ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml
index 626dd7c2..70daa639 100644
--- a/ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml
+++ b/ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml
@@ -23,7 +23,7 @@ Arch:
infer_output_key: features
infer_add_softmax: False
- Backbone:
+ Backbone:
name: PPLCNet_x2_5
pretrained: True
use_ssld: True
@@ -34,7 +34,7 @@ Arch:
embedding_size: 1280
class_num: 512
Head:
- name: ArcMargin
+ name: ArcMargin
embedding_size: 512
class_num: 185341
margin: 0.2
@@ -57,10 +57,9 @@ Optimizer:
learning_rate: 0.04
warmup_epoch: 5
regularizer:
- name: 'L2'
+ name: "L2"
coeff: 0.00001
-
# data loader for train and eval
DataLoader:
Train:
@@ -80,7 +79,7 @@ DataLoader:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
- order: ''
+ order: ""
sampler:
name: DistributedBatchSampler
@@ -93,7 +92,7 @@ DataLoader:
Eval:
Query:
- dataset:
+ dataset:
name: VeriWild
image_root: ./dataset/Aliproduct/
cls_label_path: ./dataset/Aliproduct/val_list.txt
@@ -107,7 +106,7 @@ DataLoader:
scale: 0.00392157
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
- order: ''
+ order: ""
sampler:
name: DistributedBatchSampler
batch_size: 64
@@ -118,7 +117,7 @@ DataLoader:
use_shared_memory: True
Gallery:
- dataset:
+ dataset:
name: VeriWild
image_root: ./dataset/Aliproduct/
cls_label_path: ./dataset/Aliproduct/val_list.txt
@@ -132,7 +131,7 @@ DataLoader:
scale: 0.00392157
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
- order: ''
+ order: ""
sampler:
name: DistributedBatchSampler
batch_size: 64
@@ -146,3 +145,4 @@ Metric:
Eval:
- Recallk:
topk: [1, 5]
+ - mAP: {}
--
GitLab