OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
未找到匹配项
超分辨率基准测试

基准测试

超分辨率模块包含用于基准测试的示例代码,以便比较不同的模型和算法。这里提供了一个执行基准测试的示例代码,以及一些收集到的基准测试结果。测试在 Ubuntu 18.04.02 操作系统上的 Intel i7-9700K CPU 上进行。

示例源代码

1// 此文件是 OpenCV 项目的一部分。
2// 它受此发行版顶层目录中 LICENSE 文件中找到的许可条款以及 https://opencv.ac.cn/license.html 中的许可条款的约束。
3
4
5#include <iostream>
6#include <opencv2/opencv_modules.hpp>
7
8#ifdef HAVE_OPENCV_QUALITY
10#include <opencv2/quality.hpp>
11#include <opencv2/imgproc.hpp>
12#include <opencv2/highgui.hpp>
13
14using namespace std;
15using namespace cv;
16using namespace dnn_superres;
17
18static void showBenchmark(vector<Mat> images, string title, Size imageSize,
19 const vector<String> imageTitles,
20 const vector<double> psnrValues,
21 const vector<double> ssimValues)
22{
23 int fontFace = FONT_HERSHEY_COMPLEX_SMALL;
24 int fontScale = 1;
25 Scalar fontColor = Scalar(255, 255, 255);
26
27 int len = static_cast<int>(images.size());
28
29 int cols = 2, rows = 2;
30
31 Mat fullImage = Mat::zeros(Size((cols * 10) + imageSize.width * cols, (rows * 10) + imageSize.height * rows),
32 images[0].type());
33
34 stringstream ss;
35 int h_ = -1;
36 for (int i = 0; i < len; i++) {
37
38 int fontStart = 15;
39 int w_ = i % cols;
40 if (i % cols == 0)
41 h_++;
42
43 Rect ROI((w_ * (10 + imageSize.width)), (h_ * (10 + imageSize.height)), imageSize.width, imageSize.height);
44 Mat tmp;
45 resize(images[i], tmp, Size(ROI.width, ROI.height));
46
47 ss << imageTitles[i];
48 putText(tmp,
49 ss.str(),
50 Point(5, fontStart),
51 fontFace,
52 fontScale,
53 fontColor,
54 1,
55 16);
56
57 ss.str("");
58 fontStart += 20;
59
60 ss << "PSNR: " << psnrValues[i];
61 putText(tmp,
62 ss.str(),
63 Point(5, fontStart),
64 fontFace,
65 fontScale,
66 fontColor,
67 1,
68 16);
69
70 ss.str("");
71 fontStart += 20;
72
73 ss << "SSIM: " << ssimValues[i];
74 putText(tmp,
75 ss.str(),
76 Point(5, fontStart),
77 fontFace,
78 fontScale,
79 fontColor,
80 1,
81 16);
82
83 ss.str("");
84 fontStart += 20;
85
86 tmp.copyTo(fullImage(ROI));
87 }
88
89 namedWindow(title, 1);
90 imshow(title, fullImage);
91 waitKey();
92}
93
94static Vec2d getQualityValues(Mat orig, Mat upsampled)
95{
96 double psnr = PSNR(upsampled, orig);
97 Scalar q = quality::QualitySSIM::compute(upsampled, orig, noArray());
98 double ssim = mean(Vec3d((q[0]), q[1], q[2]))[0];
99 return Vec2d(psnr, ssim);
100}
101
102int main(int argc, char *argv[])
103{
104 // 检查有效的命令行参数,如果参数不足则打印使用方法
105 // 如果提供的参数不足。
106 if (argc < 4) {
107 cout << "使用方法:参数 1:图像路径 | 图像路径" << endl;
108 cout << "\t 参数 2:算法 | edsr, espcn, fsrcnn 或 lapsrn" << endl;
109 cout << "\t 参数 3:模型文件路径 2 \n";
110 cout << "\t 参数 4:缩放比例 | 2, 3, 4 或 8 \n";
111 return -1;
112 }
113
114 string path = string(argv[1]);
115 string algorithm = string(argv[2]);
116 string model = string(argv[3]);
117 int scale = atoi(argv[4]);
118
119 Mat img = imread(path);
120 if (img.empty()) {
121 cerr << "无法加载图像:" << img << "\n";
122 return -2;
123 }
124
125 // 裁剪图像以对齐图像
126 int width = img.cols - (img.cols % scale);
127 int height = img.rows - (img.rows % scale);
128 Mat cropped = img(Rect(0, 0, width, height));
129
130 // 下采样图像用于基准测试
131 Mat img_downscaled;
132 resize(cropped, img_downscaled, Size(), 1.0 / scale, 1.0 / scale);
133
134 // 创建DNN超分辨率实例
135 DnnSuperResImpl sr;
136
137 vector <Mat> allImages;
138 Mat img_new;
139
140 // 读取并设置DNN模型
141 sr.readModel(model);
142 sr.setModel(algorithm, scale);
143 sr.upsample(img_downscaled, img_new);
144
145 vector<double> psnrValues = vector<double>();
146 vector<double> ssimValues = vector<double>();
147
148 // 深度学习模型
149 Vec2f quality = getQualityValues(cropped, img_new);
150
151 psnrValues.push_back(quality[0]);
152 ssimValues.push_back(quality[1]);
153
154 cout << sr.getAlgorithm() << ":" << endl;
155 cout << "PSNR: " << quality[0] << " SSIM: " << quality[1] << endl;
156 cout << "----------------------" << endl;
157
158 // 双三次插值
159 Mat bicubic;
160 resize(img_downscaled, bicubic, Size(), scale, scale, INTER_CUBIC);
161 quality = getQualityValues(cropped, bicubic);
162
163 psnrValues.push_back(quality[0]);
164 ssimValues.push_back(quality[1]);
165
166 cout << "双三次 " << endl;
167 cout << "PSNR: " << quality[0] << " SSIM: " << quality[1] << endl;
168 cout << "----------------------" << endl;
169
170 //最近邻插值
171 Mat nearest;
172 resize(img_downscaled, nearest, Size(), scale, scale, INTER_NEAREST);
173 quality = getQualityValues(cropped, nearest);
174
175 psnrValues.push_back(quality[0]);
176 ssimValues.push_back(quality[1]);
177
178 cout << "最近邻插值" << endl;
179 cout << "PSNR: " << quality[0] << " SSIM: " << quality[1] << endl;
180 cout << "----------------------" << endl;
181
182 //Lanczos插值
183 Mat lanczos;
184 resize(img_downscaled, lanczos, Size(), scale, scale, INTER_LANCZOS4);
185 quality = getQualityValues(cropped, lanczos);
186
187 psnrValues.push_back(quality[0]);
188 ssimValues.push_back(quality[1]);
189
190 cout << "Lanczos插值" << endl;
191 cout << "PSNR: " << quality[0] << " SSIM: " << quality[1] << endl;
192 cout << "-----------------------------------------------" << endl;
193
194 vector <Mat> imgs{img_new, bicubic, nearest, lanczos};
195 vector <String> titles{sr.getAlgorithm(), "双三次", "最近邻插值", "Lanczos插值"};
196 showBenchmark(imgs, "质量基准测试", Size(bicubic.cols, bicubic.rows), titles, psnrValues, ssimValues);
197
198 waitKey(0);
199
200 return 0;
201}
202#else
203int main()
204{
205 std::cout << "此示例需要OpenCV质量模块。" << std::endl;
206 return 0;
207}
208#endif
n维密集数组类
定义 mat.hpp:829
void copyTo(OutputArray m) const
将矩阵复制到另一个矩阵。
int cols
定义 mat.hpp:2155
bool empty() const
如果数组没有元素,则返回true。
int rows
行和列的数量,当矩阵的维度超过2维时为(-1, -1)
定义 mat.hpp:2155
二维矩形的模板类。
定义 types.hpp:444
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
_Tp height
高度
定义 types.hpp:363
_Tp width
宽度
定义 types.hpp:362
int waitKey(int delay=0)
等待按键按下。
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
从文件加载图像。
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
调整图像大小。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
void scale(cv::Mat &mat, const cv::Mat &range, const T min, const T max)
定义 quality_utils.hpp:90
定义 core.hpp:107
STL命名空间。

