作者:Arm 工程部資深軟件工程師 Mark Horvath;Arm 工程部資深軟件工程師 Michael Platings
自 2024 年 5 月 Arm KleidiCV 發(fā)布以來,該項目取得了顯著進展。Arm 于 2024 年 9 月發(fā)布了 0.2.0 版本,并于同年 12 月發(fā)布了 0.3.0 版本。這些更新都帶來了許多新功能,并實現(xiàn)了性能提升。
隨著移動設(shè)備上攝像頭數(shù)量的不斷增加,攝像頭管線和圖像處理已然成為當今最熱門的計算任務(wù)之一。OpenCV 是眾多此類管線的核心,并運行在數(shù)億臺設(shè)備上。而現(xiàn)在,在安卓系統(tǒng)上,OpenCV 4.11 已默認啟用 KleidiCV。
KleidiCV 0.2.0 和 0.3.0 的新增功能
多線程支持
KleidiCV 0.2.0 最顯著的新增功能之一是引入了多線程支持。KleidiCV 0.1.0 發(fā)布時僅支持單線程函數(shù),應(yīng)用開發(fā)者需要在更高級別上自行設(shè)置多線程。而 KleidiCV 0.2.0 已集成到 OpenCV 現(xiàn)有的多線程框架中,因此每個操作都能實現(xiàn)多線程處理,無需應(yīng)用開發(fā)者額外投入精力。圖像處理是一個“易于并行處理”的問題,因此 KleidiCV 中許多函數(shù)的處理速度幾乎與 CPU 數(shù)量呈線性關(guān)系。例如,在一臺擁有 16 個可用 CPU 的 Linux 服務(wù)器上運行時,啟用多線程后,許多 KleidiCV 函數(shù)的運行速度預計可提升近 16 倍。
增強與 OpenCV 4.11 的集成
KleidiCV 新增的多線程支持,再加上其原本就出色的性能提升,使得在 OpenCV 中啟用 KleidiCV 成為自然而然的選擇。Arm 與 OpenCV 的優(yōu)秀團隊合作,在安卓系統(tǒng)上的 OpenCV 4.11 中默認啟用了 KleidiCV。對于從源代碼構(gòu)建 OpenCV 4.10 的用戶來說,他們之前就已經(jīng)能通過設(shè)置單個配置標記,輕松啟用 KleidiCV 了,該選項在 OpenCV 4.11 中依然保留,在 Linux 系統(tǒng)上運行 OpenCV 時仍需要設(shè)置該標記來啟用 KleidiCV。不過,對于安卓系統(tǒng),該標記現(xiàn)在已默認開啟。這意味著,所有使用 OpenCV 的安卓應(yīng)用一旦升級到 OpenCV 4.11,即可享受 KleidiCV 0.3.0 帶來的性能優(yōu)勢。將 OpenCV 與 KleidiCV 集成到安卓應(yīng)用中最簡便的方法是通過 OpenCV Maven 包。
擴展的功能集
更多的 OpenCV 函數(shù)得到了加速,包括 cv::exp()、cv::pyrDown()、cv::buildOpticalFlowPyramid() 等。此外,已支持函數(shù)的功能也得到了進一步擴展,例如 cv::resize 中的 float32 圖像,以及 cv::GaussianBlur 中更多的內(nèi)核大小。完整列表請查看更新日志。
性能提升
得益于新增的多線程支持,我們看到了比之前報告中更為顯著的速度提升。Sobel 的基準測試顯示,速度提升超過了 400%,這意味著性能提高了五倍多!

