【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧
本文分享至飞腾开发者平台《飞腾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 编译及运行环境准备
编译及运行环境依赖工具表格如下
依赖工具 | 版本 |
---|---|
GCC | 5.5+ |
CMake | 3.7+ |
opencv | 4.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和其他飞腾商标均为飞腾信息技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。
本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。