由于下载的代码用了类包装器 dagnn ,这个是针对matlab7的后续版本的,已经没法使用,只能按照它的意思重新写了。

先外框架:

% DRCN 超分辨率重建
clc;clear all;name='6a.jpg';SF = 2;             % 测试比例因子。 可以是2,3或4%设置引用的 matconvnet中的函数路径
run('snu_matconvnet/matlab/vl_setupnn.m');
addpath('util/');%模型数据名
model=['sf',num2str(SF),'/DRCN_sf',num2str(SF),'.mat'];if isempty(model)error('no model');
elsePathModel = ['DRCN model/',model];
end% 载入
load(PathModel);
clear stats;clear max_psnr;%读入图
im = imread(name);
im = imresize(im, SF, 'bicubic');%先放大到目标大小if size(im,3) > 1    im = rgb2ycbcr(im);% 3通道则只对Y通道重建(先转化)
elseim = im;
end
imlow = single(im)/255;if size(im,3)>1imlowy = imlow(:,:,1);imlowy = max(16.0/255, min(235.0/255, imlowy));% 分离出imlowcb = imlow(:,:,2);imlowcr = imlow(:,:,3);
elseimlowy = imlow;
endimpred = myDRCN(net, imlowy);% 重建
%imwrite(uint8(impred*255), 'DRCN 重建单色.jpg');if size(im,3) > 1impredColor = cat(3,impred,imlowcb,imlowcr);%连回imwrite(ycbcr2rgb(uint8(impredColor*255)), ['DRCN ',num2str(SF),'倍重建.jpg']);
elseimpredColor = impred;imwrite(uint8(impredColor*255), 'DRCN 重建单色.jpg');
end

核心函数:

% DRCN 超分辨率重建 - 各层代码
function impred = myDRCN(net, imlow)l=length(net.layers);%总层数
j=0; %卷积层计数,可以无[h,w,tmp]=size(imlow);%图像大小
prediction=zeros(h,w,17);% 17张中间残差图
prediction_num=0; % 残差图计数,可以不用
for i=1:l % 循环直到所有层结束disp(['第 ',num2str(i),' 层']);
%      disp(net.layers(i).name);
%     disp(net.layers(i).type);
%     disp(net.layers(i).inputs);
%     disp(net.layers(i).outputs);
%     disp(net.layers(i).params);
%     disp(net.layers(i).block);if strTong(net.layers(i).type,'dagnn.Conv') % 字符串是否相同j=j+1disp('卷积层');%得到权重(也就是卷积核)和偏移disp('参数是:');disp(net.layers(i).params);fft=net.layers(i).params{1};for k=1:length(net.params)if strTong(net.params(k).name,fft)weight=net.params(k).value;break;endendif net.layers(i).block.hasBias==falsebias=[]; % 无偏移elsefft=net.layers(i).params{2};for k=1:length(net.params)if strTong(net.params(k).name,fft)bias=net.params(k).value;break;endendend%得到输入disp('输入是:');disp(net.layers(i).inputs);disp('输出是:');disp(net.layers(i).outputs);if strTong(net.layers(i).inputs{1},'input') %第一层convfea = myconv(imlow,weight,bias,'Pad',1);%一图得出256特征图else %一以后% 字符串是否包含if strBao(net.layers(i).outputs{:}, 'prediction') %残差if strTong(net.layers(i).outputs{:}, 'prediction') %总残差prediction=single(prediction);prediction = myconv(prediction,weight,bias);%17合成1个else %中间残差prediction_num=prediction_num+1;% 应该有17个prediction(:,:,prediction_num)= myconv(convfea,weight,bias,'Pad',1);endelseconvfea = myconv(convfea,weight,bias,'Pad',1);%中间层 256特征图合成1图 再重新生成深一层256特征图endendendif strTong(net.layers(i).type,'dagnn.ReLU' )disp('激励层');disp('输入是:');disp(net.layers(i).inputs);disp('参数是:');disp(net.layers(i).params);disp('输出是:');disp(net.layers(i).outputs);convfea = vl_nnrelu(convfea);end
%     for k=1:size(convfea,3) %保存中间图
%         %保存256张特征图
%         im_tt=uint8(convfea(:,:,k) * 255);
%         imwrite(im_tt, ['data/conv' num2str(i) '_data_0' num2str(k) '.jpg']);
%     end
end%输入和残差相加 为输出impred=imlow+prediction;%加边并卷积后还原
function [X] = myconv(X, F, B, option1, value1)
if nargin==3X = vl_nnconv(X, F, B);
else%消除四边一条线和左上角白点,否则会随着层数的增加,会越来越大BoundarySize=1;X = padarray(X, [BoundarySize,BoundarySize], 'replicate','both');X = vl_nnconv(X, F, B, option1, value1);X = X(BoundarySize+1:end-BoundarySize,BoundarySize+1:end-BoundarySize,:);
end

