在STM32 mcu上对OpenCV进行基准测试

文章作者:Anton Bondarev和Alexander Kalmuk

OpenCV可以在mcu上执行多种类型的图像处理应用程序。

图像处理已成为我们生命的一部分。没有人对面部识别或驾驶车道检测感到惊讶。今天,这些目的最常见的图书馆是OpenCV..目前,OpenCV主要专注于高性能计算(HPC)平台/微处理器。尽管高端微控制器拥有与Pentium II相当的资源,但在它们上运行OpenCV仍然非常罕见。

一段时间,我们证明了有可能在STM32上使用OpenCV(以及其他类似类的微控制器)。我们的目标是演示在类似的硬件平台上使用这个库。虽然我们的表现很差,但我们当时并没有调查原因。在这项工作中,我们纠正了第一次测试的明显缺点。这使我们能够获得可接受的性能。本文介绍了在STM32F7平台上使用OpenCV的各种示例的性能测量结果。

本文中的所有示例都是基于EMBOX RTOS.并可按说明书复制带有示例的存储库.我们使用-os优化标志进行电路板上的示例。所有示例都使用启用CPU缓存。数据文件可以位于SD卡上。我们将图像保留在演示板上的QSPI闪光灯中,以简化播放结果时的基本说明。

我们将使用stm32f769i发现板。在板上有两种ROM类型:2mb芯片闪存和64mb外部QSPI闪存。此外,还有两种类型的RAM: 512+16+ 4kb芯片上和16mb外部SDRAM。

边缘检测

让我们从前面工作中使用的相同的例子开始,即边缘检测。本例使用精明的算法

我们在运行边缘检测时提供输出;它允许您比较上一个工作的性能改进。对于其他示例,我们将仅提供具有测量结果的表。

分析后的图像样本:

图像的输出512×269
root@embox:(空)#边fruits.png 20
图片:512×269;阈值= 20.
检测时间:0 S 116 MS
FrameBuffer:800×480 32bpp
输出512×480
root@embox:(空)#边fruits.png 20
图片:512×480;阈值= 20.
检测时间:0 S 254 MS
FrameBuffer:800×480 32bpp

结果:

图像 来自Inter4nal Flash(MS)的执行时间 从外部QSPI闪存(MS)的执行时间
果子.png 512×269 116. 120.
水果.png 512×480 254. 260.

k - means

这个来自OpenCV的例子确定了点的簇,并在每个点周围画了一个相应颜色的圆。

OpenCV使用“紧凑”的概念来确定集群:

