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

先说明一下,前面的哪些文章中的内存分配用了  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通道数是太多了,

清晰度还可以,但是非常生硬,毕竟是所有残差块只用一套卷积核,

就好象切西瓜,削苹果,削菠萝,都用一把刀,总是勉强了一点。

结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值