【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧

image.png

本文分享至飞腾开发者平台《飞腾X100 NPU 应用SDK使用手册》

1 介绍

  X100 NPU APP-SDK在PhyEngine基础上封装了若干AI模型,为相关AI应用提供可在NPU上快速部署运行的API。当前包括图像分类、目标检测、文本识别、人脸认证、人脸检测和明火检测等应用API,这些API封装了各自模型的预处理、推理及后处理过程,输入图片直接返回需要结果。APP-SDK中也给出了各API的接口调用示例。

2 运行环境准备

2.1 检查NPU硬件及驱动

  1)检查NPU设备是否开启

查询命令: lspci -nn | grep dc24                            
查询结果: 03::00.6 Processing accelerators [1200]: Device [1db7:dc24] 

  2)检查是否存在NPU驱动

查询命令: lsmod | grep phy_npu
                             
查询结果:
phy_npu          151552  0 
phy_mem_npu      114688  1  phy_npu 

  3)检查/dev下是否有NPU设备描述符

查询命令: ls -al /dev | grep phy_npu0               
        
查询结果: crw-rw-rw- 1 root root 10, 57 Jun 12 11:24 phy_npu0   

需要确保phy_npu0可读可写,若非可读可写执行以下命令: chmod a+rw /dev/phy_npu0 

2.2 编译及运行环境准备

  编译及运行环境依赖工具表格如下

依赖工具版本
GCC5.5+
CMake3.7+
opencv4.1+

3 模型准备

  使用飞腾X100 NCSDK将不同深度学习框架(例如:ONNX、Pytorch、TensorFlow、Paddlepaddle等)下训练好的神经网络模型,转化编译为可以在X100 NPU上推理部署的模型。该工程中图像分类、目标检测、文本识别、人脸认证、人脸检测和火灾检测模型均完成转化编译,其格式如下:

模型格式                                                  
model_file_name*.json 
model_file_name*.tar 
model_file_name*.so
model_file_name*.params 

4 基于APP-SDK的NPU应用开发

  提供以下文件组织结构,用于阐述该工程的开发逻辑:

1)src        逻辑架构组件 
2)lib         源码开发所依赖的动态库文件 
3)CMakeLists.txt   编译的工程文件 
4)build       编译流程示例 

  以目标检测Yolov5s为例,分别对文件夹包含的内容进行说明。

4.1 src源码文件

  该文件下包含开发该工程所有应用的头文件和源码。

1)Yolov5s调用到的头文件(include目录下): 

phyAIEngine.h   #推理引擎头文件 
yolov5s.h      #yolov5s头文件 
yaml-cpp/yaml.h  #yaml头文件 

2) Yolov5s初始化函数 

Yolov5s::Initialize(std::string yaml_conf_path); 
从config中对应的yaml文件中获取模型路径及所需参数后,进行初始化 

3) Yolov5s数据处理函数 

Yolov5s::PhyPredict(cv::Mat& in_image, std::vector<Detection>& output) 
读取到输入数据in_image后进行预处理、推理和后处理等一些列操作后返回输出output。 
//输入预处理数据,可以包含多个 
std::vector<cv::Mat> matV_in; 
matV_in.push_back(预处理数据); 
//推理运行,获取推理结果,可包含多个 
std::vector<cv::Mat> matV_out; #推理输出 
phy_engine.execute_graph(matV_in, matV_out); #依赖phyAIEngine推理框架运行Yolov5s 
//推理结果后处理 
void Yolov5s::postprocess(cv::Mat &image,    
                            std::vector<cv::Mat> matV_out,    
                            const std::vector<std::string> &className,    
                            std::vector<Detection> &output); 
将处理后的结果output传给PhyPredict

4) Yolov5s对外接口函数

//传入yaml文件进行初始化
Yolov5s_Initialized(std::string yaml_conf_path);
//数据处理后返回结果
Yolov5s_Predict(cv::Mat& in_image, std::vector<Detection>& output);

4.2 lib运行时库及推理引擎

  运行时库目录:

libnpucompiler.so 
libnpusession.so 
libphycustom.so 
libPHYDNN.so 
libtvm_runtime.so 
libyaml-cpp.so 

  推理引擎动态库:

libphyaiengine.so 

  运行工程时,如果为指定lib,需要设置模型推理所依赖库文件的环境变量:

export LD_LIBRARY_PATH=/path/to/lib/ 

4.3 CMakeLists.txt编译工程文件

//添加src源码中所有头文件 
include_directories("${PROJECT_SOURCE_DIR}/src/include/")
include_directories("${PROJECT_SOURCE_DIR}/src/include/yaml-cpp/")
include_directories("${PROJECT_SOURCE_DIR}/src/ppocrv3_zh/include/") 
include_directories("${PROJECT_SOURCE_DIR}/src/face_verify/include/") 
//加载运行时库和推理引擎 LINK_LIBRARIES("\${PROJECT_SOURCE_DIR}/lib/libPHYDNN.so") 
LINK_LIBRARIES("${PROJECT_SOURCE_DIR}/lib/libtvm_runtime.so") 
LINK_LIBRARIES("${PROJECT_SOURCE_DIR}/lib/libphyaiengine.so") 
LINK_LIBRARIES("${PROJECT_SOURCE_DIR}/lib/libnpusession.so") 
LINK_LIBRARIES("${PROJECT_SOURCE_DIR}/lib/libyaml-cpp.so") 
LINK_LIBRARIES("${PROJECT_SOURCE_DIR}/lib/libphyaiengine.so") 
//添加src源码文件 file(GLOB project_SRCS ${PROJECT_SOURCE_DIR}/src/*.cpp) #src/*.cpp 
//添加项目对象,编译目标为:phytium_fastdeploy 
ADD_LIBRARY(phytium_fastdeploy SHARED ${CLASSIFICATION_src} ${PPOCRV3_src} ${FACE_VERIFY_src}) 

