在matlab7.0中运行DRCN 超分辨率重建
由于下载的代码用了类包装器 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 超分辨率重建相关推荐
- 超分辨率重建SRCNN--Matlab 7.0中运行
终于找到一个可以在自己电脑中运行的超分辨率重建程序了,Matlab 7.0真的是太老了(实际上是自己的笔记本太老了,哈哈) demo_SR.m % ========================== ...
- 超分辨率重建数据集制作:生成低分辨率数据集
目录 背景 代码 结果 其他 注意: 超分主流有两种BI.BD. 1.实际上公认的是使用MATLAB进行插值. 2.Bicubic(双三次插值)方式.(BI方式) 3.高斯模糊+双三次插值是另一种常用 ...
- 超分辨率重建数据集制作:裁剪过滤
目录 背景 代码 其他 背景 由于获取到的高分辨率图像尺寸不一,不符合公认的要求,需要有一边长为2040,另一边长不做要求,这里我将其设置为大于648.因此我对图像进行了裁剪过滤,代码如下(请修改输入 ...
- 超分辨率重建——(一)何为超分和分类
图像超分辨重建 图像超分辨率(SR)是计算机视觉中提高图像和视频分辨率的一类重要技术.图像超分辨率重建( Super-resolution Reconstruction,SR) 是由一张或多张低分辨率 ...
- 谷歌colab“几键”运行图像超分辨率模型-ESRGAN,操作详解
文章目录 1. 准备工作(前提) 2.Colab常用操作 3. git clone 从github 克隆代码 4. 下载数据集(DIV2K) 5. 解压数据 6. 查看代码,运行改名rename.py ...
- 超分算法DRCN:Deeply-Recursive Convolutional Network for Image Super-Resolution超分辨率重建
DRCN:Deeply-Recursive Convolutional Network for Image Super-Resolution Abstract 1 Introduction 2 Met ...
- 深度学习在超分辨率重建上的应用SRCNN,FSRCNN,VDSR,DRCN,SRGAN
超分辨率技术(Super-Resolution)是指从观测到的低分辨率图像重建出相应的高分辨率图像, 目前应用较多的应用场景是图像及视频分辨率提高,比如可以提高以往影视作品或图像的分辨率,提高视觉感官 ...
- 基于SRGAN实现图像超分辨率重建或复原
基于SRGAN实现图像超分辨率重建或复原 2018年04月20日 11:50:26 山水之间2018 阅读数 14064 文章标签: SRGAN图像超分辨率重建 更多 分类专栏: 深度学习 图像处理 ...
- 经典论文复现 | 基于深度学习的图像超分辨率重建
过去几年发表于各大 AI 顶会论文提出的 400 多种算法中,公开算法代码的仅占 6%,其中三分之一的论文作者分享了测试数据,约 54% 的分享包含"伪代码".这是今年 AAAI ...
最新文章
- jQuery 超屏加载
- css层叠上下文详解,CSS定位(层叠上下文)
- SCSF 系列:Smart Client Software Factory 中 MVP 模式最佳实践
- 华为S系列交换机全面阻击“WannaCry”
- python 月活_TikTok用户月活超1亿意味着什么?什么是月活用户?
- python写负数_python 负数
- WEB2.0开发平台
- 员工转正述职答辩问什么问题_展风采 创未来 | 记德信地产杭州公司新员工转正述职答辩...
- Java 时间和字符换的处理
- eclipse项目导入到AndroidStudioc报错
- Golang实现Server和Client的TCP通讯
- mysql怎么查找删除重复数据_Mysql中如何查找并删除重复数据
- 使用 DUET/REFIND 方法将 NVME 添加为引导驱动器
- mysql按工作日查询统计优化_工作日计算问题思路和实现
- win10计算机显示摄像头,win10系统此电脑添加摄像头(视频设备)图标的操作方法
- GB2312与utf16、utf8的汉字对照表
- Eclipse插件大全 (下)
- 【PMP】PMBOK 笔记 第7章 项目成本管理
- kafka之broker
- 将DataFrame中的时间转换为时间戳
热门文章
- Python多线程下载图片
- Shopee店铺开设步骤
- php mysql三_PHP 和 MySQL 基础教程(三)_MySQL
- Could not resolve com.nbsp:library:1.8如何解决
- 再牛逼的伟人,也有苦逼的青春
- java流程图什么代表活动_举例分析流程图和活动图的区别与联系
- 01-系统安装-acer台式机使用固态盘重装系统后无法进入BOOT
- pyinstaller paddle项目
- [CF628D]Magic Numbers 题解
- vue 集成 sweetalert2 提示组件