SRCNN学习(一):demo_SR.m

一、demo_SR.m 使用方法

1、Place the "SRCNN" folder into "($Caffe_Dir)/examples

2、Open MATLAB and direct to ($Caffe_Dir)/example/SRCNN, run "demo_SR.m"


二、demo_SR.m 运行结果

根据 demo.m 的代码,显示结果为双三次插值后的图片和 SRCNN 重建后的图片,同时输出双三次插值的峰值信噪比以及 SRCNN 重建的峰值信噪比。

  • 原图:

  • 双三次插值 vs SRCNN重建:


三、demo_SR.m 代码分析

  • 根据邹老师的提示:进行单步跟踪,看代码同时要边调试边看效果

  • 我选择 Matlab 中的运行节对代码进行查看

  • 读取真实图像

  1. close all;
  2. clear all 清空工作区
  3. %% read ground truth image
  4. im = imread('Set5\butterfly_GT.bmp');

此时读入名为 butterbly_GT 的图片,工作区显示图片的值

  • 设定参数

  1. %% set parameters
  2. up_scale = 3;
  3. model = 'model\9-5-5(ImageNet)\x3.mat';

这段代码实现参数设置的功能。

其中up_scale为这段代码设定的放大倍率,当 up_scale = 3 时,选择模型为 x3.mat

  • 仅在照度方面

  1. %% work on illuminance only
  2. if size(im,3)>1
  3. im = rgb2ycbcr(im);
  4. im = im(:, :, 1);
  5. end
  6. im_gnd = modcrop(im, up_scale);
  7. im_gnd = single(im_gnd)/255;

size(im,3) 返回第三维度的长度,由前面可知 im 的值为 256x256x3 uint8,所以返回值应大于1会进入循环。

rgb2ycbcr(im) 将彩色RGB图像转换为 YCbCr 颜色空间中的等效图像, im(:,:,1) 将 im 的第三维度长修改为1。

modcrop(im,up_scale) 该函数在 modcrop.m 文件中有对应的定义:

  1. function imgs = modcrop(imgs, modulo) modcrop函数
  2. if size(imgs,3)==1
  3. sz = size(imgs);
  4. sz = sz - mod(sz, modulo);
  5. imgs = imgs(1:sz(1), 1:sz(2));
  6. else
  7. tmpsz = size(imgs);
  8. sz = tmpsz(1:2);
  9. sz = sz - mod(sz, modulo);
  10. imgs = imgs(1:sz(1), 1:sz(2),:);
  11. end

该函数将图片裁剪为能够调整的大小(与放大率匹配)

  • 双三次插值

  1. %% bicubic interpolation
  2. im_l = imresize(im_gnd, 1/up_scale, 'bicubic'); %缩小三倍
  3. im_b = imresize(im_l, up_scale, 'bicubic'); %放大三倍

imresize() 函数用于调整图像大小,在这里的用法传入三个参数,第一为图片,第二为函数将 图像的长宽大小缩放的倍数,第三为缩放的方法,这里使用的 bicubic 即双三次插值的方法。使用双三次插值的方法产生的图片输出像素值是最近 4×4 邻点中的像素的加权平均值。

至此,梳理各个参数所代表的值

  • im_l :im_gnd 进行双三次插值缩小后的图像

  • im_b : im_gnd 进行双三次插值缩小后,再进行同比例放大的图像

  • SRCNN

  1. %% SRCNN
  2. im_h = SRCNN(model, im_b);

此过程根据 SRCNN 对 im_b 进行训练,产生 im_h 图像

  • 删除边框

  1. %% remove border
  2. im_h = shave(uint8(im_h * 255), [up_scale, up_scale]);
  3. im_gnd = shave(uint8(im_gnd * 255), [up_scale, up_scale]);
  4. im_b = shave(uint8(im_b * 255), [up_scale, up_scale]);

shave() 函数在文件 shave.m 中有定义:

  1. function I = shave(I, border)
  2. I = I(1+border(1):end-border(1),...
  3. 1+border(2):end-border(2), :, :,);
  • 计算 PSNR

  1. %% compute PSNR
  2. psnr_bic = compute_psnr(im_gnd,im_b);
  3. psnr_srcnn = compute_psnr(im_gnd,im_h);

