C++实现超分辨率重建 EDSR

WDSR是NTIRE2018(图像恢复和增强新趋势)的现实赛道(有噪声图片)第一名,双三次上是第七名。

本来也想测试下效果,但模型在drive.google.com上下不了(PyTorch,以及keras),下了一个Tensorflow的pb模型,用Tensorflow或者OpenCV都没有打开。

先试试 EDSR 吧,这个是是NTIRE2017的第一名(哪个赛道?)。

先导出x4倍模型 edsr_baseline_x4-6b446fab.pt(《EDSR-PyTorch-master》程序自动下载的)。

流程图:

模型定义:

struct EDSR模型
{
    //头
	层数据 * 输入层;

	//主体
	int 残差块数量;//16块
	残差块 * 块;
	层数据 * 残差输出层;

	//放大层
	层数据 * 放大1前层;
	层数据 * 放大2前层;

    //尾
	层数据 * 输出层;

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

};

主函数:

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

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

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

	预处理(rgb);//减平均值
	
			

	wid=rgb.width;
	hei=rgb.height;

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

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

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

	int pad;

		

	//定义一个宏
	//用于各个层
	#define 卷积前传(ConvX,步长)/* 上采样、下采样 */ \
	\
	层=sr.ConvX;/* Conv2 层 */ \
	if(层->输出维度 != 目标->depth || 目标->width != wid || 目标->height != hei)\
		Resize卷积层(*目标,wid,hei,层->输出维度);\
	pad=层->核宽/2;\
	vl_nnconv(源,目标,层 ,步长,步长,pad,pad,pad,pad);\
	/*vl_Norm(目标);*/\
	/*vl_nnrelu(目标);激励函数不用*/\
\
	std::swap (源,目标);\


	cout<<"输入层..."<<endl;
	卷积前传(输入层,1);


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

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

	//第二部分  16残差层
	卷积层 convfea5(wid,hei,源->depth);
	convfea5.data=new float[wid * hei * 源->depth ]; 

	卷积层 *源备份=&convfea5;


	if(源->depth != 目标->depth || 目标->width != wid || 目标->height != hei)
		Resize卷积层(*目标,wid,hei,源->depth);

	残差块 * 残差块0=sr.块;
	cout<<sr.残差块数量<<"个残差块... 包括 2 组卷积"<<endl;

	for (int k = 0;k<sr.残差块数量;k++)
	{
		cout<<"\r"<<k;


		//备份
		卷积层复制(源,源备份);


		层=残差块0->卷积层;

						
		vl_nnconv(源,目标,层 ,1,1,1,1,1,1);
						
		vl_nnrelu(目标);
				

		层++;
		vl_nnconv(目标,源,层 ,1,1,1,1,1,1);

		//输入加上残差
		卷积层相加(源备份,源);


		残差块0++;//到下残差块
	}
	cout<<endl;
	del卷积层(*源备份);

	        
	//残差输出层
	卷积前传(残差输出层,1);


	//输入加上残差
	卷积层相加(&备份,源);

	del卷积层(备份);


		
					
	cout<<"第一上采样层..."<<endl;
	卷积前传(放大1前层,1);
			
	wid=wid*2;hei=hei*2;
	Resize卷积层(*目标,wid,hei,64);
	放大排列256_64(源,目标);//亚像数放大层
	std::swap (源,目标);

	cout<<"第二上采样层..."<<endl;
	卷积前传(放大2前层,1);
	wid=wid*2;hei=hei*2;
	Resize卷积层(*目标,wid,hei,64);
	放大排列256_64(源,目标);
	std::swap (源,目标);

	cout<<"输出层..."<<endl;
	层=sr.输出层;
	if(层->输出维度 != 目标->depth || 目标->width != wid || 目标->height != hei)
		Resize卷积层(*目标,wid,hei,层->输出维度);
	pad=层->核宽/2;
	vl_nnconv(源,目标,层 ,1,1,pad,pad,pad,pad);
	del卷积层(*源);

						
	
	


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




	后处理(*目标);//加平均值 

//		
//load_mat2卷积层("me/sr.txt",目标);
	RGB2BGR(*目标) ;


	RGB2bmp(*目标);

	del卷积层(*目标);

	savejpg(savefilename);

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

}

效果:

输入 小图

EDSR 4倍

DBPN 4倍(可到《C++实现自适应风格迁移(adaptive-style-transfer-master)》一文开头处下载)

ESRGAN 4倍

EDSR 稍差一点,但速度快得太多了。

不知WDSR 效果咋样?

下载:

win32超分辩重建EDSR实用程序

超分辨率重建EDSR(4倍)的win32程序,使用edsr中的基础模型edsr_baseline_x4-6b446fab.pt

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

 

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值