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

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

Arm KleidiCV 0.2.0和0.3.0的新增功能
評(píng)論