C++实现超分辨率 RDN

C++实现超分辨率 RDNRDN(由残差密集网络实现的图像超分辨率)在《RDN-TensorFlow-master》有一个3倍模型(也只有这一个了):rdn_5_3_64_x3这里用C++实现这个的3倍重建:流程图:密集残差块:这个残差块结构内部和前面的ESRGAN(前面的文章)中的密集残差块是一样的,只是外部有点不同。定义密集残差块:struct密集残差块//4个卷积层…

大家好,又见面了,我是你们的朋友全栈君。

RDN(由残差密集网络实现的图像超分辨率)

在《RDN-TensorFlow-master》有一个3倍模型(也只有这一个了):rdn_5_3_64_x3

 

这里用C++实现这个的3倍重建:

流程图:

C++实现超分辨率 RDN

密集残差块:

C++实现超分辨率 RDN

这个残差块结构内部和前面的ESRGAN(前面的文章)中的密集残差块是一样的,只是外部有点不同。

定义密集残差块:

struct 密集残差块 // 4个卷积层
{
	//输入       0; -->64

	//0 连续存储 64
	层数据 * conv1;//64-->64

	//0,1 连续存储 128
	层数据 * conv2;//128-->64

	//0,1,2 连续存储 192
	层数据 * conv3;//192-->64

	//0,1,2,3 连续存储 256
	层数据 * conv4;//256-->64    局部特征融合 1x1卷积
};

定义模型数据池和初始化:

struct RDN模型
{
    //浅层特征提取
	层数据 * conv1;//3->64
	层数据 * conv2;//64->64

	//密集残差块
	int 密集残差块数量;//5块
	密集残差块 * 块;

	//5个密集残差块连续存储 320
	层数据 * conv3;	//320-->64 特征融合 1x1卷积
	层数据 * conv4; //64-->64

	//全局残差相加

	//放大
	层数据 * up1;//64->64 卷积
	层数据 * up2;//64->32 卷积
	层数据 * up3;//32->27 卷积
	//亚像素卷积 27->3
	
	//输出
	层数据 * out;//3->3 卷积

	
	//构造函数
	RDN模型();

};

RDN模型::RDN模型()
{

	int size;
	层数据 * 层;

	//用于一层(宏)
	/*输入维度,输出维度,核宽*/
	/*输入维度,输出维度,核宽*/
	#define 初始化ONE层(IN,OUT,KW) \
	\
	层->输入维度=IN;\
	层->输出维度=OUT;\
	层->核宽=KW;\
	层->权重长度=层->输出维度*层->输入维度*层->核宽*层->核宽;\
	层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);\
	层->偏移长度=层->输出维度;\
	层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);\


	#define 初始化层(ConvX,IN,OUT,KW) \
	size = sizeof(层数据);\
\
	层=ConvX =(层数据 *)malloc(size);\
	初始化ONE层(IN,OUT,KW)\




	/*名称,输入维度,输出维度,核宽*/
		初始化层(conv1,3,64,3);
		初始化层(conv2,64,64,3);

		密集残差块数量=5;
		size = sizeof(密集残差块)*密集残差块数量;
		块=(密集残差块*)malloc(size);
		密集残差块 * 密集残差块0=块;
		for (int k = 0;k<密集残差块数量;k++)
		{

			初始化层(密集残差块0->conv1,64,64,3);
			初始化层(密集残差块0->conv2,128,64,3);
			初始化层(密集残差块0->conv3,192,64,3);
			初始化层(密集残差块0->conv4,256,64,1);

			密集残差块0++;
		}

		初始化层(conv3,320,64,1);
		初始化层(conv4,64,64,3);

		初始化层(up1,64,64,5);
		初始化层(up2,64,32,3);
		初始化层(up3,32,27,3);

		初始化层(out,3,3,3);

}

主函数:

void RDN(char * savefilename,RDN模型 & sr)
{

//		
	int wid=bmp.width;
	int hei=bmp.height;
		cout<<"输入图像宽度:"<<wid<<endl;
		cout<<"        高度:"<<hei<<endl;
//
	卷积层 rgb(wid,hei,3);
	rgb.data=new float[wid * hei * 3 ]; 

	//jpg转换为RGB卷积层
	bmp2RGB(rgb);




	//---------------------------------------------->
	层数据 * 层;

	//两个卷积层 交替前传(源,目标)
			
	//用这个传回
	卷积层 * di=(卷积层 *)malloc(sizeof(卷积层));
		di->width=1;
		di->height=1;
		di->depth=1;
		di->data=new float[1 ]; 

	卷积层 *源,*目标;
	源 = &rgb;
	
	目标 = di;

	int pad;

		

	cout<<"输入层..."<<endl;
	卷积前传无RELU(sr.conv1);

	//备份
	卷积层 conv1备份(wid,hei,源->depth);//F_1
	conv1备份.data=new float[wid * hei * 源->depth ]; 
	卷积层复制(源,&conv1备份);


	卷积前传无RELU(sr.conv2);
		//load_mat2卷积层("me/F0.txt",源);

	//----------------------------------------------<

	    
	    

	//第二部分  5密集残差块
	密集残差块总成(sr,*源);

		
	卷积层相加(&conv1备份,源);
		//load_mat2卷积层("me/FDF.txt",源);
	del卷积层(conv1备份);

	        
	//放大3倍
		
	cout<<"放大3倍... "<<endl;


	卷积前传(sr.up1);
	卷积前传(sr.up2);
	卷积前传无RELU(sr.up3);


	//亚像素卷积
	wid *= 3;hei *= 3;
	Resize卷积层(*目标,wid,hei,3);

	像素混组放大(源,目标);

	std::swap (源,目标);
		//load_mat2卷积层("me/FU.txt",源);
	卷积前传无RELU(sr.out);

	cout<<"生成宽,高:"<<wid<<","<<hei<<endl;

		//load_mat2卷积层("me/result.txt",源);

	RGB2bmp(*源);
						
	
	del卷积层(*源);
	del卷积层(*目标);
	


	cout<<"图像转换成jpg格式... "<<endl;


	savejpg(savefilename);

	cout<<"转换文件已经保存为:    "<<savefilename<<endl;

}

