翻译自:https://www.fpgadeveloper.com/benchmarking-an-fpga-based-ai-vision-application/
许多智能视觉应用需要做出快速决策:自动驾驶汽车、无人机、监控和工业机器人只是其中的几个例子。在开发此类人工智能视觉系统时,了解影响性能的因素至关重要。
在这篇文章中,我们将探讨两个这样的因素:操作系统和相机类型。我们将测量和比较ZCU104 板上的NLP-SmartVision 应用程序的性能。我们将使用的设置是:[](https://www.xilinx.com/zcu104)
定义性能
为了评估性能,我们将测量两个方面:帧速率和玻璃到玻璃延迟。对于帧速率,我们将使用应用程序自身的能力来测量帧速率。对于玻璃到玻璃的延迟,我们将使用一种方法,即在摄像头前面放置一个 LED,在显示器前面放置一个探测器。延迟被测量为该系统的输入和输出信号之间的时间滞后。
结果
我们将从结果开始,然后在接下来的部分中我将向您展示我是如何得到它们的。
帧率
MIPI相机
操作系统 |
人脸检测 |
物体检测 |
板材检测 |
---|
PetaLinux |
30 帧/秒 |
25 帧/秒 |
30 帧/秒 |
乌班图 |
30 帧/秒 |
25 帧/秒 |
30 帧/秒 |
Ubuntu+Docker |
30 帧/秒 |
25 帧/秒 |
30 帧/秒 |
请注意,在上述所有测试中,MIPI 相机均以 30 fps 的帧速率运行。面部和车牌检测测试的结果表明,我们可以以更高的帧速率操作相机,以实现更高的吞吐量。对象检测的结果表明 25 fps 是该分辨率下该实现的最大吞吐量。
USB摄像头
操作系统 |
人脸检测 |
物体检测 |
板材检测 |
---|
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 毫秒差异。
MIPI相机
操作系统 |
人脸检测 |
物体检测 |
板材检测 |
---|
PetaLinux |
96-120 |
240-270 |
96-120 |
乌班图 |
104-128 |
200-240 |
88-128 |
Ubuntu+Docker |
104-124 |
200-280 |
100-128 |
为了为这些测量提供某种基线,我又做了两项测试:
- 独立设计,具有简单的视频管道(此处描述),用于将视频流从摄像头连接到 DisplayPort 显示器。独立设计不运行 NLP-SmartVision,除了在 FPGA 结构中执行的去马赛克和伽玛校正之外,它没有人工智能或任何视频处理。视频流还连接到 ZynqMP PS 的实时 DisplayPort 输入。
- GStreamer 运行在 PetaLinux 上,通过一个简单的视频管道将相机连接到显示器。同样,这里没有运行 NLP-SmartVision 或 AI。
操作系统 |
没有人工智能 |
---|
独立式 |
31-64 |
PetaLinux GStreamer |
140-190 |
USB摄像头
操作系统 |
人脸检测 |
物体检测 |
板材检测 |
---|
PetaLinux |
164-184 |
180-190 |
168-196 |
乌班图 |
170-190 |
170-190 |
160-190 |
Ubuntu+Docker |
150-190 |
160-200 |
150-190 |
结论
- Docker 与不使用 Docker:未检测到任何惩罚
直观上,使用 Docker 与不使用 Docker 应该会产生性能成本,但在这个总延迟 > 100 毫秒的应用程序中,该成本还不足以衡量。
- Ubuntu vs PetaLinux: 未检测到惩罚
我想在这里看到差异,但看起来确实没有差异。如果说有什么不同的话,那就是 Ubuntu 有时似乎比 PetaLinux 有优势,但任何差异都只是整体延迟的一小部分。
- MIPI 与 USB 摄像头: MIPI 胜出*,但不适用于物体检测?!*
对于人脸检测和车牌检测,使用 Raspberry Pi 摄像头与 USB 摄像头相比有明显的 50ms 以上优势。然而,令我惊讶的是,物体检测的结果却相反。我将不得不更深入地研究这一点(敬请期待)。
- 帧速率不受影响
在所有这些测试中,帧速率不受我们使用的操作系统的影响,并且无论我们是否在 Docker 容器中运行它都没有关系。然而,可能存在我们没有测量的影响,因为该影响被系统中的边际吸收了。更有趣的测试是确定每个系统下可能的最大帧速率。这将为未来的帖子进行有趣的测试。
启动说明
对于任何想要重现这些结果的人,这里是各种设置的启动说明。这可以对任何 ZCU104/ZCU102/ZCU106 板完成,但我使用 ZCU104 来生成这些数字。
要启动该应用程序,请使用与您要测试的相机对应的选项。要测量帧速率,请将该选项添加-v
到命令末尾。
相机 |
命令 |
---|
米皮 |
nlp-smartvision -m cam1 |
USB |
nlp-smartvision -u |
但是,在启动应用程序之前,您需要为正确的操作系统设置主板,这将在以下部分中提供。
Ubuntu+Docker
有关在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
在 PetaLinux 中运行 NLP-SmartVision 的说明已在上一篇文章中给出。
基线
独立式
此处记录了独立应用程序的构建和启动说明 。只需将单个摄像头连接到 RPi 摄像头 FMC,否则监控图像将在每个连接的摄像头之间切换。
GStreamer
使用上一篇文章中描述的 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。延迟被测量为输入脉冲和输出脉冲之间的时间滞后。这是我的测试设备列表:
- LED: 来自我儿子的Snap 电路套件(顺便说一句,如果您有孩子,我强烈推荐这些套件!)
- 探测器: 同样来自Snap 电路套件,由光电二极管、100k 电阻和电池组成(特写如下所示)
- 示波器: RIGOL DS1102E
- 信号发生器: 安泰信仪器 ATF20B
- DisplayPort 显示器: 戴尔 U2417H
- USB 摄像头: 罗技 USB 摄像头 C930e
下图显示了整个设置。
下面的探测器由我儿子的Snap 电路套件中的部件组成,只是一个光电二极管、一个 100K 电阻器和一个电池。示波器探头连接在光电二极管上,因此,当光线照射到光电二极管上时,我们观察到的信号变为低电平,而在黑暗中时,信号变为高电平。请注意,LED 驱动信号的作用相反,LED 亮起时为高电平,LED 熄灭时为低电平。在测量滞后时记住这一点很重要。
下面所示的信号发生器用我们也在示波器上观察到的脉冲驱动 LED。在这里,我使用 3VDC 峰峰值、偏移量 1.5V、占空比 50%、频率 2Hz 的方波驱动 LED。
不可否认,进行实际测量有点乏味,我基本上使用示波器垂直光标来测量输入和输出脉冲之间的时间。我进行了 10 多次测量并记录了最小值和最大值。下面的屏幕截图来自测试独立应用程序。当您测试 NLP-SmartVision 应用程序时,信号会变得更加混乱,因为自动增益/曝光控制开始发挥作用,而我还没有弄清楚如何禁用它。最后,我使用卫生纸卷筒的核心来阻挡显示器其余部分的光线,并使探测器聚焦在 LED 上。
未解决的问题
我们从基于 FPGA 的 AI 视觉应用程序的操作系统和相机类型的性能比较中获得了一些有趣的见解,但也提出了一些新问题:
- 为什么 USB 摄像头的对象检测 (YOLO) 延迟比 MIPI 摄像头的延迟更低?
在进行人脸和车牌检测时,MIPI 相机明显击败了 USB 相机,因此我很惊讶地看到物体检测任务的结果相反。我肯定会进一步研究这个问题。
- 为什么 GStreamer(不带 AI)的延迟比人脸检测和车牌检测更高?
目前我还没有这个问题的答案,但我想更深入地探讨这个问题。
- 为什么从亮到暗的转换总是比从暗到亮的转换有更长的延迟?
在这些测量中,我使用从暗到亮的转换来测量延迟,因为从亮到暗的转换似乎总是有点长。我推断显示器的响应时间可能只是从亮到暗的转换时间更长,但是否可以延长 20 毫秒?(请参见上面的示波器屏幕截图)这里可能有一些我没有考虑到的问题,所以我将其作为一个未回答的问题留在这里。
- 系统在最大负载下的表现如何?
在这些测试中,我没有测量每个系统下可能的最大帧速率。更好的测试是修改应用程序,以便我们可以提高帧速率并将系统推至最大负载。或者还有另一个想法,看看它在同时运行多个实例时的表现如何。设置起来并不简单,所以我不得不把这个留到下次 - 但想想很有趣!
- 在这些测试中,显示输入延迟的影响因素有多大?
显示输入延迟可能是玻璃间延迟的重要原因。量化与显示器相关的输入延迟可以显着提高我们对大多数人工智能视觉系统中真正重要的延迟的理解。