先说明一下,前面的哪些文章中的内存分配用了 new float[Size * sizeof(float)] 这里改成 new float[Size]
即然已经指定的类型,就不用 sizeof(类型),就是说前面的哪些程序浪费了3倍内存。
主函数:
void DRRN(int up_scale)
{
DRRN模型 sr;
// 加载 CNN 模型参数
loadModel(&sr);
//双三次放大
ResizeGrayscaleImage(&jpg,up_scale ) ;
int wid=jpg.getwidth();
int hei=jpg.getheight();
cout<<"输入图像宽度:"<<wid<<endl;
cout<<" 高度:"<<hei<<endl;
卷积层 im_b(wid,hei);//即Y通道
卷积层 U(wid,hei),V(wid,hei);
im_b.data=new float[wid * hei];
U.data=new float[wid * hei];
V.data=new float[wid * hei];
//RGB转换为YUV
RGB2YUV(&jpg,&im_b,&U,&V);
//首单位层结果
卷积层 convfea1(wid,hei,128);
convfea1.data=new float[wid * hei * 128];
//第一部分 首单位层
卷积层 im_b1(wid,hei);//即Y通道
im_b1.data=new float[wid * hei ];
卷积层复制(&im_b,&im_b1);
cout<<"首单位... "<<endl;
vl_BatchNorm(&im_b1,sr.首单位.u,sr.首单位.std);//函数
//save_卷积层2jpg(&im_b1,"cc1");
vl_Scale(&im_b1,sr.首单位.alpha,sr.首单位.beta);//函数
vl_nnrelu(&im_b1);//激励函数
层数据 * 层=sr.首单位.卷积层;
vl_nnconv(&im_b1,&convfea1,层 ,1,1,1,1,1,1);
delete []im_b1.data; im_b1.data=NULL;
//第二部分 9残差块
卷积层 convfea2(wid,hei,128);
convfea2.data=new float[wid * hei * 128];
卷积层 convfea3(wid,hei,128);
convfea3.data=new float[wid * hei * 128];
卷积层 *源,*目标;
源=&convfea2;
目标=&convfea3;
卷积层复制(&convfea1,源);
残差块 * 残差块0=sr.块;
cout<<"9个残差块... 包括 2 组(归一化,缩放平移,卷积)"<<endl;
for (int k = 0;k<sr.残差块数量;k++)
{
cout<<k<<endl;
for(int p=0;p<2;p++){
vl_BatchNorm(源,残差块0->数据[p].u,残差块0->数据[p].std);//函数
vl_Scale(源,残差块0->数据[p].alpha,残差块0->数据[p].beta);//函数
vl_nnrelu(源);
层=残差块0->数据[p].卷积层;
vl_nnconv(源,目标,层 ,1,1,1,1,1,1);
std::swap (源,目标);
}
//求和
卷积层相加(&convfea1,源);//和首层结果相加
//char txt[255];
//sprintf(txt, "cd%d", k);
//save_卷积层2jpg(源,txt);
残差块0++;//到下残差块
}//end
//尾单位层 ---->开始
cout<<"尾单位层... "<<endl;
vl_BatchNorm(源,sr.尾单位.u,sr.尾单位.std);//函数
vl_Scale(源,sr.尾单位.alpha,sr.尾单位.beta);//函数
vl_nnrelu(源);
//save_mat ("dd2.txt",源->data,源->width,源->height,源->depth) ; //保存
delete []convfea1.data; convfea1.data=NULL;
delete []目标->data; 目标->data=NULL;
层=sr.尾单位.卷积层;
// 3倍重建图
卷积层 hR1(wid,hei);
hR1.data=new float[wid * hei ];
vl_nnconv(源,&hR1,层 ,1,1,1,1,1,1);
//尾单位层 <----结束
delete []源->data; 源->data=NULL;
//求和
cout<<"合成结果图像... "<<endl;
卷积层相加(&im_b,&hR1);
delete []im_b.data; im_b.data=NULL;
//save_卷积层2jpg(&hR1,"hR1");
YUV2RGB(&hR1,&U,& V,&jpg);
char txt[255];
sprintf(txt, "DRRN %d 倍重建", up_scale);
savejpg(&jpg,txt);//完成图
}
效果图:
原图三倍重建图
运行很慢,128通道数是太多了,
清晰度还可以,但是非常生硬,毕竟是所有残差块只用一套卷积核,
就好象切西瓜,削苹果,削菠萝,都用一把刀,总是勉强了一点。
结束。