翻译自:https://www.fpgadeveloper.com/benchmarking-an-fpga-based-ai-vision-application/
许多智能视觉应用需要做出快速决策:自动驾驶汽车、无人机、监控和工业机器人只是其中的几个例子。在开发此类人工智能视觉系统时,了解影响性能的因素至关重要。
在这篇文章中,我们将探讨两个这样的因素:操作系统和相机类型。我们将测量和比较ZCU104 板上的NLP-SmartVision 应用程序的性能。我们将使用的设置是:[](https://www.xilinx.com/zcu104)
为了评估性能,我们将测量两个方面:帧速率和玻璃到玻璃延迟。对于帧速率,我们将使用应用程序自身的能力来测量帧速率。对于玻璃到玻璃的延迟,我们将使用一种方法,即在摄像头前面放置一个 LED,在显示器前面放置一个探测器。延迟被测量为该系统的输入和输出信号之间的时间滞后。
我们将从结果开始,然后在接下来的部分中我将向您展示我是如何得到它们的。
操作系统 | 人脸检测 | 物体检测 | 板材检测 |
---|---|---|---|
PetaLinux | 30 帧/秒 | 25 帧/秒 | 30 帧/秒 |
乌班图 | 30 帧/秒 | 25 帧/秒 | 30 帧/秒 |
Ubuntu+Docker | 30 帧/秒 | 25 帧/秒 | 30 帧/秒 |
请注意,在上述所有测试中,MIPI 相机均以 30 fps 的帧速率运行。面部和车牌检测测试的结果表明,我们可以以更高的帧速率操作相机,以实现更高的吞吐量。对象检测的结果表明 25 fps 是该分辨率下该实现的最大吞吐量。
操作系统 | 人脸检测 | 物体检测 | 板材检测 |
---|---|---|---|
PetaLinux | 24 帧/秒 | 24 帧/秒 | 24 帧/秒 |
乌班图 | 24 帧/秒 | 24 帧/秒 | 24 帧/秒 |
Ubuntu+Docker | 24 帧/秒 | 24 帧/秒 | 24 帧/秒 |
请注意,在上述所有测试中,USB 摄像头均以 24 fps 的帧速率运行。结果表明,我们可以以更高的帧速率操作相机,以实现更高的吞吐量。
以下是玻璃到玻璃的延迟测量。我没有显示延迟的平均值,而是将它们列为最小值和最大值。其原因是,由于帧速率和信号发生器与相机的帧时钟不同步,预计延迟会发生变化。为了解释这一点,请考虑一下:我们以 30 fps 的帧速率使用 MIPI 相机,即帧之间有 33 毫秒。LED 从关闭到开启的转换可以在 33ms 窗口内的任何时间发生,并且它会及时漂移,因为它与相机的帧时钟异步。如果 LED 碰巧在该窗口即将结束时打开,例如曝光时间结束时或在读出阶段期间,它不会出现在该帧中,导致我们看到 LED 转换发生在下一帧中, 33 毫秒后。在此系统中,输入时序的几毫秒差异可能会导致输出时序的 33 毫秒差异。
操作系统 | 人脸检测 | 物体检测 | 板材检测 |
---|---|---|---|
PetaLinux | 96-120 | 240-270 | 96-120 |
乌班图 | 104-128 | 200-240 | 88-128 |
Ubuntu+Docker | 104-124 | 200-280 | 100-128 |
为了为这些测量提供某种基线,我又做了两项测试:
操作系统 | 没有人工智能 |
---|---|
独立式 | 31-64 |
PetaLinux GStreamer | 140-190 |
操作系统 | 人脸检测 | 物体检测 | 板材检测 |
---|---|---|---|
PetaLinux | 164-184 | 180-190 | 168-196 |
乌班图 | 170-190 | 170-190 | 160-190 |
Ubuntu+Docker | 150-190 | 160-200 | 150-190 |
对于任何想要重现这些结果的人,这里是各种设置的启动说明。这可以对任何 ZCU104/ZCU102/ZCU106 板完成,但我使用 ZCU104 来生成这些数字。
要启动该应用程序,请使用与您要测试的相机对应的选项。要测量帧速率,请将该选项添加-v
到命令末尾。
相机 | 命令 |
---|---|
米皮 | nlp-smartvision -m cam1 |
USB | nlp-smartvision -u |
但是,在启动应用程序之前,您需要为正确的操作系统设置主板,这将在以下部分中提供。
有关在Xilinx 设备的经过认证的 Ubuntu 22.04 LTS上的 Docker 容器中运行此应用程序的说明,请参阅我之前的文章:Ubuntu 上 Docker 中的 NLP-SmartVision 应用程序。
要在没有docker 容器的情况下运行应用程序,您需要使用 之前的同一篇文章为 Ubuntu 准备 SD 卡。然后将所需的软件包安装到Ubuntu,如下所示:
sudo apt-get update -y && sudo apt-get install --yes --no-install-recommends \
git \
cmake \
build-essential \
libasound2-dev \
libgstreamer1.0-dev \
libopencv-dev \
libgoogle-glog-dev \
sudo \
libprotobuf-dev \
bash \
libjansson-dev \
vim \
libgstrtspserver-1.0-dev \
libboost-serialization1.74.0 \
libboost-serialization1.74-dev \
libzmq3-dev \
libgstreamer-plugins-good1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-bad1.0-dev \
libopencv-dev \
libxilinx-vcu-omx-dev
然后您需要克隆 NLP-SmartVision 应用程序并构建它:
git clone https://github.com/fpgadeveloper/nlp-smartvision -b xlnx_rel_v2022.1
cd nlp-smartvision
mkdir -p build/install && cd build && cmake ../ && make && make DESTDIR=./install install
然后您需要安装该应用程序并将其添加到路径中:
sudo cp -r install/* /
export PATH="/opt/xilinx/kv260-nlp-smartvision/bin:$PATH"
现在您可以运行该应用程序:
sudo xmutil desktop_disable
nlp-smartvision -m cam1
在 PetaLinux 中运行 NLP-SmartVision 的说明已在上一篇文章中给出。
此处记录了独立应用程序的构建和启动说明 。只需将单个摄像头连接到 RPi 摄像头 FMC,否则监控图像将在每个连接的摄像头之间切换。
使用上一篇文章中描述的 PetaLinux 构建,您可以使用以下命令启动 GStreamer:
sudo systemctl isolate multi-user.target
gst-launch-1.0 mediasrcbin media-device=/dev/media0 v4l2src0::io-mode=mmap ! "video/x-raw, width=1920, height=1080, format=NV12, framerate=30/1" ! kmssink plane-id=39 fullscreen-overlay=true -v
当您使用详细选项 ( -v
) 运行 NLP-SmartVision 应用程序时,它将显示 USB-UART 终端上的平均帧速率。太容易了。
这是更具挑战性的部分。为了测量玻璃到玻璃的延迟,我在相机前面设置了一个 LED,在显示器前面设置了一个光电二极管。信号发生器驱动 LED 以及示波器的通道 1。光电二极管的输出连接到示波器的通道 2。延迟被测量为输入脉冲和输出脉冲之间的时间滞后。这是我的测试设备列表:
下图显示了整个设置。
下面的探测器由我儿子的Snap 电路套件中的部件组成,只是一个光电二极管、一个 100K 电阻器和一个电池。示波器探头连接在光电二极管上,因此,当光线照射到光电二极管上时,我们观察到的信号变为低电平,而在黑暗中时,信号变为高电平。请注意,LED 驱动信号的作用相反,LED 亮起时为高电平,LED 熄灭时为低电平。在测量滞后时记住这一点很重要。
下面所示的信号发生器用我们也在示波器上观察到的脉冲驱动 LED。在这里,我使用 3VDC 峰峰值、偏移量 1.5V、占空比 50%、频率 2Hz 的方波驱动 LED。
不可否认,进行实际测量有点乏味,我基本上使用示波器垂直光标来测量输入和输出脉冲之间的时间。我进行了 10 多次测量并记录了最小值和最大值。下面的屏幕截图来自测试独立应用程序。当您测试 NLP-SmartVision 应用程序时,信号会变得更加混乱,因为自动增益/曝光控制开始发挥作用,而我还没有弄清楚如何禁用它。最后,我使用卫生纸卷筒的核心来阻挡显示器其余部分的光线,并使探测器聚焦在 LED 上。
我们从基于 FPGA 的 AI 视觉应用程序的操作系统和相机类型的性能比较中获得了一些有趣的见解,但也提出了一些新问题:
更多回帖