流程图:
主函数就按上图走:
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中导出的中间层数据,用于比对。
效果:
下载:
https://download.csdn.net/download/juebai123/10977770