32位C++改编 对抗(SRGAN)之生成(generator)超分辨重建 ---(二)主函数

本文详细介绍SRResNet模型的实现过程,从加载CNN模型参数到图像预处理,再到通过多个残差块进行特征提取,最后通过上采样层生成高分辨率图像。文章深入解析了每一层的具体操作和参数设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先展示主函数,和前面的那些程序有不同之地方到后面的文章中再说明:

void SRResNet(int up_scale)
{
	generator_tf模型 sr;
	// 加载 CNN 模型参数
	loadModel(&sr);

	int wid=jpg.getwidth();
	int hei=jpg.getheight();
		cout<<"输入图像宽度:"<<wid<<endl;
		cout<<"        高度:"<<hei<<endl;
//
	卷积层 rgb(wid,hei,3);//即rgb通道
	rgb.data=new float[wid * hei *3]; 

	//jpg转换为RGB卷积层
	jpg2RGB(&jpg,&rgb);
	//save_卷积层2jpg(&rgb,"rgb");
			

	卷积层 bgr(wid,hei,3);//即rgb通道
	bgr.data=new float[wid * hei *3]; 
	RGB2BGR(&rgb,&bgr);

		del卷积层(rgb);

	//------------------------------------->
	//卷积层 png= loadpng2卷积层("6bpng.png");
	//卷积层复制(&png,&bgr);
	//save_卷积层2txt ("rgb.txt",&png);  //保存
	//-------------------------------------<

//	 save_卷积层2txt ("bgr.txt",&bgr);  //保存
//load_mat2卷积层 ("gen_inputs_3fen.txt",&bgr);  //载入tf中的中间层数据

	//输入层结果
	卷积层 convfea1(wid,hei,64);
	convfea1.data=new float[wid * hei * 64 ]; 







	//第一部分 输入层

	层数据 * 层=sr.输入层->卷积层;

	    

		        
					cout<<"生成64个特征图..."<<endl;
		            
		            
						
						vl_nnconv(&bgr,&convfea1,层 ,1,1,4,4,4,4);
						

						vl_nnrelu(&convfea1, sr.输入层->Prelu_alpha);//激励函数Prelu
					
						//save_卷积层2jpg(&convfea1,"con0");

	    
	    
	    
//load_mat2卷积层 ("stage1_output.txt",&convfea1);  //载入tf中的数据

								del卷积层(bgr);



	//第二部分  16残差层
	卷积层 convfea2(wid,hei,64);
	convfea2.data=new float[wid * hei * 64 ]; 
	卷积层 convfea3(wid,hei,64);
	convfea3.data=new float[wid * hei * 64 ]; 
	卷积层 convfea4(wid,hei,64);
	convfea4.data=new float[wid * hei * 64 ];

	卷积层 *源,*目标,*源备份;

	源=&convfea2;
	目标=&convfea3;
	源备份=&convfea4;
	卷积层复制(&convfea1,源);


	//2。16个残差块
	残差块 * 残差块0=sr.块;
	cout<<"16个残差块... 包括 2 组(卷积,归一化,缩放平移)"<<endl;

	for (int k = 0;k<sr.残差块数量;k++)
	{
		cout<<k<<endl;
		//备份
		卷积层复制(源,源备份);

		for(int p=0;p<2;p++){
		//第一部分
			层=残差块0->数据[p].卷积层;
						
			vl_nnconv(源,目标,层 ,1,1,1,1,1,1);
		
			//save_卷积层2jpg(目标,"cc0");

		//第二部分 BatchNorm

			//if(	残差块0->数据[p].有无BatchNorm_beta==true)
			//{
				tf_BatchNorm(目标,残差块0->数据[p].u,残差块0->数据[p].std,残差块0->数据[p].BatchNorm_beta);
				//save_卷积层2jpg(目标,"cc1");


			//}
			if(p==0)
			//if(	残差块0->数据[p].有无Prelu==true)
				vl_nnrelu(目标,残差块0->数据[p].Prelu_alpha);

							//save_卷积层2jpg(目标,"cc2");
				std::swap (源,目标);
		}
		//save_卷积层2jpg(源,"a0");
		//save_卷积层2txt ("a0.txt",源);  //保存

		//求和
        卷积层相加(源备份,源);
		//save_卷积层2jpg(源,"a1");
							//char txt[255];
							//sprintf(txt, "ca%d", k);  
							//save_卷积层2jpg(目标,txt);
		

		残差块0++;//到下残差块
	}//end

	//	基本单位 残差输出层; 
	  //残差输出层--->开始
	cout<<"残差完成输出层... "<<endl;
		//第一部分
			层=sr.残差输出层.卷积层;
			vl_nnconv(源,目标,层 ,1,1,1,1,1,1);

		//save_卷积层2jpg(目标,"o0");
		//第二部分
			//if(	sr.残差输出层.有无BatchNorm_beta==true)
			//{
	//load_mat2卷积层 ("resblock_output_batchnorm.txt",目标);  
							//save_卷积层2jpg(目标,"roa_");

				tf_BatchNorm(目标,sr.残差输出层.u,sr.残差输出层.std,sr.残差输出层.BatchNorm_beta);


							//save_卷积层2jpg(目标,"rob_");

			//}
			//sum17 与输入层相加
			卷积层相加(&convfea1,目标);
		std::swap (源,目标);
		//残差输出层  <----结束

		del卷积层(convfea1);
		del卷积层(*目标);
		del卷积层(*源备份);

	//后3层
	基本单位 *后=sr.后3层;

		卷积层 中间2倍(wid*2,hei*2,64);
		卷积层 中间4倍(wid*4,hei*4,64);
	// 3倍重建图
	卷积层 hR1(wid*4,hei*4,3);

				卷积层 temp0(wid,hei,256);
				卷积层 temp1(wid*2,hei*2,256);

	for (int k = 0;k<3;k++)
	{
		层=后->卷积层;

		switch(k)
		{
			case 0:
					
				cout<<"第一像数组合放大层(2倍)... "<<endl;

				temp0.data=new float[wid * hei * 256 ];
				vl_nnconv(源,&temp0,层 ,1,1,1,1,1,1);


				//save_卷积层2jpg(&temp0,"t");

		del卷积层(*源);

				//放大排列
				中间2倍.data=new float[wid * hei *4*64 ];

				放大排列256_64(&temp0,&中间2倍);
				//放大排列2(&temp0,&中间2倍);//
				delete []temp0.data;  temp0.data=NULL;  

				//if(sr.后3层->有无Prelu==true)
					vl_nnrelu(&中间2倍,后->Prelu_alpha);

				//save_卷积层2jpg(&中间2倍,"h2");

				break;
			case 1:
				cout<<"第二像数组合放大层(2倍)... "<<endl;
				temp1.data=new float[wid * hei *4* 256 ];
				vl_nnconv(&中间2倍,&temp1,层 ,1,1,1,1,1,1);

						del卷积层(中间2倍);


				//放大排列
				中间4倍.data=new float[wid * hei *16*64 ];

				

				放大排列256_64(&temp1,&中间4倍);
				//delete []temp1.data;  temp1.data=NULL;  
				del卷积层(temp1);
								
	//load_mat2卷积层 ("subpixelconv_stage2_prelu_tf.txt",&中间4倍); 


					vl_nnrelu(&中间4倍,后->Prelu_alpha);

				//save_卷积层2jpg(&中间4倍,"h4");
//load_mat2卷积层 ("subpixelconv_stage2_out.txt",&中间4倍); 
				break;
			case 2:
				cout<<"合成结果图像... "<<endl;
				hR1.data=new float[wid * hei * 16*3 ]; 

				vl_nnconv(&中间4倍,&hR1,层 ,1,1,4,4,4,4);

				//delete []中间4倍.data;  中间4倍.data=NULL;  
								del卷积层(中间4倍);

				//save_卷积层2jpg(&hR1,"hR1");

				//save_卷积层2txt ("hR1.txt",&hR1);  //保存
				break;

		}


		后++;
	}
	//save_卷积层2txt ("hR1.txt",&hR1) ;
	cout<<"图像转换成jpg格式... "<<endl;

//load_mat2卷积层 ("output_stage.txt",&hR1); 

	//卷积层 bgr2(wid*4,hei*4,3);//即rgb通道
	//bgr2.data=new float[wid * hei * 16*3 ]; 
	//RGB2BGR(&hR1,&bgr2);
	RGB2BGR(hR1) ;//R<--互换-->B


	RGB2jpg(&hR1,&jpg);
			//delete []hR1.data;  hR1.data=NULL;  
			del卷积层(hR1);
									//del卷积层(bgr2);

	cout<<"保存为'SRResNet 4倍重建.jpg'文件... "<<endl;
	savejpg(&jpg,"SRResNet 4倍重建");
	                
}

其中注掉的代码基本上是调试用的

load_mat2卷积层  导入的数据是 前面文章中说的 从SRGAN-tensorflow-master 导出的中间层数据

这样可以从后面向前测试出错的地点。

先这样吧

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值