C++实现超分辨率重建 DBPN (二) 主流程

流程图:

主函数就按上图走:

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

//		
	int wid=jpg.getwidth();
	int hei=jpg.getheight();
	int wh=wid*hei;

		int scale_factor = 2;
        	//kernel = 6
        	int stride = 2;
        	int padding = 2;
	int whh=wh*scale_factor*scale_factor;
	int wh64=wh*64;
	int whh64=whh*64;

	//大连接池 up down  
	卷积层 l池(wid,hei,64*6); //低分辨率连接池(down) down1-> down6
	l池.data=new float[wh * l池.depth ]; 

	卷积层 l(l池.width , l池.height , 64);//复制用
	l.data=l池.data+wh64*6;//指向结尾,后面向前移

	卷积层 down(l.width , l.height ,0);//1*1卷积用,深度慢慢增加
	down.data=l.data;//始终指向复制处


	卷积层 h池(wid*scale_factor,hei*scale_factor,64*7); //高分辨率连接池(up) up1 ->up7
	h池.data=new float[whh * h池.depth ]; 

	卷积层 h(h池.width , h池.height , 64);//复制用
	h.data=h池.data+whh64*7;//指向结尾,后面向前移

	卷积层 up(h.width , h.height , 0);//1*1卷积用,深度慢慢增加
	up.data=h.data;//始终指向复制处

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

	//jpg转换为RGB卷积层
	jpg2RGB(&jpg,&rgb);

	RGB2BGR(rgb) ;
			
						 //load_mat2卷积层 ("./me/rgb.txt",&rgb); 
						//save_卷积层2txt(&rgb,"rgb.txt");

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

	//两个卷积层 交替前传(源,目标,不完全是, 也用到 up down)
			
	//大小在使用时调整
	卷积层 * di=(卷积层 *)malloc(sizeof(卷积层));
		di->width=1;
		di->height=1;
		di->depth=1;
		di->data=new float[1 ]; 

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

	int pad;

		

	//普通卷积
	#define 一层卷积(ConvX) \
	\
	层=ConvX.层;/* Conv2 层 */ \
	/*int 层数=2;*/\
		if(层->输出维度 != 目标->depth || 目标->width != wid || 目标->height != hei)\
			Resize卷积层(*目标,wid,hei,层->输出维度);\
		pad=层->核宽/2;\
		vl_nnconv(源,目标,层 ,1,1,pad,pad,pad,pad);\
		vl_nnrelu(目标,ConvX.act);/*激励函数Prelu*/\
\
		std::swap (源,目标);\


		cout<<"输入层...\n"<<endl;
		一层卷积(sr.feat0);
			save_卷积层2jpg(源,"feat0");
		一层卷积(sr.feat1);


	//下采样
	#define Conv卷积(ConvX) \
	\
	层=ConvX.层;/* Conv2 层 */ \
	wid/=scale_factor;hei/=scale_factor;\
		if(层->输出维度 != 目标->depth || 目标->width != wid || 目标->height != hei)\
			Resize卷积层(*目标,wid,hei,层->输出维度);\
		pad=padding;\
		vl_nnconv(源,目标,层 ,stride,stride,pad,pad,pad,pad);\
		vl_nnrelu(目标,ConvX.act);/*激励函数Prelu*/\
\
		std::swap (源,目标);\

	//上采样
	#define Deconv卷积(ConvX) \
	\
	层=ConvX.层;/* Conv2 层 */ \
	wid*=scale_factor;hei*=scale_factor;\
		if(层->输出维度 != 目标->depth || 目标->width != wid || 目标->height != hei)\
			Resize卷积层(*目标,wid,hei,层->输出维度);\
		pad=padding;\
		vl_nnconvt(源,目标,层 ,stride,stride,pad,pad,pad,pad);\
		vl_nnrelu(目标,ConvX.act);/*激励函数Prelu*/\
\
		std::swap (源,目标);\

	//用于残差加减
	卷积层 l备份(down.width,down.height,64);
	卷积层 h备份(up.width,up.height,64);
	l备份.data=new float[down.width*down.height*64]; h备份.data=new float[up.width*up.height*64];

	//上采样块
#define UP卷积块(UpX) \
	卷积层复制(源,&l备份);\
	Deconv卷积(UpX.up_conv1);\
	卷积层复制(源,&h备份);\
	Conv卷积  (UpX.up_conv2);\
	卷积层相减(&l备份,源);\
	Deconv卷积(UpX.up_conv3);\
	卷积层相加(&h备份,源);\
	/*向前移*/\
	h.data-=whh64;卷积层复制(源,&h);\
	up.data=h.data;up.depth+=64;\


	//下采样块
