From dc13eb704911e5584ee48dd0d09eda561d4edac1 Mon Sep 17 00:00:00 2001 From: Zheng_Bicheng <58363586+Zheng-Bicheng@users.noreply.github.com> Date: Mon, 19 Dec 2022 13:58:43 +0800 Subject: [PATCH] [RKNPU2] Update quantitative model (#879) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 对RKNPU2后端进行修改,当模型为非量化模型时,不在NPU执行normalize操作,当模型为量化模型时,在NUP上执行normalize操作 * 更新RKNPU2框架,输出数据的数据类型统一返回fp32类型 * 更新scrfd,拆分disable_normalize和disable_permute * 更新scrfd代码,支持量化 * 更新scrfd python example代码 * 更新模型转换代码,支持量化模型 * 更新文档 * 按照要求修改 * 按照要求修改 * 修正模型转换文档 * 更新一下转换脚本 --- .../vision/facedet/scrfd/rknpu2/README.md | 67 +++---------------- .../vision/facedet/scrfd/rknpu2/cpp/README.md | 10 ++- .../vision/facedet/scrfd/rknpu2/cpp/infer.cc | 5 +- .../facedet/scrfd/rknpu2/python/README.md | 16 ++++- .../facedet/scrfd/rknpu2/python/infer.py | 3 +- .../backends/rknpu/rknpu2/rknpu2_backend.cc | 17 ++--- fastdeploy/vision/facedet/contrib/scrfd.cc | 15 +++-- fastdeploy/vision/facedet/contrib/scrfd.h | 10 ++- .../vision/facedet/contrib/scrfd_pybind.cc | 3 +- .../vision/facedet/contrib/scrfd.py | 12 +++- ...rait_PP_HumanSegV2_Lite_256x144_infer.yaml | 7 -- .../RK3568/picodet_s_416_coco_lcnet.yaml | 5 -- tools/rknpu2/config/RK3568/scrfd.yaml | 7 -- ...rait_PP_HumanSegV2_Lite_256x144_infer.yaml | 7 -- .../RK3588/picodet_s_416_coco_lcnet.yaml | 5 -- tools/rknpu2/config/RK3588/scrfd.yaml | 7 -- tools/rknpu2/config/scrfd.yaml | 15 +++++ tools/rknpu2/export.py | 29 +++----- 18 files changed, 92 insertions(+), 148 deletions(-) delete mode 100644 tools/rknpu2/config/RK3568/Portrait_PP_HumanSegV2_Lite_256x144_infer.yaml delete mode 100644 tools/rknpu2/config/RK3568/picodet_s_416_coco_lcnet.yaml delete mode 100644 tools/rknpu2/config/RK3568/scrfd.yaml delete mode 100644 tools/rknpu2/config/RK3588/Portrait_PP_HumanSegV2_Lite_256x144_infer.yaml delete mode 100644 tools/rknpu2/config/RK3588/picodet_s_416_coco_lcnet.yaml delete mode 100644 tools/rknpu2/config/RK3588/scrfd.yaml create mode 100644 tools/rknpu2/config/scrfd.yaml diff --git a/examples/vision/facedet/scrfd/rknpu2/README.md b/examples/vision/facedet/scrfd/rknpu2/README.md index b5f4e7d8b..b77afe362 100644 --- a/examples/vision/facedet/scrfd/rknpu2/README.md +++ b/examples/vision/facedet/scrfd/rknpu2/README.md @@ -1,67 +1,20 @@ # SCRFD RKNPU2部署模型 - -- [SCRFD](https://github.com/deepinsight/insightface/tree/17cdeab12a35efcebc2660453a8cbeae96e20950) - - (1)[官方库](https://github.com/deepinsight/insightface/)中提供的*.pt通过[导出ONNX模型](#导出ONNX模型)操作后,可进行部署; - - (2)开发者基于自己数据训练的SCRFD模型,可按照[导出ONNX模型](#导出ONNX模型)后,完成部署。 - -## 下载预训练ONNX模型 - -为了方便开发者的测试,下面提供了SCRFD导出的各系列模型,开发者可直接下载使用。(下表中模型的精度来源于源官方库) -| 模型 | 大小 | 精度 | -|:---------------------------------------------------------------- |:----- |:----- | -| [SCRFD-500M-kps-160](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_bnkps_shape160x160.onnx) | 2.5MB | - | -| [SCRFD-500M-160](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_shape160x160.onnx) | 2.2MB | - | -| [SCRFD-500M-kps-320](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_bnkps_shape320x320.onnx) | 2.5MB | - | -| [SCRFD-500M-320](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_shape320x320.onnx) | 2.2MB | - | -| [SCRFD-500M-kps-640](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_bnkps_shape640x640.onnx) | 2.5MB | 90.97% | -| [SCRFD-500M-640](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_shape640x640.onnx) | 2.2MB | 90.57% | -| [SCRFD-1G-160](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_1g_shape160x160.onnx ) | 2.5MB | - | -| [SCRFD-1G-320](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_1g_shape320x320.onnx) | 2.5MB | - | -| [SCRFD-1G-640](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_1g_shape640x640.onnx) | 2.5MB | 92.38% | -| [SCRFD-2.5G-kps-160](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_2.5g_bnkps_shape160x160.onnx) | 3.2MB | - | -| [SCRFD-2.5G-160](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_2.5g_shape160x160.onnx) | 2.6MB | - | -| [SCRFD-2.5G-kps-320](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_2.5g_bnkps_shape320x320.onnx) | 3.2MB | - | -| [SCRFD-2.5G-320](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_2.5g_shape320x320.onnx) | 2.6MB | - | -| [SCRFD-2.5G-kps-640](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_2.5g_bnkps_shape640x640.onnx) | 3.2MB | 93.8% | -| [SCRFD-2.5G-640](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_2.5g_shape640x640.onnx) | 2.6MB | 93.78% | -| [SCRFD-10G-kps-320](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_10g_bnkps_shape320x320.onnx) | 17MB | - | -| [SCRFD-10G-320](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_10g_shape320x320.onnx) | 15MB | - | -| [SCRFD-10G-kps-640](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_10g_bnkps_shape640x640.onnx) | 17MB | 95.4% | -| [SCRFD-10G-640](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_10g_shape640x640.onnx) | 15MB | 95.16% | -| [SCRFD-10G-kps-1280](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_10g_bnkps_shape1280x1280.onnx) | 17MB | - | -| [SCRFD-10G-1280](https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_10g_shape1280x1280.onnx) | 15MB | - | - -## 导出ONNX模型 - - ```bash - #下载scrfd模型文件 - e.g. download from https://onedrive.live.com/?authkey=%21ABbFJx2JMhNjhNA&id=4A83B6B633B029CC%215542&cid=4A83B6B633B029CC - - # 安装官方库配置环境,此版本导出环境为: - - 手动配置环境 - torch==1.8.0 - mmcv==1.3.5 - mmdet==2.7.0 - - - 通过docker配置 - docker pull qyjdefdocker/onnx-scrfd-converter:v0.3 - - # 导出onnx格式文件 - - 手动生成 - python tools/scrfd2onnx.py configs/scrfd/scrfd_500m.py weights/scrfd_500m.pth --shape 640 --input-img face-xxx.jpg - - - docker - docker的onnx目录中已有生成好的onnx文件 - - ``` +本教程提供SCRFD模型在RKNPU2环境下的部署,模型的详细介绍已经ONNX模型的下载请查看[模型介绍文档](../README.md)。 ## ONNX模型转换RKNN模型 + +下面以scrfd_500m_bnkps_shape640x640为例子,快速的转换SCRFD ONNX模型为RKNN量化模型。 以下命令在Ubuntu18.04下执行: ```bash -wget https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_bnkps_shape640x640.onnx -python tools/rknpu2/export.py --config_path tools/rknpu2/config/RK3588/scrfd.yaml +wget https://bj.bcebos.com/paddlehub/fastdeploy/rknpu2/scrfd_500m_bnkps_shape640x640.zip +unzip scrfd_500m_bnkps_shape640x640.zip +python /Path/To/FastDeploy/tools/rknpu2/export.py \ + --config_path tools/rknpu2/config/scrfd.yaml \ + --target_platform rk3588 ``` + + ## 详细部署文档 - [Python部署](python/README.md) diff --git a/examples/vision/facedet/scrfd/rknpu2/cpp/README.md b/examples/vision/facedet/scrfd/rknpu2/cpp/README.md index f08a70a69..3d947f9bb 100644 --- a/examples/vision/facedet/scrfd/rknpu2/cpp/README.md +++ b/examples/vision/facedet/scrfd/rknpu2/cpp/README.md @@ -17,9 +17,7 @@ ├── CMakeLists.txt ├── build # 编译文件夹 ├── image # 存放图片的文件夹 -├── infer_cpu_npu.cc -├── infer_cpu_npu.h -├── main.cc +├── infer.cc ├── model # 存放模型文件的文件夹 └── thirdpartys # 存放sdk的文件夹 ``` @@ -39,9 +37,8 @@ mkdir thirdpartys 请参考[RK2代NPU部署库编译](../../../../../../docs/cn/build_and_install/rknpu2.md)仓库编译SDK,编译完成后,将在build目录下生成 fastdeploy-0.7.0目录,请移动它至thirdpartys目录下. -### 拷贝模型文件,以及配置文件至model文件夹 -在Paddle动态图模型 -> Paddle静态图模型 -> ONNX模型的过程中,将生成ONNX文件以及对应的yaml配置文件,请将配置文件存放到model文件夹内。 -转换为RKNN后的模型文件也需要拷贝至model。 +### 拷贝模型文件至model文件夹 +请参考[SCRFD模型转换文档](../README.md)转换SCRFD ONNX模型到RKNN模型,再将RKNN模型移动到model文件夹。 ### 准备测试图片至image文件夹 ```bash @@ -61,6 +58,7 @@ make install ```bash cd ./build/install +export LD_LIBRARY_PATH=${PWD}/lib:${LD_LIBRARY_PATH} ./rknpu_test ``` 运行完成可视化结果如下图所示 diff --git a/examples/vision/facedet/scrfd/rknpu2/cpp/infer.cc b/examples/vision/facedet/scrfd/rknpu2/cpp/infer.cc index e009d2ead..6ae869fe4 100644 --- a/examples/vision/facedet/scrfd/rknpu2/cpp/infer.cc +++ b/examples/vision/facedet/scrfd/rknpu2/cpp/infer.cc @@ -29,6 +29,7 @@ void ONNXInfer(const std::string& model_dir, const std::string& image_file) { tc.End(); tc.PrintInfo("SCRFD in ONNX"); + std::cout << res.Str() << std::endl; cv::imwrite("infer_onnx.jpg", vis_im); std::cout << "Visualized result saved in ./infer_onnx.jpg" @@ -48,7 +49,8 @@ void RKNPU2Infer(const std::string& model_dir, const std::string& image_file) { std::cerr << "Failed to initialize." << std::endl; return; } - model.DisableNormalizeAndPermute(); + model.DisableNormalize(); + model.DisablePermute(); fastdeploy::TimeCounter tc; tc.Start(); @@ -62,6 +64,7 @@ void RKNPU2Infer(const std::string& model_dir, const std::string& image_file) { tc.End(); tc.PrintInfo("SCRFD in RKNN"); + std::cout << res.Str() << std::endl; cv::imwrite("infer_rknn.jpg", vis_im); std::cout << "Visualized result saved in ./infer_rknn.jpg" diff --git a/examples/vision/facedet/scrfd/rknpu2/python/README.md b/examples/vision/facedet/scrfd/rknpu2/python/README.md index 3c8bc158c..8fe459071 100644 --- a/examples/vision/facedet/scrfd/rknpu2/python/README.md +++ b/examples/vision/facedet/scrfd/rknpu2/python/README.md @@ -4,9 +4,14 @@ - 1. 软硬件环境满足要求,参考[FastDeploy环境要求](../../../../../../docs/cn/build_and_install/rknpu2.md) - 本目录下提供`infer.py`快速完成SCRFD在RKNPU上部署的示例。执行如下脚本即可完成 +## 拷贝模型文件 +请参考[SCRFD模型转换文档](../README.md)转换SCRFD ONNX模型到RKNN模型,再将RKNN模型移动到该目录下。 + + +## 运行example +拷贝模型文件后,请输入以下命令,运行RKNPU2 Python example ```bash # 下载部署示例代码 git clone https://github.com/PaddlePaddle/FastDeploy.git @@ -20,10 +25,17 @@ python3 infer.py --model_file ./scrfd_500m_bnkps_shape640x640_rk3588.rknn \ --image test_lite_face_detector_3.jpg ``` +## 可视化 +运行完成可视化结果如下图所示 + + + + ## 注意事项 RKNPU上对模型的输入要求是使用NHWC格式,且图片归一化操作会在转RKNN模型时,内嵌到模型中,因此我们在使用FastDeploy部署时, -需要先调用DisableNormalizePermute(C++)或`disable_normalize_permute(Python),在预处理阶段禁用归一化以及数据格式的转换。 +需要先调用DisablePermute(C++)或`disable_permute(Python),在预处理阶段禁用归一化以及数据格式的转换。 + ## 其它文档 - [SCRFD 模型介绍](../README.md) diff --git a/examples/vision/facedet/scrfd/rknpu2/python/infer.py b/examples/vision/facedet/scrfd/rknpu2/python/infer.py index 77e57a0f1..b322d7005 100644 --- a/examples/vision/facedet/scrfd/rknpu2/python/infer.py +++ b/examples/vision/facedet/scrfd/rknpu2/python/infer.py @@ -45,7 +45,8 @@ model = fd.vision.facedet.SCRFD( runtime_option=runtime_option, model_format=fd.ModelFormat.RKNN) -model.disable_normalize_and_permute() +model.disable_normalize() +model.disable_permute() # 预测图片分割结果 im = cv2.imread(args.image) diff --git a/fastdeploy/backends/rknpu/rknpu2/rknpu2_backend.cc b/fastdeploy/backends/rknpu/rknpu2/rknpu2_backend.cc index ac9429450..e018ecc64 100644 --- a/fastdeploy/backends/rknpu/rknpu2/rknpu2_backend.cc +++ b/fastdeploy/backends/rknpu/rknpu2/rknpu2_backend.cc @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. #include "fastdeploy/backends/rknpu/rknpu2/rknpu2_backend.h" -#include "fastdeploy/utils/perf.h" + namespace fastdeploy { RKNPU2Backend::~RKNPU2Backend() { // Release memory uniformly here @@ -254,12 +254,11 @@ bool RKNPU2Backend::GetModelInputOutputInfos() { void RKNPU2Backend::DumpTensorAttr(rknn_tensor_attr& attr) { printf("index=%d, name=%s, n_dims=%d, dims=[%d, %d, %d, %d], " "n_elems=%d, size=%d, fmt=%s, type=%s, " - "qnt_type=%s, zp=%d, scale=%f, pass_through=%d", + "qnt_type=%s, zp=%d, scale=%f\n", attr.index, attr.name, attr.n_dims, attr.dims[0], attr.dims[1], attr.dims[2], attr.dims[3], attr.n_elems, attr.size, get_format_string(attr.fmt), get_type_string(attr.type), - get_qnt_type_string(attr.qnt_type), attr.zp, attr.scale, - attr.pass_through); + get_qnt_type_string(attr.qnt_type), attr.zp, attr.scale); } TensorInfo RKNPU2Backend::GetInputInfo(int index) { @@ -310,12 +309,7 @@ bool RKNPU2Backend::Infer(std::vector& inputs, input_attrs_[i].type = input_type; input_attrs_[i].size = inputs[0].Nbytes(); input_attrs_[i].size_with_stride = inputs[0].Nbytes(); - if(input_attrs_[i].type == RKNN_TENSOR_FLOAT16 || - input_attrs_[i].type == RKNN_TENSOR_FLOAT32){ - FDINFO << "The input model is not a quantitative model. " - "Close the normalize operation." << std::endl; - } - + input_attrs_[i].pass_through = 0; input_mems_[i] = rknn_create_mem(ctx, inputs[i].Nbytes()); if (input_mems_[i] == nullptr) { FDERROR << "rknn_create_mem input_mems_ error." << std::endl; @@ -346,7 +340,6 @@ bool RKNPU2Backend::Infer(std::vector& inputs, // default output type is depend on model, this requires float32 to compute top5 ret = rknn_set_io_mem(ctx, output_mems_[i], &output_attrs_[i]); - // set output memory and attribute if (ret != RKNN_SUCC) { FDERROR << "output tensor memory rknn_set_io_mem fail! ret=" << ret @@ -357,7 +350,7 @@ bool RKNPU2Backend::Infer(std::vector& inputs, this->infer_init = true; } - + // Copy input data to input tensor memory for (uint32_t i = 0; i < io_num.n_input; i++) { uint32_t width = input_attrs_[i].dims[2]; diff --git a/fastdeploy/vision/facedet/contrib/scrfd.cc b/fastdeploy/vision/facedet/contrib/scrfd.cc index 69c1ff002..a11328b97 100644 --- a/fastdeploy/vision/facedet/contrib/scrfd.cc +++ b/fastdeploy/vision/facedet/contrib/scrfd.cc @@ -141,7 +141,7 @@ bool SCRFD::Preprocess(Mat* mat, FDTensor* output, is_scale_up, stride); BGR2RGB::Run(mat); - if (!disable_normalize_and_permute_) { + if (!disable_normalize_) { // Normalize::Run(mat, std::vector(mat->Channels(), 0.0), // std::vector(mat->Channels(), 1.0)); // Compute `result = mat * alpha + beta` directly by channel @@ -150,6 +150,9 @@ bool SCRFD::Preprocess(Mat* mat, FDTensor* output, std::vector alpha = {1.f / 128.f, 1.f / 128.f, 1.f / 128.f}; std::vector beta = {-127.5f / 128.f, -127.5f / 128.f, -127.5f / 128.f}; Convert::Run(mat, alpha, beta); + } + + if(!disable_permute_){ HWC2CHW::Run(mat); Cast::Run(mat, "float"); } @@ -347,7 +350,6 @@ bool SCRFD::Predict(cv::Mat* im, FaceDetectionResult* result, static_cast(mat.Width())}; im_info["output_shape"] = {static_cast(mat.Height()), static_cast(mat.Width())}; - if (!Preprocess(&mat, &input_tensors[0], &im_info)) { FDERROR << "Failed to preprocess input image." << std::endl; return false; @@ -367,8 +369,13 @@ bool SCRFD::Predict(cv::Mat* im, FaceDetectionResult* result, } return true; } -void SCRFD::DisableNormalizeAndPermute(){ - disable_normalize_and_permute_ = true; + +void SCRFD::DisableNormalize() { + disable_normalize_=true; +} + +void SCRFD::DisablePermute() { + disable_permute_=true; } } // namespace facedet } // namespace vision diff --git a/fastdeploy/vision/facedet/contrib/scrfd.h b/fastdeploy/vision/facedet/contrib/scrfd.h index f1f06b203..04d8455c7 100644 --- a/fastdeploy/vision/facedet/contrib/scrfd.h +++ b/fastdeploy/vision/facedet/contrib/scrfd.h @@ -90,8 +90,10 @@ class FASTDEPLOY_DECL SCRFD : public FastDeployModel { unsigned int num_anchors; /// This function will disable normalize and hwc2chw in preprocessing step. - void DisableNormalizeAndPermute(); + void DisableNormalize(); + /// This function will disable hwc2chw in preprocessing step. + void DisablePermute(); private: bool Initialize(); @@ -121,8 +123,10 @@ class FASTDEPLOY_DECL SCRFD : public FastDeployModel { std::unordered_map> center_points_; - // for recording the switch of normalize and hwc2chw - bool disable_normalize_and_permute_ = false; + // for recording the switch of normalize + bool disable_normalize_ = false; + // for recording the switch of hwc2chw + bool disable_permute_ = false; }; } // namespace facedet } // namespace vision diff --git a/fastdeploy/vision/facedet/contrib/scrfd_pybind.cc b/fastdeploy/vision/facedet/contrib/scrfd_pybind.cc index 6b53f1a7e..b2f28c18b 100644 --- a/fastdeploy/vision/facedet/contrib/scrfd_pybind.cc +++ b/fastdeploy/vision/facedet/contrib/scrfd_pybind.cc @@ -28,7 +28,8 @@ void BindSCRFD(pybind11::module& m) { self.Predict(&mat, &res, conf_threshold, nms_iou_threshold); return res; }) - .def("disable_normalize_and_permute",&vision::facedet::SCRFD::DisableNormalizeAndPermute) + .def("disable_normalize",&vision::facedet::SCRFD::DisableNormalize) + .def("disable_permute",&vision::facedet::SCRFD::DisablePermute) .def_readwrite("size", &vision::facedet::SCRFD::size) .def_readwrite("padding_value", &vision::facedet::SCRFD::padding_value) .def_readwrite("is_mini_pad", &vision::facedet::SCRFD::is_mini_pad) diff --git a/python/fastdeploy/vision/facedet/contrib/scrfd.py b/python/fastdeploy/vision/facedet/contrib/scrfd.py index e225e69bc..753411cb7 100644 --- a/python/fastdeploy/vision/facedet/contrib/scrfd.py +++ b/python/fastdeploy/vision/facedet/contrib/scrfd.py @@ -51,11 +51,17 @@ class SCRFD(FastDeployModel): return self._model.predict(input_image, conf_threshold, nms_iou_threshold) - def disable_normalize_and_permute(self): + def disable_normalize(self): """ - This function will disable normalize and hwc2chw in preprocessing step. + This function will disable normalize in preprocessing step. """ - self._model.disable_normalize_and_permute() + self._model.disable_normalize() + + def disable_permute(self): + """ + This function will disable hwc2chw in preprocessing step. + """ + self._model.disable_permute() # 一些跟SCRFD模型有关的属性封装 # 多数是预处理相关,可通过修改如model.size = [640, 640]改变预处理时resize的大小(前提是模型支持) diff --git a/tools/rknpu2/config/RK3568/Portrait_PP_HumanSegV2_Lite_256x144_infer.yaml b/tools/rknpu2/config/RK3568/Portrait_PP_HumanSegV2_Lite_256x144_infer.yaml deleted file mode 100644 index d78a46a66..000000000 --- a/tools/rknpu2/config/RK3568/Portrait_PP_HumanSegV2_Lite_256x144_infer.yaml +++ /dev/null @@ -1,7 +0,0 @@ -model_path: ./Portrait_PP_HumanSegV2_Lite_256x144_infer/Portrait_PP_HumanSegV2_Lite_256x144_infer.onnx -output_folder: ./Portrait_PP_HumanSegV2_Lite_256x144_infer -target_platform: RK3568 -normalize: - mean: [[0.5,0.5,0.5]] - std: [[0.5,0.5,0.5]] -outputs: None diff --git a/tools/rknpu2/config/RK3568/picodet_s_416_coco_lcnet.yaml b/tools/rknpu2/config/RK3568/picodet_s_416_coco_lcnet.yaml deleted file mode 100644 index 7bb141eca..000000000 --- a/tools/rknpu2/config/RK3568/picodet_s_416_coco_lcnet.yaml +++ /dev/null @@ -1,5 +0,0 @@ -model_path: ./picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx -output_folder: ./picodet_s_416_coco_lcnet -target_platform: RK3568 -normalize: None -outputs: ['tmp_17','p2o.Concat.9'] diff --git a/tools/rknpu2/config/RK3568/scrfd.yaml b/tools/rknpu2/config/RK3568/scrfd.yaml deleted file mode 100644 index dac268b1a..000000000 --- a/tools/rknpu2/config/RK3568/scrfd.yaml +++ /dev/null @@ -1,7 +0,0 @@ -model_path: ./scrfd_500m_bnkps_shape640x640.onnx -output_folder: ./ -target_platform: RK3568 -normalize: - mean: [[0.5,0.5,0.5]] - std: [[0.5,0.5,0.5]] -outputs: None diff --git a/tools/rknpu2/config/RK3588/Portrait_PP_HumanSegV2_Lite_256x144_infer.yaml b/tools/rknpu2/config/RK3588/Portrait_PP_HumanSegV2_Lite_256x144_infer.yaml deleted file mode 100644 index 98fe9c6b5..000000000 --- a/tools/rknpu2/config/RK3588/Portrait_PP_HumanSegV2_Lite_256x144_infer.yaml +++ /dev/null @@ -1,7 +0,0 @@ -model_path: ./Portrait_PP_HumanSegV2_Lite_256x144_infer/Portrait_PP_HumanSegV2_Lite_256x144_infer.onnx -output_folder: ./Portrait_PP_HumanSegV2_Lite_256x144_infer -target_platform: RK3588 -normalize: - mean: [[0.5,0.5,0.5]] - std: [[0.5,0.5,0.5]] -outputs: None diff --git a/tools/rknpu2/config/RK3588/picodet_s_416_coco_lcnet.yaml b/tools/rknpu2/config/RK3588/picodet_s_416_coco_lcnet.yaml deleted file mode 100644 index ba12a4be1..000000000 --- a/tools/rknpu2/config/RK3588/picodet_s_416_coco_lcnet.yaml +++ /dev/null @@ -1,5 +0,0 @@ -model_path: ./picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx -output_folder: ./picodet_s_416_coco_lcnet -target_platform: RK3588 -normalize: None -outputs: ['tmp_16','p2o.Concat.9'] diff --git a/tools/rknpu2/config/RK3588/scrfd.yaml b/tools/rknpu2/config/RK3588/scrfd.yaml deleted file mode 100644 index f8c289baf..000000000 --- a/tools/rknpu2/config/RK3588/scrfd.yaml +++ /dev/null @@ -1,7 +0,0 @@ -model_path: ./scrfd_500m_bnkps_shape640x640.onnx -output_folder: ./ -target_platform: RK3588 -normalize: - mean: [[0.5,0.5,0.5]] - std: [[0.5,0.5,0.5]] -outputs: None diff --git a/tools/rknpu2/config/scrfd.yaml b/tools/rknpu2/config/scrfd.yaml new file mode 100644 index 000000000..454d762ab --- /dev/null +++ b/tools/rknpu2/config/scrfd.yaml @@ -0,0 +1,15 @@ +mean: + - + - 128.5 + - 128.5 + - 128.5 +std: + - + - 128.5 + - 128.5 + - 128.5 +model_path: ./scrfd_500m_bnkps_shape640x640.onnx +outputs_nodes: +do_quantization: True +dataset: "./datasets.txt" +output_folder: "./" \ No newline at end of file diff --git a/tools/rknpu2/export.py b/tools/rknpu2/export.py index ee43a1809..062f4fd82 100644 --- a/tools/rknpu2/export.py +++ b/tools/rknpu2/export.py @@ -21,6 +21,7 @@ def get_config(): parser = argparse.ArgumentParser() parser.add_argument("--verbose", default=True, help="rknntoolkit verbose") parser.add_argument("--config_path") + parser.add_argument("--target_platform") args = parser.parse_args() return args @@ -34,30 +35,19 @@ if __name__ == "__main__": model = RKNN(config.verbose) # Config - if yaml_config["normalize"] == "None": - model.config(target_platform=yaml_config["target_platform"]) - else: - mean_values = [[256 * mean for mean in mean_ls] - for mean_ls in yaml_config["normalize"]["mean"]] - std_values = [[256 * std for std in std_ls] - for std_ls in yaml_config["normalize"]["std"]] - model.config( - mean_values=mean_values, - std_values=std_values, - target_platform=yaml_config["target_platform"]) + 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) # Load ONNX model - print(type(yaml_config["outputs"])) - print("yaml_config[\"outputs\"] = ", yaml_config["outputs"]) - if yaml_config["outputs"] == "None": + 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"]) + 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=None) + ret = model.build(do_quantization=yaml_config["do_quantization"], dataset=yaml_config["dataset"]) assert ret == 0, "Build model failed!" # Init Runtime @@ -69,9 +59,8 @@ if __name__ == "__main__": os.mkdir(yaml_config["output_folder"]) model_base_name = os.path.basename(yaml_config["model_path"]).split(".")[0] - model_device_name = yaml_config["target_platform"].lower() + 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)) + ret = model.export_rknn(os.path.join(yaml_config["output_folder"], model_save_name)) assert ret == 0, "Export rknn model failed!" print("Export OK!")