[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-avatar-img
發文者
2024/10/11
[Opencv][Python]解決Could not located cublas64_11.dll提及了這篇文章,趕快過去看看吧!
avatar-img
螃蟹_crab的沙龍
145會員
253內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2025/03/24
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
Thumbnail
2025/03/24
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
Thumbnail
2024/10/10
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
Thumbnail
2024/10/10
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
Thumbnail
2024/10/02
iPhone也有去背的功能,那麼OpenCV能不能做到這件事呢?,答案是可以的 如果圖像背景簡單且與前景有明顯的顏色區分,可以使用 色彩空間轉換 或 閥值分割。 如果背景較為複雜一點點,但你可以提供一個大致的前景位置,則可以使用 GrabCut。 結果圖 但在背景相當複雜的情況下,結果就不太
Thumbnail
2024/10/02
iPhone也有去背的功能,那麼OpenCV能不能做到這件事呢?,答案是可以的 如果圖像背景簡單且與前景有明顯的顏色區分,可以使用 色彩空間轉換 或 閥值分割。 如果背景較為複雜一點點,但你可以提供一個大致的前景位置,則可以使用 GrabCut。 結果圖 但在背景相當複雜的情況下,結果就不太
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
在電腦視覺應用中,輪廓(Contour)常用來描述物體的邊界。 當圖像中有雜訊或物體邊緣過於複雜時,我們可以利用輪廓逼近技術,將輪廓簡化成較少點數的多邊形,這不僅有助於後續的形狀分析,也能提高處理速度。 本文將介紹如何使用 OpenCV 中的 cv2.arcLength 與 cv2.approx
Thumbnail
在電腦視覺應用中,輪廓(Contour)常用來描述物體的邊界。 當圖像中有雜訊或物體邊緣過於複雜時,我們可以利用輪廓逼近技術,將輪廓簡化成較少點數的多邊形,這不僅有助於後續的形狀分析,也能提高處理速度。 本文將介紹如何使用 OpenCV 中的 cv2.arcLength 與 cv2.approx
Thumbnail
我們將學習如何使用 Python 和 OpenCV 實現圖像的主色提取與重新著色。 以下的程式碼展示了如何通過 KMeans 聚類演算法分析圖像,提取 HSV 色彩空間中的主色,並將圖像重新著色,提取想偵測的物件的顏色。 在官網案例,實作為RGB色彩空間,但如果套用HSV色彩空間則會因為H色
Thumbnail
我們將學習如何使用 Python 和 OpenCV 實現圖像的主色提取與重新著色。 以下的程式碼展示了如何通過 KMeans 聚類演算法分析圖像,提取 HSV 色彩空間中的主色,並將圖像重新著色,提取想偵測的物件的顏色。 在官網案例,實作為RGB色彩空間,但如果套用HSV色彩空間則會因為H色
Thumbnail
cv2.fastNlMeansDenoising() 是 OpenCV 中一個非常有效的去噪函數,基於非局部均值濾波算法(Non-Local Means Filtering)。它能夠有效地去除圖像中的隨機噪聲(如高斯噪聲),並保留圖像的細節,特別適合處理含有隨機噪聲的圖像,如拍攝時產生的感光元件噪聲
Thumbnail
cv2.fastNlMeansDenoising() 是 OpenCV 中一個非常有效的去噪函數,基於非局部均值濾波算法(Non-Local Means Filtering)。它能夠有效地去除圖像中的隨機噪聲(如高斯噪聲),並保留圖像的細節,特別適合處理含有隨機噪聲的圖像,如拍攝時產生的感光元件噪聲
Thumbnail
[OpenCV][Python]影像增強對比_自適應直方圖均衡化 在上一篇文章,我們有比較過自適應直方圖均衡化與直方圖均衡化的差異。 本文將主要應用在OCV檢測上,應用這兩種方法將會有那些不一樣的差異。內文中的OCV檢測,主要涵蓋OCR的文字高寬及面積。 測試圖 就利用這看起來雜訊特多的圖。
Thumbnail
[OpenCV][Python]影像增強對比_自適應直方圖均衡化 在上一篇文章,我們有比較過自適應直方圖均衡化與直方圖均衡化的差異。 本文將主要應用在OCV檢測上,應用這兩種方法將會有那些不一樣的差異。內文中的OCV檢測,主要涵蓋OCR的文字高寬及面積。 測試圖 就利用這看起來雜訊特多的圖。
Thumbnail
在某些特別的情況下,需要去調整亮度及對比度,讓我們想要的影像特徵更加明顯 本文將介紹利用這兩個函數 cv2.convertScaleAbs 和 cv2.addWeighted 來調整亮度及對比度。
Thumbnail
在某些特別的情況下,需要去調整亮度及對比度,讓我們想要的影像特徵更加明顯 本文將介紹利用這兩個函數 cv2.convertScaleAbs 和 cv2.addWeighted 來調整亮度及對比度。
Thumbnail
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和影像處理庫,它提供了豐富的功能和工具,可用於開發各種視覺應用程式。 OpenCV最初是用C++編寫的,但它也提供了Python、Java等多種程式語言的接口,方便不同語言的開發者使用。
Thumbnail
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和影像處理庫,它提供了豐富的功能和工具,可用於開發各種視覺應用程式。 OpenCV最初是用C++編寫的,但它也提供了Python、Java等多種程式語言的接口,方便不同語言的開發者使用。
Thumbnail
這系列文章將引導讀者如何設定和使用 Stable Diffusion WebUI,一種強大的 AI 圖像生成工具。文章從安裝必要的軟件開始,包括 git、Python 3.10.x 和 CUDA 工具箱(如果有 NVIDIA 顯示卡),然後說明如何設定 WebUI,包括檢查顯示記憶體 (VRAM)
Thumbnail
這系列文章將引導讀者如何設定和使用 Stable Diffusion WebUI,一種強大的 AI 圖像生成工具。文章從安裝必要的軟件開始,包括 git、Python 3.10.x 和 CUDA 工具箱(如果有 NVIDIA 顯示卡),然後說明如何設定 WebUI,包括檢查顯示記憶體 (VRAM)
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News