相同和包含函数:

%字符串相同
function TrueFalse = strTong(str1, str2)TrueFalse=0;l1=length(str1);
l2=length(str2);
if l1==l2if str1==str2TrueFalse=1;end
end%字符串包含
%在str1中 是否 包含有 str2
function TrueFalse = strBao(str1, str2)TrueFalse=0;l1=length(str1);
l2=length(str2);
if l1==l2if str1==str2TrueFalse=1;end
elseif l1>l2str3=str1(1:l2);if str3==str2TrueFalse=1;endend
end

其它 vl_nnrelu 可以直接运行

vl_nnconv可以先用下面这个,由于是256 通道  非常慢,可以用很小的图,比如10x10

%VL_NNCONV CNN 卷积。
%   Y = VL_NNCONV(X, F, B)计算图像堆x的卷积,F是卷积核,B是偏置。X=H*W*D*N,
%   (H,W)是图像的高和宽,D是图像深度(特征频道的数目,例彩色就是3),
%   N是堆中图像的数目。F=FW*FH*FD*K ,(FH,FW)是卷积核的大小,FD是卷积核的深度,
%   须与D一致,或能整除D,K是卷积核的数目。%   Y = VL_NNCONV(X, F, B) 计算图像X与滤波器组F的卷积并偏置B。
%   如果B是空矩阵,则不添加偏置。如果F是空矩阵,则函数不过滤图像,
%   但仍添加偏移并应用下采样和填充,如下所述。
%
%   X 是维度 H x W x C x N 的阵列,其中( H,W )是图像堆栈的高度和宽度,
%   C是特征通道的数量,N是批处理中的图像数量。
%
%   F 是尺寸为FW×FH×FC×K的阵列,其中 (FH,FW) 是滤波器高度和宽度,
%   K是滤波器组中的滤波器数量。 FC 是每个滤波器中的特征信道数,
%   必须与 X 中的特征信道数 C 匹配。 Alternatively, FC can
%   *divide* the C; in this case, filters are assumed to form G=C/FC
%   *groups* of equal size (where G must divide K). {或者,FC可以*除C;
%    在这种情况下,假定滤波器形成大小相等的G = C / FC *组* (其中G必须除以K )。}
%   每组滤波器在输入阵列 X 的特征信道的连续子集上工作。
%%   [DX, DF, DB] = VL_NNCONV(X, F, B, DY) 计算投影到 P 上的算子的导数。
%   DX、DF、DB和DY分别具有与X、F、B和Y相同的尺寸。特别地,如果B是空矩阵,
%   则DB也是空的。
%
%   VL_NNCONV() 实现了一种特殊的*完全连接*模式:当过滤器的支持与输入图像的
%   支持完全匹配时,代码使用优化的途径以加快计算速度。
%
%   VL_NNCONV(..., 'option', value, ...) 接受以下
%   选项:
%
%   `Stride`:: 1
%     输出步幅或下采样因子。如果该值是标量,则相同的步幅应用于垂直和水平方向;
%     否则,通过 [STRIDEY STRIDEX] 允许为每个方向指定不同的下采样因子。
%
%   `Pad`:: 0
%     输入填充量。在计算卷积之前,输入图像用零填充该数量的像素。通过[上 下 左 右][TOP BOTTOM LEFT RIGHT]
%     允许分别为顶侧、底侧、左侧和右侧指定不同的填充量。
%     传递单个标量将相同的填充应用于所有边框。
%
%   过滤器尺寸必须不大于填充图像,即
%
%     1 <= FH <= H + 2*(PADTOP+PADBOTTOM),
%     1 <= FW <= W + 2*(PADLEFT+PADRIGHT).
%
%    输出a是N幅图像尺寸YH×YW×K×N的阵列,具有K个特征值和大小:
%
%     YH = floor((H + (PADTOP+PADBOTTOM) - FH)/STRIDEY) + 1,
%     YW = floor((W + (PADLEFT+PADRIGHT) - FW)/STRIDEX) + 1.
%
%   参数可以是单精度或双个精度的以及CPU或GPU阵列;但是,
%   它们必须具有相同的类型(除非为空)。
function Y = vl_nnconv(X, F, B, option1, value1, option2, value2, ...ops,cudnn)% vl_nnconv(res(i).x, l.weights{1}, l.weights{2}, res(i+1).dzdx, ...
%           'pad', l.pad, ...
%           'stride', l.stride, ...
%           l.opts{:}, ...
%           cudnn{:}) ;F=double(F);
[np,tmp]=size(B);
if np>1[FW,FH,FC,K]=size(F);if (FC==1 && K~=1)||(FC~=1 && K==1)Kp=max(FC,K);%第一层 生成64特征图[h,w,c]=size(X);Y=zeros(h,w,Kp);for i=1:Kpif K~=1;ff=F(:,:,1,i);end;if FC~=1;ff=F(:,:,i);end;Y(:,:,i) =B(i)+ imfilter(X,ff, 'same', 'replicate');endelse[h,w,c, N]=size(X);if K==1else%中间层2-19 :先把64个特征图合在一起,再重新找出64种特征图。Y=zeros(h,w,K);%Kfor j=1:FCfor i=1:Kxx=X(:,:,i);%  ff=F(:,:,j,i);ff=F(:,:,i,j);Y(:,:,j) =Y(:,:,j)+imfilter(xx,ff, 'same', 'replicate');%convnendY(:,:,j) =Y(:,:,j) + B(j);endendend
else%最后一层,64 图合成 1 图[h,w, N]=size(X);Y=zeros(h,w);for i=1:Nxx=X(:,:,i);ff=F(:,:,i);Y =Y+imfilter(xx,ff, 'same', 'replicate');endY=Y + B(1);
end