compute_psnr() 函数在文件 compute_psnr.m 中有定义

  1. function psnr=compute_psnr(im1,im2)
  2. if size(im1, 3) == 3,
  3. im1 = rgb2ycbcr(im1);
  4. im1 = im1(:, :, 1);
  5. end
  6. if size(im2, 3) == 3,
  7. im2 = rgb2ycbcr(im2);
  8. im2 = im2(:, :, 1);
  9. end
  10. imdff = double(im1) - double(im2);
  11. imdff = imdff(:);
  12. rmse = sqrt(mean(imdff.^2));
  13. psnr = 20*log10(255/rmse);

在论文中提到 PSNR 是一种用于定量评估图像恢复质量的广泛使用的度量,并且与感知质量部分相关,2个图像之间 PSNR 值越大,则越相似。普遍基准为 30dB ,30dB 以下的图像劣化较为明显。PSNR 定义为:

  1. PSNR = 10log10(MAX^2/MSE)

这里 MAX 表示图像颜色的最大数值,8bit 图像取值为255。MSE(均方差),即 m×n 单色图像 I 和 K(原图像与处理图像)之间均方误差。

compute_psnr() 就是对生成的图像与原图对比,形成信噪比的直观查看方式。

  • 显示结果

  1. %% show results
  2. fprintf('双三次插值的峰值信噪比: %f dB\n', psnr_bic);
  3. fprintf('SRCNN 重建的峰值信噪比: %f dB\n', psnr_srcnn);
  4. figure, imshow(im_b); title('双三次插值');
  5. figure, imshow(im_h); title('SRCNN 重建');
  6. imwrite(im_b, ['双三次插值' '.bmp']);
  7. imwrite(im_h, ['SRCNN 重建' '.bmp']);

输出两张图片,以及两次比较的信噪比。


四、实践

由于通过论文给的函数只会输出灰度的图像,我在网上查看他人的代码时发现输出具有颜色的图像的方式。

下面时我根据他的代码进行修改后输出的结果

  1. close all;
  2. clear all;
  3. %% read ground truth image 读取真实图像
  4. im = imread('Set5\butterfly_GT.bmp');
  5. %% set parameters 设定参数
  6. up_scale = 3;
  7. model = 'model\9-5-5(ImageNet)\x3.mat';
  8. %% work on illuminance only 仅在照度方面
  9. if size(im,3)>1
  10. im = rgb2ycbcr(im);
  11. im_U = im(:, :, 1);
  12. end
  13. im_gnd = modcrop(im_U, up_scale);
  14. im_gnd = single(im_gnd)/255;
  15. im_gnd2 = modcrop(im, up_scale);
  16. im_gnd2 = single(im_gnd2)/255;
  17. im_2 = im_gnd2(:, :, 2);
  18. im_3 = im_gnd2(:, :, 3);
  19. %% bicubic interpolation 双三次插值
  20. im_l = imresize(im_gnd, 1/up_scale, 'bicubic');
  21. im_b = imresize(im_l, up_scale, 'bicubic');
  22. %% SRCNN
  23. im_h = SRCNN(model, im_b);
  24. %% 三通道合回
  25. [m,n] = size(im_h);
  26. im_h1 = zeros(m,n,3);
  27. im_h1(:, :, 1) = im_h;
  28. im_h1(:, :, 2) = im_2;
  29. im_h1(:, :, 3) = im_3;
  30. im_h1 = uint8(im_h1 * 255);%转回uint8
  31. im_h1 = ycbcr2rgb(im_h1);%转回rgb
  32. %% remove border 删除边框
  33. im_h1 = shave(im_h1, [up_scale, up_scale]);
  34. %% show results 显示结果
  35. figure, imshow(im_h1);
  36. title('SRCNN 重建');


五、结语

这周的学习主要是对 SRCNN 的整个流程进行了重新认识,明白了各个步骤的主要任务,了解到论文中 SRCNN 其实是对图片的 Y 通道提取后,进行重建,最后通过输出 PSNR 和图片的方式,来对重建的程度进行分析。

下周将对 SRCNN.m 文件进行学习,并在学习卷积、步长等概念后对 SRCNN 的三个卷积过程有更深刻的理解。

参考博客:超分辨率重建SRCNN--Matlab 7.0中运行