#define DOWN卷积块(DownX) \
	卷积层复制(源,&h备份);\
	Conv卷积  (DownX.down_conv1);\
	卷积层复制(源,&l备份);\
	Deconv卷积(DownX.down_conv2);\
	卷积层相减(&h备份,源);\
	Conv卷积  (DownX.down_conv3);\
	卷积层相加(&l备份,源);\
	/*向前移*/\
	l.data-=wh64;卷积层复制(源,&l);\
	down.data=l.data;down.depth+=64;\
	

	//up1
	cout<<"上采样1层...\n"<<endl;
	UP卷积块(sr.up1);


	//down1
	cout<<"下采样1层...\n"<<endl;
	DOWN卷积块(sr.down1) ;//----

	//up2
	cout<<"上采样2层...\n"<<endl;
	UP卷积块(sr.up2);//----

	//密集卷积(减维) (多个64维 -> 64维)
	#define UP_1x1卷积(ConvX) \
	\
	层=ConvX.层;/* Conv2 层 */ \
		if(目标->depth != 层->输出维度 || 目标->width != up.width || 目标->height != up.height)\
			Resize卷积层(*目标,up.width,up.height,层->输出维度);\
		pad=0;\
		vl_nnconv(&up,目标,层 ,1,1,pad,pad,pad,pad);\
		vl_nnrelu(目标,ConvX.act);/*激励函数Prelu*/\
\
		std::swap (源,目标);\

	//
	#define DOWN_1x1卷积(ConvX) \
	\
	层=ConvX.层;/* Conv2 层 */ \
		if(目标->depth != 层->输出维度 || 目标->width != down.width || 目标->height != down.height)\
			Resize卷积层(*目标,down.width,down.height,层->输出维度);\
		pad=0;\
		vl_nnconv(&down,目标,层 ,1,1,pad,pad,pad,pad);\
		vl_nnrelu(目标,ConvX.act);/*激励函数Prelu*/\
\
		std::swap (源,目标);\

	cout<<"下采样2层...\n"<<endl;
	UP_1x1卷积(sr.down2.conv);
	DOWN卷积块(sr.down2) ;


	cout<<"上采样3层...\n"<<endl;
	DOWN_1x1卷积(sr.up3.conv);
	UP卷积块(sr.up3);

			//save_卷积层2txt(&up,"up3_cat.txt");

	cout<<"下采样3层...\n"<<endl;

	UP_1x1卷积(sr.down3.conv);
	DOWN卷积块(sr.down3) ;

	cout<<"上采样4层...\n"<<endl;
	DOWN_1x1卷积(sr.up4.conv);
	UP卷积块(sr.up4);


	cout<<"下采样4层...\n"<<endl;
	UP_1x1卷积(sr.down4.conv);
	DOWN卷积块(sr.down4) ;

	cout<<"上采样5层...\n"<<endl;
	DOWN_1x1卷积(sr.up5.conv);
	UP卷积块(sr.up6);


	cout<<"下采样5层...\n"<<endl;
	UP_1x1卷积(sr.down5.conv);
	DOWN卷积块(sr.down5) ;

	cout<<"上采样6层...\n"<<endl;
	DOWN_1x1卷积(sr.up6.conv);
	UP卷积块(sr.up6);


	cout<<"下采样6层...\n"<<endl;
	UP_1x1卷积(sr.down6.conv);
	DOWN卷积块(sr.down6) ;
				save_卷积层2jpg(源,"down6");

					//load_mat2卷积层 ("./me/down6_cat.txt",&down); 
						 //load_mat2卷积层 ("./me/up7_cat.txt",&h池); 

	cout<<"上采样7层...\n"<<endl;
	DOWN_1x1卷积(sr.up7.conv);
	UP卷积块(sr.up7);
				save_卷积层2jpg(源,"up7");



			//save_卷积层2txt(源,"up7.txt");
			//save_卷积层2txt(&up,"up7_cat.txt");
						 //load_mat2卷积层 ("./me/up7_cat.txt",&up); 

	//输出层

	del卷积层(*源);
	del卷积层(l池);
		
	cout<<"输出层...\n"<<endl;

	//读取卷积(sr.output_conv);
	层=sr.output_conv.层;/* Conv2 层 */ 
		if(目标->depth != 层->输出维度 || 目标->width != up.width || 目标->height != up.height)\
			Resize卷积层(*目标,up.width,up.height,层->输出维度);\
		cout<<"宽,高:"<<wid<<","<<hei<<endl;
		pad=层->核宽/2;\
		vl_nnconv(&up,目标,层 ,1,1,pad,pad,pad,pad);

	del卷积层(l备份);
	del卷积层(h备份);
	del卷积层(h池);

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

			//save_卷积层2txt(目标,"out.txt");
						 //load_mat2卷积层 ("./me/output.txt",目标); 

	RGB2BGR(*目标) ;
				save_卷积层2jpg(目标,"out");



	RGB2jpg(目标,&jpg);

	del卷积层(*目标);

	savejpg(&jpg,savefilename);

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

其中,me文件夹中的文件是从pytorch中导出的中间层数据,用于比对。

效果:

输入图

重建图

下载:

win32超分辩重建dbpn实用程序

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

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值