本来还想实现下 AdaIN 风格转换中的`-preserveColor`选项(保留内容图像的颜色)
但是一看 coral 函数太复杂,吓倒我了,以后再说吧。
看到《ESRGAN-master》有两个测试模型下载:"RRDB_ESRGAN_x4.pth","RRDB_PSNR_x4.pth",试试这个吧。
ESRGAN(增强型SRGAN)(增强型超分辨率生成对抗网络)
在[PIRM2018-SR竞赛](区域3)中获得了第一名并获得了最佳感知指数。
先测试下效果:
两者相比,各有特色。
然后导出生成网络的训练数据,是一个167M的文本文件,比 DBPN的154M大了一点,是一个更深的网络
定义密集残差块和组:
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);
}
该部分结束。