欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

纯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;  
					


	                
}

效果图:

纯C++超分辨率重建FSRCNN --改编--(三)主函数fscrcnn原图

纯C++超分辨率重建FSRCNN --改编--(三)主函数fscrcnn重建图

完成

编译程序下载:

win32位编译的 快速超分辨率重建(fscrcnn)程序

地址:

https://download.csdn.net/download/juebai123/10636934

win32位编译的 快速超分辨率重建(fscrcnn)程序,非源代码

上一篇:

下一篇: