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根目錄下新建的編譯目錄。
下面就是這樣的一些配置,根據(jù)自己的需求去選擇VS版本和平臺(tái),其它默認(rèn)就可以了。
2.1 重要的參數(shù)選擇
這里有幾個(gè)選項(xiàng)一定要勾選這是我們能成功的關(guān)鍵。
這個(gè)WITH_CUDA一定要勾選上,WITH_CUDNN也一定要勾選上。
這幾個(gè)OpenCV DNN的選項(xiàng)也一定要勾選上。
這個(gè)OPENCV_ENABLE_NONFREE一定要勾選上,我第一次沒有勾選。編譯不報(bào)錯(cuò)但是OpenCV不能使用。
這里重點(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)去查詢自己卡的算力,這里只保留自己的算力,其它值刪除即可。
下面的OpenCV一些路徑配置,只需配置自己的OpenCV地址即可,按照自己的路徑去修改。
下面就去點(diǎn)擊configure去生成配置,這里一定要選擇一個(gè)網(wǎng)絡(luò)較好的機(jī)器。因?yàn)檫@個(gè)過程中需要頻繁的去下載組件的,有錯(cuò)也不要灰心。一定要無錯(cuò)誤位置,最終生成的To be Build里有Python3和CUDA。如下圖所示:
最后沒有錯(cuò)誤的情況下,點(diǎn)擊Generate按鈕,生成需要編譯的文件。這里先不要關(guān)閉CMAKE軟件,
點(diǎn)擊Open Project用VS編譯。
3 VS編譯
通過前面打開Project后,就會(huì)跳轉(zhuǎn)到VS界面。這里首先要確定的一點(diǎn)是,首先將模式調(diào)整為Release版本。
同時(shí)必須保證bindings這個(gè)目錄下有opencv_python3才進(jìn)行下一步,否則即使編譯成功仍然不能使用CUDA加速。
首先選擇ALL_BUILD->生成,接下來就是漫長的等待過程。我的機(jī)器大概編譯了3個(gè)小時(shí),
編譯完成后,在INSTALL->生成,這個(gè)編譯要快一點(diǎn)。下面就是等待他們完成了,編譯完成后結(jié)果如下:
這次人品比較好,一次成功中間沒出任何錯(cuò)。謝天謝地呀!
4 驗(yàn)證
編譯完成后會(huì)生成cv2.cp38-win_amd64.pyd這個(gè)文件路徑如下圖所示,我們只需將這個(gè)文件Copy到我們前面設(shè)置的OpenCV編譯版本目錄即可。
下一步就可以測(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%,效果還是可以的。好的今天就先介紹到這里,有問題歡迎討論。