OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配项
超分辨率基准测试

基准测试

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

示例的源代码

1// 该文件是 OpenCV 项目的一部分。
2// 该文件受此发行版中的顶级目录中找到的 LICENSE 文件中的许可条款和 https://opencv.ac.cn/license.html 上的许可条款约束。
3// of this distribution and at https://opencv.ac.cn/license.html.
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 字号比例 = 1;
25 标量 字体颜色 = 标量(255, 255, 255);
26
27 int 长度 = static_cast<int>(图片.大小());
28
29 int 列数 = 2, 行数 = 2;
30
31 矩阵 整幅图像 = 矩阵::零(尺寸((列数 * 10) + 图片尺寸.宽度 * 列数, (行数 * 10) + 图片尺寸.高度 * 行数),
32 图片[0].类型());
33
34 字符串流 ss;
35 int h_ = -1;
36 for (int i = 0; i < 长度; i++) {
37
38 int 字体开始 = 15;
39 int w_ = i % 列数;
40 if (i % 列数 == 0)
41 h_++;
42
43 矩形 ROI((w_ * (10 + 图片尺寸.宽度)), (h_ * (10 + 图片尺寸.高度)), 图片尺寸.宽度, 图片尺寸.高度);
44 矩阵 tmp;
45 改变尺寸(图片[i], tmp, 尺寸(ROI.宽度, ROI.高度));
46
47 ss << 图片标题[i];
48 绘制文字(tmp,
49 ss.str(),
50 (5, 字体开始),
51 字体风格,
52 字号比例,
53 字体颜色,
54 1,
55 16);
56
57 ss.str("");
58 字体开始 += 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 << "用法:Arg 1:图像路径 | 图像路径" << endl;
108 cout << "\t Arg 2:算法 | edsr、espcn、fsrcnn 或 lapsrn" << endl;
109 cout << "\t Arg 3:模型文件 2 的路径 \n";
110 cout << "\t Arg 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 //DL 模型
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 //NEAREST NEIGHBOR
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 << "Nearest neighbor" << 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(), "Bicubic", "Nearest neighbor", "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:812
void copyTo(OutputArray m) const
将矩阵复制到另一个矩阵。
int cols
定义 mat.hpp:2138
bool empty() const
如果阵列没有元素则返回 true。
int rows
行数和列数,或 (-1, -1),当矩阵具有 2 个以上的维度时
定义 mat.hpp:2138
用于指定 2D 矩形的模板类。
定义 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)
从文件中加载图像。
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:102
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()

    计算PSNR和SSIM。使用OpenCV的PSNR(核心opencv)和SSIM(contrib)函数比较图像。使用其他升级算法重复此操作,例如其他DL模型或插值方法(例如双三次、最近邻)。

基准测试结果

General100数据集

2倍缩放因子

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
Lanczos0.001094 32.4687 0.9327

3倍缩放因子

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
Lanczos0.001012 25.9115 0.8706

4倍缩放因子

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
Lanczos0.001012 25.9115 0.8706

图像

2倍缩放因子

Set5: butterfly.png大小:256x256
PSRN / 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

3倍缩放因子

Urban100: img_001.png大小:1024x644
PSRN / SSIM / 速度(CPU)27.0474 / 0.8484 / 0.000391 26.0842 / 0.8353 / 0.000236 27.0704 / 0.8483 / 0.002234
LapSRN未针对3倍进行训练
因其架构
28.0118 / 0.8588 / 0.030748 28.0184 / 0.8597 / 0.094173 30.5671 / 0.9019 / 9.517580

4倍缩放因子

Set14: comic.png大小:250x361
PSRN / 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

8 倍缩放系数

Div2K: 0006.png大小: 1356x2040
PSRN / 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