2024-06-06 Python OpenCV 使用GPU環(huán)境

背景

Python中使用OpenCV處理圖像,一般需要Python環(huán)境,在Python中安裝OpenCV環(huán)境就可以使用。此環(huán)境中做圖像處理是使用電腦CPU。

想要使用GPU處理圖像需要對(duì)Python環(huán)境進(jìn)行配置。

GPU

使用GPU需要電腦具備GPU功能,一般英偉達(dá)顯卡都有。而且不同的GPU需要使用不同的OpenCV版本。筆者這里使用了2臺(tái)電腦,顯卡不同使用的OpenCV和Python版本都不同。具體的版本對(duì)應(yīng)關(guān)系筆者也不是很清楚,針對(duì)2個(gè)不同的顯卡CUDA環(huán)境進(jìn)行描述。

首先確保你電腦上的顯卡驅(qū)動(dòng)正確安裝,安裝驅(qū)動(dòng)后如果沒(méi)有安裝對(duì)應(yīng)的CUDA環(huán)境請(qǐng)自行安裝顯卡對(duì)應(yīng)的CUDA:

CUDA Toolkit Archive | NVIDIA Developer。

有地方說(shuō)還需要cuDNN環(huán)境,但是筆者沒(méi)有cuDNN環(huán)境也可以,估計(jì)實(shí)際上不需要。

CUDA 11.4

2024-06-06_131322.jpg
2024-06-06_131229.jpg
2024-06-06_131614.jpg

此電腦顯卡GeForce GT 710,顯卡驅(qū)動(dòng)已安裝CUDA是11.4。此環(huán)境確保CUDA是可用的,然后就是OpenCV,有很多地方說(shuō)Python中使用pip install安裝的opencv-python是不帶CUDA的,需要自己編譯帶CUDA的OpenCV,需要自己編譯帶CUDA的OpenCV。這個(gè)筆者確實(shí)不太懂,不過(guò)正常使用Python用pip install安裝環(huán)境確實(shí)很便捷,如果這樣安裝的不帶,那就比較麻煩了。筆者之前編譯過(guò)C++下的OpenCV,那時(shí)候沒(méi)有想過(guò)CUDA的事,當(dāng)時(shí)也沒(méi)在意有沒(méi)有帶CUDA環(huán)境,那個(gè)過(guò)程比較麻煩,所以這里也沒(méi)想再編譯,所以找到一個(gè)大佬,自己編譯了好多版本的OpenCV是帶CUDA可用的,可以在下面鏈接去下載。

Releases · cudawarped/opencv_contrib (github.com)

這里的OpenCV版本沒(méi)有實(shí)際OpenCV的版本多,差異的話(huà)筆者也不是很清楚,不過(guò)能正常用。

但是版本還是很關(guān)鍵的,筆者2個(gè)電腦一個(gè)CUDA11一個(gè)CUDA12,11的使用OpenCV4.7的不行,12的使用OpenCV4.5的不行,具體為啥也不知道。

2024-06-06_133056.jpg

筆者現(xiàn)在手里有2個(gè)版本的OpenCV,4.7是在上述網(wǎng)站中下載的,4.5是在博客中某大佬的分享下載的,因?yàn)槟莻€(gè)網(wǎng)站此時(shí)沒(méi)有4.5版本的,只能自己找資源。

2024-06-06_133420.jpg

將opencv_4_5_0_cuda_11_1_py38.7z文件解壓到電腦中,有的地方說(shuō)要配置環(huán)境變量,其實(shí)不用,在使用的時(shí)候總是要添加進(jìn)去的。

2024-06-06_133647.jpg

進(jìn)剛剛解壓路徑的這里,有個(gè)cv2.cp38-win_amd64.pyd文件,注意看這個(gè)文件名稱(chēng)中,cv2.cp38這個(gè)很關(guān)鍵,這個(gè)表示對(duì)應(yīng)的Python版本,筆者剛開(kāi)始不知道一直用的Python3.9,最后使用OpenCV4.7里面這個(gè)文件命名是cv2.cp39,才聯(lián)想起來(lái)。所以這里要說(shuō)的是,你使用的Python版本是這個(gè)OpenCV版本決定的。一定要根據(jù)OpenCv版本再安裝Python,好在Python很容易安裝,再把環(huán)境變量改一下就行了,也不用卸載老版本之類(lèi)的。

2024-06-06_134019.jpg

將那個(gè)文件拷貝到Python的庫(kù)路徑中。

2024-06-06_134455.jpg

確認(rèn)一下電腦的Python環(huán)境,里面確實(shí)沒(méi)有opencv-python。

2024-06-06_134445.jpg

在代碼中使用cv2提示的不是找不到cv2模塊,而是 DLL load failed while importing cv2: 找不到指定的模塊。

雖然是有錯(cuò)誤,但是不是那種錯(cuò)誤,也就說(shuō)明有效。

2024-06-06_134730.jpg

在代碼中添加導(dǎo)入CUDA和OpenCV的代碼,就可以正常使用cv2了。

import os

os.add_dll_directory("C:\\Program Files\\NVIDIA GPU Computing Toolkit\CUDA\\v11.4\\bin")
os.add_dll_directory("D:\\Program Files\\opencv_4_5_0_cuda_11_1_py38\\install\\x64\\vc16\\bin")

import cv2 as cv

print("OpenCV版本", cv.__version__)

cv.cuda.printCudaDeviceInfo(0)
"D:\Program Files\Python\Python3810\python.exe" D:/workspace/python/test2/src/org/test/test1.py
OpenCV版本 4.5.0
*** CUDA Device Query (Runtime API) version (CUDART static linking) *** 

Device count: 1

Device 0: "NVIDIA GeForce GT 710"
  CUDA Driver Version / Runtime Version          11.40 / 11.10
  CUDA Capability Major/Minor version number:    3.5
  Total amount of global memory:                 2048 MBytes (2147483648 bytes)
  ( 1) Multiprocessors x (192) CUDA Cores/MP:     192 CUDA Cores
  GPU Clock Speed:                               0.95 GHz
  Max Texture Dimension Size (x,y,z)             1D=(65536), 2D=(65536,65536), 3D=(4096,4096,4096)
  Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16384) x 2048
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     2147483647 x 65535 x 65535
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and execution:                 Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Concurrent kernel execution:                   Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support enabled:                No
  Device is using TCC driver mode:               No
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Bus ID / PCI location ID:           1 / 0
  Compute Mode:
      Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) 

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version  = 11.40, CUDA Runtime Version = 11.10, NumDevs = 1


Process finished with exit code 0

CUDA 12

在CUDA11.4的電腦中成功使用了CUDA后,對(duì)整個(gè)過(guò)程都熟悉了,就是那幾個(gè)環(huán)境,然后版本對(duì)應(yīng)上,其它電腦也是一樣的原理,所以在CUDA12的電腦上一下子就成功了。

與上文的不同是首先電腦顯卡不同,那么顯卡驅(qū)動(dòng)就不同,所以CUDA不同。具體的CUDA與OpenCV的版本關(guān)系筆者也不清楚,基于CUDA11用的OpenCV4.5,還有個(gè)地方看到別人也記錄一樣的事情,環(huán)境也一樣,對(duì)方的CUDA是12,用的OpenCV4.7,所以在CUDA12的電腦上筆者直接下載OpenCV4.7的版本。而在OpenCV4.7中使用的Python是3.9。所以上述環(huán)境準(zhǔn)備好后很容易就可以搭建好環(huán)境。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容