使用Arm KleidiCV开源库加速图像处理性能

2024-09-04

作者:Arm 工程部主任软件工程师Michael Platings

对于在云端及边缘等环境中运行的数百万个人工智能 (AI) 工作负载,以及各类需要理解摄像头和视频数据的 AI 应用来说,计算机视觉 (CV) 都在其中起着关键作用。Arm KleidiCV 是一个针对 Arm CPU 优化的性能关键型例程的开源库。该软件库专为集成到各种计算机视觉框架而设计,能够为 Arm 平台上的计算机视觉工作负载提供最佳性能,并且无需应用开发者进行额外编程或开发。

计算机视觉的重要性

在消费电子设备中,摄像头质量是消费者选择手机时的一大关键因素。但是,摄像头的质量不仅与镜头或传感器有关。从光子击中摄像头传感器到图像显示在屏幕的过程中,图像数据须经过多次转换,其中通常包括但不限于:热像素校正、白平衡、去马赛克、降噪、阴影校正、几何校正、色彩校正、色调曲线调整、边缘增强、缩放和裁剪等。

上述部分转换应由专用硬件完成,然而许多转换在软件中执行时表现更佳。在软件中执行可以带来出色的灵活性,使摄像头管线设计者能够快速迭代其构想,打造优异的摄像体验,进而使产品在市场中脱颖而出。

性能因素

摄像头管线不仅要生成高品质图像,还要能够快速运行。既要让消费者能够以 60fps 帧率录制 4K 视频,又可以快速拍摄优质的静态图像。用户想要记录下的一些美好瞬间稍纵即逝,如果摄像头唤醒时间过长,那即使具备拍出漂亮照片的摄像功能,也只是劳而无功。因此,要拍出令人惊艳的好照片,就最好在软件中运行摄像头管线,而且相关软件需要能够快速运行。

Arm 对构成图像处理基本要素的许多运算进行了高度优化,充分善用现有和未来 Arm CPU 的功耗和效率。我们是如何做到的?KleidiCV 不使用普通的 C 函数,而是使用 Arm C 语言扩展 (Arm C Language Extensions, ACLE) intrinsics 编写而成,可直接映射到功能强大的 Arm 单指令多数据 (SIMD) 指令。每个 KleidiCV 函数都有三种不同的实现方式,分别针对 Neon、SVE2 或 Streaming SVE 和 SME2。KleidiCV 会自动检测其所运行的硬件,并据此选择合适的实现方式。

KleidiCV 是一个小型,但不断增长的简单却快速的图像底层运算集合。其中包括:

RGB 和 BGR(含和不含 alpha 通道)、灰度和 YUV 之间的色彩转换

高斯模糊

膨胀和腐蚀

索贝尔算子

调整图像大小

KleidiCV 可用作轻量级独立图像处理库,此外还可作为非常热门的 OpenCV 库的一部分无缝使用。如果你已经在使用 OpenCV,那么可以轻松启用 KleidiCV 来加速图像处理。

KleidiCV 的速度

通过 OpenCV 的基准测试,我们可以了解 KleidiCV 如何能够加速 OpenCV。代码使用 Android NDK 26d 构建而成。以下基准测试显示了 KleidiCV 在三星 Galaxy S22 手机上搭载的 Arm Cortex-X2 核心上的性能提升情况,其中图像尺寸为 1920*1080。

目前,KleidiCV 不提供内置的多线程支持。图像处理是一个“易并行”问题,因此原则上,可以轻松地为 KleidiCV 添加多线程,但我们仍在不断完善 API,致力于为开发者提供在多任务环境中使用异构 CPU 时所需的控制功能。为了使比较更有意义,我们的基准测试在 OpenCV 中禁用了多线程。基准测试显示的是单核性能。

使用Arm KleidiCV开源库加速图像处理性能 (https://ic.work/) 技术资料 第1张

各个运算的基准测试得分各有不同。在某些情况中,性能取得了小幅提升,而在更好的情况下,KleidiCV 的运行时间比标准 OpenCV 要短得多。不同运算的平均提升率超过 75%。

若想详细了解我们如何运行基准测试,可以在 KleidiCV 资源库中查看我们使用的脚本。

获取方式

在 Java 项目中,要想获取启用 KleidiCV 的 OpenCV,最简单的方法是使用 OpenCV 4.10 Maven 包,开发者可访问以下链接,获取相关资源。

或者,在使用 CMake 构建 OpenCV 4.10 时,添加参数 -DWITH_KLEIDICV=ON,即可启用 KleidiCV 0.1。

使用Arm KleidiCV开源库加速图像处理性能 (https://ic.work/) 技术资料 第2张

你也可以将 KleidiCV 构建为独立的库。

安全和测试

Arm 非常重视安全问题。安全开发生命周期已融入到我们工作的方方面面。在可能的情况下,KleidiCV 函数将验证其参数,例如参数超出有效范围时,将返回错误。该项目包含大量自动测试。核心库代码的分支覆盖率非常高,远远超过 99%,且行覆盖率达到 100%。

开源

KleidiCV 以符合 Apache 许可证 2.0 版的源代码形式提供。

初期阶段

KleidiCV 库会不断增加更多功能。欢迎开发者在我们的 GitLab 资源库中提出反馈意见或问题。

文章推荐

相关推荐