From 6cfb59fde13089d3da1c4b584d22162989e4b269 Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Mon, 9 Jan 2023 18:02:38 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/faq/rknpu2/build.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/cn/faq/rknpu2/build.md b/docs/cn/faq/rknpu2/build.md index d70c4b7eacd..b1b91ab86c0 100644 --- a/docs/cn/faq/rknpu2/build.md +++ b/docs/cn/faq/rknpu2/build.md @@ -8,9 +8,9 @@ FastDeploy当前在RK平台上支持后端引擎如下: | ONNX Runtime | RK356X
RK3588 | ONNX | 编译开关`ENABLE_ORT_BACKEND`为ON或OFF控制,默认OFF | | RKNPU2 | RK356X
RK3588 | RKNN | 编译开关`ENABLE_RKNPU2_BACKEND`为ON或OFF控制,默认OFF | -## 板端编译 +## 编译FastDeploy SDK -### 编译FastDeploy C++ SDK +### 板端编译FastDeploy C++ SDK RKNPU2暂时仅支持linux系统, 以下教程在RK3568(debian 10)、RK3588(debian 11) 环境下完成。 @@ -32,6 +32,26 @@ make -j8 make install ``` +### 交叉编译FastDeploy C++ SDK +```bash +git clone https://github.com/PaddlePaddle/FastDeploy.git +cd FastDeploy +mkdir build && cd build +cmake .. -DCMAKE_C_COMPILER=/home/zbc/opt/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc \ + -DCMAKE_CXX_COMPILER=/home/zbc/opt/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ \ + -DCMAKE_TOOLCHAIN_FILE=./../cmake/toolchain.cmake \ + -DTARGET_ABI=arm64 \ + -DENABLE_ORT_BACKEND=OFF \ + -DENABLE_RKNPU2_BACKEND=ON \ + -DENABLE_VISION=ON \ + -DRKNN2_TARGET_SOC=RK3588 \ + -DENABLE_FLYCV=ON \ + -DCMAKE_INSTALL_PREFIX=${PWD}/fastdeploy-0.0.3 + +make -j8 +make install +``` + ### 编译Python SDK RKNPU2暂时仅支持linux系统, 以下教程在RK3568(debian 10)、RK3588(debian 11) 环境下完成。Python打包依赖`wheel`,编译前请先执行`pip install wheel` From 478f97546916be6b8aa842eece571b7b12ce6c5e Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Mon, 9 Jan 2023 18:02:59 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmake/toolchain.cmake | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cmake/toolchain.cmake b/cmake/toolchain.cmake index 85bd057981b..176f65d31e2 100755 --- a/cmake/toolchain.cmake +++ b/cmake/toolchain.cmake @@ -18,8 +18,12 @@ if (DEFINED TARGET_ABI) set(OpenCV_DIR ${THIRD_PARTY_PATH}/install/opencv/lib/cmake/opencv4) elseif(${TARGET_ABI} MATCHES "arm64") set(CMAKE_SYSTEM_PROCESSOR aarch64) - set(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc") - set(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++") + if(NOT CMAKE_C_COMPILER) + set(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc") + endif() + if(NOT CMAKE_CXX_COMPILER) + set(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++") + endif() set(CMAKE_CXX_FLAGS "-march=armv8-a ${CMAKE_CXX_FLAGS}") set(CMAKE_C_FLAGS "-march=armv8-a ${CMAKE_C_FLAGS}") set(OPENCV_URL "https://bj.bcebos.com/fastdeploy/third_libs/opencv-linux-aarch64-4.6.0.tgz") From 11081c4812a82b1316bd43f3e1568c56d6bc0f9c Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Mon, 9 Jan 2023 18:05:02 +0800 Subject: [PATCH 03/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/faq/rknpu2/build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cn/faq/rknpu2/build.md b/docs/cn/faq/rknpu2/build.md index b1b91ab86c0..3d07e45315e 100644 --- a/docs/cn/faq/rknpu2/build.md +++ b/docs/cn/faq/rknpu2/build.md @@ -52,7 +52,7 @@ make -j8 make install ``` -### 编译Python SDK +### 板端编译Python SDK RKNPU2暂时仅支持linux系统, 以下教程在RK3568(debian 10)、RK3588(debian 11) 环境下完成。Python打包依赖`wheel`,编译前请先执行`pip install wheel` From 8337768e4795e2210f0b1307acb1e404a895e260 Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Tue, 10 Jan 2023 09:06:24 +0800 Subject: [PATCH 04/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/faq/rknpu2/build.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/cn/faq/rknpu2/build.md b/docs/cn/faq/rknpu2/build.md index 3d07e45315e..01ee47f5fdf 100644 --- a/docs/cn/faq/rknpu2/build.md +++ b/docs/cn/faq/rknpu2/build.md @@ -36,6 +36,10 @@ make install ```bash git clone https://github.com/PaddlePaddle/FastDeploy.git cd FastDeploy + +# 如果您使用的是develop分支输入以下命令 +git checkout develop + mkdir build && cd build cmake .. -DCMAKE_C_COMPILER=/home/zbc/opt/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc \ -DCMAKE_CXX_COMPILER=/home/zbc/opt/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ \ @@ -47,7 +51,6 @@ cmake .. -DCMAKE_C_COMPILER=/home/zbc/opt/gcc-linaro-6.3.1-2017.05-x86_64_aarch -DRKNN2_TARGET_SOC=RK3588 \ -DENABLE_FLYCV=ON \ -DCMAKE_INSTALL_PREFIX=${PWD}/fastdeploy-0.0.3 - make -j8 make install ``` @@ -59,16 +62,17 @@ RKNPU2暂时仅支持linux系统, 以下教程在RK3568(debian 10)、RK3588(debi ```bash git clone https://github.com/PaddlePaddle/FastDeploy.git cd FastDeploy -cd python +# 如果您使用的是develop分支输入以下命令 +git checkout develop + +cd python export ENABLE_ORT_BACKEND=ON export ENABLE_RKNPU2_BACKEND=ON export ENABLE_VISION=ON export RKNN2_TARGET_SOC=RK3588 python3 setup.py build python3 setup.py bdist_wheel - cd dist - pip3 install fastdeploy_python-0.0.0-cp39-cp39-linux_aarch64.whl ``` From f7d2ea905422a5141188cc733c9e0297ec0fe27a Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Tue, 10 Jan 2023 09:10:00 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/faq/rknpu2/build.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cn/faq/rknpu2/build.md b/docs/cn/faq/rknpu2/build.md index 01ee47f5fdf..eba9852a117 100644 --- a/docs/cn/faq/rknpu2/build.md +++ b/docs/cn/faq/rknpu2/build.md @@ -27,7 +27,7 @@ cmake .. -DENABLE_ORT_BACKEND=ON \ -DENABLE_RKNPU2_BACKEND=ON \ -DENABLE_VISION=ON \ -DRKNN2_TARGET_SOC=RK3588 \ - -DCMAKE_INSTALL_PREFIX=${PWD}/fastdeploy-0.0.3 + -DCMAKE_INSTALL_PREFIX=${PWD}/fastdeploy-0.0.0 make -j8 make install ``` @@ -50,7 +50,7 @@ cmake .. -DCMAKE_C_COMPILER=/home/zbc/opt/gcc-linaro-6.3.1-2017.05-x86_64_aarch -DENABLE_VISION=ON \ -DRKNN2_TARGET_SOC=RK3588 \ -DENABLE_FLYCV=ON \ - -DCMAKE_INSTALL_PREFIX=${PWD}/fastdeploy-0.0.3 + -DCMAKE_INSTALL_PREFIX=${PWD}/fastdeploy-0.0.0 make -j8 make install ``` From d2eaaecccdd20a0838348292877a93fa8fd29d6b Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Tue, 10 Jan 2023 09:10:58 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/faq/rknpu2/build.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/cn/faq/rknpu2/build.md b/docs/cn/faq/rknpu2/build.md index eba9852a117..c99bcb17f73 100644 --- a/docs/cn/faq/rknpu2/build.md +++ b/docs/cn/faq/rknpu2/build.md @@ -17,12 +17,11 @@ RKNPU2暂时仅支持linux系统, 以下教程在RK3568(debian 10)、RK3588(debi ```bash git clone https://github.com/PaddlePaddle/FastDeploy.git cd FastDeploy -mkdir build && cd build -# 编译配置详情见README文件,这里只介绍关键的几个配置 -# -DENABLE_ORT_BACKEND: 是否开启ONNX模型,默认关闭 -# -DENABLE_RKNPU2_BACKEND: 是否开启RKNPU模型,默认关闭 -# -RKNN2_TARGET_SOC: 编译SDK的板子型号,只能输入RK356X或者RK3588,注意区分大小写 +# 如果您使用的是develop分支输入以下命令 +git checkout develop + +mkdir build && cd build cmake .. -DENABLE_ORT_BACKEND=ON \ -DENABLE_RKNPU2_BACKEND=ON \ -DENABLE_VISION=ON \ From 77e71c7427797d6ce6bfa7182f9e43a6564b84ba Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Tue, 10 Jan 2023 11:08:35 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/build_and_install/rknpu2.md | 1 + docs/cn/faq/rknpu2/issues.md | 9 +++++++++ scripts/fastdeploy_init.sh | 4 ++++ 3 files changed, 14 insertions(+) create mode 100644 docs/cn/faq/rknpu2/issues.md diff --git a/docs/cn/build_and_install/rknpu2.md b/docs/cn/build_and_install/rknpu2.md index 69931ca7204..33ee596fea6 100644 --- a/docs/cn/build_and_install/rknpu2.md +++ b/docs/cn/build_and_install/rknpu2.md @@ -12,3 +12,4 @@ RKNPU2指的是Rockchip推出的RK356X以及RK3588系列芯片的NPU。 * [编译FastDeploy](../faq/rknpu2/build.md) * [RKNN模型导出建议](../faq/rknpu2/export.md) * [RKNPU2模型部署demo](../faq/rknpu2/rknpu2.md) +* [RKNPU2 常见问题合集](../faq/rknpu2/issues.md) diff --git a/docs/cn/faq/rknpu2/issues.md b/docs/cn/faq/rknpu2/issues.md new file mode 100644 index 00000000000..551bff37100 --- /dev/null +++ b/docs/cn/faq/rknpu2/issues.md @@ -0,0 +1,9 @@ +# RKNPU2常见问题合集 + +## 导航 + +- [动态链接库链接问题](#动态链接库链接问题) + +## 动态链接库链接问题 + +关联issue: [Issue 870](https://github.com/PaddlePaddle/FastDeploy/issues/870) diff --git a/scripts/fastdeploy_init.sh b/scripts/fastdeploy_init.sh index f045287e4ae..e188db2dadc 100644 --- a/scripts/fastdeploy_init.sh +++ b/scripts/fastdeploy_init.sh @@ -27,9 +27,13 @@ done # Remove the dumplicate directories LIBS_DIRECOTRIES=($(awk -v RS=' ' '!a[$1]++' <<< ${LIBS_DIRECOTRIES[@]})) +# Print the dynamic library location and output the configuration file +output_file=./fastdeploy_libs.conf +rm $output_file IMPORT_PATH="" for LIB_DIR in ${LIBS_DIRECOTRIES[@]};do echo "Find Library Directory: $LIB_DIR" + echo "$LIB_DIR" >> $output_file IMPORT_PATH=${LIB_DIR}":"$IMPORT_PATH done From 1d91da634a3d034d63ef5521574eb6ce29225e82 Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Tue, 10 Jan 2023 11:14:48 +0800 Subject: [PATCH 08/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/faq/rknpu2/issues.md | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/docs/cn/faq/rknpu2/issues.md b/docs/cn/faq/rknpu2/issues.md index 551bff37100..6827c7fe7a4 100644 --- a/docs/cn/faq/rknpu2/issues.md +++ b/docs/cn/faq/rknpu2/issues.md @@ -1,9 +1,43 @@ # RKNPU2常见问题合集 +在使用FastDeploy的过程中大家可能会碰到很多的问题,这个文档用来记录已经解决的共性问题,方便大家查阅。 + ## 导航 - [动态链接库链接问题](#动态链接库链接问题) ## 动态链接库链接问题 -关联issue: [Issue 870](https://github.com/PaddlePaddle/FastDeploy/issues/870) +### 关联issue + +- [Issue 870](https://github.com/PaddlePaddle/FastDeploy/issues/870) + +### 问题描述 + +在编译的过程中没有出现问题,但是运行程序时出现以下报错 +```text +error while loading shared libraries: libfastdeploy.so.0.0.0: cannot open shared object file: No such file or directory +``` + +### 分析原因 + +链接器ld提示找不到库文件。ld默认的目录是/lib和/usr/lib,如果放在其他路径也可以,需要让ld知道库文件所在的路径。 + +### 解决方案 + +**临时解决方法** + +编译FastDeploy C++ SDK后,SDK目录下有一个fastdeploy_init.sh文件,运行这个文件即可。 + +```bash +source PathToFastDeploySDK/fastdeploy_init.sh +``` + +**永久解决方案** + +运行以下代码: +```bash +source PathToFastDeploySDK/fastdeploy_init.sh +sudo cp PathToFastDeploySDK/fastdeploy_libs.conf /etc/ld.so.conf.d/ +sudo ldconfig +``` From 00eab71a6674b5ef45bed3e17ef60c83f6e03819 Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Tue, 10 Jan 2023 11:48:04 +0800 Subject: [PATCH 09/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/faq/rknpu2/issues.md | 5 +++-- scripts/fastdeploy_init.sh | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/cn/faq/rknpu2/issues.md b/docs/cn/faq/rknpu2/issues.md index 6827c7fe7a4..4357e27a7f4 100644 --- a/docs/cn/faq/rknpu2/issues.md +++ b/docs/cn/faq/rknpu2/issues.md @@ -27,7 +27,7 @@ error while loading shared libraries: libfastdeploy.so.0.0.0: cannot open shared **临时解决方法** -编译FastDeploy C++ SDK后,SDK目录下有一个fastdeploy_init.sh文件,运行这个文件即可。 +临时解决方法对系统没有伤害,但是仅在打开终端时生效,关闭终端后,这个配置会失效。 ```bash source PathToFastDeploySDK/fastdeploy_init.sh @@ -35,9 +35,10 @@ source PathToFastDeploySDK/fastdeploy_init.sh **永久解决方案** -运行以下代码: +临时解决方法解决方案在开关终端后会失效,因为每一次重新打开终端运行程序时,都需要重新输入命令。如果您不想每一次运行程序都需要运行一次代码,可以执行以下代码: ```bash source PathToFastDeploySDK/fastdeploy_init.sh sudo cp PathToFastDeploySDK/fastdeploy_libs.conf /etc/ld.so.conf.d/ sudo ldconfig ``` +执行后配置文件将写入系统,刷新后即可让系统找到库的位置。 diff --git a/scripts/fastdeploy_init.sh b/scripts/fastdeploy_init.sh index e188db2dadc..6c1867b866d 100644 --- a/scripts/fastdeploy_init.sh +++ b/scripts/fastdeploy_init.sh @@ -28,7 +28,7 @@ done LIBS_DIRECOTRIES=($(awk -v RS=' ' '!a[$1]++' <<< ${LIBS_DIRECOTRIES[@]})) # Print the dynamic library location and output the configuration file -output_file=./fastdeploy_libs.conf +output_file=$(dirname "${BASH_SOURCE[0]}")/fastdeploy_libs.conf rm $output_file IMPORT_PATH="" for LIB_DIR in ${LIBS_DIRECOTRIES[@]};do From 3e02c3792d8a8d7d29e0c3621436420323a9832f Mon Sep 17 00:00:00 2001 From: Jason <928090362@qq.com> Date: Tue, 10 Jan 2023 13:28:02 +0800 Subject: [PATCH 10/17] Update issues.md --- docs/cn/faq/rknpu2/issues.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cn/faq/rknpu2/issues.md b/docs/cn/faq/rknpu2/issues.md index 4357e27a7f4..b0cebfa9dba 100644 --- a/docs/cn/faq/rknpu2/issues.md +++ b/docs/cn/faq/rknpu2/issues.md @@ -27,7 +27,7 @@ error while loading shared libraries: libfastdeploy.so.0.0.0: cannot open shared **临时解决方法** -临时解决方法对系统没有伤害,但是仅在打开终端时生效,关闭终端后,这个配置会失效。 +临时解决方法对系统没有影响,但是仅在当前打开的终端时生效,关闭终端后,这个配置会失效。 ```bash source PathToFastDeploySDK/fastdeploy_init.sh From 9e9687e41f1fc79073479c58896182bbae148ab7 Mon Sep 17 00:00:00 2001 From: Jason <928090362@qq.com> Date: Tue, 10 Jan 2023 13:29:52 +0800 Subject: [PATCH 11/17] Update fastdeploy_init.sh --- scripts/fastdeploy_init.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/scripts/fastdeploy_init.sh b/scripts/fastdeploy_init.sh index 6c1867b866d..d5442d67064 100644 --- a/scripts/fastdeploy_init.sh +++ b/scripts/fastdeploy_init.sh @@ -28,13 +28,10 @@ done LIBS_DIRECOTRIES=($(awk -v RS=' ' '!a[$1]++' <<< ${LIBS_DIRECOTRIES[@]})) # Print the dynamic library location and output the configuration file -output_file=$(dirname "${BASH_SOURCE[0]}")/fastdeploy_libs.conf -rm $output_file -IMPORT_PATH="" +output_file=${FASTDEPLOY_LIBRARY_PATH}/fastdeploy_libs.conf +rm -rf $output_file for LIB_DIR in ${LIBS_DIRECOTRIES[@]};do - echo "Find Library Directory: $LIB_DIR" echo "$LIB_DIR" >> $output_file - IMPORT_PATH=${LIB_DIR}":"$IMPORT_PATH done if [ -f "ascend_init.sh" ] From 64dc5640a895d4d5fa5a7e5e4b0b3e073d25def4 Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Tue, 10 Jan 2023 13:56:19 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/fastdeploy_init.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/fastdeploy_init.sh b/scripts/fastdeploy_init.sh index d5442d67064..8a8b50a3cd4 100644 --- a/scripts/fastdeploy_init.sh +++ b/scripts/fastdeploy_init.sh @@ -28,10 +28,13 @@ done LIBS_DIRECOTRIES=($(awk -v RS=' ' '!a[$1]++' <<< ${LIBS_DIRECOTRIES[@]})) # Print the dynamic library location and output the configuration file +IMPORT_PATH="" output_file=${FASTDEPLOY_LIBRARY_PATH}/fastdeploy_libs.conf rm -rf $output_file for LIB_DIR in ${LIBS_DIRECOTRIES[@]};do + echo "Find Library Directory: $LIB_DIR" echo "$LIB_DIR" >> $output_file + IMPORT_PATH=${LIB_DIR}":"$IMPORT_PATH done if [ -f "ascend_init.sh" ] From 355a6e05b745a16691e224c26ffd50efbf88e5f5 Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Wed, 11 Jan 2023 11:41:32 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0insightface=E7=B3=BB?= =?UTF-8?q?=E5=88=97=E6=A8=A1=E5=9E=8B=E7=9A=84rknpu2=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../faceid/insightface/cpp/README_CN.md | 2 - .../faceid/insightface/python/README_CN.md | 1 - .../insightface/python/infer_arcface.py | 3 - .../insightface/python/infer_cosface.py | 3 - .../insightface/python/infer_partial_fc.py | 3 - .../faceid/insightface/python/infer_vpl.py | 3 - .../faceid/insightface/rknpu2/README_CN.md | 54 ++++++ .../insightface/rknpu2/cpp/CMakeLists.txt | 13 ++ .../faceid/insightface/rknpu2/cpp/README.md | 135 ++++++++++++++ .../insightface/rknpu2/cpp/infer_arcface.cc | 127 +++++++++++++ .../insightface/rknpu2/python/README_CN.md | 108 +++++++++++ .../rknpu2/python/infer_arcface.py | 82 +++++++++ .../vision/faceid/contrib/insightface/base.cc | 12 +- .../contrib/insightface/insightface_pybind.cc | 171 +++++++++++------- .../vision/faceid/contrib/insightface/model.h | 16 +- .../contrib/insightface/preprocessor.cc | 19 +- .../faceid/contrib/insightface/preprocessor.h | 14 +- .../faceid/contrib/insightface/__init__.py | 14 +- tools/rknpu2/config/arcface_quantized.yaml | 15 ++ tools/rknpu2/config/arcface_unquantized.yaml | 15 ++ tools/rknpu2/export.py | 21 ++- 21 files changed, 719 insertions(+), 112 deletions(-) create mode 100644 examples/vision/faceid/insightface/rknpu2/README_CN.md create mode 100644 examples/vision/faceid/insightface/rknpu2/cpp/CMakeLists.txt create mode 100644 examples/vision/faceid/insightface/rknpu2/cpp/README.md create mode 100644 examples/vision/faceid/insightface/rknpu2/cpp/infer_arcface.cc create mode 100644 examples/vision/faceid/insightface/rknpu2/python/README_CN.md create mode 100644 examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py mode change 100755 => 100644 fastdeploy/vision/faceid/contrib/insightface/base.cc mode change 100755 => 100644 fastdeploy/vision/faceid/contrib/insightface/preprocessor.cc create mode 100644 tools/rknpu2/config/arcface_quantized.yaml create mode 100644 tools/rknpu2/config/arcface_unquantized.yaml diff --git a/examples/vision/faceid/insightface/cpp/README_CN.md b/examples/vision/faceid/insightface/cpp/README_CN.md index ff03789ca2c..5d5fc3c82fa 100644 --- a/examples/vision/faceid/insightface/cpp/README_CN.md +++ b/examples/vision/faceid/insightface/cpp/README_CN.md @@ -121,8 +121,6 @@ VPL模型加载和初始化,其中model_file为导出的ONNX模型格式。 通过InsightFaceRecognitionPreprocessor::SetAlpha(std::vector& alpha)来进行修改 > > * **beta**(vector<float>): 预处理归一化的beta值,计算公式为`x'=x*alpha+beta`,beta默认为[-1.f, -1.f, -1.f], 通过InsightFaceRecognitionPreprocessor::SetBeta(std::vector& beta)来进行修改 -> > * **permute**(bool): 预处理是否将BGR转换成RGB,默认true, - 通过InsightFaceRecognitionPreprocessor::SetPermute(bool permute)来进行修改 #### InsightFaceRecognitionPostprocessor成员变量(后处理参数) > > * **l2_normalize**(bool): 输出人脸向量之前是否执行l2归一化,默认false, diff --git a/examples/vision/faceid/insightface/python/README_CN.md b/examples/vision/faceid/insightface/python/README_CN.md index b30921b7e7f..b5d444c5f9b 100644 --- a/examples/vision/faceid/insightface/python/README_CN.md +++ b/examples/vision/faceid/insightface/python/README_CN.md @@ -100,7 +100,6 @@ ArcFace模型加载和初始化,其中model_file为导出的ONNX模型格式 > > * **size**(list[int]): 通过此参数修改预处理过程中resize的大小,包含两个整型元素,表示[width, height], 默认值为[112, 112] > > * **alpha**(list[float]): 预处理归一化的alpha值,计算公式为`x'=x*alpha+beta`,alpha默认为[1. / 127.5, 1.f / 127.5, 1. / 127.5] > > * **beta**(list[float]): 预处理归一化的beta值,计算公式为`x'=x*alpha+beta`,beta默认为[-1.f, -1.f, -1.f] -> > * **swap_rb**(bool): 预处理是否将BGR转换成RGB,默认True #### AdaFacePostprocessor的成员变量 以下变量为AdaFacePostprocessor的成员变量 diff --git a/examples/vision/faceid/insightface/python/infer_arcface.py b/examples/vision/faceid/insightface/python/infer_arcface.py index 06e8ef00186..25504b9943d 100644 --- a/examples/vision/faceid/insightface/python/infer_arcface.py +++ b/examples/vision/faceid/insightface/python/infer_arcface.py @@ -65,9 +65,6 @@ def build_option(args): face1 = cv2.imread(args.face_positive) face2 = cv2.imread(args.face_negative) # 0,2 不同的人 -# 设置 l2 normalize -model.postprocessor.l2_normalize = True - # 预测图片检测结果 result0 = model.predict(face0) result1 = model.predict(face1) diff --git a/examples/vision/faceid/insightface/python/infer_cosface.py b/examples/vision/faceid/insightface/python/infer_cosface.py index 2bb1292f492..7500aee57a5 100644 --- a/examples/vision/faceid/insightface/python/infer_cosface.py +++ b/examples/vision/faceid/insightface/python/infer_cosface.py @@ -65,9 +65,6 @@ def build_option(args): face1 = cv2.imread(args.face_positive) face2 = cv2.imread(args.face_negative) # 0,2 不同的人 -# 设置 l2 normalize -model.postprocessor.l2_normalize = True - # 预测图片检测结果 result0 = model.predict(face0) result1 = model.predict(face1) diff --git a/examples/vision/faceid/insightface/python/infer_partial_fc.py b/examples/vision/faceid/insightface/python/infer_partial_fc.py index e81531e6eec..9aba41974bf 100644 --- a/examples/vision/faceid/insightface/python/infer_partial_fc.py +++ b/examples/vision/faceid/insightface/python/infer_partial_fc.py @@ -65,9 +65,6 @@ def build_option(args): face1 = cv2.imread(args.face_positive) face2 = cv2.imread(args.face_negative) # 0,2 不同的人 -# 设置 l2 normalize -model.postprocessor.l2_normalize = True - # 预测图片检测结果 result0 = model.predict(face0) result1 = model.predict(face1) diff --git a/examples/vision/faceid/insightface/python/infer_vpl.py b/examples/vision/faceid/insightface/python/infer_vpl.py index 6113ad3df72..cc072966c28 100644 --- a/examples/vision/faceid/insightface/python/infer_vpl.py +++ b/examples/vision/faceid/insightface/python/infer_vpl.py @@ -65,9 +65,6 @@ def build_option(args): face1 = cv2.imread(args.face_positive) face2 = cv2.imread(args.face_negative) # 0,2 不同的人 -# 设置 l2 normalize -model.postprocessor.l2_normalize = True - # 预测图片检测结果 result0 = model.predict(face0) result1 = model.predict(face1) diff --git a/examples/vision/faceid/insightface/rknpu2/README_CN.md b/examples/vision/faceid/insightface/rknpu2/README_CN.md new file mode 100644 index 00000000000..378eb849c7c --- /dev/null +++ b/examples/vision/faceid/insightface/rknpu2/README_CN.md @@ -0,0 +1,54 @@ +[English](README.md) | 简体中文 +# InsightFace RKNPU准备部署模型 + +本教程提供InsightFace模型在RKNPU2环境下的部署,模型的详细介绍已经ONNX模型的下载请查看[模型介绍文档](../README.md)。 + +## 支持模型列表 +目前FastDeploy支持如下模型的部署 +- ArcFace +- CosFace +- PartialFC +- VPL + +## 下载预训练ONNX模型 + +为了方便开发者的测试,下面提供了InsightFace导出的各系列模型,开发者可直接下载使用。(下表中模型的精度来源于源官方库)其中精度指标来源于InsightFace中对各模型的介绍,详情各参考InsightFace中的说明 + +| 模型 | 大小 | 精度 (AgeDB_30) | +|:-------------------------------------------------------------------------------------------|:------|:--------------| +| [CosFace-r18](https://bj.bcebos.com/paddlehub/fastdeploy/glint360k_cosface_r18.onnx) | 92MB | 97.7 | +| [CosFace-r34](https://bj.bcebos.com/paddlehub/fastdeploy/glint360k_cosface_r34.onnx) | 131MB | 98.3 | +| [CosFace-r50](https://bj.bcebos.com/paddlehub/fastdeploy/glint360k_cosface_r50.onnx) | 167MB | 98.3 | +| [CosFace-r100](https://bj.bcebos.com/paddlehub/fastdeploy/glint360k_cosface_r100.onnx) | 249MB | 98.4 | +| [ArcFace-r18](https://bj.bcebos.com/paddlehub/fastdeploy/ms1mv3_arcface_r18.onnx) | 92MB | 97.7 | +| [ArcFace-r34](https://bj.bcebos.com/paddlehub/fastdeploy/ms1mv3_arcface_r34.onnx) | 131MB | 98.1 | +| [ArcFace-r50](https://bj.bcebos.com/paddlehub/fastdeploy/ms1mv3_arcface_r50.onnx) | 167MB | - | +| [ArcFace-r100](https://bj.bcebos.com/paddlehub/fastdeploy/ms1mv3_arcface_r100.onnx) | 249MB | 98.4 | +| [ArcFace-r100_lr0.1](https://bj.bcebos.com/paddlehub/fastdeploy/ms1mv3_r100_lr01.onnx) | 249MB | 98.4 | +| [PartialFC-r34](https://bj.bcebos.com/paddlehub/fastdeploy/partial_fc_glint360k_r50.onnx) | 167MB | - | +| [PartialFC-r50](https://bj.bcebos.com/paddlehub/fastdeploy/partial_fc_glint360k_r100.onnx) | 249MB | - | + + +## 转换为RKNPU模型 + +```bash +wget https://bj.bcebos.com/paddlehub/fastdeploy/ms1mv3_arcface_r18.onnx + +python -m paddle2onnx.optimize --input_model ms1mv3_arcface_r18.onnx \ + --output_model ms1mv3_arcface_r18.onnx \ + --input_shape_dict "{'data':[1,3,112,112]}" + +python /Path/To/FastDeploy/tools/rknpu2/export.py \ + --config_path tools/rknpu2/config/arcface_unquantized.yaml \ + --target_platform rk3588 +``` + +## 详细部署文档 + +- [Python部署](python) +- [C++部署](cpp) + + +## 版本说明 + +- 本版本文档和代码基于[InsightFace CommitID:babb9a5](https://github.com/deepinsight/insightface/commit/babb9a5) 编写 diff --git a/examples/vision/faceid/insightface/rknpu2/cpp/CMakeLists.txt b/examples/vision/faceid/insightface/rknpu2/cpp/CMakeLists.txt new file mode 100644 index 00000000000..f7c62565deb --- /dev/null +++ b/examples/vision/faceid/insightface/rknpu2/cpp/CMakeLists.txt @@ -0,0 +1,13 @@ +PROJECT(infer_demo C CXX) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10) + +# 指定下载解压后的fastdeploy库路径 +option(FASTDEPLOY_INSTALL_DIR "Path of downloaded fastdeploy sdk.") + +include(${FASTDEPLOY_INSTALL_DIR}/FastDeploy.cmake) + +# 添加FastDeploy依赖头文件 +include_directories(${FASTDEPLOY_INCS}) + +add_executable(infer_arcface_demo ${PROJECT_SOURCE_DIR}/infer_arcface.cc) +target_link_libraries(infer_arcface_demo ${FASTDEPLOY_LIBS}) diff --git a/examples/vision/faceid/insightface/rknpu2/cpp/README.md b/examples/vision/faceid/insightface/rknpu2/cpp/README.md new file mode 100644 index 00000000000..bd7bed7b224 --- /dev/null +++ b/examples/vision/faceid/insightface/rknpu2/cpp/README.md @@ -0,0 +1,135 @@ +[English](README.md) | 简体中文 +# InsightFace C++部署示例 + +FastDeploy支持在RKNPU上部署包括ArcFace\CosFace\VPL\Partial_FC在内的InsightFace系列模型。 + +本目录下提供`infer_arcface.cc`快速完成InsighFace模型包括ArcFace在CPU/RKNPU加速部署的示例。 + + +在部署前,需确认以下两个步骤: + +1. 软硬件环境满足要求 +2. 根据开发环境,下载预编译部署库或者从头编译FastDeploy仓库 + +以上步骤请参考[RK2代NPU部署库编译](../../../../../../docs/cn/build_and_install/rknpu2.md)实现 + +在本目录执行如下命令即可完成编译测试 + +```bash +mkdir build +cd build +wget https://bj.bcebos.com/fastdeploy/release/cpp/fastdeploy-linux-x64-x.x.x.tgz +tar xvf fastdeploy-linux-x64-x.x.x.tgz +cmake .. -DFASTDEPLOY_INSTALL_DIR=${PWD}/fastdeploy-linux-x64-x.x.x +make -j + +# 下载官方转换好的ArcFace模型文件和测试图片 +wget https://bj.bcebos.com/paddlehub/fastdeploy/ms1mv3_arcface_r18.onnx +wget https://bj.bcebos.com/paddlehub/fastdeploy/rknpu2/face_demo.zip +unzip face_demo.zip + +# CPU推理 +./infer_arcface_demo ms1mv3_arcface_r100.onnx face_0.jpg face_1.jpg face_2.jpg 0 +# RKNPU推理 +./infer_arcface_demo ms1mv3_arcface_r100.onnx face_0.jpg face_1.jpg face_2.jpg 1 +``` + +运行完成可视化结果如下图所示 + +
+ + + +
+ +以上命令只适用于Linux或MacOS, Windows下SDK的使用方式请参考: +- [如何在Windows中使用FastDeploy C++ SDK](../../../../../docs/cn/faq/use_sdk_on_windows.md) + +## InsightFace C++接口 + +### ArcFace类 + +```c++ +fastdeploy::vision::faceid::ArcFace( + const string& model_file, + const string& params_file = "", + const RuntimeOption& runtime_option = RuntimeOption(), + const ModelFormat& model_format = ModelFormat::ONNX) +``` + +ArcFace模型加载和初始化,其中model_file为导出的ONNX模型格式。 + +### CosFace类 + +```c++ +fastdeploy::vision::faceid::CosFace( + const string& model_file, + const string& params_file = "", + const RuntimeOption& runtime_option = RuntimeOption(), + const ModelFormat& model_format = ModelFormat::ONNX) +``` + +CosFace模型加载和初始化,其中model_file为导出的ONNX模型格式。 + +### PartialFC类 + +```c++ +fastdeploy::vision::faceid::PartialFC( + const string& model_file, + const string& params_file = "", + const RuntimeOption& runtime_option = RuntimeOption(), + const ModelFormat& model_format = ModelFormat::ONNX) +``` + +PartialFC模型加载和初始化,其中model_file为导出的ONNX模型格式。 + +### VPL类 + +```c++ +fastdeploy::vision::faceid::VPL( + const string& model_file, + const string& params_file = "", + const RuntimeOption& runtime_option = RuntimeOption(), + const ModelFormat& model_format = ModelFormat::ONNX) +``` + +VPL模型加载和初始化,其中model_file为导出的ONNX模型格式。 +**参数** + +> * **model_file**(str): 模型文件路径 +> * **params_file**(str): 参数文件路径,当模型格式为ONNX时,此参数传入空字符串即可 +> * **runtime_option**(RuntimeOption): 后端推理配置,默认为None,即采用默认配置 +> * **model_format**(ModelFormat): 模型格式,默认为ONNX格式 + +#### Predict函数 + +> ```c++ +> ArcFace::Predict(cv::Mat* im, FaceRecognitionResult* result) +> ``` +> +> 模型预测接口,输入图像直接输出检测结果。 +> +> **参数** +> +> > * **im**: 输入图像,注意需为HWC,BGR格式 +> > * **result**: 检测结果,包括检测框,各个框的置信度, FaceRecognitionResult说明参考[视觉模型预测结果](../../../../../docs/api/vision_results/) + +### 修改预处理以及后处理的参数 +预处理和后处理的参数的需要通过修改InsightFaceRecognitionPostprocessor,InsightFaceRecognitionPreprocessor的成员变量来进行修改。 + +#### InsightFaceRecognitionPreprocessor成员变量(预处理参数) +> > * **size**(vector<int>): 通过此参数修改预处理过程中resize的大小,包含两个整型元素,表示[width, height], 默认值为[112, 112], + 通过InsightFaceRecognitionPreprocessor::SetSize(std::vector& size)来进行修改 +> > * **alpha**(vector<float>): 预处理归一化的alpha值,计算公式为`x'=x*alpha+beta`,alpha默认为[1. / 127.5, 1.f / 127.5, 1. / 127.5], + 通过InsightFaceRecognitionPreprocessor::SetAlpha(std::vector& alpha)来进行修改 +> > * **beta**(vector<float>): 预处理归一化的beta值,计算公式为`x'=x*alpha+beta`,beta默认为[-1.f, -1.f, -1.f], + 通过InsightFaceRecognitionPreprocessor::SetBeta(std::vector& beta)来进行修改 + +#### InsightFaceRecognitionPostprocessor成员变量(后处理参数) +> > * **l2_normalize**(bool): 输出人脸向量之前是否执行l2归一化,默认false, + InsightFaceRecognitionPostprocessor::SetL2Normalize(bool& l2_normalize)来进行修改 + +- [模型介绍](../../../) +- [Python部署](../python) +- [视觉模型预测结果](../../../../../../docs/api/vision_results/README.md) +- [如何切换模型推理后端引擎](../../../../../../docs/cn/faq/how_to_change_backend.md) diff --git a/examples/vision/faceid/insightface/rknpu2/cpp/infer_arcface.cc b/examples/vision/faceid/insightface/rknpu2/cpp/infer_arcface.cc new file mode 100644 index 00000000000..be6f9b4bc12 --- /dev/null +++ b/examples/vision/faceid/insightface/rknpu2/cpp/infer_arcface.cc @@ -0,0 +1,127 @@ +// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// 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. + +#include "fastdeploy/vision.h" + +void CpuInfer(const std::string& model_file, + const std::vector& image_file) { + auto model = fastdeploy::vision::faceid::ArcFace(model_file, ""); + + fastdeploy::TimeCounter tc; + tc.Start(); + cv::Mat face0 = cv::imread(image_file[0]); + fastdeploy::vision::FaceRecognitionResult res0; + if (!model.Predict(face0, &res0)) { + std::cerr << "Prediction Failed." << std::endl; + } + tc.End(); + tc.PrintInfo("Arcface in ONNX"); + + cv::Mat face1 = cv::imread(image_file[1]); + fastdeploy::vision::FaceRecognitionResult res1; + if (!model.Predict(face1, &res1)) { + std::cerr << "Prediction Failed." << std::endl; + } + + cv::Mat face2 = cv::imread(image_file[2]); + fastdeploy::vision::FaceRecognitionResult res2; + if (!model.Predict(face2, &res2)) { + std::cerr << "Prediction Failed." << std::endl; + } + + std::cout << "Prediction Done!" << std::endl; + + std::cout << "--- [Face 0]:" << res0.Str(); + std::cout << "--- [Face 1]:" << res1.Str(); + std::cout << "--- [Face 2]:" << res2.Str(); + + float cosine01 = fastdeploy::vision::utils::CosineSimilarity( + res0.embedding, res1.embedding, + model.GetPostprocessor().GetL2Normalize()); + float cosine02 = fastdeploy::vision::utils::CosineSimilarity( + res0.embedding, res2.embedding, + model.GetPostprocessor().GetL2Normalize()); + std::cout << "Detect Done! Cosine 01: " << cosine01 + << ", Cosine 02:" << cosine02 << std::endl; +} + +void RKNPUInfer(const std::string& model_file, + const std::vector& image_file) { + std::string params_file; + auto option = fastdeploy::RuntimeOption(); + option.UseRKNPU2(); + auto format = fastdeploy::ModelFormat::RKNN; + auto model = fastdeploy::vision::faceid::ArcFace(model_file, params_file, + option, format); + model.GetPreprocessor().DisableNormalize(); + model.GetPreprocessor().DisablePermute(); + + fastdeploy::TimeCounter tc; + tc.Start(); + cv::Mat face0 = cv::imread(image_file[0]); + fastdeploy::vision::FaceRecognitionResult res0; + if (!model.Predict(face0, &res0)) { + std::cerr << "Prediction Failed." << std::endl; + } + tc.End(); + tc.PrintInfo("Arcface in RKNN"); + + cv::Mat face1 = cv::imread(image_file[1]); + fastdeploy::vision::FaceRecognitionResult res1; + if (!model.Predict(face1, &res1)) { + std::cerr << "Prediction Failed." << std::endl; + } + + cv::Mat face2 = cv::imread(image_file[2]); + fastdeploy::vision::FaceRecognitionResult res2; + if (!model.Predict(face2, &res2)) { + std::cerr << "Prediction Failed." << std::endl; + } + + std::cout << "Prediction Done!" << std::endl; + + std::cout << "--- [Face 0]:" << res0.Str(); + std::cout << "--- [Face 1]:" << res1.Str(); + std::cout << "--- [Face 2]:" << res2.Str(); + + float cosine01 = fastdeploy::vision::utils::CosineSimilarity( + res0.embedding, res1.embedding, + model.GetPostprocessor().GetL2Normalize()); + float cosine02 = fastdeploy::vision::utils::CosineSimilarity( + res0.embedding, res2.embedding, + model.GetPostprocessor().GetL2Normalize()); + std::cout << "Detect Done! Cosine 01: " << cosine01 + << ", Cosine 02:" << cosine02 << std::endl; +} + +int main(int argc, char* argv[]) { + if (argc < 6) { + std::cout << "Usage: infer_demo path/to/model path/to/image run_option, " + "e.g ./infer_arcface_demo ms1mv3_arcface_r100.onnx " + "face_0.jpg face_1.jpg face_2.jpg 0" + << std::endl; + std::cout << "The data type of run_option is int, " + "0: run with cpu; 1: run with rknpu2." + << std::endl; + return -1; + } + + std::vector image_files = {argv[2], argv[3], argv[4]}; + if (std::atoi(argv[5]) == 0) { + CpuInfer(argv[1], image_files); + } else if (std::atoi(argv[5]) == 1) { + RKNPUInfer(argv[1], image_files); + } + return 0; +} diff --git a/examples/vision/faceid/insightface/rknpu2/python/README_CN.md b/examples/vision/faceid/insightface/rknpu2/python/README_CN.md new file mode 100644 index 00000000000..fd539f70875 --- /dev/null +++ b/examples/vision/faceid/insightface/rknpu2/python/README_CN.md @@ -0,0 +1,108 @@ +[English](README.md) | 简体中文 +# InsightFace Python部署示例 + +FastDeploy支持在RKNPU上部署包括ArcFace\CosFace\VPL\Partial_FC在内的InsightFace系列模型。 + +本目录下提供`infer_arcface.py`快速完成InsighFace模型包括ArcFace在CPU/RKNPU加速部署的示例。 + + +在部署前,需确认以下步骤: + +- 1. 软硬件环境满足要求,参考[FastDeploy环境要求](../../../../../../docs/cn/build_and_install/rknpu2.md) + +```bash +#下载部署示例代码 +git clone https://github.com/PaddlePaddle/FastDeploy.git +cd examples/vision/faceid/insightface/python/ + +#下载ArcFace模型文件和测试图片 +wget https://bj.bcebos.com/paddlehub/fastdeploy/ms1mv3_arcface_r100.onnx +wget https://bj.bcebos.com/paddlehub/fastdeploy/rknpu2/face_demo.zip +unzip face_demo.zip + +# CPU推理 +python infer_arcface.py --model ms1mv3_arcface_r100.onnx \ + --face face_0.jpg \ + --face_positive face_1.jpg \ + --face_negative face_2.jpg \ + --device cpu +# GPU推理 +python infer_arcface.py --model ms1mv3_arcface_r100.onnx \ + --face face_0.jpg \ + --face_positive face_1.jpg \ + --face_negative face_2.jpg \ + --device gpu +``` + +运行完成可视化结果如下图所示 + +
+ + + +
+ +```bash +Prediction Done! +--- [Face 0]:FaceRecognitionResult: [Dim(512), Min(-2.309220), Max(2.372197), Mean(0.016987)] +--- [Face 1]:FaceRecognitionResult: [Dim(512), Min(-2.288258), Max(1.995104), Mean(-0.003400)] +--- [Face 2]:FaceRecognitionResult: [Dim(512), Min(-3.243411), Max(3.875866), Mean(-0.030682)] +Detect Done! Cosine 01: 0.814385, Cosine 02:-0.059388 + +``` + +## InsightFace Python接口 + +```python +fastdeploy.vision.faceid.ArcFace(model_file, params_file=None, runtime_option=None, model_format=ModelFormat.ONNX) +fastdeploy.vision.faceid.CosFace(model_file, params_file=None, runtime_option=None, model_format=ModelFormat.ONNX) +fastdeploy.vision.faceid.PartialFC(model_file, params_file=None, runtime_option=None, model_format=ModelFormat.ONNX) +fastdeploy.vision.faceid.VPL(model_file, params_file=None, runtime_option=None, model_format=ModelFormat.ONNX) +``` + +ArcFace模型加载和初始化,其中model_file为导出的ONNX模型格式 + +**参数** + +> * **model_file**(str): 模型文件路径 +> * **params_file**(str): 参数文件路径,当模型格式为ONNX格式时,此参数无需设定 +> * **runtime_option**(RuntimeOption): 后端推理配置,默认为None,即采用默认配置 +> * **model_format**(ModelFormat): 模型格式,默认为ONNX + +### predict函数 + +> ```python +> ArcFace.predict(image_data) +> ``` +> +> 模型预测结口,输入图像直接输出检测结果。 +> +> **参数** +> +> > * **image_data**(np.ndarray): 输入数据,注意需为HWC,BGR格式 + +> **返回** +> +> > 返回`fastdeploy.vision.FaceRecognitionResult`结构体,结构体说明参考文档[视觉模型预测结果](../../../../../docs/api/vision_results/) + +### 类成员属性 +#### 预处理参数 +用户可按照自己的实际需求,修改下列预处理参数,从而影响最终的推理和部署效果 + +#### AdaFacePreprocessor的成员变量 +以下变量为AdaFacePreprocessor的成员变量 +> > * **size**(list[int]): 通过此参数修改预处理过程中resize的大小,包含两个整型元素,表示[width, height], 默认值为[112, 112] +> > * **alpha**(list[float]): 预处理归一化的alpha值,计算公式为`x'=x*alpha+beta`,alpha默认为[1. / 127.5, 1.f / 127.5, 1. / 127.5] +> > * **beta**(list[float]): 预处理归一化的beta值,计算公式为`x'=x*alpha+beta`,beta默认为[-1.f, -1.f, -1.f] + +#### AdaFacePostprocessor的成员变量 +以下变量为AdaFacePostprocessor的成员变量 +> > * **l2_normalize**(bool): 输出人脸向量之前是否执行l2归一化,默认False + + +## 其它文档 + +- [InsightFace 模型介绍](..) +- [InsightFace C++部署](../cpp) +- [模型预测结果说明](../../../../../docs/api/vision_results/) +- [如何切换模型推理后端引擎](../../../../../docs/cn/faq/how_to_change_backend.md) diff --git a/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py b/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py new file mode 100644 index 00000000000..2f0506c52a5 --- /dev/null +++ b/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py @@ -0,0 +1,82 @@ +import fastdeploy as fd +import cv2 +import numpy as np + + +# 余弦相似度 +def cosine_similarity(a, b): + a = np.array(a) + b = np.array(b) + mul_a = np.linalg.norm(a, ord=2) + mul_b = np.linalg.norm(b, ord=2) + mul_ab = np.dot(a, b) + return mul_ab / (mul_a * mul_b) + + +def parse_arguments(): + import argparse + import ast + parser = argparse.ArgumentParser() + parser.add_argument( + "--model", required=True, help="Path of insgihtface onnx model.") + parser.add_argument( + "--face", required=True, help="Path of test face image file.") + parser.add_argument( + "--face_positive", + required=True, + help="Path of test face_positive image file.") + parser.add_argument( + "--face_negative", + required=True, + help="Path of test face_negative image file.") + parser.add_argument( + "--device", + type=str, + default='cpu', + help="Type of inference device, support 'cpu' or 'gpu'.") + return parser.parse_args() + + +def build_option(args): + option = fd.RuntimeOption() + + if args.device.lower() == "npu": + option.use_rknpu2() + return option + + +args = parse_arguments() + +# 配置runtime,加载模型 +runtime_option = fd.RuntimeOption() +model = fd.vision.faceid.ArcFace(args.model, runtime_option=runtime_option) +if args.device.lower() == "npu": + runtime_option.use_rknpu2() + model.preprocessor.disable_normalize() + model.preprocessor.disable_permute() + +# 加载图片 +face0 = cv2.imread(args.face) # 0,1 同一个人 +face1 = cv2.imread(args.face_positive) +face2 = cv2.imread(args.face_negative) # 0,2 不同的人 + +# 预测图片检测结果 +result0 = model.predict(face0) +result1 = model.predict(face1) +result2 = model.predict(face2) + +# 计算余弦相似度 +embedding0 = result0.embedding +embedding1 = result1.embedding +embedding2 = result2.embedding + +cosine01 = cosine_similarity(embedding0, embedding1) +cosine02 = cosine_similarity(embedding0, embedding2) + +# 打印结果 +print(result0, end="") +print(result1, end="") +print(result2, end="") +print("Cosine 01: ", cosine01) +print("Cosine 02: ", cosine02) +print(model.runtime_option) diff --git a/fastdeploy/vision/faceid/contrib/insightface/base.cc b/fastdeploy/vision/faceid/contrib/insightface/base.cc old mode 100755 new mode 100644 index 35d8b808609..8b970cb82c0 --- a/fastdeploy/vision/faceid/contrib/insightface/base.cc +++ b/fastdeploy/vision/faceid/contrib/insightface/base.cc @@ -22,7 +22,6 @@ InsightFaceRecognitionBase::InsightFaceRecognitionBase( const std::string& model_file, const std::string& params_file, const fastdeploy::RuntimeOption& custom_option, const fastdeploy::ModelFormat& model_format) { - if (model_format == ModelFormat::ONNX) { valid_cpu_backends = {Backend::ORT}; valid_gpu_backends = {Backend::ORT, Backend::TRT}; @@ -31,6 +30,7 @@ InsightFaceRecognitionBase::InsightFaceRecognitionBase( valid_gpu_backends = {Backend::PDINFER, Backend::ORT, Backend::TRT}; valid_kunlunxin_backends = {Backend::LITE}; } + valid_rknpu_backends = {Backend::RKNPU2}; runtime_option = custom_option; runtime_option.model_format = model_format; runtime_option.model_file = model_file; @@ -55,8 +55,9 @@ bool InsightFaceRecognitionBase::Predict(const cv::Mat& im, return true; } -bool InsightFaceRecognitionBase::BatchPredict(const std::vector& images, - std::vector* results){ +bool InsightFaceRecognitionBase::BatchPredict( + const std::vector& images, + std::vector* results) { std::vector fd_images = WrapMat(images); FDASSERT(images.size() == 1, "Only support batch = 1 now."); if (!preprocessor_.Run(&fd_images, &reused_input_tensors_)) { @@ -70,8 +71,9 @@ bool InsightFaceRecognitionBase::BatchPredict(const std::vector& images return false; } - if (!postprocessor_.Run(reused_output_tensors_, results)){ - FDERROR << "Failed to postprocess the inference results by runtime." << std::endl; + if (!postprocessor_.Run(reused_output_tensors_, results)) { + FDERROR << "Failed to postprocess the inference results by runtime." + << std::endl; return false; } return true; diff --git a/fastdeploy/vision/faceid/contrib/insightface/insightface_pybind.cc b/fastdeploy/vision/faceid/contrib/insightface/insightface_pybind.cc index b193d9fb795..fa0e2babf67 100644 --- a/fastdeploy/vision/faceid/contrib/insightface/insightface_pybind.cc +++ b/fastdeploy/vision/faceid/contrib/insightface/insightface_pybind.cc @@ -19,83 +19,120 @@ void BindInsightFace(pybind11::module& m) { pybind11::class_( m, "InsightFaceRecognitionPreprocessor") .def(pybind11::init()) - .def("run", [](vision::faceid::InsightFaceRecognitionPreprocessor& self, - std::vector& im_list) { - std::vector images; - for (size_t i = 0; i < im_list.size(); ++i) { - images.push_back(vision::WrapMat(PyArrayToCvMat(im_list[i]))); - } - std::vector outputs; - if (!self.Run(&images, &outputs)) { - throw std::runtime_error("Failed to preprocess the input data in InsightFaceRecognitionPreprocessor."); - } - for (size_t i = 0; i < outputs.size(); ++i) { - outputs[i].StopSharing(); - } - return outputs; - }) - .def_property("permute", &vision::faceid::InsightFaceRecognitionPreprocessor::GetPermute, - &vision::faceid::InsightFaceRecognitionPreprocessor::SetPermute) - .def_property("alpha", &vision::faceid::InsightFaceRecognitionPreprocessor::GetAlpha, - &vision::faceid::InsightFaceRecognitionPreprocessor::SetAlpha) - .def_property("beta", &vision::faceid::InsightFaceRecognitionPreprocessor::GetBeta, - &vision::faceid::InsightFaceRecognitionPreprocessor::SetBeta) - .def_property("size", &vision::faceid::InsightFaceRecognitionPreprocessor::GetSize, - &vision::faceid::InsightFaceRecognitionPreprocessor::SetSize); + .def("run", + [](vision::faceid::InsightFaceRecognitionPreprocessor& self, + std::vector& im_list) { + std::vector images; + for (size_t i = 0; i < im_list.size(); ++i) { + images.push_back(vision::WrapMat(PyArrayToCvMat(im_list[i]))); + } + std::vector outputs; + if (!self.Run(&images, &outputs)) { + throw std::runtime_error( + "Failed to preprocess the input data in " + "InsightFaceRecognitionPreprocessor."); + } + for (size_t i = 0; i < outputs.size(); ++i) { + outputs[i].StopSharing(); + } + return outputs; + }) + .def( + "disable_normalize", + &vision::faceid::InsightFaceRecognitionPreprocessor::DisableNormalize) + .def("disable_permute", + &vision::faceid::InsightFaceRecognitionPreprocessor::DisablePermute) + .def_property( + "alpha", + &vision::faceid::InsightFaceRecognitionPreprocessor::GetAlpha, + &vision::faceid::InsightFaceRecognitionPreprocessor::SetAlpha) + .def_property( + "beta", &vision::faceid::InsightFaceRecognitionPreprocessor::GetBeta, + &vision::faceid::InsightFaceRecognitionPreprocessor::SetBeta) + .def_property( + "size", &vision::faceid::InsightFaceRecognitionPreprocessor::GetSize, + &vision::faceid::InsightFaceRecognitionPreprocessor::SetSize); pybind11::class_( m, "InsightFaceRecognitionPostprocessor") .def(pybind11::init()) - .def("run", [](vision::faceid::InsightFaceRecognitionPostprocessor& self, std::vector& inputs) { - std::vector results; - if (!self.Run(inputs, &results)) { - throw std::runtime_error("Failed to postprocess the runtime result in InsightFaceRecognitionPostprocessor."); - } - return results; - }) - .def("run", [](vision::faceid::InsightFaceRecognitionPostprocessor& self, std::vector& input_array) { - std::vector results; - std::vector inputs; - PyArrayToTensorList(input_array, &inputs, /*share_buffer=*/true); - if (!self.Run(inputs, &results)) { - throw std::runtime_error("Failed to postprocess the runtime result in InsightFaceRecognitionPostprocessor."); - } - return results; - }) - .def_property("l2_normalize", &vision::faceid::InsightFaceRecognitionPostprocessor::GetL2Normalize, - &vision::faceid::InsightFaceRecognitionPostprocessor::SetL2Normalize); + .def("run", + [](vision::faceid::InsightFaceRecognitionPostprocessor& self, + std::vector& inputs) { + std::vector results; + if (!self.Run(inputs, &results)) { + throw std::runtime_error( + "Failed to postprocess the runtime result in " + "InsightFaceRecognitionPostprocessor."); + } + return results; + }) + .def("run", + [](vision::faceid::InsightFaceRecognitionPostprocessor& self, + std::vector& input_array) { + std::vector results; + std::vector inputs; + PyArrayToTensorList(input_array, &inputs, /*share_buffer=*/true); + if (!self.Run(inputs, &results)) { + throw std::runtime_error( + "Failed to postprocess the runtime result in " + "InsightFaceRecognitionPostprocessor."); + } + return results; + }) + .def_property( + "l2_normalize", + &vision::faceid::InsightFaceRecognitionPostprocessor::GetL2Normalize, + &vision::faceid::InsightFaceRecognitionPostprocessor::SetL2Normalize); pybind11::class_( m, "InsightFaceRecognitionBase") - .def(pybind11::init()) - .def("predict", [](vision::faceid::InsightFaceRecognitionBase& self, pybind11::array& data) { - cv::Mat im = PyArrayToCvMat(data); - vision::FaceRecognitionResult result; - self.Predict(im, &result); - return result; - }) - .def("batch_predict", [](vision::faceid::InsightFaceRecognitionBase& self, std::vector& data) { - std::vector images; - for (size_t i = 0; i < data.size(); ++i) { - images.push_back(PyArrayToCvMat(data[i])); - } - std::vector results; - self.BatchPredict(images, &results); - return results; - }) - .def_property_readonly("preprocessor", &vision::faceid::InsightFaceRecognitionBase::GetPreprocessor) - .def_property_readonly("postprocessor", &vision::faceid::InsightFaceRecognitionBase::GetPostprocessor); + .def(pybind11::init()) + .def("predict", + [](vision::faceid::InsightFaceRecognitionBase& self, + pybind11::array& data) { + cv::Mat im = PyArrayToCvMat(data); + vision::FaceRecognitionResult result; + self.Predict(im, &result); + return result; + }) + .def("batch_predict", + [](vision::faceid::InsightFaceRecognitionBase& self, + std::vector& data) { + std::vector images; + for (size_t i = 0; i < data.size(); ++i) { + images.push_back(PyArrayToCvMat(data[i])); + } + std::vector results; + self.BatchPredict(images, &results); + return results; + }) + .def_property_readonly( + "preprocessor", + &vision::faceid::InsightFaceRecognitionBase::GetPreprocessor) + .def_property_readonly( + "postprocessor", + &vision::faceid::InsightFaceRecognitionBase::GetPostprocessor); - pybind11::class_(m, "ArcFace") - .def(pybind11::init()); + pybind11::class_(m, "ArcFace") + .def(pybind11::init()); - pybind11::class_(m, "CosFace") - .def(pybind11::init()); + pybind11::class_(m, "CosFace") + .def(pybind11::init()); - pybind11::class_(m, "PartialFC") - .def(pybind11::init()); + pybind11::class_(m, "PartialFC") + .def(pybind11::init()); - pybind11::class_(m, "VPL") - .def(pybind11::init()); + pybind11::class_(m, "VPL") + .def(pybind11::init()); } } // namespace fastdeploy diff --git a/fastdeploy/vision/faceid/contrib/insightface/model.h b/fastdeploy/vision/faceid/contrib/insightface/model.h index a1a8f128bd6..8ae5c950a9e 100755 --- a/fastdeploy/vision/faceid/contrib/insightface/model.h +++ b/fastdeploy/vision/faceid/contrib/insightface/model.h @@ -35,6 +35,8 @@ class FASTDEPLOY_DECL ArcFace : public InsightFaceRecognitionBase { if (model_format == ModelFormat::ONNX) { valid_cpu_backends = {Backend::ORT}; valid_gpu_backends = {Backend::ORT, Backend::TRT}; + } else if (model_format == ModelFormat::RKNN) { + valid_rknpu_backends = {Backend::RKNPU2}; } else { valid_cpu_backends = {Backend::PDINFER, Backend::ORT, Backend::LITE}; valid_gpu_backends = {Backend::PDINFER, Backend::ORT, Backend::TRT}; @@ -63,6 +65,8 @@ class FASTDEPLOY_DECL CosFace : public InsightFaceRecognitionBase { if (model_format == ModelFormat::ONNX) { valid_cpu_backends = {Backend::ORT}; valid_gpu_backends = {Backend::ORT, Backend::TRT}; + } else if (model_format == ModelFormat::RKNN) { + valid_rknpu_backends = {Backend::RKNPU2}; } else { valid_cpu_backends = {Backend::PDINFER, Backend::ORT, Backend::LITE}; valid_gpu_backends = {Backend::PDINFER, Backend::ORT, Backend::TRT}; @@ -83,13 +87,15 @@ class FASTDEPLOY_DECL PartialFC : public InsightFaceRecognitionBase { * \param[in] model_format Model format of the loaded model, default is Paddle format */ PartialFC(const std::string& model_file, const std::string& params_file = "", - const RuntimeOption& custom_option = RuntimeOption(), - const ModelFormat& model_format = ModelFormat::ONNX) + const RuntimeOption& custom_option = RuntimeOption(), + const ModelFormat& model_format = ModelFormat::ONNX) : InsightFaceRecognitionBase(model_file, params_file, custom_option, model_format) { if (model_format == ModelFormat::ONNX) { valid_cpu_backends = {Backend::ORT}; valid_gpu_backends = {Backend::ORT, Backend::TRT}; + } else if (model_format == ModelFormat::RKNN) { + valid_rknpu_backends = {Backend::RKNPU2}; } else { valid_cpu_backends = {Backend::PDINFER, Backend::ORT, Backend::LITE}; valid_gpu_backends = {Backend::PDINFER, Backend::ORT, Backend::TRT}; @@ -110,13 +116,15 @@ class FASTDEPLOY_DECL VPL : public InsightFaceRecognitionBase { * \param[in] model_format Model format of the loaded model, default is Paddle format */ VPL(const std::string& model_file, const std::string& params_file = "", - const RuntimeOption& custom_option = RuntimeOption(), - const ModelFormat& model_format = ModelFormat::ONNX) + const RuntimeOption& custom_option = RuntimeOption(), + const ModelFormat& model_format = ModelFormat::ONNX) : InsightFaceRecognitionBase(model_file, params_file, custom_option, model_format) { if (model_format == ModelFormat::ONNX) { valid_cpu_backends = {Backend::ORT}; valid_gpu_backends = {Backend::ORT, Backend::TRT}; + } else if (model_format == ModelFormat::RKNN) { + valid_rknpu_backends = {Backend::RKNPU2}; } else { valid_cpu_backends = {Backend::PDINFER, Backend::ORT, Backend::LITE}; valid_gpu_backends = {Backend::PDINFER, Backend::ORT, Backend::TRT}; diff --git a/fastdeploy/vision/faceid/contrib/insightface/preprocessor.cc b/fastdeploy/vision/faceid/contrib/insightface/preprocessor.cc old mode 100755 new mode 100644 index c846522cc1f..398a7016e0b --- a/fastdeploy/vision/faceid/contrib/insightface/preprocessor.cc +++ b/fastdeploy/vision/faceid/contrib/insightface/preprocessor.cc @@ -23,11 +23,10 @@ InsightFaceRecognitionPreprocessor::InsightFaceRecognitionPreprocessor() { size_ = {112, 112}; alpha_ = {1.f / 127.5f, 1.f / 127.5f, 1.f / 127.5f}; beta_ = {-1.f, -1.f, -1.f}; // RGB - permute_ = true; } - -bool InsightFaceRecognitionPreprocessor::Preprocess(FDMat * mat, FDTensor* output) { +bool InsightFaceRecognitionPreprocessor::Preprocess(FDMat* mat, + FDTensor* output) { // face recognition model's preprocess steps in insightface // reference: insightface/recognition/arcface_torch/inference.py // 1. Resize @@ -39,13 +38,16 @@ bool InsightFaceRecognitionPreprocessor::Preprocess(FDMat * mat, FDTensor* outpu if (resize_h != mat->Height() || resize_w != mat->Width()) { Resize::Run(mat, resize_w, resize_h); } - if (permute_) { + + if (!disable_permute_) { BGR2RGB::Run(mat); } - Convert::Run(mat, alpha_, beta_); - HWC2CHW::Run(mat); - Cast::Run(mat, "float"); + if (!disable_normalize_) { + Convert::Run(mat, alpha_, beta_); + HWC2CHW::Run(mat); + Cast::Run(mat, "float"); + } mat->ShareWithTensor(output); output->ExpandDim(0); // reshape to n, h, w, c @@ -55,7 +57,8 @@ bool InsightFaceRecognitionPreprocessor::Preprocess(FDMat * mat, FDTensor* outpu bool InsightFaceRecognitionPreprocessor::Run(std::vector* images, std::vector* outputs) { if (images->empty()) { - FDERROR << "The size of input images should be greater than 0." << std::endl; + FDERROR << "The size of input images should be greater than 0." + << std::endl; return false; } FDASSERT(images->size() == 1, "Only support batch = 1 now."); diff --git a/fastdeploy/vision/faceid/contrib/insightface/preprocessor.h b/fastdeploy/vision/faceid/contrib/insightface/preprocessor.h index 88d0dce8dca..b8cf44fba5b 100755 --- a/fastdeploy/vision/faceid/contrib/insightface/preprocessor.h +++ b/fastdeploy/vision/faceid/contrib/insightface/preprocessor.h @@ -54,10 +54,16 @@ class FASTDEPLOY_DECL InsightFaceRecognitionPreprocessor { /// Set beta. void SetBeta(std::vector& beta) { beta_ = beta; } - bool GetPermute() { return permute_; } + bool GetPermute() { return disable_permute_; } /// Set permute. - void SetPermute(bool permute) { permute_ = permute; } + void SetPermute(bool permute) { disable_permute_ = !permute; } + + /// This function will disable normalize and hwc2chw in preprocessing step. + void DisableNormalize() { disable_normalize_ = true; } + + /// This function will disable hwc2chw in preprocessing step. + void DisablePermute() { disable_permute_ = true; } protected: bool Preprocess(FDMat* mat, FDTensor* output); @@ -70,9 +76,11 @@ class FASTDEPLOY_DECL InsightFaceRecognitionPreprocessor { // Argument for image preprocessing step, beta values for normalization, // default beta = {-1.f, -1.f, -1.f} std::vector beta_; + // for recording the switch of normalize + bool disable_normalize_ = false; // Argument for image preprocessing step, whether to swap the B and R channel, // such as BGR->RGB, default true. - bool permute_; + bool disable_permute_ = false; }; } // namespace faceid diff --git a/python/fastdeploy/vision/faceid/contrib/insightface/__init__.py b/python/fastdeploy/vision/faceid/contrib/insightface/__init__.py index 3353c8e4408..dd8cab5e20d 100644 --- a/python/fastdeploy/vision/faceid/contrib/insightface/__init__.py +++ b/python/fastdeploy/vision/faceid/contrib/insightface/__init__.py @@ -56,13 +56,17 @@ def beta(self): """ return self._preprocessor.beta - @property - def permute(self): + def disable_normalize(self): + """ + This function will disable normalize in preprocessing step. + """ + self._preprocessor.disable_normalize() + + def disable_permute(self): """ - Argument for image preprocessing step, whether to swap the B and R channel, - such as BGR->RGB, default true. + This function will disable hwc2chw in preprocessing step. """ - return self._preprocessor.permute + self._preprocessor.disable_permute() class InsightFaceRecognitionPostprocessor: diff --git a/tools/rknpu2/config/arcface_quantized.yaml b/tools/rknpu2/config/arcface_quantized.yaml new file mode 100644 index 00000000000..b4f198d630c --- /dev/null +++ b/tools/rknpu2/config/arcface_quantized.yaml @@ -0,0 +1,15 @@ +mean: + - + - 127.5 + - 127.5 + - 127.5 +std: + - + - 127.5 + - 127.5 + - 127.5 +model_path: ./ms1mv3_arcface_r18.onnx +outputs_nodes: +do_quantization: True +dataset: "./datasets.txt" +output_folder: "./" diff --git a/tools/rknpu2/config/arcface_unquantized.yaml b/tools/rknpu2/config/arcface_unquantized.yaml new file mode 100644 index 00000000000..d68488a0d13 --- /dev/null +++ b/tools/rknpu2/config/arcface_unquantized.yaml @@ -0,0 +1,15 @@ +mean: + - + - 127.5 + - 127.5 + - 127.5 +std: + - + - 127.5 + - 127.5 + - 127.5 +model_path: ./ms1mv3_arcface_r18.onnx +outputs_nodes: +do_quantization: False +dataset: "./datasets.txt" +output_folder: "./" diff --git a/tools/rknpu2/export.py b/tools/rknpu2/export.py index 062f4fd82d7..c42a1eade73 100644 --- a/tools/rknpu2/export.py +++ b/tools/rknpu2/export.py @@ -37,17 +37,24 @@ def get_config(): # Config mean_values = yaml_config["mean"] std_values = yaml_config["std"] - model.config(mean_values=mean_values, std_values=std_values, target_platform=config.target_platform) + model.config( + mean_values=mean_values, + std_values=std_values, + target_platform=config.target_platform) # Load ONNX model if yaml_config["outputs_nodes"] is None: ret = model.load_onnx(model=yaml_config["model_path"]) else: - ret = model.load_onnx(model=yaml_config["model_path"], outputs=yaml_config["outputs_nodes"]) + ret = model.load_onnx( + model=yaml_config["model_path"], + outputs=yaml_config["outputs_nodes"]) assert ret == 0, "Load model failed!" # Build model - ret = model.build(do_quantization=yaml_config["do_quantization"], dataset=yaml_config["dataset"]) + ret = model.build( + do_quantization=yaml_config["do_quantization"], + dataset=yaml_config["dataset"]) assert ret == 0, "Build model failed!" # Init Runtime @@ -60,7 +67,11 @@ def get_config(): model_base_name = os.path.basename(yaml_config["model_path"]).split(".")[0] model_device_name = config.target_platform.lower() - model_save_name = model_base_name + "_" + model_device_name + ".rknn" - ret = model.export_rknn(os.path.join(yaml_config["output_folder"], model_save_name)) + if yaml_config["do_quantization"]: + model_save_name = model_base_name + "_" + model_device_name + "_quantized" + ".rknn" + else: + model_save_name = model_base_name + "_" + model_device_name + "_unquantized" + ".rknn" + ret = model.export_rknn( + os.path.join(yaml_config["output_folder"], model_save_name)) assert ret == 0, "Export rknn model failed!" print("Export OK!") From c35787d43ced6f2adb4356b59d02782a6e8dfdbd Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Wed, 11 Jan 2023 13:04:27 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0insightface=E7=B3=BB?= =?UTF-8?q?=E5=88=97=E6=A8=A1=E5=9E=8B=E7=9A=84rknpu2=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/faq/rknpu2/rknpu2.md | 23 ++++++++++--------- .../rknpu2/{README_CN.md => README.md} | 4 ++-- tools/rknpu2/config/arcface_quantized.yaml | 6 ++--- tools/rknpu2/config/arcface_unquantized.yaml | 6 ++--- 4 files changed, 20 insertions(+), 19 deletions(-) rename examples/vision/faceid/insightface/rknpu2/{README_CN.md => README.md} (93%) diff --git a/docs/cn/faq/rknpu2/rknpu2.md b/docs/cn/faq/rknpu2/rknpu2.md index fcd3e7c35c2..f4ba2f8328b 100644 --- a/docs/cn/faq/rknpu2/rknpu2.md +++ b/docs/cn/faq/rknpu2/rknpu2.md @@ -13,14 +13,15 @@ ONNX模型不能直接调用RK芯片中的NPU进行运算,需要把ONNX模型 * ARM CPU使用ONNX框架进行测试 * NPU均使用单核进行测试 -| 任务场景 | 模型 | 模型版本(表示已经测试的版本) | ARM CPU/RKNN速度(ms) | -|----------------|------------------------------------------------------------------------------------------|--------------------------|--------------------| -| Detection | [Picodet](../../../../examples/vision/detection/paddledetection/rknpu2/README.md) | Picodet-s | 162/112 | -| Detection | [RKYOLOV5](../../../../examples/vision/detection/rkyolo/README.md) | YOLOV5-S-Relu(int8) | -/57 | -| Detection | [RKYOLOX](../../../../examples/vision/detection/rkyolo/README.md) | - | -/- | -| Detection | [RKYOLOV7](../../../../examples/vision/detection/rkyolo/README.md) | - | -/- | -| Segmentation | [Unet](../../../../examples/vision/segmentation/paddleseg/rknpu2/README.md) | Unet-cityscapes | -/- | -| Segmentation | [PP-HumanSegV2Lite](../../../../examples/vision/segmentation/paddleseg/rknpu2/README.md) | portrait(int8) | 133/43 | -| Segmentation | [PP-HumanSegV2Lite](../../../../examples/vision/segmentation/paddleseg/rknpu2/README.md) | human(int8) | 133/43 | -| Face Detection | [SCRFD](../../../../examples/vision/facedet/scrfd/rknpu2/README.md) | SCRFD-2.5G-kps-640(int8) | 108/42 | -| Classification | [ResNet](../../../../examples/vision/classification/paddleclas/rknpu2/README.md) | ResNet50_vd | -/33 | +| 任务场景 | 模型 | 模型版本(表示已经测试的版本) | ARM CPU/RKNN速度(ms) | +|----------------------|------------------------------------------------------------------------------------------|--------------------------|--------------------| +| Detection | [Picodet](../../../../examples/vision/detection/paddledetection/rknpu2/README.md) | Picodet-s | 162/112 | +| Detection | [RKYOLOV5](../../../../examples/vision/detection/rkyolo/README.md) | YOLOV5-S-Relu(int8) | -/57 | +| Detection | [RKYOLOX](../../../../examples/vision/detection/rkyolo/README.md) | - | -/- | +| Detection | [RKYOLOV7](../../../../examples/vision/detection/rkyolo/README.md) | - | -/- | +| Segmentation | [Unet](../../../../examples/vision/segmentation/paddleseg/rknpu2/README.md) | Unet-cityscapes | -/- | +| Segmentation | [PP-HumanSegV2Lite](../../../../examples/vision/segmentation/paddleseg/rknpu2/README.md) | portrait(int8) | 133/43 | +| Segmentation | [PP-HumanSegV2Lite](../../../../examples/vision/segmentation/paddleseg/rknpu2/README.md) | human(int8) | 133/43 | +| Face Detection | [SCRFD](../../../../examples/vision/facedet/scrfd/rknpu2/README.md) | SCRFD-2.5G-kps-640(int8) | 108/42 | +| Face FaceRecognition | [InsightFace](../../../../examples/vision/faceid/insightface/rknpu2/README_CN.md) | ms1mv3_arcface_r18(int8) | 81/42 | +| Classification | [ResNet](../../../../examples/vision/classification/paddleclas/rknpu2/README.md) | ResNet50_vd | -/33 | diff --git a/examples/vision/faceid/insightface/rknpu2/README_CN.md b/examples/vision/faceid/insightface/rknpu2/README.md similarity index 93% rename from examples/vision/faceid/insightface/rknpu2/README_CN.md rename to examples/vision/faceid/insightface/rknpu2/README.md index 378eb849c7c..01bee2e287f 100644 --- a/examples/vision/faceid/insightface/rknpu2/README_CN.md +++ b/examples/vision/faceid/insightface/rknpu2/README.md @@ -34,8 +34,8 @@ ```bash wget https://bj.bcebos.com/paddlehub/fastdeploy/ms1mv3_arcface_r18.onnx -python -m paddle2onnx.optimize --input_model ms1mv3_arcface_r18.onnx \ - --output_model ms1mv3_arcface_r18.onnx \ +python -m paddle2onnx.optimize --input_model ./ms1mv3_arcface_r18/ms1mv3_arcface_r18.onnx \ + --output_model ./ms1mv3_arcface_r18/ms1mv3_arcface_r18.onnx \ --input_shape_dict "{'data':[1,3,112,112]}" python /Path/To/FastDeploy/tools/rknpu2/export.py \ diff --git a/tools/rknpu2/config/arcface_quantized.yaml b/tools/rknpu2/config/arcface_quantized.yaml index b4f198d630c..95642b5c9c4 100644 --- a/tools/rknpu2/config/arcface_quantized.yaml +++ b/tools/rknpu2/config/arcface_quantized.yaml @@ -8,8 +8,8 @@ std: - 127.5 - 127.5 - 127.5 -model_path: ./ms1mv3_arcface_r18.onnx +model_path: ./ms1mv3_arcface_r18/ms1mv3_arcface_r18.onnx outputs_nodes: do_quantization: True -dataset: "./datasets.txt" -output_folder: "./" +dataset: "./ms1mv3_arcface_r18/datasets.txt" +output_folder: "./ms1mv3_arcface_r18" diff --git a/tools/rknpu2/config/arcface_unquantized.yaml b/tools/rknpu2/config/arcface_unquantized.yaml index d68488a0d13..c11b285d362 100644 --- a/tools/rknpu2/config/arcface_unquantized.yaml +++ b/tools/rknpu2/config/arcface_unquantized.yaml @@ -8,8 +8,8 @@ std: - 127.5 - 127.5 - 127.5 -model_path: ./ms1mv3_arcface_r18.onnx +model_path: ./ms1mv3_arcface_r18/ms1mv3_arcface_r18.onnx outputs_nodes: do_quantization: False -dataset: "./datasets.txt" -output_folder: "./" +dataset: "./ms1mv3_arcface_r18/datasets.txt" +output_folder: "./ms1mv3_arcface_r18" From 0693c59b567510a550aa87e4f0c7723c94a6fbe5 Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Wed, 11 Jan 2023 13:06:42 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/faq/rknpu2/rknpu2.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/cn/faq/rknpu2/rknpu2.md b/docs/cn/faq/rknpu2/rknpu2.md index f4ba2f8328b..81f35bd431d 100644 --- a/docs/cn/faq/rknpu2/rknpu2.md +++ b/docs/cn/faq/rknpu2/rknpu2.md @@ -23,5 +23,12 @@ ONNX模型不能直接调用RK芯片中的NPU进行运算,需要把ONNX模型 | Segmentation | [PP-HumanSegV2Lite](../../../../examples/vision/segmentation/paddleseg/rknpu2/README.md) | portrait(int8) | 133/43 | | Segmentation | [PP-HumanSegV2Lite](../../../../examples/vision/segmentation/paddleseg/rknpu2/README.md) | human(int8) | 133/43 | | Face Detection | [SCRFD](../../../../examples/vision/facedet/scrfd/rknpu2/README.md) | SCRFD-2.5G-kps-640(int8) | 108/42 | -| Face FaceRecognition | [InsightFace](../../../../examples/vision/faceid/insightface/rknpu2/README_CN.md) | ms1mv3_arcface_r18(int8) | 81/42 | +| Face FaceRecognition | [InsightFace](../../../../examples/vision/faceid/insightface/rknpu2/README_CN.md) | ms1mv3_arcface_r18(int8) | 81/12 | | Classification | [ResNet](../../../../examples/vision/classification/paddleclas/rknpu2/README.md) | ResNet50_vd | -/33 | + +## 预编译库下载 + +为了方便大家进行开发,这里提供1.0.2版本的FastDeploy给大家使用 + +- [FastDeploy RK356X c++ SDK](https://bj.bcebos.com/fastdeploy/release/cpp/fastdeploy-linux-aarch64-rk356X-1.0.2.tgz) +- [FastDeploy RK3588 c++ SDK](https://bj.bcebos.com/fastdeploy/release/cpp/fastdeploy-linux-aarch64-rk3588-1.0.2.tgz) From aa7aee41dfa9781361f86e1aacbc7aa849d671ac Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Thu, 12 Jan 2023 20:27:42 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0insightface?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/vision/faceid/insightface/cpp/README_CN.md | 2 +- .../faceid/insightface/rknpu2/cpp/CMakeLists.txt | 2 -- .../vision/faceid/insightface/rknpu2/cpp/README.md | 3 ++- .../faceid/insightface/rknpu2/cpp/infer_arcface.cc | 12 ++++-------- .../insightface/rknpu2/python/infer_arcface.py | 1 - .../vision/faceid/contrib/insightface/preprocessor.h | 5 ----- 6 files changed, 7 insertions(+), 18 deletions(-) diff --git a/examples/vision/faceid/insightface/cpp/README_CN.md b/examples/vision/faceid/insightface/cpp/README_CN.md index 5d5fc3c82fa..7f0dc442c5c 100644 --- a/examples/vision/faceid/insightface/cpp/README_CN.md +++ b/examples/vision/faceid/insightface/cpp/README_CN.md @@ -101,7 +101,7 @@ VPL模型加载和初始化,其中model_file为导出的ONNX模型格式。 #### Predict函数 > ```c++ -> ArcFace::Predict(cv::Mat* im, FaceRecognitionResult* result) +> ArcFace::Predict(const cv::Mat& im, FaceRecognitionResult* result) > ``` > > 模型预测接口,输入图像直接输出检测结果。 diff --git a/examples/vision/faceid/insightface/rknpu2/cpp/CMakeLists.txt b/examples/vision/faceid/insightface/rknpu2/cpp/CMakeLists.txt index f7c62565deb..ce3b467ba6f 100644 --- a/examples/vision/faceid/insightface/rknpu2/cpp/CMakeLists.txt +++ b/examples/vision/faceid/insightface/rknpu2/cpp/CMakeLists.txt @@ -1,12 +1,10 @@ PROJECT(infer_demo C CXX) CMAKE_MINIMUM_REQUIRED (VERSION 3.10) -# 指定下载解压后的fastdeploy库路径 option(FASTDEPLOY_INSTALL_DIR "Path of downloaded fastdeploy sdk.") include(${FASTDEPLOY_INSTALL_DIR}/FastDeploy.cmake) -# 添加FastDeploy依赖头文件 include_directories(${FASTDEPLOY_INCS}) add_executable(infer_arcface_demo ${PROJECT_SOURCE_DIR}/infer_arcface.cc) diff --git a/examples/vision/faceid/insightface/rknpu2/cpp/README.md b/examples/vision/faceid/insightface/rknpu2/cpp/README.md index bd7bed7b224..bb88804cdea 100644 --- a/examples/vision/faceid/insightface/rknpu2/cpp/README.md +++ b/examples/vision/faceid/insightface/rknpu2/cpp/README.md @@ -18,6 +18,7 @@ FastDeploy支持在RKNPU上部署包括ArcFace\CosFace\VPL\Partial_FC在内的In ```bash mkdir build cd build +# FastDeploy version need >=1.0.3 wget https://bj.bcebos.com/fastdeploy/release/cpp/fastdeploy-linux-x64-x.x.x.tgz tar xvf fastdeploy-linux-x64-x.x.x.tgz cmake .. -DFASTDEPLOY_INSTALL_DIR=${PWD}/fastdeploy-linux-x64-x.x.x @@ -104,7 +105,7 @@ VPL模型加载和初始化,其中model_file为导出的ONNX模型格式。 #### Predict函数 > ```c++ -> ArcFace::Predict(cv::Mat* im, FaceRecognitionResult* result) +> ArcFace::Predict(const cv::Mat& im, FaceRecognitionResult* result) > ``` > > 模型预测接口,输入图像直接输出检测结果。 diff --git a/examples/vision/faceid/insightface/rknpu2/cpp/infer_arcface.cc b/examples/vision/faceid/insightface/rknpu2/cpp/infer_arcface.cc index be6f9b4bc12..f9a4d85ff0c 100644 --- a/examples/vision/faceid/insightface/rknpu2/cpp/infer_arcface.cc +++ b/examples/vision/faceid/insightface/rknpu2/cpp/infer_arcface.cc @@ -18,15 +18,11 @@ void CpuInfer(const std::string& model_file, const std::vector& image_file) { auto model = fastdeploy::vision::faceid::ArcFace(model_file, ""); - fastdeploy::TimeCounter tc; - tc.Start(); cv::Mat face0 = cv::imread(image_file[0]); fastdeploy::vision::FaceRecognitionResult res0; if (!model.Predict(face0, &res0)) { std::cerr << "Prediction Failed." << std::endl; } - tc.End(); - tc.PrintInfo("Arcface in ONNX"); cv::Mat face1 = cv::imread(image_file[1]); fastdeploy::vision::FaceRecognitionResult res1; @@ -38,6 +34,7 @@ void CpuInfer(const std::string& model_file, fastdeploy::vision::FaceRecognitionResult res2; if (!model.Predict(face2, &res2)) { std::cerr << "Prediction Failed." << std::endl; + return; } std::cout << "Prediction Done!" << std::endl; @@ -67,26 +64,25 @@ void RKNPUInfer(const std::string& model_file, model.GetPreprocessor().DisableNormalize(); model.GetPreprocessor().DisablePermute(); - fastdeploy::TimeCounter tc; - tc.Start(); cv::Mat face0 = cv::imread(image_file[0]); fastdeploy::vision::FaceRecognitionResult res0; if (!model.Predict(face0, &res0)) { std::cerr << "Prediction Failed." << std::endl; + return; } - tc.End(); - tc.PrintInfo("Arcface in RKNN"); cv::Mat face1 = cv::imread(image_file[1]); fastdeploy::vision::FaceRecognitionResult res1; if (!model.Predict(face1, &res1)) { std::cerr << "Prediction Failed." << std::endl; + return; } cv::Mat face2 = cv::imread(image_file[2]); fastdeploy::vision::FaceRecognitionResult res2; if (!model.Predict(face2, &res2)) { std::cerr << "Prediction Failed." << std::endl; + return; } std::cout << "Prediction Done!" << std::endl; diff --git a/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py b/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py index 2f0506c52a5..29431713cc8 100644 --- a/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py +++ b/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py @@ -3,7 +3,6 @@ import numpy as np -# 余弦相似度 def cosine_similarity(a, b): a = np.array(a) b = np.array(b) diff --git a/fastdeploy/vision/faceid/contrib/insightface/preprocessor.h b/fastdeploy/vision/faceid/contrib/insightface/preprocessor.h index b8cf44fba5b..b73538df49e 100755 --- a/fastdeploy/vision/faceid/contrib/insightface/preprocessor.h +++ b/fastdeploy/vision/faceid/contrib/insightface/preprocessor.h @@ -54,11 +54,6 @@ class FASTDEPLOY_DECL InsightFaceRecognitionPreprocessor { /// Set beta. void SetBeta(std::vector& beta) { beta_ = beta; } - bool GetPermute() { return disable_permute_; } - - /// Set permute. - void SetPermute(bool permute) { disable_permute_ = !permute; } - /// This function will disable normalize and hwc2chw in preprocessing step. void DisableNormalize() { disable_normalize_ = true; } From dcc6ac2f52ce42ce84e83973676afd9d90d7108c Mon Sep 17 00:00:00 2001 From: ZhengBicheng Date: Fri, 13 Jan 2023 10:57:21 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E8=A7=A3=E5=86=B3pybin?= =?UTF-8?q?d=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vision/faceid/insightface/python/infer_arcface.py | 6 ------ .../vision/faceid/insightface/python/infer_cosface.py | 10 ++-------- .../faceid/insightface/python/infer_partial_fc.py | 9 ++------- examples/vision/faceid/insightface/python/infer_vpl.py | 6 ------ .../faceid/insightface/rknpu2/python/infer_arcface.py | 9 ++------- 5 files changed, 6 insertions(+), 34 deletions(-) diff --git a/examples/vision/faceid/insightface/python/infer_arcface.py b/examples/vision/faceid/insightface/python/infer_arcface.py index 25504b9943d..c426a35ca3e 100644 --- a/examples/vision/faceid/insightface/python/infer_arcface.py +++ b/examples/vision/faceid/insightface/python/infer_arcface.py @@ -3,7 +3,6 @@ import numpy as np -# 余弦相似度 def cosine_similarity(a, b): a = np.array(a) b = np.array(b) @@ -56,21 +55,17 @@ def build_option(args): args = parse_arguments() -# 配置runtime,加载模型 runtime_option = build_option(args) model = fd.vision.faceid.ArcFace(args.model, runtime_option=runtime_option) -# 加载图片 face0 = cv2.imread(args.face) # 0,1 同一个人 face1 = cv2.imread(args.face_positive) face2 = cv2.imread(args.face_negative) # 0,2 不同的人 -# 预测图片检测结果 result0 = model.predict(face0) result1 = model.predict(face1) result2 = model.predict(face2) -# 计算余弦相似度 embedding0 = result0.embedding embedding1 = result1.embedding embedding2 = result2.embedding @@ -78,7 +73,6 @@ def build_option(args): cosine01 = cosine_similarity(embedding0, embedding1) cosine02 = cosine_similarity(embedding0, embedding2) -# 打印结果 print(result0, end="") print(result1, end="") print(result2, end="") diff --git a/examples/vision/faceid/insightface/python/infer_cosface.py b/examples/vision/faceid/insightface/python/infer_cosface.py index 7500aee57a5..b316057e0a0 100644 --- a/examples/vision/faceid/insightface/python/infer_cosface.py +++ b/examples/vision/faceid/insightface/python/infer_cosface.py @@ -3,7 +3,6 @@ import numpy as np -# 余弦相似度 def cosine_similarity(a, b): a = np.array(a) b = np.array(b) @@ -56,21 +55,17 @@ def build_option(args): args = parse_arguments() -# 配置runtime,加载模型 runtime_option = build_option(args) model = fd.vision.faceid.CosFace(args.model, runtime_option=runtime_option) -# 加载图片 -face0 = cv2.imread(args.face) # 0,1 同一个人 +face0 = cv2.imread(args.face) face1 = cv2.imread(args.face_positive) -face2 = cv2.imread(args.face_negative) # 0,2 不同的人 +face2 = cv2.imread(args.face_negative) -# 预测图片检测结果 result0 = model.predict(face0) result1 = model.predict(face1) result2 = model.predict(face2) -# 计算余弦相似度 embedding0 = result0.embedding embedding1 = result1.embedding embedding2 = result2.embedding @@ -78,7 +73,6 @@ def build_option(args): cosine01 = cosine_similarity(embedding0, embedding1) cosine02 = cosine_similarity(embedding0, embedding2) -# 打印结果 print(result0, end="") print(result1, end="") print(result2, end="") diff --git a/examples/vision/faceid/insightface/python/infer_partial_fc.py b/examples/vision/faceid/insightface/python/infer_partial_fc.py index 9aba41974bf..e979e774cdd 100644 --- a/examples/vision/faceid/insightface/python/infer_partial_fc.py +++ b/examples/vision/faceid/insightface/python/infer_partial_fc.py @@ -3,7 +3,6 @@ import numpy as np -# 余弦相似度 def cosine_similarity(a, b): a = np.array(a) b = np.array(b) @@ -56,21 +55,18 @@ def build_option(args): args = parse_arguments() -# 配置runtime,加载模型 runtime_option = build_option(args) model = fd.vision.faceid.PartialFC(args.model, runtime_option=runtime_option) # 加载图片 -face0 = cv2.imread(args.face) # 0,1 同一个人 +face0 = cv2.imread(args.face) face1 = cv2.imread(args.face_positive) -face2 = cv2.imread(args.face_negative) # 0,2 不同的人 +face2 = cv2.imread(args.face_negative) -# 预测图片检测结果 result0 = model.predict(face0) result1 = model.predict(face1) result2 = model.predict(face2) -# 计算余弦相似度 embedding0 = result0.embedding embedding1 = result1.embedding embedding2 = result2.embedding @@ -78,7 +74,6 @@ def build_option(args): cosine01 = cosine_similarity(embedding0, embedding1) cosine02 = cosine_similarity(embedding0, embedding2) -# 打印结果 print(result0, end="") print(result1, end="") print(result2, end="") diff --git a/examples/vision/faceid/insightface/python/infer_vpl.py b/examples/vision/faceid/insightface/python/infer_vpl.py index cc072966c28..8c6f711f3d4 100644 --- a/examples/vision/faceid/insightface/python/infer_vpl.py +++ b/examples/vision/faceid/insightface/python/infer_vpl.py @@ -3,7 +3,6 @@ import numpy as np -# 余弦相似度 def cosine_similarity(a, b): a = np.array(a) b = np.array(b) @@ -56,21 +55,17 @@ def build_option(args): args = parse_arguments() -# 配置runtime,加载模型 runtime_option = build_option(args) model = fd.vision.faceid.VPL(args.model, runtime_option=runtime_option) -# 加载图片 face0 = cv2.imread(args.face) # 0,1 同一个人 face1 = cv2.imread(args.face_positive) face2 = cv2.imread(args.face_negative) # 0,2 不同的人 -# 预测图片检测结果 result0 = model.predict(face0) result1 = model.predict(face1) result2 = model.predict(face2) -# 计算余弦相似度 embedding0 = result0.embedding embedding1 = result1.embedding embedding2 = result2.embedding @@ -78,7 +73,6 @@ def build_option(args): cosine01 = cosine_similarity(embedding0, embedding1) cosine02 = cosine_similarity(embedding0, embedding2) -# 打印结果 print(result0, end="") print(result1, end="") print(result2, end="") diff --git a/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py b/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py index 29431713cc8..90222a27273 100644 --- a/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py +++ b/examples/vision/faceid/insightface/rknpu2/python/infer_arcface.py @@ -46,7 +46,6 @@ def build_option(args): args = parse_arguments() -# 配置runtime,加载模型 runtime_option = fd.RuntimeOption() model = fd.vision.faceid.ArcFace(args.model, runtime_option=runtime_option) if args.device.lower() == "npu": @@ -54,17 +53,14 @@ def build_option(args): model.preprocessor.disable_normalize() model.preprocessor.disable_permute() -# 加载图片 -face0 = cv2.imread(args.face) # 0,1 同一个人 +face0 = cv2.imread(args.face) face1 = cv2.imread(args.face_positive) -face2 = cv2.imread(args.face_negative) # 0,2 不同的人 +face2 = cv2.imread(args.face_negative) -# 预测图片检测结果 result0 = model.predict(face0) result1 = model.predict(face1) result2 = model.predict(face2) -# 计算余弦相似度 embedding0 = result0.embedding embedding1 = result1.embedding embedding2 = result2.embedding @@ -72,7 +68,6 @@ def build_option(args): cosine01 = cosine_similarity(embedding0, embedding1) cosine02 = cosine_similarity(embedding0, embedding2) -# 打印结果 print(result0, end="") print(result1, end="") print(result2, end="")