本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。
[OpenCV][Python]Win10+Cmake+VS2022編譯 OpenCV 及opencv_contrib
OPENCV_DNN_CUDA
(這個選項特別用於啟用 DNN 模組的 CUDA 支援)
分別改這四行,就會切換使用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()
一模一樣,無差異性
左邊是CPU運算的結果,右邊是GPU,影響的只有處理時間。
兩張圖相減,在灰階二值化驗證是否有差異點
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()