1. 引言
OpenCV
是一個開源的計算機視覺庫,擁有大量優秀的算法。基于最新的合并,OpenCV包含一個易于使用的接口,主要用于實現基于深度學習方法的超分辨率(SR)。該接口包含預先訓練的模型,這些模型可以非常容易和有效地用于推理。在這篇文章中,我將解釋它可以做什么,并逐步展示如何使用它。
閑話少說,我們直接開始吧!
2. 版本說明
首先我們的第一步是安裝OpenCV
庫。一些功能都是在逐漸發布,所以需要注意版本:4.2.0用于C++,4.3.0添加Python接口,4.4.0添加GPU推理。大家可以按照OpenCV
文檔中的說明進行相應的操作。大家注意安裝contrib
模塊,因為這是SR接口代碼所在的位置。本文中我們將使用的接口或模塊稱為dnn_superres
(dnn代表深度神經網絡;superres代表超分辨率)。
3. 模型下載
接著我們需要單獨下載預先訓練好的模型,因為OpenCV
代碼庫不包含它們。原因是有些模型相當大。這里有幾種模型可供選擇,所有這些模型都是流行SR論文中的實現。現在,讓我們選擇一個小模型,大家可以在這里下載。
4. 實踐
我們在Python中可以通過以下代碼進行相應的實現:
import cv2
from cv2 import dnn_superres# Create an SR object
sr = dnn_superres.DnnSuperResImpl_create()# Read image
image = cv2.imread('./input.png')# Read the desired model
path = "EDSR_x3.pb"
sr.readModel(path)# Set the desired model and scale to get correct pre- and post-processing
sr.setModel("edsr", 3)# Upscale the image
result = sr.upsample(image)# Save the image
cv2.imwrite("./upscaled.png", result)
代碼相對簡單,參考相應的注釋即可。
5. 推薦模型
目前在OpenCV
中主要支持4種不同的SR模型。它們都可以按2、3和4的比例放大圖像。LapSRN甚至可以升級8倍。它們在準確性、大小和速度上各不相同。
-
EDSR: 這是目前表現最好的模型。然而,它也是參數量最大的模型,因此具有最大的文件大小和最慢的推理。大家可以在這里下載。
-
ESPCN: 這是一個相對較小的模型,具有快速和良好的推理能力。它可以進行實時視頻放大(取決于圖像大小)。大家可以在這里下載。
-
FSRCNN: 這也是一個具有快速準確推理的小模型。還可以進行實時視頻放大。大家可以在這里下載。
-
LapSRN: 這是一款中等大小的模型,可以提升8倍分辨率。大家可以在這里下載。
有關這些模型的更多信息和實現,請參閱模塊的GitHub中的ReadME
文件。關于上述模型的基準和比較,請訪問此處。
6. 具體實例
接著讓我們看具體實例如下:(如果在移動設備上查看,建議放大后進行直觀的對比)
輸入圖像如下:
雙線性插值放大三倍后的圖像如下:
使用模型FSRCNN
放大三倍后的效果如下:
使用模型ESDR
放大三倍后的效果如下:
正如大家所看到的,這些模型產生了令人非常滿意的結果,特別是EDSR給出了驚人的結果,盡管它有點慢(幾秒鐘的推理時間),但是絕對值得等待。大家可以自己試試!
7. 注意事項
事實上,在上述具體實現中,有以下幾點注意事項:
-
如果在使用
.jpg
圖像時出現錯誤,請嘗試切換到.png格式
。 -
確保大家的
setModel()
中的參數與大家在readModel()
中使用的模型匹配。 -
嘗試不同的模型,在速度和性能方面獲得不同的結果。
-
如果大家想使用GPU進行推理(默認是CPU),大家可以在讀入模型后將后端設置為CUDA。這是一個新的特性,因此大家需要4.4.0版本。請參閱相關的拉取請求。部門代碼參考如下:
path = "EDSR_x3.pb"
sr.readModel(path)# Set CUDA backend and target to enable GPU inference
sr.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
sr.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
8. 總結
本文重點介紹了在OpenCV中,利用深度學習的方法來進行超分辨率的實現,被給出了具體的代碼實例,和幾種常用的模型。
您學廢了嗎?