首页 > 其他分享 >在OpenCV基于深度学习的超分辨率模型实践

在OpenCV基于深度学习的超分辨率模型实践

时间:2023-12-09 17:04:21浏览次数:36  
标签:大家 sr 分辨率 dnn cv2 OpenCV 深度 模型

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. 具体实例

接着让我们看具体实例如下:(如果在移动设备上查看,建议放大后进行直观的对比)

输入图像如下:

在OpenCV基于深度学习的超分辨率模型实践_深度学习

双线性插值放大三倍后的图像如下:

在OpenCV基于深度学习的超分辨率模型实践_CUDA_02

使用模型FSRCNN放大三倍后的效果如下:

在OpenCV基于深度学习的超分辨率模型实践_OpenCV_03

使用模型ESDR放大三倍后的效果如下:

在OpenCV基于深度学习的超分辨率模型实践_CUDA_04

正如大家所看到的,这些模型产生了令人非常满意的结果,特别是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中,利用深度学习的方法来进行超分辨率的实现,被给出了具体的代码实例,和几种常用的模型。

您学废了吗?

标签:大家,sr,分辨率,dnn,cv2,OpenCV,深度,模型
From: https://blog.51cto.com/u_15506603/8750537

相关文章

  • opencv cpp的安装
    搞了半天,可算弄好了. vsopencvcpp: https://blog.csdn.net/weixin_50918736/article/details/130176469?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-130176469-blog-127627204.235%5Ev39%5Epc_relevant_a......
  • 近屿智能OJAC:大模型工程师与产品专家深度训练营火热招生中
    近屿智能OJAC的第五期“AIGC星辰大海:大模型工程师与产品专家深度训练营”火热招生中! 近屿智能OJAC始终坚守着"别人教您使用AIGC工具,例如ChatGP7和MJ,我们教您预训练和微调大模型以及开发软/硬件AI产品"的服务宗旨。已经培育了上千位在AIGC领域的大模型专家,并协助他们发明了一系列基......
  • Qt显示OpenCV的单通道图片
    一、概述Qt中显示OpenCV的图片。OpenCV中的Mat默认是3通道图片。但是其灰度图、二值图片会是8位单通道的。示例代码中记录了如何显示二、代码示例#include"ImageUtils.h"MatImageUtils::qImageToMat(QImageqImage){//QImage转Mat三通道图片QImageimage=......
  • 邻接表,图的深度优先遍历
    #include<iostream>usingnamespacestd;#defineN100typedefcharOtherInfo;intvisited[N]={0};typedefstructArcNode{intadjvex;OtherInfoinfo;structArcNode*next;}ArcNode;typedefstructVNode{charvex;ArcNode*first;}VNode,AdjList[N];typed......
  • opencv4.8+vs2019 运行出现一堆[INFO:XXX]信息
    前言Opencv+vs2019搭建成功运行后出现一堆INFO信息,虽说不影响程序运行但是会占据控制台窗口,覆盖正常调试输出出现时机:在每次需要显示图像时均会出现,如:namedWindow、imshow函数调用时。 一、现象分析这些不是错,是OpenCV在启动时加载GUI(图形用户界面)后端注册表的信息,显示的是......
  • vue2、vue3适配大屏。分辨率变化,样式不变
    一、vue3适配大屏的,创建一个叫useDraw.jsexportdefaultfunction(){constscale={width:'1',height:'1',}constbaseWidth=1920constbaseHeight=1080constbaseProportion=parseFloat((baseWidth/baseHeight).toFixed(5......
  • 【Python】【OpenCV】检测直线和圆
     重新理解一下Canny方法:参数:image:输入的图像。threshold1:第一个阈值,用于检测边缘的强度梯度的下限。threshold2:第二个阈值,用于检测边缘的强度梯度的上限。apertureSize:Sobel算子的大小,可选值为3、5、7,默认值为3。L2gradient:一个布尔值,指示是否使用更精确的L2范数计算梯度......
  • 深度学习笔记3:使用预训练模型之特征提取
    我们在小型图像数据集上做深度学习时,一种高效且实用的方法是采用预训练模型。预训练模型,指的是在大型数据集上预先训练好的模型。如果原始数据集具有足够的规模和通用性,那么预训练模型所学习到的特征的空间层次结构可以被视为视觉世界的通用模型。与许多早期的浅层学习方法相......
  • 深度学习3D网络---PointNet
    常见的3D数据表示方式有点云、多视图、体素、mesh网格等。PointNet是直接处理点云数据的网络,可以实现对点云的分类和分割,其首页地址为:http://stanford.edu/~rqi/pointnet/。主要从解决点云的无序性和保证旋转一致性两个方向出发,提出了以点云作为输入的分类网络和分割网络。一......
  • Request 爬虫的 SSL 连接问题深度解析
    SSL连接简介SSL(SecureSocketsLayer)是一种用于确保网络通信安全性的加密协议,广泛应用于互联网上的数据传输。在数据爬取过程中,爬虫需要与使用HTTPS协议的网站进行通信,这就牵涉到了SSL连接。本文将深入研究Request爬虫中的SSL连接问题,并提供解决方案以应对各种情况。问题......