簡介
Xilinx Vitis-AI 是用于 Xilinx 硬件平臺上的 AI 推理的開發堆棧。它由優化的 IP、工具、庫、模型和示例設計組成。
簡單來說,它主要包含:
AI推理加速器IP,即DPU;
支持將AI模型優化 (Optimizer)、量化 (Quantizer)、最后編譯 (Compiler) 成DPU運行指令集的整套工具;
支撐模型運行的運行時庫(Vitis-AI runtime, Vitis-AI library);
本案例中,我們將使用 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”
注意因為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:~#
程序編譯
可通過如下方式獲得本案例中的代碼,
主要用到的文件為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的使用示例;
再來看本例子,如何用簡單到10行代碼實現圖片分類:
int main(int argc, char* argv[]) {
std::string image_name = argv[1];
auto image = cv::imread(image_name);
auto network = vitis::create("resnet50");
auto result = network->run(image);
cout << "Classification result:" << endl;
for (const auto &r : result.scores){
cout << result.lookup(r.index) << ": " << r.score << endl;
}
}
源文件中除去include部分,只有10行代碼,代碼中最重要的有兩句,第一句調用create方法創建了Classification類的一個實例,第二句調用run方法來運行神經網絡獲得推理結果。
auto network = vitis::create("resnet50");
auto result = network->run(image);
vitis::Classification 是 model libraries 中的一個基礎類,其作用是進行圖片分類,這個類中包含如下方法:
其中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::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器件上部署神經網絡應用。
審核編輯:劉清
-
神經網絡
+關注
關注
42文章
4772瀏覽量
100836 -
SD卡
+關注
關注
2文章
565瀏覽量
63926 -
DPU
+關注
關注
0文章
364瀏覽量
24201 -
Zynq
+關注
關注
10文章
610瀏覽量
47193
原文標題:10行代碼輕松在ZYNQ MP上實現圖像識別
文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論