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<<"输入图像宽度:"<
	层数据 * 层;

	//两个卷积层 交替前传(源,目标,不完全是, 也用到 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"<输出维度 != 目标->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"< 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"<depth != 层->输出维度 || 目标->width != up.width || 目标->height != up.height)\
			Resize卷积层(*目标,up.width,up.height,层->输出维度);\
		cout<<"宽,高:"<核宽/2;\
		vl_nnconv(&up,目标,层 ,1,1,pad,pad,pad,pad);

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

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

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

效果:

C++实现超分辨率重建 DBPN (二) 主流程_第1张图片输入图

C++实现超分辨率重建 DBPN (二) 主流程_第2张图片重建图

下载:

win32超分辩重建dbpn实用程序

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

 

 

你可能感兴趣的:(超分辨率重建)