如今各种机器学习框架的普及使得个人搭建和训练一个机器学习模型越来越容易。然而现实中大量的机器学习模型训练完后需要在边缘端部署,那么我们看看借助xilinx vitis-ai工具,如何仅仅使用10行代码,就能在zynq mp器件上部署深度学习模型实现图像分类。
简介
xilinx vitis-ai 是用于 xilinx 硬件平台上的 ai 推理的开发堆栈。它由优化的 ip、工具、库、模型和示例设计组成。
简单来说,它主要包含:
ai推理加速器ip,即dpu; 支持将ai模型优化 (optimizer)、量化 (quantizer)、最后编译 (compiler) 成dpu运行指令集的整套工具; 支撑模型运行的运行时库(vitis-ai runtime, vitis-ai library);
更多具体介绍请 访问如下链接至官方文档:
https://github.com/xilinx/vitis-ai
https://www.xilinx.com/support/documentation/sw_manuals/vitis_ai/1_4/ug1...
本案例中,我们将使用 xilinx kria kv260开发板(包含zynqmp器件)为目标运行设备。
本文使用的vitis-ai 版本为1.4, 使用的platform基于vitis/vivado 2020.2。为了方便快速部署,我们直接使用官方发布的linux系统启动镜像, 并且使用vitis-ai library为编程接口。
准备工作
开始工作前我们需要先搭建好运行环境,包括设置host端(x86机器)的交叉编译环境,以及 target端(kv260)的启动镜像烧写。
本文的主要目的是阐述 vitis-ai library 的使用,故运行环境的搭建不做过多介绍,可以完全参考以下链接中的步骤
“step1: setup cross-compiler”
“step2: setup the target”
https://github.com/xilinx/vitis-ai/tree/master/setup/mpsoc/vart
注意因为kv260 的vitis-ai 1.4 platform基于vitis/vivado 2020.2, 配置交叉编译环境使用的脚本为host_cross_compiler_setup_2020.2.sh
因为我们使用官方启动镜像,step2中标注为“optional”的步骤我们都可以省略。
当kv260成功启动,我们会在console中看到如下提示符:
root@xilinx-k26-starterkit-2020_2:~# 程序编译
可通过如下方式获得本案例中的代码,
git clone https://github.com/lobster1989/image-classification-on-edge-with-10-lines-of-code.git 主要用到的文件为classification.cpp和makefile。另外几个jpeg文件可用于后续测试输入。
安装准备工作章节中配置好交叉编译环境后,切换到源码目录中直接运行make。make完成后文件夹中会生成执行文件“classification”。
运行演示
kv260 连接好串口,从sd卡启动运行(记得提前把执行文件和测试图片拷贝到sd下),
切换到执行文件和测试图片目录下,运行 ./classification.jpeg
分类结果如下:
代码分析
vitis-ai包含了两组编程接口:vart (vitis-ai runtime) 比较底层,提供更大的自由度;vitis-ai library属于高层次api,构建于 vart 之上,通过封装许多高效、高质量的神经网络,提供更易于使用的统一接口。
vitis-ai library的组成如下图,包含 base libraries, model libraries, library test samples, application demos几个部分:
base libraries提供底层接口; model libraries是重要的部分,提供了主流模型(classification, detection, segmentation…) 的调用方法; library test samples和application demos主要提供library的使用示例;
更多vitis-ai library的细节可参考官方文档,
https://www.xilinx.com/support/documentation/sw_manuals/vitis_ai/1_4/ug1...
再来看本例子,如何用简单到10行代码实现图片分类:
int main(int argc, char* argv[]) { std::string image_name = argv[1]; auto image = cv::imread(image_name); auto network = vitis::ai::classification::create(resnet50); auto result = network->run(image); cout << classification result: << endl; for (const auto &r : result.scores){cout << result.lookup(r.index) << : << r.score
其中create方法接受一个模型名称作为参数,返回一个classification类的实例。在安装了vitis-ai library的开发板上,已经训练编译好的模型文件放在开发板的/usr/share/vitis_ai_library/models/目录下,vitis-ai library会通过传递给create方法的模型名称来调用这些模型文件,比如我们用到的resnet50模型文件位置如下,
如果用户训练并编译好了自己的模型,也可以把自己的模型文件放到对应位置来使用。
run方法接受一个/一组图片作为输入,输出这个/这些图片的分类结果。其工作简单来说就是把模型文件和图片数据传送给dpu, dpu运行并输出推理结果,cpu再读回结果。
再看下添加了注释的代码片段,整个过程实际上非常简单明了。
int main(int argc, char* argv[]) { std::string image_name = argv[1]; auto image = cv::imread(image_name); // 读入图片 auto network = vitis::ai::classification::create(resnet50); // 用resnet50模型创建classification类实例 auto result = network->run(image); //运行模型 cout << classification result: << endl; for (const auto &r : result.scores){cout << result.lookup(r.index) << : << r.score << endl; //输出模型运行结果 }} 除了classification基础类, vitis-ai library包含了非常多的常用机器学习任务(classification, detection, segmentation…)的基础类。这些类的使用方法基本一致,
首先通过create方法创建基础类的实例, 通过getinputwidth()/getinputheight()来获取模型需要的图片尺寸, resize图片, 运行run方法来运行网络获得输出。 总结
通过这个例子,我们看到通过vitis-ai工具,可以大大缩减模型到部署之间的距离。vitis-ai包含了常用模型的model-zoo, 提供简单易用的编程接口,甚至可以让不熟悉机器学习或者fpga的软件开发者都可以在极短的时间内在fpga/soc器件上部署神经网络应用。
双十二有哪些蓝牙耳机推荐,这三款网红蓝牙耳机不容错过
在Vivado中构建自定义AXI4-Stream FIR滤波器IP 3
D类功放IC单片集成TDA7482的应用电路
5G与时空技术融合赋能千行百业数字化转型
TDA8707各引脚功能的电压参数资料
10行代码轻松在ZYNQ MP上实现图像识别
算法即芯片的时代来了!AI芯片是个全新战场
JLINK、JTAG、ULINK和STLINK的区别介绍
红外单目标跟踪与防盗报警系统的设计
通用汽车投运使用3D打印研发中心
软起动器基础问答十例
Samsung BESPOKE系列衣物护理机呵护你的甜蜜时刻
智能引导机器人能给用户带来什么帮助
意法半导体推出首款航天级可配置集成限流器
飞轮储能为什么不大力发展_飞轮储能研究的现状及前景
英特尔年营收542亿美元 第四财季营收154.1亿美元
飞思卡尔固态射频功率创新引领家庭烹饪新概念
你知道PCB为什么大多是绿色的
华为正式发布了Sound X白金版智能音箱
max6675温控器设计