文章目录
- 介绍
- OpenCV中的超分辨率
- EDSR
- ESPCN
- FSRCNN
- LapSRN
- 结果
- 结论
介绍
超分辨率是指放大或改善图像细节的过程。请关注此博客,以了解OpenCV中“超分辨率”的选项。当增加图像的尺寸时,需要以某种方式插入额外的像素。基本的图像处理技术无法提供良好的效果,因为它们在放大时不会考虑周围环境。深度学习以及最新的GAN则考虑到了这一点,能够给出更好的结果。
下图展示的是超分辨率图像。最左边是原始高分辨率图像能够显示的最佳细节效果。其他图像是在使用各种超分辨率方法重构后获得的。您可以在此仔细的对比它们的效果。
使用超分辨率变体获得的重建图像与原始高分辨率图像的效果比较
OpenCV中的超分辨率
OpenCV当前提供四种深度学习算法供您选择,以用于放大图像。在本文中,所有这些都将进行审查。我们还将看到它们的结果,并将它们与使用双三次插值法在OpenCV中使用标准调整大小操作放大后的图像进行比较。我们将讨论的四种方法是:
EDSR 论文 模型
ESPCN 论文 模型
FSRCNN 论文 模型
LapSRN 论文 模型
请注意,前三种算法的放大倍数是原始大小的2倍,3倍和4倍,而后一种算法的原始倍数是原始大小的2倍,4倍和8倍!可以使用上面提供的链接下载每个所需比率的TensorFlow模型。要将它们与OpenCV的DNN模块一起使用,需要opencv-contrib。可以使用以下方法安装最新版本的pip:
pip install opencv-contrib-python
注意:如果您已经安装了OpenCV,则最好创建一个虚拟环境并在其中安装opencv-contrib,以避免任何依赖性问题。默认情况下,这将安装最新版本的OpenCV以及opencv-contrib模块。如果您以前在运行此命令之前已安装过OpenCV,则也可以选择卸载它。
EDSR
Lim等。在他们的论文中提出了两种方法,EDSR和MDSR。EDSR方法中的不同规模需要不同的模型。相比之下,单个模型可以在MDSR模型中重建各种规模。但是,在本文中,我们将仅讨论EDSR。
使用ResNet样式的体系结构时不使用“批处理规范化”层。他们发现这些图层摆脱了要素网络的范围灵活性,从而提高了性能。这使他们可以构建具有更好性能的更大模型。为了应对大型模型中的不稳定性,他们通过在最后的卷积层之后放置恒定的缩放层,在每个残余块中使用因子为0.1的残余缩放。同样,在残留块之后不使用ReLu激活层。
最初使用该体系结构的比例因子为2。然后,当针对比例因子3和4进行训练时,将使用这些预训练的权重。这不仅可以加快训练速度,而且可以提高模型的性能。下图是EDSR方法,双三次插值方法和原始高分辨率图像的4倍超分辨率结果的比较。
使用双三次插值法,ESPCN和相应的高分辨率图像进行超分辨率的比较。 使用双三次插值法,ESPCN和相应的高分辨率图像进行超分辨率的比较。
ESPCN
Shi等人,而不是使用双三次滤波器在将低分辨率放大后执行超分辨率。以低分辨率本身提取特征图,并使用复杂的放大滤镜获得结果。升级层仅部署在网络的末端。这样可以确保模型中发生的复杂操作在较小的维度上发生,这使其速度更快,尤其是与其他技术相比。
ESPCN的基本结构受SRCNN的启发。代替使用常规的卷积层,利用了子像素卷积层,其作用类似于去卷积层。在最后一层中使用子像素卷积层以生成高分辨率图。与此同时,他们发现Tanh激活功能比标准ReLu功能要好得多。
下图是ESPCN方法,双三次插值法和原始高分辨率图像的3倍超分辨率结果的比较。
使用双三次插值法,ESPCN和相应的高分辨率图像进行超分辨率的比较。 使用双三次插值法,ESPCN和相应的高分辨率图像进行超分辨率的比较。
FSRCNN
FSRCNN和ESPCN具有非常相似的概念。两者的基本结构均受SRCNN的启发,并在最后采用了放大层以提高速度,而不是尽早进行插值。此外,它们甚至在最终使用更多映射层之前缩小输入要素的尺寸并使用较小的过滤器尺寸,从而导致模型变得更小,更快。
该体系结构从卷积层开始,其滤波器大小从SRCNN的9减少到5。应用缩小层是因为输入分辨率本身可能很大并且需要很多时间。使用的过滤器大小为1×1,这不会增加计算成本。
接下来,作者将重点放在减少非线性映射上,该非线性映射在不降低准确性的前提下减慢了模型的速度。因此,他们使用多个3×3滤镜。下一个扩展部分与收缩部分相反,最后才应用反卷积层进行上采样。对于激活功能,使用了PReLu。
下图是FSRCNN方法,双三次插值方法和原始高分辨率图像的3倍超分辨率结果的比较。
双三次插值,FSRCNN和相应的高分辨率图像的超分辨率比较。 双三次插值,FSRCNN和相应的高分辨率图像的超分辨率比较。 图片 来源
LapSRN
LapSRN提供了在开始和结束时进行提升的对比策略之间的中间立场。建议将其逐渐放大到最后。它的名称基于拉普拉斯金字塔,其结构基本上就像金字塔,将低分辨率图像放大到最后。为了提高速度,很大程度上依赖于参数共享。就像EDSR模型一样,他们还提出了一个可以重构不同尺度的单一模型,称为MS-LapSRN。但是,在本文中,我们将仅讨论LapSRN。
这些模型包括两个分支:特征提取和图像重建分支。参数共享发生在不同比例之间,即4x使用2x模型中的参数,依此类推。这意味着一个金字塔用于缩放2倍,两个金字塔用于缩放4倍,而三个用于缩放8倍!制作如此深的模型意味着它们可能会遇到梯度消失的问题。因此,他们尝试使用不同类型的本地跳过连接,例如,不同源的跳过连接和共享源的连接。Charbonnier损失用于模型的损失函数,而未使用批次归一化层。
下图是LapSRN方法,双三次插值方法和原始高分辨率图像的8倍超分辨率结果的比较。
双三次插值,LapSRN和相应的高分辨率图像的超分辨率比较。 双三次插值,LapSRN和相应的高分辨率图像的超分辨率比较。 图片 来源
代码
第一步是创建DNN超分辨率类的对象。接下来是读取和设置模型,最后将图像放大。
我们在下面提供了Python和C ++代码。您可以将model_path变量的值替换为要使用的模型的路径。我们已经在博客的开头提供了所有模型的链接。下面还提供了它们以供参考。
EDSR [型号]
ESPCN [模型]
FSRCNN [模型]
LapSRN [型号]
C ++
#include <opencv2/dnn_superres.hpp>DnnSuperResImpl sr;
string model_path = "ESPCN_x4.pb";
sr.readModel(model_path);
sr.setModel("espcn", 4); // set the model by passing the value and the upsampling ratio
Mat result; // creating blank mat for result
sr.upsample(img, result); // upscale the input image
Python
import cv2sr = cv2.dnn_superres.DnnSuperResImpl_create()
path = "ESPCN_x4.pb"
sr.readModel(path)
sr.setModel("espcn", 4) # set the model by passing the value and the upsampling ratio
result = sr.upsample(img) # upscale the input image
注意:确保以小写形式正确传递模型名称,并采用正确的上采样率作为所采用的模型sr.setModel()。
结果
原始图像。卡尔文·马诺(Calvin Mano)在Unsplash上 拍摄的照片
为了在此处显示结果,仅裁剪了上图中的蝴蝶区域。使用超分辨率模型将其放大了四倍,并在下表中列出。
结果 使用4种不同模型从原始图像按比例放大蝴蝶区域的结果
仅通过放大图像来用肉眼在结果之间进行区分并不容易。因此,为了验证模型的所有性能,将这些技术应用于三张尺寸为500×333的图像,并在将其上采样回500×333之前将其缩小为所需的尺寸。然后使用PSNR和SSIM将放大后的图像与原始图像进行比较。计算所有图像的平均结果,并在下面给出。
姓名 | 2倍 | 3倍 | 4倍 | 8倍 |
---|---|---|---|---|
双三次 | 27.8667 | 25.9653 | 24.7637 | 21.5657 |
EDSR | 28.5503 | 26.484 | 25.3513 | – |
静电防护网 | 28.3803 | 25.9613 | 25.0947 | – |
FSRCNN | 28.1673 | 26.128 | 25.0683 | – |
LapSRN | 28.098 | – | 25.053 | 21.587 |
平均PSNR值(dB)
姓名 | 2倍 | 3倍 | 4倍 | 8倍 |
---|---|---|---|---|
双三次 | 0.859 | 0.794 | 0.728 | 0.552 |
EDSR | 0.885 | 0.825 | 0.762 | – |
静电防护网 | 0.877 | 0.799 | 0.736 | – |
FSRCNN | 0.876 | 0.798 | 0.735 | – |
LapSRN | 0.874 | – | 0.735 | 0.554 |
平均SSIM值
此外,还将记录在Intel i5-7200U上花费的时间,下面给出所有图像的平均值。请记住,传递给3倍的图像大小小于2倍,并且对于更大的缩放因子也是如此。
姓名 | 2倍 | 3倍 | 4倍 | 8倍 |
---|---|---|---|---|
双三次 | 0.00099 | 0.00099 | 0.00098 | 0.00098 |
EDSR | 32.501 | 16.718 | 10.224 | – |
ESPCN | 0.049 | 0.032 | 0.018 | |
FSRCNN | 0.074 | 0.035 | 0.054 | – |
LapSRN | 0.501 | – | 0.742 | 0.765 |
平均时间(以秒为单位)
如需更详细的指标,这些方法,请参阅此文章上的OpenCV的文档。
结论
在此博客中,我们简要介绍了超分辨率的概念。我们选择了四个超分辨率模型,讨论了它们的架构和结果,特别说明了图像超分辨率显示的不同方法以及实现效率的差异。
总结我们的观察结果,EDSR很容易就给出了四种方法中的最佳结果。但是它效率很低,不能用于实时应用程序。如果需要实时性能并且具有几乎相同的性能,则ESPCN和FSRCNN是首选方法。但是对于所选用的测试图像,ESPCN比FSRCNN要略微领先。对于8x的放大因子,即使可以使用2x和4x模型的组合,LapSRN的8x放大模型在大多数情况下也表现更好。尽管这些方法都无法与传统的双三次方法速度相提并论,但它们肯定能能得到更好的结果。