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中可以通过以下代码进行相应的实现:
cpp
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版本。请参阅相关的拉取请求。部门代码参考如下:
cpp
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中,利用深度学习的方法来进行超分辨率的实现,被给出了具体的代码实例,和几种常用的模型。
您学废了吗?