[Python]在 OpenCV 中啟用 CUDA 加速來運行 DNN 超分辨率模型

[Python]在 OpenCV 中啟用 CUDA 加速來運行 DNN 超分辨率模型

更新於 發佈於 閱讀時間約 7 分鐘

本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。


在CMake上這選項要開,才可支援DNN模組。

CMake編譯OpenCV教學文 連結

[OpenCV][Python]Win10+Cmake+VS2022編譯 OpenCV 及opencv_contrib

OPENCV_DNN_CUDA(這個選項特別用於啟用 DNN 模組的 CUDA 支援)

raw-image

CPU與GPU比較結果

raw-image

程式範例

分別改這四行,就會切換使用GPU或CPU

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

# sr.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)

# sr.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)

程式碼

import cv2
import time

def performance_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} 執行時間:{end_time - start_time} 秒")
return result
return wrapper

@performance_decorator
def test():
# 初始化 DnnSuperResImpl_create
sr = cv2.dnn_superres.DnnSuperResImpl_create()
# 讀取圖片
img = cv2.imread('D:/python/crab/Dnn_superres/111.jpg')
height,width = img.shape[:2]
img = cv2.resize(img, (width // 4, height // 4)) # 減少影像大小
# 讀取預訓練的模型,這裡使用 EDSR_x4 模型放大 4
sr.readModel(r"D:\python\crab\Dnn_superres\EDSR_x4.pb")
# 設置模型類型和放大倍率
print('設置模型類型和放大倍率')
sr.setModel("edsr", 4)
# # 設定後端為 CUDA
print('改使用 GPU運算')
sr.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
sr.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
# print('改使用 CPU運算')
# sr.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
# sr.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
# 使用 DNN 模型放大圖像
print('使用 DNN 模型放大圖像')
res_img = sr.upsample(img)
# 保存放大的影像
cv2.imwrite('D:/python/crab/Dnn_superres/111_out.png', res_img)

# 測試運行
test()

比較驗證放大的圖差異

一模一樣,無差異性

raw-image

左邊是CPU運算的結果,右邊是GPU,影響的只有處理時間。

raw-image

兩張圖相減,在灰階二值化驗證是否有差異點

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 讀取兩張圖片
img1 = cv2.imread(r'D:\python\crab\Dnn_superres\111_out_cpu.png')
img2 = cv2.imread(r'D:\python\crab\Dnn_superres\111_out_gpu.png')

# 確保兩張圖片尺寸相同
if img1.shape != img2.shape:
raise ValueError("兩張圖片必須大小相同")

# 兩張圖片相減
diff = cv2.absdiff(img1, img2)

# 轉換為灰階
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)

# 自動二值化(Otsu's Binarization)
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 使用 matplotlib 顯示結果
plt.figure(figsize=(12, 6))

# 顯示相減結果
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(diff, cv2.COLOR_BGR2RGB))
plt.title('Difference Image')
plt.axis('off')

# 顯示灰階圖
plt.subplot(1, 3, 2)
plt.imshow(gray, cmap='gray')
plt.title('Grayscale Image')
plt.axis('off')

# 顯示二值化結果
plt.subplot(1, 3, 3)
plt.imshow(binary, cmap='gray')
plt.title('Binary Image')
plt.axis('off')

# 顯示圖片
plt.tight_layout()
plt.show()


avatar-img
螃蟹_crab的沙龍
138會員
244內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言
avatar-img
留言分享你的想法!
螃蟹_crab的沙龍 的其他內容
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
iPhone也有去背的功能,那麼OpenCV能不能做到這件事呢?,答案是可以的 如果圖像背景簡單且與前景有明顯的顏色區分,可以使用 色彩空間轉換 或 閥值分割。 如果背景較為複雜一點點,但你可以提供一個大致的前景位置,則可以使用 GrabCut。 結果圖 但在背景相當複雜的情況下,結果就不太
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
iPhone也有去背的功能,那麼OpenCV能不能做到這件事呢?,答案是可以的 如果圖像背景簡單且與前景有明顯的顏色區分,可以使用 色彩空間轉換 或 閥值分割。 如果背景較為複雜一點點,但你可以提供一個大致的前景位置,則可以使用 GrabCut。 結果圖 但在背景相當複雜的情況下,結果就不太