作者:Tom Simpson,文章来源:电路城
本文旨在帮大家了解如何在运行 Ubuntu 桌面的 Xilinx KV260 Vision AI 入门套件上轻松设置机器学习推理功能。
硬件部件
概述
用于 Xilinx 开发板的 Ubuntu Desktop 20.04.3 LTS的发布,包括 Kria KV260 Vision AI Starter Kit,开启了原型设计和开发机会的世界。Ubuntu 是用于创建机器学习和计算机视觉应用程序的绝佳开发环境,现在 Canonical 在多个 Xilinx 开发板上正式支持它。该项目将研究如何使用 Xilinx Kria KV260 Vision AI Starter Kit 上的 Ubuntu 20.04.3 在 Xilinx 硬件上轻松实现加速机器学习应用。
要求
项目设立
该项目的设置非常简单,并分为以下步骤,大致遵循此处的入门说明。
第 1 步:从 Canonical 下载页面下载 Kria KV260 Vision AI Starter Kit 的 Ubuntu 桌面映像
可以在此处找到下载,或者如果您使用 Linux PC 下载桌面映像文件,您可以从终端使用以下命令:
wget https://people.canonical.com/~platform/images/xilinx/kria/iot-kria-class... -O ~/Downloads/iot-kria-classic-desktop-2004-x03-20211110-98.img.xz
第 2 步:将下载的 Ubuntu 桌面映像文件刻录到空白 SD 卡
可以使用 BalenaEtcher 之类的映像实用程序或在 Linux 上使用该命令将映像文件写入 SD 卡。如果在 Linux 上使用该命令,请确保在继续之前阅读以下免责声明:
以下命令可用于使用 Linux 写入 SD 卡映像:
注意:上面提到的 SD 卡/dev/sd
SD卡写入过程完成后,您可以使用以下命令弹出设备
sudo eject /dev/sd
注意:上一步中的 SD 卡设备枚举也适用于此步骤。
第 3 步:设置硬件
应按照 https://www.xilinx.com/products/som/kria/kv260-vision-starter-kit/kv260-... 上的入门指南中的说明连接 KV260
第 4 步:在 Kria KV260 上启动 Ubuntu
Xilinx 入门页面描述了如何在 KV260 上启动 Ubuntu,以及使用 Xilinx 实用程序初始化 Ubuntu 映像。
请按照https://www.xilinx.com/products/som/kria/kv260-vision-starter-kit/kv260-...上的说明进行操作
第 5 步:在 KV260 上安装机器学习加速器覆盖
KV260 的可编程逻辑(FPGA 结构)可以通过用户可定制的硬件加速器动态加载。预建快照可用于安装基本功能,包括可编程逻辑覆盖。预构建的叠加层与Kria App Store的NLP-SmartVision加速应用程序中使用的叠加层相同。NLP-SmartVision 应用程序具有用于加速机器学习推理应用程序的B3136 DPU ,以及用于与板载 AP1302 ISP 接口的 MIPI 捕获管道。即使我们正在安装 NLP-SmartVision 应用程序,我们仍然可以使用它提供的覆盖来创建我们自己的自定义应用程序。
以下来自Xilinx Wiki的命令将安装 NLP-SmartVision snap。
sudo xlnx-config --snap --install xlnx-nlp-smartvision
注意: 该xlnx-config实用程序是在上面的步骤 4 中安装的。
我们还可以使用预构建的 snap 安装 Vitis-AI 库示例。Vitis-AI 库 snap安装预编译的测试应用程序,用于运行与 Xilinx Vitis-AI Model Zoo 中的模型相关的各种机器学习任务。
以下命令将安装 Vitis-AI 库 snap。
sudo snap install xlnx-vai-lib-samples
安装 Vitis-AI 库示例 snap 后,我们现在已设置好并准备好创建我们自己的自定义机器学习应用程序。
第 6 步:加载 NLP-SmartVision 覆盖
在我们可以运行 Vitis-AI 库示例之前,我们需要加载包含机器学习推理加速器(即 DPU)的可编程逻辑 (PL) 覆盖。以下命令将卸载当前的 PL 覆盖并加载 NLP-SmartVision 覆盖。
sudo xlnx-config --xmutil unloadapp
sudo xlnx-config --xmutil loadapp nlp-smartvision
接下来,创建一个指向加载的 dpu.xclbin 的软链接
sudo ln -sf /var/snap/xlnx-config/current/assets/dpu.xclbin /usr/lib/dpu.xclbin
注意:dpu.xclbin 软链接用于 dexplorer 实用程序 - 运行推理应用程序不需要它。
然后,验证 DPU 加速器信息
dexplorer -w
第 7 步:运行人员检测示例
为了在实时视频上运行人员检测,我们需要使用 v4l2-ctrl 库确定摄像头设备枚举。以下命令将列出系统中的视频捕获设备
v4l2-ctl --list-devices
您应该看到类似于以下内容的内容
网络摄像头设备是/dev/video0,我们可以将其作为参数传递给人员检测测试应用程序,以使用来自摄像头的实时视频。
xlnx-vai-lib-samples.test-video refinedet refinedet_pruned_0_96 /dev/video0
注意:如果您使用远程终端(SSH 或串行端口),您需要解锁 Ubuntu 桌面才能看到应用程序输出。此外,您需要使用命令设置 XAUTHORITY 和 DISPLAY 环境变量
export XAUTHORITY=$HOME/.Xauthority
export DISPLAY=:1.0
KV260 基本附件包中的 MIPI 摄像头列举如上/dev/video2图 2,媒体管道列举为/dev/media1. MIPI 摄像头需要进行额外设置才能使用。以下命令将设置 KV260 以使用 MIPI 摄像头 -确保为您的系统使用正确的 /dev/video* 和 /dev/media*。
设置媒体捕获管道分辨率和格式
media-ctl -d /dev/media1 -V '"ap1302.4-003c":2 [fmt:UYVY8_1X16/1280x720 field:none]'
media-ctl -d /dev/media1 -V '"b0100000.scaler":0 [fmt:UYVY8_1X16/1280x720 field:none]'
media-ctl -d /dev/media1 -V '"b0100000.scaler":1 [fmt:RBG24/1280x720 field:none]'
上面的命令为 1280x720 BGR 数据设置 MIPI 捕获管道。
使用 MIPI 摄像头输入运行示例人脸检测应用程序(需要 KV260 基本附件包)
xlnx-vai-lib-samples.test-video refinedet refinedet_pruned_0_96 "v4l2src device=/dev/video2 ! video/x-raw, width=1280, height=720, format=BGR, framerate=30/1 ! queue ! appsink"
创建并运行自定义机器学习应用程序
KV260 上的 Ubuntu 映像用作开发环境,因此可以直接在目标硬件上编码和编译应用程序。为了帮助我们的开发过程,我们可能需要安装 OpenCV 开发库。以下命令将安装 OpenCV 开发包。
sudo apt-get install libopencv-dev python3-opencv
要使用 Vitis-AI 库编译应用程序,我们还需要安装 glog 包。以下命令安装 glog。
sudo apt-get install libgoogle-glog-dev
下面的简单代码示例可用于执行人员检测。
#include
#include
#include
#include
#include
using namespace std;
int main( int argc, char *argv[] )
{
if (argc < 2)
{
cout << "Input source not specified" << endl;
cout << "USAGE: ./person_detection
cv::VideoCapture vid(argv[1]);
auto person_detect = vitis::ai::RefineDet::create("refinedet_pruned_0_96");
while (1)
{
cv::Mat frame;
vid >> frame;
auto detections = person_detect->run(frame);
float width = frame.cols;
float height = frame.rows;
for (auto &roi : detections.bboxes)
{
int xmin = std::min(std::max(roi.x * width, 0.0f), width);
int ymin = std::min(std::max(roi.y * height, 0.0f), height);
int xmax = std::min(std::max(xmin + (roi.width * width), 0.0f), width);
int ymax = std::min(std::max(ymin + (roi.height * height), 0.0f), height);
cv::rectangle( frame,
cv::Point(xmin, ymin),
cv::Point(xmax, ymax),
cv::Scalar(0,255,0),
1,
1,
0 );
}
cv::imshow("Person Detection", frame);
if (cv::waitKey(1) == 'q') break;
}
return 0;
}
您还可以使用以下命令在您的 Kria 上下载示例代码
mkdir ~/person_detect
cd ~/person_detect
wget https://www.hackster.io/code_files/574226/download -O main.cpp
使用以下命令编译上面的 C++ 应用程序
g++ -std=c++17 -O3 ~/person_detect/main.cpp -o ~/person_detect/person_detection \
-I/usr/include/opencv4 \
-lpthread \
-lopencv_core \
-lopencv_video \
-lopencv_videoio \
-lopencv_imgproc \
-lopencv_imgcodecs \
-lopencv_highgui \
-lvitis_ai_library-refinedet
创建指向在运行 Vitis-AI snap 时下载的人员检测模型的符号链接。这是必要的,因为 Vitis-AI-Library API 会在当前目录中查找 ML 模型,/usr/share/vitis_ai_library/models如果在当前目录中找不到该目录,则查找该目录。
ln -sf ~/snap/xlnx-vai-lib-samples/current/models/refinedet_pruned_0_96 ~/person_detect/refinedet_pruned_0_96
注意:如果您没有运行 Vitis-AI 快照人员检测示例,则可以从此处下载模型。下载模型后,将其解压缩到~/person_detect目录中。
以下命令将使用 USB 网络摄像头运行自定义人员检测应用程序(假设 USB 网络摄像头被枚举为 /dev/video0)
cd ~/person_detect
./person_detection /dev/video0
以下命令将使用 MIPI 摄像头运行自定义人员检测应用程序(假设 MIPI 摄像头被枚举为 /dev/video2,并且媒体管道已使用media-ctl前面显示的命令设置为 720p 分辨率)
cd ~/person_detect
./person_detection "v4l2src device=/dev/video2 ! video/x-raw, width=1280, height=720, format=BGR, framerate=30/1 ! queue ! appsink"
创建并安装新的自定义可编程逻辑覆盖
使用赛灵思 wiki中描述的平台资产容器 (PAC) 格式打包自定义 PL 覆盖非常简单。PAC 是一个目录结构,它使用来自自定义覆盖构建的产品。要创建自定义覆盖,请参阅我的创建自定义 Kria KV260 加速 ML 应用程序项目。
本节中的说明假设您已按照创建自定义 Kria KV260 加速 ML 应用程序项目,并且仍然保留项目目录。
注意:KV260 Ubuntu 映像基于 2020.2,因此请确保使用创建自定义 Kria KV260 加速 ML 应用程序项目中的 2020.2 构建产品。
我们要创建的 PAC 目录结构如下所示:
在您的构建机器上执行以下命令(具有创建自定义 Kria KV260 加速 ML 应用程序项目的构建产品的机器)
mkdir -p ~/kv260_ml_accel/kv260-pac/hwconfig/ml-accel/kv260
使用以下命令将构建产品复制到 PAC 目录。构建产品包括比特流二进制文件 (kv260-ml-accel.bit.bin)、设备树 blob 覆盖文件 (kv260-ml-accel.dtbo) 和加速器二进制覆盖文件 (kv260-ml-accel.xclbin) .
cp ~/kv260_ml_accel/xilinx-k26-starterkit-2020.2.2/build/tmp/sysroots-components/zynqmp_generic/kv260-ml-accel/lib/firmware/xilinx/kv260-ml-accel/* ~/kv260_ml_accel/kv260-pac/hwconfig/ml-accel/kv260/.
使用以下命令创建一个 shell.json 文件。shell.json 文件通知 DFX 管理器覆盖类型。DFX 管理器处理加载叠加。
echo '{
"shell_type" : "XRT_FLAT",
"num_slots": "1"
}' > ~/kv260_ml_accel/kv260-pac/hwconfig/ml-accel/kv260/shell.json
使用以下命令创建清单文件。清单文件包含描述硬件配置的元信息。
echo "name: ml-accel
description: KV260 ML inference accelerator (B4096 DPU + Vitis Vision xf::cv::resize)
revision: 1.0
assets:
kv260: kv260" > ~/kv260_ml_accel/kv260-pac/hwconfig/ml-accel/manifest.yaml
PAC 目录结构现在应该类似于上面的图 5。
现在 PAC 已创建,我们需要将其复制到 KV260。以下命令将通过以太网将 PAC 目录从构建机器复制到 KV260。
scp -rp ~/kv260_ml_accel/kv260-pac ubuntu@
注意:您需要将
从此时起,所有命令都将在 KV260 上执行。
将 PAC 复制到 KV260 后,您需要将 PAC 目录移动到/usr/local/share/xlnx-config或/boot/firmware/xlnx-config目录中。以下命令可用于将 PAC 移动到 KV260 上的正确位置。
sudo mkdir -p /usr/local/share/xlnx-config
sudo mv ~/Downloads/kv260-pac /usr/local/share/xlnx-config/.
我们现在可以查询系统以确定哪些 PAC 可用。以下命令执行查询
xlnx-config --query
您应该会看到类似于下面图 6 的查询响应。请注意,我们刚刚复制到目录的 ml-accel PAC 旁边没有星号。/usr/local/share/xlnx-config缺少星号表示未安装 PAC。
然后我们可以使用命令安装 PAC
sudo xlnx-config --install ml-accel
再次运行查询以查看现在已安装 ml-accel PAC
xlnx-config --query
执行上面的命令应该会显示类似于下面的图 7 的内容。现在 ml-accel PAC 旁边有一个星号,表示它已安装并可以使用。
您现在可以使用以下命令加载新的 PL 覆盖
sudo xlnx-config --xmutil unloadapp
sudo xlnx-config --xmutil loadapp ml-accel
我们可以通过使用该实用程序检查 DPU 配置来验证新的覆盖是否已加载dexplorer
图 8 显示 B4096 DPU 现在已加载到可编程逻辑中。
下载 B4096 DPU 的人员检测模型并将其解压缩到 B4096 模型目录
mkdir -p ~/xilinx_models/B4096
wget https://www.xilinx.com/bin/public/openDownload?filename=refinedet_pruned... -O ~/Downloads/refinedet_pruned_0_96-zcu102_zcu104-r1.3.1.tar.gz
tar -xvzf ~/Downloads/refinedet_pruned_0_96-zcu102_zcu104-r1.3.1.tar.gz -C ~/xilinx_models/B4096
更新人员检测应用程序目录中的符号链接以指向 B4096 模型
cd ~/person_detect
ln -sf ~/xilinx_models/B4096/refinedet_pruned_0_96
我们现在可以像以前一样使用命令运行行人检测应用程序
cd ~/person_detect
./person_detection /dev/video0
总结
该项目着眼于在 Xilinx Kria KV260 Vision AI Starter Kit 上执行机器学习推理。使用 KV260 的 Ubuntu 映像,我们可以轻松地对机器学习推理解决方案进行原型设计,并使用自定义硬件加速器创建可编程逻辑覆盖。这种方法是在熟悉的 Ubuntu 环境中工作时快速开始使用 Xilinx 平台的好方法。