Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleClas
提交
6c4852ac
P
PaddleClas
项目概览
PaddlePaddle
/
PaddleClas
大约 1 年 前同步成功
通知
115
Star
4999
Fork
1114
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
19
列表
看板
标记
里程碑
合并请求
6
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleClas
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
19
Issue
19
列表
看板
标记
里程碑
合并请求
6
合并请求
6
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
6c4852ac
编写于
9月 01, 2022
作者:
H
HydrogenSulfate
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update PP-ShiTuV2 inference/serving code and docs, reformat yamls
上级
6e0aa193
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
227 addition
and
192 deletion
+227
-192
deploy/cpp_shitu/readme.md
deploy/cpp_shitu/readme.md
+169
-143
deploy/paddleserving/recognition/config.yml
deploy/paddleserving/recognition/config.yml
+3
-4
deploy/paddleserving/recognition/pipeline_http_client.py
deploy/paddleserving/recognition/pipeline_http_client.py
+7
-4
deploy/paddleserving/recognition/recognition_web_service.py
deploy/paddleserving/recognition/recognition_web_service.py
+18
-11
docs/zh_CN/image_recognition_pipeline/feature_extraction.md
docs/zh_CN/image_recognition_pipeline/feature_extraction.md
+3
-3
docs/zh_CN/inference_deployment/recognition_serving_deploy.md
.../zh_CN/inference_deployment/recognition_serving_deploy.md
+18
-18
ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml
...s/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml
+9
-9
未找到文件。
deploy/cpp_shitu/readme.md
浏览文件 @
6c4852ac
# 服务器端C++预测
本教程将介绍在服务器端部署PP-ShiT
U
的详细步骤。
本教程将介绍在服务器端部署PP-ShiT
u
的详细步骤。
## 目录
...
...
@@ -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,首先设置c
ame源码路径(
`root_path`
)以及安装路径(
`install_path`
),
`root_path`
为下载的came源码路径,
`install_path`
为cam
e的安装路径。在本例中,源码路径即为当前目录下的
`cmake-3.22.0/`
。
-
编译cmake,首先设置c
make源码路径(
`root_path`
)以及安装路径(
`install_path`
),
`root_path`
为下载的cmake源码路径,
`install_path`
为cmak
e的安装路径。在本例中,源码路径即为当前目录下的
`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就可以正常
使用了
<a
name=
"1.2"
></a>
...
...
@@ -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
```
<a
name=
"1.3"
></a>
...
...
@@ -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`
中包含当前预测库的版本信息。
<a
name=
"1.3.2"
></a>
...
...
@@ -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/`
的子文件夹。
<a
name=
"1.4"
></a>
### 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_v
1
.0.tar
tar
-xf
drink_dataset_v
1
.0.tar
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v
2
.0.tar
tar
-xf
drink_dataset_v
2
.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
python
3.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++推理结果有微小差异。但基本不影响最终的检索结果。
<a
name=
"4"
></a>
...
...
deploy/paddleserving/recognition/config.yml
浏览文件 @
6c4852ac
...
...
@@ -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_PPLCNet
V2_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/
deploy/paddleserving/recognition/pipeline_http_client.py
浏览文件 @
6c4852ac
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
]}
...
...
deploy/paddleserving/recognition/recognition_web_service.py
浏览文件 @
6c4852ac
...
...
@@ -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
,
""
...
...
docs/zh_CN/image_recognition_pipeline/feature_extraction.md
浏览文件 @
6c4852ac
...
...
@@ -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
...
...
docs/zh_CN/inference_deployment/recognition_serving_deploy.md
浏览文件 @
6c4852ac
...
...
@@ -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_PPLCNet
V2_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_PPLCNet
V2_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_PPLCNet
V2_base_pretrained
_v1.0_serving/
\
--serving_client
./general_PPLCNet
V2_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_PPLCNet
V2_base_pretrained_v1.0_serving/`
和
`general_PPLCNetV2_base_pretrained
_v1.0_client/`
的文件夹,具备如下结构:
```
shell
├── general_PPLCNet
_x2_5_lite
_v1.0_serving/
├── general_PPLCNet
V2_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_PPLCNet
V2_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_PPLCNet
V2_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_v
1
.0.tar
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v
2
.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': []}
```
<a
name=
"3.2.2"
></a>
...
...
@@ -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文件
\c
p ./paddleserving/recognition/preprocess/general_PPLCNet
_x2_5_lite_v1.0_serving/
*
.prototxt ./models/general_PPLCNet_x2_5_lite
_v1.0_serving/
\c
p ./paddleserving/recognition/preprocess/general_PPLCNet
_x2_5_lite_v1.0_client/
*
.prototxt ./models/general_PPLCNet_x2_5_lite
_v1.0_client/
\c
p ./paddleserving/recognition/preprocess/general_PPLCNet
V2_base_pretrained_v1.0_serving/
*
.prototxt ./models/general_PPLCNetV2_base_pretrained
_v1.0_serving/
\c
p ./paddleserving/recognition/preprocess/general_PPLCNet
V2_base_pretrained_v1.0_client/
*
.prototxt ./models/general_PPLCNetV2_base_pretrained
_v1.0_client/
\c
p ./paddleserving/recognition/preprocess/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_client/
*
.prototxt ./models/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_client/
\c
p ./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
}]
```
-
关闭服务
...
...
ppcls/configs/GeneralRecognition/GeneralRecognition_PPLCNet_x2_5.yaml
浏览文件 @
6c4852ac
...
...
@@ -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
:
{}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录