Opencv-python DNN模塊使用CUDA加速

OpenCV-python DNN模塊使用CUDA加速

背景

眾所周知,Opencv底層是用C++編寫的,大家使用最多的肯定也是在該語言下。尤其在使用CUDA加速模型推斷這一塊。這不由發(fā)問,難道Python就不能了嗎?況且好多深度學(xué)習(xí)框架還是用Python編寫。因此,這里為了相應(yīng)Python的強(qiáng)大功能。記錄一下如何用CUDA加速DNN推斷過程。

問題的由來

相信有好多朋友都習(xí)慣使用Opencv自帶的CUDA加速功能,通過設(shè)置:

net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

來實(shí)現(xiàn)CUDA加速,但是很多情況下會(huì)遇到下面的情況:

Net::Impl::setUpNet DNN module was not built with CUDA backend; switching to CPU

這時(shí)候估計(jì)很納悶,為什么我的有GPU也有相應(yīng)的CUDA環(huán)境為什么不能使用CUDA加速呢。這是由于使用官方的OpenCV-python默認(rèn)是CPU版本的,沒有CUDA加速功能(我一直很納悶為什么不發(fā)布編譯后的CUDA版本呢)。所以,不能很輕松的去實(shí)現(xiàn)CUDA加速模型推理。那難道我們使用Python就不能實(shí)現(xiàn)CUDA加速模型推理了嗎?答案明顯是否定的。下面通過一系列步驟來實(shí)現(xiàn)Opencv DNN模塊的CUDA加速

編譯Opencv-python CUDA版本

1 下載源碼

這里需要下載OpenCV和opencv_contrib的源代碼,下載地址如下:

https://github.com/opencv/opencv
https://github.com/opencv/opencv_contrib

將源碼下載后并解壓到文件夾,按如下的項(xiàng)目結(jié)構(gòu):

opencv
----build #用來存放編譯的文件
----source
-------opencv#解壓的OpenCV項(xiàng)目
-------opencv_contrib#解壓OpenCV-contrib項(xiàng)目

2 CMAKE編譯

這里默認(rèn)你已經(jīng)安裝了CMAKE這個(gè)編譯工具了,下面就是對(duì)CMAKE進(jìn)行一些配置操作了,配置如下:

其中source code這里一定要填寫的是opencv源碼的根目錄,build the binaries這里則是在opencv根目錄下新建的編譯目錄。

img

下面就是這樣的一些配置,根據(jù)自己的需求去選擇VS版本和平臺(tái),其它默認(rèn)就可以了。

2.1 重要的參數(shù)選擇

這里有幾個(gè)選項(xiàng)一定要勾選這是我們能成功的關(guān)鍵。

image-20210803192512115.png

這個(gè)WITH_CUDA一定要勾選上,WITH_CUDNN也一定要勾選上。

image-20210803192627408.png

這幾個(gè)OpenCV DNN的選項(xiàng)也一定要勾選上。

image-20210803192828050.png

這個(gè)OPENCV_ENABLE_NONFREE一定要勾選上,我第一次沒有勾選。編譯不報(bào)錯(cuò)但是OpenCV不能使用。

image-20210803193012667.png

這里重點(diǎn)要強(qiáng)調(diào)的是,是OPENCV_EXTRA_MODULES_PATH這個(gè)選項(xiàng),這里就是我們上面下載的opencv_contrib源碼,但是這里到modules文件夾即可。還有一個(gè)就是CUDA_ARCH_BIN這個(gè)選項(xiàng)去選擇,這個(gè)可以從官網(wǎng)去查詢自己卡的算力,這里只保留自己的算力,其它值刪除即可。

image-20210803193630237.png

下面的OpenCV一些路徑配置,只需配置自己的OpenCV地址即可,按照自己的路徑去修改。

image-20210803193758502.png

下面就去點(diǎn)擊configure去生成配置,這里一定要選擇一個(gè)網(wǎng)絡(luò)較好的機(jī)器。因?yàn)檫@個(gè)過程中需要頻繁的去下載組件的,有錯(cuò)也不要灰心。一定要無錯(cuò)誤位置,最終生成的To be Build里有Python3和CUDA。如下圖所示:

image-20210803194145005.png
image-20210803194208714.png

最后沒有錯(cuò)誤的情況下,點(diǎn)擊Generate按鈕,生成需要編譯的文件。這里先不要關(guān)閉CMAKE軟件,

img

點(diǎn)擊Open Project用VS編譯。

3 VS編譯

通過前面打開Project后,就會(huì)跳轉(zhuǎn)到VS界面。這里首先要確定的一點(diǎn)是,首先將模式調(diào)整為Release版本。

image-20210803194724698.png

同時(shí)必須保證bindings這個(gè)目錄下有opencv_python3才進(jìn)行下一步,否則即使編譯成功仍然不能使用CUDA加速。

image-20210803194758339.png

首先選擇ALL_BUILD->生成,接下來就是漫長的等待過程。我的機(jī)器大概編譯了3個(gè)小時(shí),

編譯完成后,在INSTALL->生成,這個(gè)編譯要快一點(diǎn)。下面就是等待他們完成了,編譯完成后結(jié)果如下:

image-20210803195039008.png

![image-20210803195420586.png](https://upload-images.jianshu.io/upload_images/11975952-830fe667394f4970.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這次人品比較好,一次成功中間沒出任何錯(cuò)。謝天謝地呀!

4 驗(yàn)證

編譯完成后會(huì)生成cv2.cp38-win_amd64.pyd這個(gè)文件路徑如下圖所示,我們只需將這個(gè)文件Copy到我們前面設(shè)置的OpenCV編譯版本目錄即可。

image-20210803195420586.png

下一步就可以測(cè)試了:

cv2.cuda.getCudaEnabledDeviceCount()

通過上面一段代碼如果輸出為不為0,則說明我們已經(jīng)可以使用CUDA加速我們的Python-OpenCV了。同時(shí)也不會(huì)再出現(xiàn)本文開頭的那句提示了。

net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

這兩句也可以正常使用了。通過本人的實(shí)測(cè)使用CUDA版本加速OpenCV-Python速度提高了約40%,效果還是可以的。好的今天就先介紹到這里,有問題歡迎討論。

參考內(nèi)容

[1] https://zhuanlan.zhihu.com/p/363655896

[2]https://zhuanlan.zhihu.com/p/363655896

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容