密实度:从每个点到相应中心的平方距离的总和。(来源:OpenCV.

换句话说,密实度是一个指示点离星团中心有多近的指标。

kmeans.cpp生成一个480 x 480图像,其中几个不同颜色的点簇作为输入。随机选择每个群集的中心,并根据正态分布将点添加到集群中。

紧凑 从ROM执行时间(MS) QSPI的执行时间(毫秒)
733589. 34. 98
160406. 6. 18.
331447. 14. 38.
706280 13. 36.
399182 8. 25.

广场

识别几何形状,特别是矩形,也是OpenCV库中的标准示例。

分析图像的一个样本(取自下表中列出的pic6.png)

400×300的图像结果:

图像 从ROM执行时间(MS) QSPI的执行时间(毫秒)
pic1.png 1312. 1668
pic2.png. 4893 7268
pic3.png. 1263. 1571.
pic4.png 2351. 3590
pic5.png 1235. 1515.
pic6.png. 1575. 2202

人脸检测

人脸识别是我们研究的最初目标。我们想要估计类似的算法在这样的板子上能有多好。我们使用标准的“人脸检测”示例,包含5张图像。示例使用哈尔级联检测

分析图像的样本:

图片的结果在256×256:

图像 从ROM执行时间(MS) QSPI的执行时间(毫秒)
seq_256x256 / img_000.png. 3389. 3801
seq_256x256 / img_001.png 4015. 4454
seq_256x256 / img_002.png 4016. 4464
seq_256x256 / img_003.png 3315. 3717.
seq_256x256 / img_004.png 3526. 3952

图片的结果480×480:

图像 从ROM执行时间(MS) QSPI的执行时间(毫秒)
seq_480x480 / img_000.png 14406 16149
seq_480x480 / img_001.png 14784 16578
seq_480x480 / img_002.png 15106. 16904
seq_480x480 / img_003.png. 12695 14352
seq_480x480 / img_004.png 14655 16446.

人民检测

我们决定尝试更复杂的算法,选择人工检测。我们使用OpenCV中的' peopledetect '例子,它是基于面向梯度的直方图(猪)。

图片示例:

结果

图像 从ROM执行时间(MS) QSPI的执行时间(毫秒)
basketball2.png 640×480 40347 52587

二维码

QR码是模式识别的一个广泛应用的例子。在这个例子中,QR码在图像中定义,并被一个方形框架包围。我们只使用检测而没有内容识别。

我们使用的样本来自互联网:

结果:

图像 从ROM执行时间(MS) QSPI的执行时间(毫秒)
qrcode_600x442.png. - 3092.

此示例使用不同的函数调用,因此将不同的代码插入到最终图像中。因此,虽然我们尝试构建这个例子,但它不适合内部闪光,因此,结果仅来自QSPI。

所有的例子都使用不同的算法(函数调用),并将不同的代码插入到最终的图像中。因此,当我们试图构建这个示例时,它不适合片上闪存,因此,结果仅来自QSPI。

在微控制器上工作的具体细节

在微控制器上使用OpenCV时发现了一些显着的点。首先,即使启用高速缓存,内部内存中的代码工作比外部QSPI闪存更快。

第二,在我们看来,也与缓存相关联,是性能对代码位置的依赖性。我们发现次要代码更改,例如插入未调用的命令,可以将性能提高5%或更高。

第三,是内存的有限尺寸。我们无法快速使用内部闪光灯检测QR码检测示例。

另一个重要特征涉及ARM Cortex-M核心。我们使用了支持的CPU核心SIMD.指令。该技术通过同时对单个寄存器中的多个数据点执行相同的操作,有助于提高性能。为了评估SIMD是否会影响类似任务的性能,我们在Linux上进行了测量,在支持和不支持SIMD指令的情况下,发现在一些例子中,比如方块,使用SIMD可以提高80%的性能,但是这种加速取决于所使用的算法。

对于我们的CPU核心,只有支持的形式内在功能.换句话说,有必要手动插入这些命令。OpenCV支持这种方法。您可以为自定义体系结构实施SIMD支持。但是目前,OpenCV SIMD支持旨在只使用长数据类型(128位等),而Cortex-M7核心仅支持32位寄存器。因此,在STM32上使用SIMD时,这项工作并未评估性能改进。我们希望这将是未来研究的方向。

结论

这些结果表明,可以在微控制器上使用非常复杂的软件,例如OpenCV。这一示例发起了几个例子,所有这些例子都成功地工作了。但是,性能明显低于主机平台的性能。

在微控制器上使用OpenCV非常依赖目标。大多数基本算法都是不知不觉的。边缘检测在一秒钟的一小部分中完成;这种性能可能足以让自主机器人。也可以使用复杂的算法,例如QR码处理,但有必要评估解决方案的优缺点。一方面,完成面部检测所需的3秒可能是一些应用程序的长时间,但另一方面,出于某些目的,它可能足够快。

因此,我们发现这种平台尚未足够强大,以识别复杂的对象,例如,识别一个人。与主机上的相同图像相比,延迟非常明显。然而,我们还必须明白,在本研究中,我们将MCU与64位Intel-I7的MCU与8个核心和基本上不同的频率进行比较,当然,这些平台的功耗和成本完全不同。除此之外,比较不涉及最强大的微控制器。STM32具有H7系列,具有两倍以上的性能。

你可以看出它是如何工作的视频下图:

复制的结果

您可以重现在文章中获得的结果。您需要两个存储库。主要的Embox库存储库使用示例图像和STM32F769I-Discovery Board的现成配置。您应该按照Samples存储库从ReadMe文件中的说明进行操作以重现结果。

您还可以使用其他板,但是,您需要准备特定的EMBOX的配置。此外,您还可以在SD卡上进行其他图像或将图像存储在一起,但它还需要更改EMBOX的配置。

本文最初发布嵌入式

安东尼邦德纳维夫Embox RTOS创始人。Anton于2003年毕业于圣彼得堡电气技术大学(LETI),获得电气工程硕士学位,并就读于圣彼得堡国立大学软件工程专业的研究生课程。他在嵌入式和系统编程方面有20多年的经验。

亚历山大Kalmuk是EMBOX的Cofounter。亚历山大于2014年毕业于圣彼得堡州立大学,硕士学位和软件工程硕士学位,并参加了圣彼得堡州立大学的研究生课程专门从事控制理论。他在嵌入式系统编程中有超过10年。

发表评论