SRCNN(一)的更多相关文章

  1. 『超分辨率重建』从SRCNN到WDSR

    超分辨率重建技术(Super-Resolution)是指从观测到的低分辨率图像重建出相应的高分辨率图像.SR可分为两类:    1. 从多张低分辨率图像重建出高分辨率图像    2. 从单张低分辨率图 ...

  2. SRCNN

    SRCNN(超分辨率卷积神经网络) 网络结构 l  Conv1: f1 = 9 *9 activation = ‘relu’ l  Conv2: f2 = 1 *1 activation = ‘rel ...

  3. SRcnn:神经网络重建图片的开山之作

    % ========================================================================= % Test code for Super-Re ...

  4. SRCNN之后的深度学习超分辨率

    SRCNN开山之作 IDN 信息蒸馏网络information distillation network(IDN) Fast and Accurate Single Image Super-Resol ...

  5. SRCNN代码分析

    代码是作者页面上下载的matlab版.香港中文大学汤晓鸥教授.Learning a Deep Convolutional Network for Image Super-Resolution. htt ...

  6. 体验SRCNN和FSRCNN两种图像超分网络应用

    摘要:图像超分即超分辨率,将图像从模糊的状态变清晰. 本文分享自华为云社区<图像超分实验:SRCNN/FSRCNN>,作者:zstar. 图像超分即超分辨率,将图像从模糊的状态变清晰.本文 ...

  7. 比SRCNN效果好的传统超分辨率算法汇总

    1.基于深度协作表达的人脸图像超分辨率算法研究与应用_百度学术 采用一种深度协作表达算法框架,构造深度的多线性模型 分段拟合高低分辨率图像块之间的非线性关系,本文算法简洁高效,提供了一种新的深度学习模 ...

  8. SRCNN 卷积神经网络

    2019-05-19 从GitHub下载了代码(这里) 代码量虽然不多,但是第一次学,花了时间还是挺多的.根据代码有跑出结果(基本没有改),但是对于数据集的处理还是看的很懵逼,主要是作者的实现都是用类 ...

  9. DL论文

    题目:Accurate Image Super-Resolution Using Very Deep Convolutional Networks(2016CVPR) 摘要:文中提出了一种高精度处理单 ...

随机推荐

  1. libav(ffmpeg)简明教程(1)

    突然发现又有好久没有写技术blog了,主要原因是最近时间都用来研究libav去了(因为api极类似ffmpeg,虽然出自同一份代码的另外一个分支,因项目选用libav,故下文均用libav代替),其实 ...

  2. 【洛谷1967】货车运输(最大生成树+倍增LCA)

    点此看题面 大致题意: 有\(n\)个城市和\(m\)条道路,每条道路有一个限重.多组询问,每次询问从\(x\)到\(y\)的最大载重为多少. 一个贪心的想法 首先,让我们来贪心一波. 由于要求最大载 ...

  3. 2018.5.25 Oracle相关的函数命令

    第03章 函数 1 Oracle的函数 Oracle的函数和java中的方法一样, 能完成一定的功能 2 字符处理类函数 --需求1:把ename字段转换成小写 select lower(ename) ...

  4. BundleConfig的作用

    在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压缩(多个文件可以打包成一个文件),并且可以区分调试和非调试,在调试时不进行压缩,以原 ...

  5. WebAppBuilder独立于portal之arcgis for js应用框架研究之二

    WAB采用ArcGIS JavaScript for API作为地图开发底层,采用Web AppBuilder作为开发框架,利用该框架即拿即用的Widget来构建应用,比如制图.查询.地理处理.编辑. ...

  6. java算法面试题:写一个Singleton出来

    package com.swift; public class Singleton { public static void main(String[] args) { /* * 写一个Singlet ...

  7. [vijos1066]弱弱的战壕

    描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...

  8. 【C++学习笔记】 链式前向星

    链式前向星是一种常见的储存图的方式(是前向星存图法的优化版本),支持增边和查询,但不支持删边(如果想要删除指定的边建议用邻接矩阵). 储存方式 首先定义数组 head[ i ] 来储存从节点 i 出发 ...

  9. linux下通过phpize为php在不重新编译php情况下安装模块memcache

    通过phpize为php在不重新编译php情况下安装模块memcache 1. 下载    wget http://pecl.php.net/get/memcache-2.2.4.tgz     解压 ...

  10. Java 批量文件压缩导出,并下载到本地

    主要用的是org.apache.tools.zip.ZipOutputStream  这个zip流,这里以Execl为例子. 思路首先把zip流写入到http响应输出流中,再把excel的流写入zip ...