效果图:

C++实现超分辨率 RDN小图

C++实现超分辨率 RDNRDN 3倍

C++实现超分辨率 RDNEDSR 3倍重建(EDSR-PyTorch-master运行结果)

C++实现超分辨率 RDN

确实和EDSR效果和速度都相差不多。

下载:

win32超分辩重建RDN实用程序

超分辨率重建RDN(3倍)的win32程序,由RDN-TensorFlow-master中的模型改编而来

https://download.csdn.net/download/juebai123/11135013

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150430.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • String,StringBuffer和StringBuilder的区别及使用场景[通俗易懂]

    String,StringBuffer和StringBuilder的区别及使用场景[通俗易懂]String:字符串常量。StringBuffer与StringBuilder是字符缓冲变量。StringBuffer与StringBuilder中的方法和功能完全是等价的,只是StringBuffer中的方法大都采用了synchronized关键字进行修饰,因此是线程安全的,而StringBuilder没有这个修饰,可以被认为是线程不安全的。StringBuilder是在…

  • 推流地址怎么获取_淘宝店怎么和抖音对接

    推流地址怎么获取_淘宝店怎么和抖音对接随着淘宝直播官方不再对外提供推流地址,一些习惯了用(或者必须用)第三方推流平台(如obs)的用户来说,是非常头疼的。这个时候,迫切需要找到淘宝直播的推流地址,本文提供了三种方法来获取,一种比一种简单。闲话少说,直播上干货。方法一:Fiddler+Proxifier抓包的方式(仅使用Fiddler抓不到)1、安装Fiddler(下载地址:https://dl1.qwp365.cn/buding/xiugaiqi/3DMGAME-CheatEnginev7.0CH.zip),安装Proxifier(

    2022年10月19日
  • oracle多字段去重查询_根据某一字段去重

    oracle多字段去重查询_根据某一字段去重oracle怎么去重查询oracle去重查询的方法是:oracle数据库多字段去重方法介绍:distinct关键字、groupby、row_number()over(partitionby列orderby列desc)我的需求是:根据某几列去重查询出去重后的全部信息。最后我选择的是第三种方法。我的想法:我想找出一种更简单的方法去实现去重查询。越直接越好。表结构&&…

    2022年10月23日
  • matlab超前滞后校正装置设计_matlab劳斯判据

    matlab超前滞后校正装置设计_matlab劳斯判据且1引言不确定性与时滞是工业过程中普通存在的现象,这使得系统的分析与综合变得更加复杂和困难,同时也是导致系统不稳定和性能恶化的主要因素.因此,对不确定时滞系统的鲁棒控制问题进行研究,具有重要的理论意义和实际应用价值.近年来,不确定时滞系统的稳定性研究得到了广泛的关注匡5}.中立时滞系统作为一类非常重要的控制系统,其稳定性研究己有不少有价值的结论{3一11}.中立时滞系统的稳定条件可分为两大类:时滞…

  • 【STM32】系统时钟RCC详解(超详细,超全面)

    【STM32】系统时钟RCC详解(超详细,超全面)1什么是时钟时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理(点灯,串口,ADC),时钟的重要性不言而喻。为什么STM32要有多个时钟源呢?STM32本身十分复杂,外设非常多但我们实际使用的时候只会用到有…

  • JAVA获取服务器上文件路径,java 获取远程服务器目录的路径

    JAVA获取服务器上文件路径,java 获取远程服务器目录的路径java获取远程服务器目录的路径内容精选换一换已将所需升级的鲲鹏性能分析工具的软件包下载到本地。获取软件包后,需要校验软件包,确保与网站上的原始软件包一致,详细步骤请参见软件包校验。获取软件包后,需要校验软件包,确保与网站上的原始软件包一致,详细步骤请参见软件包校验。升级前请确认鲲鹏性能分析工具可以正常使用。升级前请确认安装空间至少保留原工具安装目录的大小加上新版本安装空间(1GB)为加强对系…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号