The super-resolution module contains sample codes for benchmarking, in order to compare different models and algorithms. Here is presented a sample code for performing benchmarking, and then a few benchmarking results are collected. It was performed on an Intel i7-9700K CPU on an Ubuntu 18.04.02 OS.
14 using namespace dnn_superres;
16 static void showBenchmark(vector<Mat> images,
string title,
Size imageSize,
17 const vector<String> imageTitles,
18 const vector<double> psnrValues,
19 const vector<double> ssimValues)
25 int len =
static_cast<int>(images.size());
27 int cols = 2, rows = 2;
29 Mat fullImage = Mat::zeros(
Size((cols * 10) + imageSize.
width * cols, (rows * 10) + imageSize.
height * rows),
34 for (
int i = 0; i < len; i++) {
43 resize(images[i], tmp,
Size(ROI.width, ROI.height));
58 ss <<
"PSNR: " << psnrValues[i];
71 ss <<
"SSIM: " << ssimValues[i];
84 tmp.
copyTo(fullImage(ROI));
92 static Vec2d getQualityValues(
Mat orig,
Mat upsampled)
94 double psnr =
PSNR(upsampled, orig);
95 Scalar q = quality::QualitySSIM::compute(upsampled, orig,
noArray());
96 double ssim =
mean(
Vec3d((q[0]), q[1], q[2]))[0];
97 return Vec2d(psnr, ssim);
100 int main(
int argc,
char *argv[])
105 cout <<
"usage: Arg 1: image path | Path to image" << endl;
106 cout <<
"\t Arg 2: algorithm | edsr, espcn, fsrcnn or lapsrn" << endl;
107 cout <<
"\t Arg 3: path to model file 2 \n";
108 cout <<
"\t Arg 4: scale | 2, 3, 4 or 8 \n";
112 string path = string(argv[1]);
113 string algorithm = string(argv[2]);
114 string model = string(argv[3]);
115 int scale = atoi(argv[4]);
119 cerr <<
"Couldn't load image: " << img <<
"\n";
126 Mat cropped = img(
Rect(0, 0, width, height));
130 resize(cropped, img_downscaled,
Size(), 1.0 / scale, 1.0 / scale);
135 vector <Mat> allImages;
140 sr.setModel(algorithm, scale);
141 sr.upsample(img_downscaled, img_new);
143 vector<double> psnrValues = vector<double>();
144 vector<double> ssimValues = vector<double>();
147 Vec2f quality = getQualityValues(cropped, img_new);
149 psnrValues.push_back(quality[0]);
150 ssimValues.push_back(quality[1]);
152 cout << sr.getAlgorithm() <<
":" << endl;
153 cout <<
"PSNR: " << quality[0] <<
" SSIM: " << quality[1] << endl;
154 cout <<
"----------------------" << endl;
159 quality = getQualityValues(cropped, bicubic);
161 psnrValues.push_back(quality[0]);
162 ssimValues.push_back(quality[1]);
164 cout <<
"Bicubic " << endl;
165 cout <<
"PSNR: " << quality[0] <<
" SSIM: " << quality[1] << endl;
166 cout <<
"----------------------" << endl;
171 quality = getQualityValues(cropped, nearest);
173 psnrValues.push_back(quality[0]);
174 ssimValues.push_back(quality[1]);
176 cout <<
"Nearest neighbor" << endl;
177 cout <<
"PSNR: " << quality[0] <<
" SSIM: " << quality[1] << endl;
178 cout <<
"----------------------" << endl;
183 quality = getQualityValues(cropped, lanczos);
185 psnrValues.push_back(quality[0]);
186 ssimValues.push_back(quality[1]);
188 cout <<
"Lanczos" << endl;
189 cout <<
"PSNR: " << quality[0] <<
" SSIM: " << quality[1] << endl;
190 cout <<
"-----------------------------------------------" << endl;
192 vector <Mat> imgs{img_new, bicubic, nearest, lanczos};
193 vector <String> titles{sr.getAlgorithm(),
"Bicubic",
"Nearest neighbor",
"Lanczos"};
194 showBenchmark(imgs,
"Quality benchmark",
Size(bicubic.
cols, bicubic.
rows), titles, psnrValues, ssimValues);
Scalar_< double > Scalar
Definition: types.hpp:669
Scalar mean(InputArray src, InputArray mask=noArray())
Calculates an average (mean) of array elements.
int rows
the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions ...
Definition: mat.hpp:2086
void copyTo(OutputArray m) const
Copies the matrix to another one.
Mat imread(const String &filename, int flags=IMREAD_COLOR)
Loads an image from a file.
_Tp width
the width
Definition: types.hpp:339
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
"black box" representation of the file storage associated with a file on disk.
Definition: affine.hpp:51
smaller version of FONT_HERSHEY_COMPLEX
Definition: imgproc.hpp:819
double PSNR(InputArray src1, InputArray src2, double R=255.)
Computes the Peak Signal-to-Noise Ratio (PSNR) image quality metric.
Template class for specifying the size of an image or rectangle.
Definition: types.hpp:315
void scale(cv::Mat &mat, const cv::Mat &range, const T min, const T max)
Definition: quality_utils.hpp:90
InputOutputArray noArray()
int cols
Definition: mat.hpp:2086
Rect2i Rect
Definition: types.hpp:462
Template class for 2D rectangles.
Definition: types.hpp:420
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
Creates a window.
_Tp height
the height
Definition: types.hpp:340
Size2i Size
Definition: types.hpp:347
Vec< double, 2 > Vec2d
Definition: matx.hpp:423
void resize(int src_type, const uchar *src_data, size_t src_step, int src_width, int src_height, uchar *dst_data, size_t dst_step, int dst_width, int dst_height, double inv_scale_x, double inv_scale_y, int interpolation)
void putText(InputOutputArray img, const String &text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=LINE_8, bool bottomLeftOrigin=false)
Draws a text string.
Vec< double, 3 > Vec3d
Definition: matx.hpp:424
n-dimensional dense array class
Definition: mat.hpp:791
bool empty() const
Returns true if the array has no elements.
Point2i Point
Definition: types.hpp:194
int waitKey(int delay=0)
Waits for a pressed key.