4.4 build编译

编译命令如下:

mkdir build 
cd build 
cmake .. && make -j8 

  编译完成后生成libphytium_fastdeploy.so动态时库,将该库拷贝到examples下各应用到lib目录下,为应用提供调用接口。

5 API接口调用流程

  examples目录下包含图像分类、目标检测、文本识别、人脸认证、人脸检测和火灾检测。每个用例都是一个工程,以目标检测Yolov5s为例,提供以下文件组织结构,用于阐述该工程的开发逻辑:

1)src        Yolov5s的测试源码 
2)lib        模型推理依赖的动态库 
3)config       yaml文件 
4)labels       labels文件 
5)model       模型文件 
6)CMakeLists.txt   编译的工程文件 
7)build       用于编resnet_test可执行文件 

5.1 src测试源码

1)接口头文件 
include "phy_FastDeploy.h" 
include "phy_utils.h" 

2)读取输入数据 
std::string img_path = "../images/input.jpg"; 
auto image = imread(img_path); 

3)输入yaml文件 std::string yaml_path = "../config/yolov5s_detch.yaml";

4)调用libphytium_fastdeploy.so 中Yolov5s初始化、数据处理接口,获取输出output 
std::vector<Detection> output; 
Yolov5s_Initialized(yaml_path); 
Yolov5s_Predict (image, output); 

5.2 lib模型处理接口

libphytium_fastdeploy.so

5.3 config保存yaml文件

  yaml文件内容会在封装好的phytium_fastdeploy库中被调用,相当于可以灵活的修改参数。以下是yaml文件中Global、Params两种关键字所包含的参数。

//用于保存src源码调用的模型、所需文件路径 
Global:       
        model_dir: ../model/ yolov5s     
        labes_dir: ../labels/coco-labels-2-14_2017.txt 
        format: 'onnx' 
//保存src源码提供的所需参数 
Params:      
        score_threshold: 0.25 
        nms_ threshold: 0.4 
        confidence_ threshold: 0.3 

5.4 labels文件

  以下文档中包含了80个图像类别。

coco-labels-2-14_2017.txt    

5.5 model模型文件

yolov5s.json 
yolov5s.params 
yolov5s.so 
yolov5s.tar 

5.6 CMakeLists.txt编译工程文件

         …… 
//加载动态库 
LINK_LIBRARIES("\${PROJECT_SOURCE_DIR}/lib/libphytium_fastdeploy.so") 
//加载所有可执行源码  
file(GLOB project_SRCS src/*.cpp) 
//添加项目对象,编译目标为:yolov5s_test 
add_executable(yolov5s_test ${project_SRCS}) 
target_link_libraries(yolov5s_test ${OpenCV_LIBRARIES}) 

5.7 build编译

  编译命令如下:

mkdir build 
cd build 
cmake .. && make -j8 

  编译完成后生成可执行文件yolov5s_test

5.8 测试用例

  目前Phytium-SDK实现了多个应用,包括包含图像分类、目标检测、文本识别、人脸认证、人脸检测和火灾检测,每个应用都可以通过build编译生成一个可执行脚本。

  1)图像分类(resnet50-test)

  在该应用目录src下的源码resnet_test.cpp中将图片tabby_cat.jpg作为测试例,对该图片进行推理输出类别。其执行命令如下:

./resnet_test 

  2)目标检测(yolov5s-test)

  在该应用目录src下的源码yolov5s_test.cpp中将图片dog.jpg作为测试例,对该图片中目标进行检测。其执行命令如下:

./yolov5s_test 

  3)文本识别(ppocrv3-test)

  在该应用目录src下的源码ppocrv3_test.cpp中以不同h/w比的图片为例,对images下的所有图片进行识别。其执行命令如下:

./ppocrv3_test 

  4)人脸认证(face_verify-test)

  在该应用目录src下的源码face_verify_test.cpp中将图片jay2.jpg作为测试例,对该图片进行人脸特征提取。其执行命令如下:

./face_verify_test 

  5)人脸检测(yunet-test)

  在应用目录src下的源码yunet_test.cpp中,可以将图片作为参数传入,这里以图片face.jpg为测试例,对该图片进行人脸识别。其执行命令如下:

./yunet_test ../images/face.jpg     

  6)火灾检测(fire-test)

  在应用目录src下的源码fire_test.cpp中,可以将图片作为参数传入,这里以图片fire.png为测试例,对该图片进行火灾监测。其执行命令如下:

./fire_test ../images/fire.png


推荐阅读

欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料

如开发者在使用飞腾产品有任何问题可通过在线工单联系我们



版权所有。飞腾信息技术有限公司 2023。保留所有权利。

未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。

商标声明

Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。

本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。


飞腾开发者
6 声望3 粉丝

飞腾开发者技术小助手,定期分享飞腾技术文档,助力开发者打怪升级。更多材料获取:[链接]