C++实现超分辨率重建 ESRGAN (一) 数据池

本来还想实现下 AdaIN 风格转换中的`-preserveColor`选项(保留内容图像的颜色)
但是一看 coral 函数太复杂,吓倒我了,以后再说吧。


看到《ESRGAN-master》有两个测试模型下载:"RRDB_ESRGAN_x4.pth","RRDB_PSNR_x4.pth",试试这个吧。

ESRGAN(增强型SRGAN)(增强型超分辨率生成对抗网络)
在[PIRM2018-SR竞赛](区域3)中获得了第一名并获得了最佳感知指数。

先测试下效果:

原图

C++实现超分辨率重建 ESRGAN (一) 数据池_第1张图片ESRGAN 4倍重建图

C++实现超分辨率重建 ESRGAN (一) 数据池_第2张图片DBPN 4倍重建图

两者相比,各有特色。

然后导出生成网络的训练数据,是一个167M的文本文件,比 DBPN的154M大了一点,是一个更深的网络

C++实现超分辨率重建 ESRGAN (一) 数据池_第3张图片

定义密集残差块和组:

struct 密集残差块 // ResidualDenseBlock_5C
{
	层数据 * conv1;
	层数据 * conv2;
	层数据 * conv3;
	层数据 * conv4;
	层数据 * conv5;
};

struct 密集残差组 //RRDB
{
	密集残差块 RDB1;
	密集残差块 RDB2;
	密集残差块 RDB3;

};

定义二十三个组:

struct 二十三组 //RRDB
{
	int 个数;
	密集残差组 * sub;
};

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

struct ESRGAN模型
{

	//初始特征提取(输入层)
	层数据 * 特征_conv;

	//23个密集残差块组
	二十三组 rb_blocks;

	层数据 * LR_conv;
	放大块 up2x_1;//4倍=2倍2次(放大)
	放大块 up2x_2;

	//输出层
	层数据 * HR_conv0;	
	层数据 * HR_conv1;	

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

};

ESRGAN模型::ESRGAN模型()
{
	int size;
	层数据 * 层;

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


	//初始特征提取(输入屋)
	初始化ONE层(特征_conv,3,64,3);


	#define 初始化密集残差块(rdbX) \
	初始化ONE层(rdbX.conv1,64,32,3);\
	初始化ONE层(rdbX.conv2,96,32,3);\
	初始化ONE层(rdbX.conv3,128,32,3);\
	初始化ONE层(rdbX.conv4,160,32,3);\
	初始化ONE层(rdbX.conv5,192,64,3);\


	rb_blocks.个数=23;
	size = sizeof(密集残差组)*rb_blocks.个数;
	rb_blocks.sub=(密集残差组 *)malloc(size);
	密集残差组 * rb0=rb_blocks.sub;
	for(int i=0;iRDB1);
		初始化密集残差块(rb0->RDB2);
		初始化密集残差块(rb0->RDB3);
		rb0++;
	}


	初始化ONE层(LR_conv,64,64,3);
	初始化ONE层(up2x_1.conv,64,64,3);
	初始化ONE层(up2x_2.conv,64,64,3);

	//输出层
	初始化ONE层(HR_conv0,64,64,3);
	初始化ONE层(HR_conv1,64,3,3);

}

该部分结束。

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