解释

  1. 读取并缩小图像

    int width = img.cols - (img.cols % scale);
    int height = img.rows - (img.rows % scale);
    Mat cropped = img(Rect(0, 0, width, height));
    Mat img_downscaled;
    cv::resize(cropped, img_downscaled, cv::Size(), 1.0 / scale, 1.0 / scale);

    按缩放因子调整图像大小。在此之前需要进行裁剪,以便图像对齐。

  2. 设置模型

    DnnSuperResImpl sr;
    sr.readModel(path);
    sr.setModel(algorithm, scale);
    sr.upsample(img_downscaled, img_new);

    实例化一个dnn超分辨率对象。读取并设置算法和缩放因子。

  3. 执行基准测试

    double psnr = PSNR(img_new, cropped);
    double ssim = mean(cv::Vec3f(q[0], q[1], q[2]))[0];
    cv::Scalar compute(InputArray cmp) CV_OVERRIDE
    计算 SSIM。
    InputOutputArray noArray()
    返回一个空的 InputArray 或 OutputArray。

    计算 PSNR 和 SSIM。使用 OpenCV 的 PSNR(核心 OpenCV)和 SSIM(contrib)函数来比较图像。使用其他上采样算法重复此操作,例如其他深度学习模型或插值方法(例如,双三次插值、最近邻插值)。