如果要加快运行速度,就要编译matconvnet 中的vl_nnconv

找不到<blas.h>中的 sgemm 矩阵乘法 可以先用下面的:

for(i=0;i<m;i++)
{     for(int j=0;j<n;j++)  {  for(int q=0;q<k;q++){  c[j*m+i]+=a[q*m+i]*b[j*k+q]; }  }
}

虽然只实现 sgemm 中的部分功能,但在这里已经够用了(另外网上有个C语言版sgemm,放在这里好象不能用,不知为什么?)

然后得到一个 vl_nnconv.dll 这样虽然快了一点,但是还是很慢的

效果图:

原图

2倍重建图

这个是等了很久才出来的,3,4倍就更慢了,就没有运行了

这样就没有改成C++价值了

在matlab7.0中运行DRCN 超分辨率重建相关推荐

  1. 超分辨率重建SRCNN--Matlab 7.0中运行

    终于找到一个可以在自己电脑中运行的超分辨率重建程序了,Matlab 7.0真的是太老了(实际上是自己的笔记本太老了,哈哈) demo_SR.m % ========================== ...

  2. 超分辨率重建数据集制作:生成低分辨率数据集

    目录 背景 代码 结果 其他 注意: 超分主流有两种BI.BD. 1.实际上公认的是使用MATLAB进行插值. 2.Bicubic(双三次插值)方式.(BI方式) 3.高斯模糊+双三次插值是另一种常用 ...

  3. 超分辨率重建数据集制作:裁剪过滤

    目录 背景 代码 其他 背景 由于获取到的高分辨率图像尺寸不一,不符合公认的要求,需要有一边长为2040,另一边长不做要求,这里我将其设置为大于648.因此我对图像进行了裁剪过滤,代码如下(请修改输入 ...

  4. 超分辨率重建——(一)何为超分和分类

    图像超分辨重建 图像超分辨率(SR)是计算机视觉中提高图像和视频分辨率的一类重要技术.图像超分辨率重建( Super-resolution Reconstruction,SR) 是由一张或多张低分辨率 ...

  5. 谷歌colab“几键”运行图像超分辨率模型-ESRGAN,操作详解

    文章目录 1. 准备工作(前提) 2.Colab常用操作 3. git clone 从github 克隆代码 4. 下载数据集(DIV2K) 5. 解压数据 6. 查看代码,运行改名rename.py ...

  6. 超分算法DRCN:Deeply-Recursive Convolutional Network for Image Super-Resolution超分辨率重建

    DRCN:Deeply-Recursive Convolutional Network for Image Super-Resolution Abstract 1 Introduction 2 Met ...

  7. 深度学习在超分辨率重建上的应用SRCNN,FSRCNN,VDSR,DRCN,SRGAN

    超分辨率技术(Super-Resolution)是指从观测到的低分辨率图像重建出相应的高分辨率图像, 目前应用较多的应用场景是图像及视频分辨率提高,比如可以提高以往影视作品或图像的分辨率,提高视觉感官 ...

  8. 基于SRGAN实现图像超分辨率重建或复原

    基于SRGAN实现图像超分辨率重建或复原 2018年04月20日 11:50:26 山水之间2018 阅读数 14064 文章标签: SRGAN图像超分辨率重建 更多 分类专栏: 深度学习 图像处理  ...

  9. 经典论文复现 | 基于深度学习的图像超分辨率重建

    过去几年发表于各大 AI 顶会论文提出的 400 多种算法中,公开算法代码的仅占 6%,其中三分之一的论文作者分享了测试数据,约 54% 的分享包含"伪代码".这是今年 AAAI ...

最新文章

  1. jQuery 超屏加载
  2. css层叠上下文详解,CSS定位(层叠上下文)
  3. SCSF 系列:Smart Client Software Factory 中 MVP 模式最佳实践
  4. 华为S系列交换机全面阻击“WannaCry”
  5. python 月活_TikTok用户月活超1亿意味着什么?什么是月活用户?
  6. python写负数_python 负数
  7. WEB2.0开发平台
  8. 员工转正述职答辩问什么问题_展风采 创未来 | 记德信地产杭州公司新员工转正述职答辩...
  9. Java 时间和字符换的处理
  10. eclipse项目导入到AndroidStudioc报错
  11. Golang实现Server和Client的TCP通讯
  12. mysql怎么查找删除重复数据_Mysql中如何查找并删除重复数据
  13. 使用 DUET/REFIND 方法将 NVME 添加为引导驱动器
  14. mysql按工作日查询统计优化_工作日计算问题思路和实现
  15. win10计算机显示摄像头,win10系统此电脑添加摄像头(视频设备)图标的操作方法
  16. GB2312与utf16、utf8的汉字对照表
  17. Eclipse插件大全 (下)
  18. 【PMP】PMBOK 笔记 第7章 项目成本管理
  19. kafka之broker
  20. 将DataFrame中的时间转换为时间戳

热门文章

  1. Python多线程下载图片
  2. Shopee店铺开设步骤
  3. php mysql三_PHP 和 MySQL 基础教程(三)_MySQL
  4. Could not resolve com.nbsp:library:1.8如何解决
  5. 再牛逼的伟人,也有苦逼的青春
  6. java流程图什么代表活动_举例分析流程图和活动图的区别与联系
  7. 01-系统安装-acer台式机使用固态盘重装系统后无法进入BOOT
  8. pyinstaller paddle项目
  9. [CF628D]Magic Numbers 题解
  10. vue 集成 sweetalert2 提示组件