图像超分辨率(Image Super Resolution)是指从低分辨率图像或图像序列得到高分辨率图像。图像超分辨率是计算机视觉领域中一个非常重要的研究问题,广泛应用于医学图像分析、生物识别、视频监控和安全等领域。随着深度学习技术的发展,基于深度学习的图像超分方法在多个测试任务上,相比传统图像超分方法,取得了更优的性能和效果。
文章目录
- 1 OpenCV dnn_superres模块介绍
- 2 OpenCV dnn_superres模块使用
- 2.1 图像超分放大单输出
- 2.1.1 接口介绍
- 2.1.2 示例代码
- 2.1.3 结果
- 2.2 图像超分放大多输出
- 2.2.1 接口介绍
- 2.2.2 示例代码
- 2.2.3 结果
- 2.3 视频超分放大
- 3 不同图像超分算法性能比较
- 3.1 不同图像超分算法效果评估
- 3.2 不同图像超分算法速度评估
- 3.3 官方超分放大基准测试
- 3.4 超分算法选择总结
- 4 参考
- 4.1 相关论文
- 4.2 参考代码
- 4.3 参考文档
关于基于深度学习的图像超分辨率的综述可以见文章:
【超分辨率】—图像超分辨率(Super-Resolution)技术研究
关于基于深度学习的图像超分辨率放大的介绍和最新进展可以见文章:
【超分辨率】—基于深度学习的图像超分辨率最新进展与趋势
OpenCV contrib库中dnn_superres模块用于实现基于深度学习的图像超分放大,本文主要介绍使用此模块进行超分放大。关于dnn_superres模块的代码介绍可以见:
本文需要OpenCV contrib库,OpenCV contrib库的编译安装见:
OpenCV_contrib库在windows下编译使用指南
本文所有代码见:
1 OpenCV dnn_superres模块介绍
dnn_superres包含四种基于深度学习的算法,用于放大图像,这些模型能让图像放大2~4倍。具体模型介绍如下:
EDSR
- 模型和官方代码地址:EDSR_Tensorflow
- 论文:Enhanced Deep Residual Networks for Single Image Super-Resolution
- 模型大小:〜38.5MB。这是一个量化版本,因此可以将其上传到GitHub。(原始模型大小为150MB。)
- 模型参数:提供x2,x3,x4训练模型
- 优点:高精度
- 缺点:模型文件大且运行速度慢
- 速度:在Intel i7-9700K CPU上的256x256图像,每个放大比例所需时间均小于3秒。
ESPCN
- 模型和官方代码地址:TF-ESPCN
- 论文:Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network
- 模型大小:〜100kb
- 模型参数:提供x2,x3,x4训练模型
- 优点:体积小,速度快,并且仍然表现良好
- 缺点:与更新的、更健壮的模型相比,在视觉上表现更差。
- 速度:在Intel i7-9700K CPU上的256x256图像上,每个放大比例所需时间均小于0.01秒。
FSRCNN
- 模型和官方代码地址:FSRCNN_Tensorflow
- 论文:Accelerating the Super-Resolution Convolutional Neural Network
- 模型大小:〜40KB(对于FSRCNN-small,约为9kb)
- 模型参数:提供x2,x3,x4训练模型和small训练模型
- 优点:快速,小巧
- 缺点:不够准确
- 速度:在Intel i7-9700K CPU上的256x256图像上,每个放大比例所需时间均小于0.01秒。
- 其他:FSRCNN-small具有较少的参数,因此精度较低,但速度更快。
LapSRN
- 模型和官方代码地址:TF-LAPSRN
- 论文:Deep laplacian pyramid networks for fast and accurate super-resolution
- 模型大小:1-5Mb之间
- 模型参数:提供x2,x4,x8训练模型
- 优点:该模型可以通过一次向前传递进行多尺度超分辨率。可以支持2x,4x,8x和[2x,4x]和[2x,4x,8x]超分辨率。
- 缺点:它比ESPCN和FSRCNN慢,并且精度比EDSR差。
- 速度:在Intel i7-9700K CPU上的256x256图像上,每个放大比例所需时间均小于0.1秒。。
2 OpenCV dnn_superres模块使用
2.1 图像超分放大单输出
2.1.1 接口介绍
在本节中,我们将学习如何使用dnn_superres中的函数,通过已有训练的神经网络对图像进行放大。实际上就是调用模型构造模型,只不过dnn_superres对这些模型的调用函数进行了封装,并且建立了通用接口。调用方法如下:
C++
Python
2.1.2 示例代码
主要展示通过OpenCV自带resize函数或调用深度学习将一张图像发大指定倍数,C++代码和Python代码如下。
C++/dnn_superres.cpp
Python/dnn_superres.py
2.1.3 结果
放大四倍,不同算法效果如下所示:
方法 | 结果 |
原图 | |
bilinear | |
bicubic | |
edsr | |
espcn | |
fsrcnn | |
fsrcnn-small | |
lapsrn |
2.2 图像超分放大多输出
2.2.1 接口介绍
本节主要介绍如何通过LapSRN多输出来放大图像。如果给出了节点的名称,OpenCV的dnn模块支持一次推断访问多个节点。LapSRN模型可以在一次推理运行中提供更多输出。现在,LapSRN模型可以支持2x,4x,8x和(2x,4x)和(2x,4x,8x)超分辨率。经过训练的LapSRN模型文件具有以下输出节点名称:
- 2x模型:NCHW_output
- 4x模型:NCHW_output_2x,NCHW_output_4x
- 8x模型:NCHW_output_2x,NCHW_output_4x,NCHW_output_8x
其次这个功能用处不那么大,LapSRN效果很一般。不过看看挺好的。
由于Python相关实现代码有所问题,因此该部分只提供C++代码。调用方法如下。相比单输出放大,需要设定输出层名字并通过upsampleMultioutput输出各输出层的放大结果。
2.2.2 示例代码
C++/dnn_superres_multioutput.cpp
2.2.3 结果
放大二倍、四倍、八倍的LapSRN算法效果如下所示:
方法 | 结果 |
原图 | |
LapSRN_x2 | |
LapSRN_x4 | |
LapSRN_x8 |
2.3 视频超分放大
实际视频超分放大输出,就是把视频每一帧提取出来,超分放大每一帧图像。代码如下,实际上如果电脑配置很一般不建议视频超分放大,对电脑配置性能要求很高,建议使用opencv cuda进行运算。
C++/dnn_superres_video.cpp
Python/dnn_superres_video.py
3 不同图像超分算法性能比较
3.1 不同图像超分算法效果评估
通过PSNR和SSIM来评估图像放大后的效果,PSNR越大,图像失真越小。SSIM也是越大,图像失真越小。PSNR和SSIM介绍见博客:PSNR和SSIM 本节对比四类算法放大图像后的PSNR值和SSIM值,因为电脑性能原因只放大2倍。具体放大倍数可自行调试。代码如下:
C++/dnn_superres_benchmark_quality.cpp
Python/dnn_superres_benchmark_quality.py
通过lapsrn模型进行超分放大,结果如图所示。可以知道的是lapsrn模型效果实际最好,但是实际中resize函数调用不同选项也会有类似结果,差距没有想象那么大。
3.2 不同图像超分算法速度评估
本节对比四类算法差分放大所需时间,因为电脑性能原因只放大2倍。具体放大倍数可自行调试。代码如下:
C++/dnn_superres_benchmark_time.cpp
Python/dnn_superres_benchmark_time.py
通过lapsrn模型进行超分放大,结果如图所示。图中单位为秒/s。lapsrn是OpenCV提供速度最快和精度最低的DNN超分模块,比resize普通算法效果更好都是耗时更多。
3.3 官方超分放大基准测试
OpenCV官方文档给了数据集下的基础测试结果,具体见:Super-resolution benchmarking 在Ubuntu 18.04.02 OS的Intel i7-9700K CPU上数据集超分放大算法结果如下所示。
2倍超分放大
方法 | 平均时间(s)/cpu | 平均PSNR | 平均SSIM |
ESPCN | 0.008795 | 32.7059 | 0.9276 |
EDSR | 5.923450 | 34.1300 | 0.9447 |
FSRCNN | 0.021741 | 32.8886 | 0.9301 |
LapSRN | 0.114812 | 32.2681 | 0.9248 |
Bicubic | 0.000208 | 32.1638 | 0.9305 |
Nearest neighbor | 0.000114 | 29.1665 | 0.9049 |
Lanczos | 0.001094 | 32.4687 | 0.9327 |
3倍超分放大
方法 | 平均时间(s)/cpu | 平均PSNR | 平均SSIM |
ESPCN | 0.005495 | 28.4229 | 0.8474 |
EDSR | 2.455510 | 29.9828 | 0.8801 |
FSRCNN | 0.008807 | 28.3068 | 0.8429 |
LapSRN | 0.282575 | 26.7330 | 0.8862 |
Bicubic | 0.000311 | 26.0635 | 0.8754 |
Nearest neighbor | 0.000148 | 23.5628 | 0.8174 |
Lanczos | 0.001012 | 25.9115 | 0.8706 |
4倍超分放大
方法 | 平均时间(s)/cpu | 平均PSNR | 平均SSIM |
ESPCN | 0.004311 | 26.6870 | 0.7891 |
EDSR | 1.607570 | 28.1552 | 0.8317 |
FSRCNN | 0.005302 | 26.6088 | 0.7863 |
LapSRN | 0.121229 | 26.7383 | 0.7896 |
Bicubic | 0.000311 | 26.0635 | 0.8754 |
Nearest neighbor | 0.000148 | 23.5628 | 0.8174 |
Lanczos | 0.001012 | 25.9115 | 0.8706 |
此外,官方也给出了不同图片在不同算法和不同比例下超分放大的结果,如下所示:
4倍放大一张768x512大小的图像
方法 | 时间(s)/cpu | SNR | SSIM |
ESPCN | 0.01159 | 26.5471 | 0.88116 |
EDSR | 3.26758 | 29.2404 | 0.92112 |
FSRCNN | 0.01298 | 26.5646 | 0.88064 |
LapSRN | 0.28257 | 26.7330 | 0.88622 |
Bicubic | 0.00031 | 26.0635 | 0.87537 |
Nearest neighbor | 0.00014 | 23.5628 | 0.81741 |
Lanczos | 0.00101 | 25.9115 | 0.87057 |
2倍放大一张256x256大小的图像
3倍放大一张1024x644大小的图像
Urban100: img_001.png | size: 1024x644 | ||
Original | Bicubic interpolation | Nearest neighbor interpolation | Lanczos interpolation |
PSRN / SSIM / Speed (CPU) | 27.0474 / 0.8484 / 0.000391 | 26.0842 / 0.8353 / 0.000236 | 27.0704 / 0.8483 / 0.002234 |
LapSRN无三倍放大 | |||
ESPCN | FSRCNN | LapSRN | EDSR |
28.0118 / 0.8588 / 0.030748 | 28.0184 / 0.8597 / 0.094173 | 30.5671 / 0.9019 / 9.517580 |
4倍放大一张250x361大小的图像
Set14: comic.png | size: 250x361 | ||
Original | Bicubic interpolation | Nearest neighbor interpolation | Lanczos interpolation |
PSRN / SSIM / Speed (CPU) | 19.6766 / 0.6413 / 0.000262 | 18.5106 / 0.5879 / 0.000085 | 19.4948 / 0.6317 / 0.001098 |
ESPCN | FSRCNN | LapSRN | EDSR |
20.0417 / 0.6302 / 0.001894 | 20.0885 / 0.6384 / 0.002103 | 20.0676 / 0.6339 / 0.061640 | 20.5233 / 0.6901 / 0.665876 |
4倍放大一张1356x2040大小的图像
Div2K: 0006.png | size: 1356x2040 | |
Original | Bicubic interpolation | Nearest neighbor interpolation |
PSRN / SSIM / Speed (CPU) | 26.3139 / 0.8033 / 0.001107 | 23.8291 / 0.7340 / 0.000611 |
Lanczos interpolation | LapSRN | |
26.1565 / 0.7962 / 0.004782 | 26.7046 / 0.7987 / 2.274290 |
3.4 超分算法选择总结
OpenCV中的dnn_superres模块提供的四种图像超分放大深度学习模型,在实践中用的最多的就是EDSR模型。其他三类模型和OpenCV自带的resize函数视觉上差别并不大。但是EDSR模型推理速度太慢,2倍放大和4倍放大可以使用ESPCN代替,4倍和8倍放大可以使用LapSRN。但是总体来说还是使用EDSR为好,毕竟超分放大需要高性能运算,还是用高性能显卡运算较为合适。
此外OpenCV的dnn_superres模块不适用于移动端设备或嵌入式设备,因为OpenCV对设备性能有一定要求。所以移动端可以看看ncnn的超分放大实现。具体见:
ncnn用的是srmd超分放大模型,srmd官方代码和ncnn官方实现代码见
事实上srmd超分放大性能效果高于OpenCV提供的EDSR模型,但SRMD需要显卡进行运算,ncnn在移动端使用vulkan实现加速运算,在PC端如果有显卡也通过ncnn调用SRMD模型。
4 参考
4.1 相关论文
Enhanced Deep Residual Networks for Single Image Super-ResolutionReal-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural NetworkAccelerating the Super-Resolution Convolutional Neural Network
Deep laplacian pyramid networks for fast and accurate super-resolution
4.2 参考代码
Super Resolution using Convolutional Neural NetworksEDSR_TensorflowTF-ESPCNFSRCNN_TensorflowTF-LAPSRNOpenCV-Practical-ExerciseSRMDsrmd-ncnn-vulkan
4.3 参考文档
超分辨率基准测试Super-resolution benchmarking
【超分辨率】—图像超分辨率(Super-Resolution)技术研究
【超分辨率】—基于深度学习的图像超分辨率最新进展与趋势
PSNR和SSIM
OpenCV_contrib库在windows下编译使用指南
srmd ncnn vulkan 通用图片超分放大工具