作者: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ù)量的不斷增加,攝像頭管線和圖像處理已然成為當(dāng)今最熱門的計算任務(wù)之一。OpenCV 是眾多此類管線的核心,并運行在數(shù)億臺設(shè)備上。而現(xiàn)在,在安卓系統(tǒng)上,OpenCV 4.11 已默認(rèn)啟用 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ù)的運行速度預(yù)計可提升近 16 倍。
增強與 OpenCV 4.11 的集成
KleidiCV 新增的多線程支持,再加上其原本就出色的性能提升,使得在 OpenCV 中啟用 KleidiCV 成為自然而然的選擇。Arm 與 OpenCV 的優(yōu)秀團隊合作,在安卓系統(tǒng)上的 OpenCV 4.11 中默認(rèn)啟用了 KleidiCV。對于從源代碼構(gòu)建 OpenCV 4.10 的用戶來說,他們之前就已經(jīng)能通過設(shè)置單個配置標(biāo)記,輕松啟用 KleidiCV 了,該選項在 OpenCV 4.11 中依然保留,在 Linux 系統(tǒng)上運行 OpenCV 時仍需要設(shè)置該標(biāo)記來啟用 KleidiCV。不過,對于安卓系統(tǒng),該標(biāo)記現(xiàn)在已默認(rè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 的基準(zhǔn)測試顯示,速度提升超過了 400%,這意味著性能提高了五倍多!
上述測試比較了在三星 Galaxy S22 SM-S901B 的兩個 Cortex-A710 核心上,OpenCV 4.11 在禁用和啟用 KleidiCV 時的運行情況。除非另有說明,否則基準(zhǔn)測試均針對 1080p 圖像進行。若想要詳細了解如何運行基準(zhǔn)測試,可以在 KleidiCV 代碼倉庫中查看 Arm 使用的腳本。
在 OpenCV 項目中充分利用 KleidiCV
KleidiCV 可以加速一部分 OpenCV 功能。在某些情況下,這與你的應(yīng)用需求相匹配,而在其他情況下則不然。為了充分利用 KleidiCV,你可以對應(yīng)用進行一些小的改動,以匹配 KleidiCV 所提供的功能。具體要求可在 KleidiCV 的 OpenCV 文檔中找到,以下是一些示例:
使用分離的源圖像和目標(biāo)圖像
高斯模糊等操作會針對目標(biāo)圖像中的每個像素讀取源圖像中的多個像素。如果源圖像和目標(biāo)圖像相同,則必須進行額外的操作來避免讀取已改變的像素。因此,為了讓 KleidiCV 采用最有效的處理方式,它僅支持使用分離的源圖像和目標(biāo)圖像。如果源圖像和目標(biāo)圖像相同,則會使用 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 的默認(rèn)邊界模式相同,也可能不同。例如,KleidiCV 的 Sobel 函數(shù)速度極快,但要在 OpenCV 中使用它,就需要顯式指定邊界模式為復(fù)制。
Arm Learning Path 提供了一個詳細示例,展示了如何構(gòu)建一個充分利用 KleidiCV 性能提升的安卓應(yīng)用。
展望
在未來的版本中,Arm 將繼續(xù)擴展 KleidiCV 的能力,以更全面地加速 OpenCV 功能,并消除上述一些限制。而用戶的需求對于 KleidiCV 的發(fā)展至關(guān)重要,我們歡迎開發(fā)者通過 Arm 的 GitLab 代碼倉庫提交反饋。
-
ARM
+關(guān)注
關(guān)注
134文章
9242瀏覽量
372240 -
多線程
+關(guān)注
關(guān)注
0文章
279瀏覽量
20159 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4359瀏覽量
63500 -
OpenCV
+關(guān)注
關(guān)注
31文章
638瀏覽量
42018
原文標(biāo)題:KleidiCV 更新詳解!支持多線程,并實現(xiàn) OpenCV 4.11 集成
文章出處:【微信號:Arm社區(qū),微信公眾號:Arm社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
先楫半導(dǎo)體HPMicro Nuttx v0.2.0正式發(fā)布!
使用Arm KleidiCV開源庫加速圖像處理性能

RT-Thread/GUI 0.3.0 beta
OpenHarmony 3.0 LTS 新增特性功能
.NET Core 3.0(預(yù)覽版 2)的新增功能是什么
Vivado 2015.3的新增量編譯功能
MDK V5.33的新增功能有哪些
RustSBI 0.3.0正式版現(xiàn)已發(fā)布
數(shù)據(jù)丟失防護15.5中的新增功能

數(shù)據(jù)丟失防護15.0中的新增功能

先楫半導(dǎo)體HPMicro Nuttx v0.2.0 發(fā)布

SOLIDWORKS 2025設(shè)計新增功能
SOLIDWORKS 2025 PDM新增功能

評論