纯C++超分辨率重建FSRCNN --改编--(三)主函数fscrcnn
程序员文章站
2023-12-30 19:40:58
...
主函数fscrcnn
void fscrcnn(int up_scale)
{
fscrcnn_x3模型 sr;
// 加载 CNN 模型参数
loadModel(&sr);
//cout<<"loadModel成功"<<endl;
int wid=jpg.getwidth();
int hei=jpg.getheight();
cout<<"输入图像宽度:"<<wid<<endl;
cout<<" 高度:"<<hei<<endl;
卷积层 im_b(wid,hei);//即Y通道
im_b.data=new float[wid * hei * sizeof(float)];
卷积层 U(wid,hei),V(wid,hei);
U.data=new float[wid * hei * sizeof(float)];
V.data=new float[wid * hei * sizeof(float)];
//RGB转换为YUV
RGB2YUV(&jpg,&im_b,&U,&V);
//U,V暂时无用,先删除占用内存
delete []U.data; U.data=NULL;
delete []V.data; V.data=NULL;
//loadImlow(&im_b);//载入matlab导出的数据用于比较
//save_mat ("im_bis.txt",im_b.data,im_b.width,im_b.height,im_b.depth); //保存
//总层数
int l=总层数;//
cout<<"共有:"<<l<<"层"<<endl;
//中间过程
卷积层 convfea1(wid,hei,56);
convfea1.data=new float[wid * hei * 56 * sizeof(float)];
卷积层 convfea2(wid,hei,12);
convfea2.data=new float[wid * hei * 12 * sizeof(float)];
卷积层 convfea3(wid,hei,12);
convfea3.data=new float[wid * hei * 12 * sizeof(float)];
卷积层 *源=&im_b, *目标=&convfea1;
// 3倍重建图
卷积层 hR1(wid*3,hei*3);
hR1.data=new float[wid * hei * 9 * sizeof(float)];
int 前部=0;
float *weight, *bias;
//save_矩阵 ("im_b.txt",im_b.data,im_b.width,im_b.height,im_b.depth); //保存
层数据 * 层=sr.所有层;
//循环各层直至结束
for (int i=0;i<l;i++ )//8 25层
{
cout<<"第 "<<i<<" 层"<<endl;
if (strstr(层->类型, "卷积层"))//strTong(net.layers(i).type,'dagnn.Conv')
{
//返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
//j=j+1
cout<<"卷积..."<<endl;
//得到权重(也就是卷积核)和偏移
weight=层->权重_数据;
bias=层->偏移_数据;
if (i==0) //strTong(net.layers(i).inputs{1},'LR') //第一层
{
//convfea = vl_nnconv(im_b,weight,bias,'Pad',1);//一图得出64特征图
vl_nnconv(&im_b,目标,层,1 ,1 , 2 ,2 ,2 ,2 );
vl_nnrelu(目标, 层->**_数据);//'leak',
//save_卷积层2jpg(目标,"con0");
源=目标;
目标=&convfea2;
}
else //一以后
{
if (层->权重长度==672) //strBao(net.layers(i).outputs{:}, 'residual')
{
//residual_num=residual_num+1;
if (前部==0){
cout<<"降维..."<<endl;
}else{
cout<<"扩维..."<<endl;
目标= & convfea1;
}
vl_nnconv(源,目标,层);
vl_nnrelu(目标, 层->**_数据);//'leak',
//char txt[255];
//sprintf(txt, "第%d残差", residual_num);
//save_卷积层2jpg(目标,txt);
//sprintf(txt, "第%d残差前", residual_num);
//save_卷积层2jpg(源,txt);
源= 目标;
if (前部==0){
//cout<<"降维..."<<endl;
目标= & convfea3;
}else{
//cout<<"扩维..."<<endl;
目标= & convfea1;
}
前部++;
}
else
{
//中间层 12特征图合成1图 再重新生成深一层12特征图
//convfea = vl_nnconv(convfea,weight,bias,'Pad',1);
vl_nnconv(源,目标,层,1 ,1 , 1 ,1 ,1 ,1 );
vl_nnrelu(目标, 层->**_数据);//'leak',
//char txt[255];
//sprintf(txt, "con%d", i);
//save_卷积层2jpg(目标,txt);
std::swap(源,目标);
}
//end
}//end
}//end
if (strstr(层->类型, "上采样层"))//strTong(net.layers(i).type,'dagnn.Conv')
{
cout<<"反卷积..."<<endl;
weight=层->权重_数据;
bias=层->偏移_数据;
//目标= & hR1;
vl_nnconvt(源,&hR1,层,3,3, 4 ,4,4,4) ;//放大
//char txt[255];
//sprintf(txt, "残差放大%d", i);
//save_卷积层2jpg(目标,txt);
}
层++;
}//end
//到这里可以删除
delete []目标->data; 目标->data=NULL;
delete []源 ->data; 源 ->data=NULL;
//色彩放大(3倍)
ResizeGrayscaleImage(&jpg,3) ;
//卷积层 U(wid,hei),V(wid,hei);
U.height=V.height=hei*3;
U.width =V.width =wid*3;
U.data=new float[wid * hei *9* sizeof(float)];
V.data=new float[wid * hei *9* sizeof(float)];
//RGB转换为YUV
RGB2YUV(&jpg,&U,&V);
//合成色彩重建图
IMAGE im_h(U.width,U.height);
YUV2RGB(&hR1,&U,&V, &im_h);
//保存图像
saveimage(L"fscrcnn 3倍 重建.jpg", &im_h);
//U,V暂时无用,先删除占用内存
delete []U.data; U.data=NULL;
}
效果图:
原图
重建图
完成
编译程序下载:
win32位编译的 快速超分辨率重建(fscrcnn)程序
地址:
https://download.csdn.net/download/juebai123/10636934
win32位编译的 快速超分辨率重建(fscrcnn)程序,非源代码