上述測試比較了在三星 Galaxy S22 SM-S901B 的兩個 Cortex-A710 核心上,OpenCV 4.11 在禁用和啟用 KleidiCV 時的運行情況。除非另有說明,否則基準測試均針對 1080p 圖像進行。若想要詳細了解如何運行基準測試,可以在 KleidiCV 代碼倉庫中查看 Arm 使用的腳本。
在 OpenCV 項目中充分利用 KleidiCV
KleidiCV 可以加速一部分 OpenCV 功能。在某些情況下,這與你的應(yīng)用需求相匹配,而在其他情況下則不然。為了充分利用 KleidiCV,你可以對應(yīng)用進行一些小的改動,以匹配 KleidiCV 所提供的功能。具體要求可在 KleidiCV 的 OpenCV 文檔中找到,以下是一些示例:
使用分離的源圖像和目標圖像
高斯模糊等操作會針對目標圖像中的每個像素讀取源圖像中的多個像素。如果源圖像和目標圖像相同,則必須進行額外的操作來避免讀取已改變的像素。因此,為了讓 KleidiCV 采用最有效的處理方式,它僅支持使用分離的源圖像和目標圖像。如果源圖像和目標圖像相同,則會使用 OpenCV 的常規(guī)高斯模糊,這樣就無法獲得性能提升。
使用最佳高斯模糊參數(shù)
OpenCV 支持將 sigmaX 和 sigmaY 指定為 0。在這種情況下,KleidiCV 將使用根據(jù)內(nèi)核大小計算出的 sigma 值,這能使其運行速度比使用非零 sigma 值時快很多。如果 sigmaX 或 sigmaY 必須非零值,但又不需要精確到比特的模糊效果,則可以將提示參數(shù)(OpenCV 4.11 中的新功能)設(shè)置為 ALGO_HINT_APPROX,這樣仍能讓 KleidiCV 實現(xiàn)大幅加速。內(nèi)核大小必須與 KleidiCV 能夠加速的內(nèi)核大小之一相匹配,在 KleidiCV 0.3.0 中,這些內(nèi)核大小為 3x3、5x5、7x7 和 15x15。
使用支持的邊界類型
一些 OpenCV 函數(shù)將邊界模式作為參數(shù),例如 reflect 或 wrap。每個 KleidiCV 函數(shù)都支持其中的一部分邊界模式,這些模式可能與 OpenCV 的默認邊界模式相同,也可能不同。例如,KleidiCV 的 Sobel 函數(shù)速度極快,但要在 OpenCV 中使用它,就需要顯式指定邊界模式為復制。
Arm Learning Path 提供了一個詳細示例,展示了如何構(gòu)建一個充分利用 KleidiCV 性能提升的安卓應(yīng)用。
展望
在未來的版本中,Arm 將繼續(xù)擴展 KleidiCV 的能力,以更全面地加速 OpenCV 功能,并消除上述一些限制。而用戶的需求對于 KleidiCV 的發(fā)展至關(guān)重要,我們歡迎開發(fā)者通過 Arm 的 GitLab 代碼倉庫提交反饋。
-
ARM
+關(guān)注
關(guān)注
135文章
9530瀏覽量
390302 -
多線程
+關(guān)注
關(guān)注
0文章
279瀏覽量
20967 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4413瀏覽量
67194 -
OpenCV
+關(guān)注
關(guān)注
33文章
651瀏覽量
44601
原文標題:KleidiCV 更新詳解!支持多線程,并實現(xiàn) OpenCV 4.11 集成
文章出處:【微信號:Arm社區(qū),微信公眾號:Arm社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
先楫半導體HPMicro Nuttx v0.2.0正式發(fā)布!
使用Arm KleidiCV開源庫加速圖像處理性能
RT-Thread/GUI 0.3.0 beta
OpenHarmony 3.0 LTS 新增特性功能
.NET Core 3.0(預覽版 2)的新增功能是什么
Vivado 2015.3的新增量編譯功能
MDK V5.33的新增功能有哪些
RustSBI 0.3.0正式版現(xiàn)已發(fā)布
數(shù)據(jù)丟失防護15.5中的新增功能
數(shù)據(jù)丟失防護15.0中的新增功能
先楫半導體HPMicro Nuttx v0.2.0 發(fā)布
SOLIDWORKS 2025設(shè)計新增功能
SOLIDWORKS 2025 PDM新增功能
Arm KleidiCV 0.2.0和0.3.0的新增功能
評論