32位C++改编 风格转移(style)之应用(生成) ---(二)主函数

主要处理部分:

void style(char * savefilename,Transformation_tf模型 & sr)
{

//载入模型已经放到main中去了

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

	RGB2BGR(rgb) ;


	//load_mat2卷积层 ("image.txt",&rgb);  //载入tf导出的数据

	//伸缩零头:使宽,高保证为4的倍数而设,即 宽(高)除4的余数 + x0(y0) = 4
	int x0=0, y0=0;

	//加边(四边各加上10个像数宽的边)
	伸缩边(rgb, x0, y0);
	wid=rgb.width;
	hei=rgb.height;



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


	// 输入层

	层数据 * 层=sr.输入层;

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

						

						vl_nnrelu(&convfea1);//激励函数Prelu
	//load_mat2卷积层 ("conv1.txt",&convfea1);  //载入tf导出的数据

						//save_卷积层2jpg(&convfea1,"con1");
	// 下采样层1
	wid=wid/2;hei=hei/2;
	卷积层 convfea2(wid,hei,64);
	convfea2.data=new float[wid * hei * 64 ]; 

	层=sr.下采样层1;

		        
					cout<<"扩维成64个特征图..."<<endl;
		            
		            
						
						vl_nnconv(&convfea1,&convfea2,层 ,2,2,1,1,1,1);
						vl_Norm(&convfea2);

						vl_nnrelu(&convfea2);//激励函数Prelu

	//load_mat2卷积层 ("conv2.txt",&convfea2);  //载入tf导出的数据
					
						//save_卷积层2jpg(&convfea2,"con2");
	// 下采样层2
	wid=wid/2;hei=hei/2;
	卷积层 convfea3(wid,hei,128);
	convfea3.data=new float[wid * hei * 128 ]; 
	层=sr.下采样层2;

		        
					cout<<"扩维成128个特征图..."<<endl;
		            
		            
						
						vl_nnconv(&convfea2,&convfea3,层 ,2,2,1,1,1,1);
						vl_Norm(&convfea3);

						vl_nnrelu(&convfea3);//激励函数Prelu

	//load_mat2卷积层 ("conv3.txt",&convfea3);  //载入tf导出的数据
						//save_卷积层2jpg(&convfea3,"con3");

	    
	    

	//  5残差层
	卷积层 convfea4(wid,hei,128);
	convfea4.data=new float[wid * hei * 128 ]; 
	卷积层 convfea5(wid,hei,128);
	convfea5.data=new float[wid * hei * 128 ]; 

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


	源=&convfea3;
	目标=&convfea4;
	源备份=&convfea5;


	残差块 * 残差块0=sr.块;
	cout<<"5个残差块... 包括 2 组卷积"<<endl;

	for (int k = 0;k<sr.残差块数量;k++)
	{
		cout<<"\r"<<k;

		//if(k==1)
		//	load_mat2卷积层 ("res1.txt",源);
		//	//load_mat2卷积层 ("res2.txt",源);
		//	//load_mat2卷积层 ("res3.txt",源);
		//	//load_mat2卷积层 ("res4.txt",源);
		//if(k==2)

		//	save_卷积层2txt ("res2-me.txt",源);  //保存
		//

		//备份
		卷积层复制(源,源备份);


		层=残差块0->卷积层;

						
		vl_nnconv(源,目标,层 ,1,1,1,1,1,1);
		vl_nnrelu(目标);
		//save_卷积层2jpg(目标,"cc0");
				
		//像素扩展(*目标);


		层++;
		vl_nnconv(目标,源,层 ,1,1,1,1,1,1);
		//save_卷积层2jpg(目标,"cc2");

	//	//求和
        卷积层相加(源备份,源);
		//save_卷积层2jpg(源,"a0");
		//save_卷积层2txt ("a0.txt",源);  //保存
		//save_卷积层2txt ("a1.txt",源备份);  //保存


		残差块0++;//到下残差块
	}
	cout<<endl;

	del卷积层(*源备份);
	del卷积层(*目标);
//load_mat2卷积层 ("res5.txt",源);  //载入tf保存
		//save_卷积层2jpg(源,"residual");


	层=sr.上采样层1;

		        
					cout<<"减维成64个特征图..."<<endl;
		            
		            
						
						resize_conv2d(*源,convfea2,层);

							del卷积层(*源);

						vl_Norm(&convfea2);
						vl_nnrelu(&convfea2);//激励函数Prelu
//load_mat2卷积层 ("deconv1.txt",&convfea2);  //载入tf保存
								//save_卷积层2jpg(&convfea2,"cot1");

	层=sr.上采样层2;

		        
					cout<<"减维成32个特征图..."<<endl;
		            
		            
						
						resize_conv2d(convfea2,convfea1,层);

							del卷积层(convfea2);
						vl_Norm(&convfea1);

						vl_nnrelu(&convfea1);//激励函数Prelu
//load_mat2卷积层 ("deconv2.txt",&convfea1);  //载入tf保存
								//save_卷积层2jpg(&convfea1,"cot2");
	层=sr.输出层;

		        
					cout<<"减维成3个通道图..."<<endl;
		            
		            
						
						vl_nnconv(&convfea1,&rgb,层 ,1,1,4,4,4,4);
							del卷积层(convfea1);
						vl_Norm(&rgb);

						vl_tanh(&rgb);//激励函数Prelu
	
//load_mat2卷积层 ("deconv3.txt",&rgb);  //保存
		//save_卷积层2txt ("rgb.txt",&rgb) ;
								save_卷积层2jpg(&rgb,"out");




	cout<<"图像转换成jpg格式... "<<endl;

	//减边(还原前面的加边)
	伸缩边(rgb, x0, y0,false); 

	RGB2BGR(rgb) ;

	RGB2jpg(&rgb,&jpg);

	// 保存转换后的图像               
	savejpg(&jpg,savefilename);
}

其中一些新增的函数到后面详细说明

这里完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值