Files
FastDeploy/docs/cn/faq/rknpu2/rknpu2.md
Zheng_Bicheng 795833ad2b [Doc]Fix Doc Error (#547)
* 修正RKPicodet文档

* 修正yolov5文档模型大小的错误

* 修复picodet example代码错误

* 修正文档错误,以及example模型错误
2022-11-09 18:39:58 +08:00

3.9 KiB
Raw Blame History

RKNPU2模型部署

安装环境

RKNPU2模型导出只支持在x86Linux平台上进行导出安装流程请参考RKNPU2模型导出环境配置文档

ONNX模型转换为RKNN模型

ONNX模型不能直接调用RK芯片中的NPU进行运算需要把ONNX模型转换为RKNN模型具体流程请查看RKNPU2转换文档

RKNPU2已经支持的模型列表

以下环境测试的速度均为端到端,测试环境如下:

  • 设备型号: RK3588
  • ARM CPU使用ONNX框架进行测试
  • NPU均使用单核进行测试
任务场景 模型 模型版本(表示已经测试的版本) ARM CPU/RKNN速度(ms)
Detection Picodet Picodet-s 599/136
Segmentation Unet Unet-cityscapes -/-
Segmentation PP-LiteSeg PP_LiteSeg_T_STDC1_cityscapes 6634/5598
Segmentation PP-HumanSegV2Lite portrait 456/266
Segmentation PP-HumanSegV2Lite human 496/256
Face Detection SCRFD SCRFD-2.5G-kps-640 963/142

TODO

以下为TODO计划表示还正在准备支持但是还存在问题或还可以改进的模型。

任务场景 模型 模型版本(表示已经测试的版本) ARM CPU/RKNN速度(ms)
Detection Picodet Picodet-s(int8) -/-
Detection PPYOLOE PPYOLOE(int8) -/-
Detection YOLOv5 YOLOv5-s_v6.2(int8) -/-
Face Recognition ArcFace ArcFace_r18 600/3
Face Recognition cosFace cosFace_r18 600/3

RKNPU2 Backend推理使用教程

这里以Scrfd模型为例子教你如何使用RKNPU2 Backend推理模型。以下注释中的改动是对比onnx cpu的改动。

int infer_scrfd_npu() {
    char model_path[] = "./model/scrfd_2.5g_bnkps_shape640x640.rknn";
    char image_file[] = "./image/test_lite_face_detector_3.jpg";
    auto option = fastdeploy::RuntimeOption();
	// 改动1: option需要调用UseRKNPU2
    option.UseRKNPU2();  

	// 改动2: 模型加载时需要传递fastdeploy::ModelFormat::RKNN参数
    auto *model = new fastdeploy::vision::facedet::SCRFD(model_path,"",option,fastdeploy::ModelFormat::RKNN);  
    if (!model->Initialized()) {
        std::cerr << "Failed to initialize." << std::endl;
        return 0;
    }

	// 改动3(可选): RKNPU2支持使用NPU进行normalize操作并且输入格式为nhwc格式。
	// DisableNormalizeAndPermute操作将屏蔽预处理时的nor操作和hwc转chw操作。
	// 如果你使用的是已经支持的模型列表请在Predict前调用该方法。
    model->DisableNormalizeAndPermute();
    auto im = cv::imread(image_file);
    auto im_bak = im.clone();
    fastdeploy::vision::FaceDetectionResult res;
    clock_t start = clock();
    if (!model->Predict(&im, &res, 0.8, 0.8)) {
        std::cerr << "Failed to predict." << std::endl;
        return 0;
    }
    clock_t end = clock();
    double dur = (double) (end - start);
    printf("infer_scrfd_npu use time:%f\n", (dur / CLOCKS_PER_SEC));
    auto vis_im = fastdeploy::vision::Visualize::VisFaceDetection(im_bak, res);
    cv::imwrite("scrfd_rknn_vis_result.jpg", vis_im);
    std::cout << "Visualized result saved in ./scrfd_rknn_vis_result.jpg" << std::endl;
    return 0;
}

其他关联文档