基准测试结果

General100 数据集

2x 缩放因子

平均推理时间(秒)(CPU)平均 PSNR平均 SSIM
ESPCN0.008795 32.7059 0.9276
EDSR5.923450 34.1300 0.9447
FSRCNN0.021741 32.8886 0.9301
LapSRN0.114812 32.2681 0.9248
双三次插值0.000208 32.1638 0.9305
最近邻插值0.000114 29.1665 0.9049
Lanczos 插值0.001094 32.4687 0.9327

3x 缩放因子

平均推理时间(秒)(CPU)平均 PSNR平均 SSIM
ESPCN0.005495 28.4229 0.8474
EDSR2.455510 29.9828 0.8801
FSRCNN0.008807 28.3068 0.8429
LapSRN0.282575 26.7330 0.8862
双三次插值0.000311 26.0635 0.8754
最近邻插值0.000148 23.5628 0.8174
Lanczos 插值0.001012 25.9115 0.8706

4x 缩放因子

平均推理时间(秒)(CPU)平均 PSNR平均 SSIM
ESPCN0.004311 26.6870 0.7891
EDSR1.607570 28.1552 0.8317
FSRCNN0.005302 26.6088 0.7863
LapSRN0.121229 26.7383 0.7896
双三次插值0.000311 26.0635 0.8754
最近邻插值0.000148 23.5628 0.8174
Lanczos 插值0.001012 25.9115 0.8706

图像

2x 缩放因子

Set5: butterfly.png尺寸:256x256

PSNR / SSIM / 速度 (CPU)26.6645 / 0.9048 / 0.000201 23.6854 / 0.8698 / 0.000075 26.9476 / 0.9075 / 0.001039

29.0341 / 0.9354 / 0.004157 29.0077 / 0.9345 / 0.006325 27.8212 / 0.9230 / 0.037937 30.0347 / 0.9453 / 2.077280

3x 缩放因子

Urban100: img_001.png尺寸:1024x644

PSNR / SSIM / 速度 (CPU)27.0474 / 0.8484 / 0.000391 26.0842 / 0.8353 / 0.000236 27.0704 / 0.8483 / 0.002234

LapSRN 未针对 3x 训练
因为其架构原因

28.0118 / 0.8588 / 0.030748 28.0184 / 0.8597 / 0.094173 30.5671 / 0.9019 / 9.517580

4x 缩放因子

Set14: comic.png尺寸:250x361

PSNR / SSIM / 速度 (CPU)19.6766 / 0.6413 / 0.000262 18.5106 / 0.5879 / 0.000085 19.4948 / 0.6317 / 0.001098

20.0417 / 0.6302 / 0.001894 20.0885 / 0.6384 / 0.002103 20.0676 / 0.6339 / 0.061640 20.5233 / 0.6901 / 0.665876

8x 缩放因子

Div2K: 0006.png尺寸:1356x2040

PSNR / SSIM / 速度 (CPU)26.3139 / 0.8033 / 0.001107 23.8291 / 0.7340 / 0.000611

26.1565 / 0.7962 / 0.004782 26.7046 / 0.7987 / 2.274290