纯C++超分辨率重建SRCNN --改编--(三)第二层卷积

第二层卷积:

	cout<<"第二层卷积..."<<endl;
	// 第二层卷积:卷积核尺寸1×1(f2×f2),卷积核数目32(n2),输出32张特征图;
	vector <卷积矩阵> conv2_data;//[32];//结果

	for (int i = 0;i<32 ;i++)
	{
		卷积矩阵 conv2(wid,hei);
	 	for (int j = 0 ;j<64;j++)
		{
			//conv2_data(:,:,i) = conv2_data(:,:,i) + weights_conv2(j,:,i) * conv1_data(:,:,j);
			第二层运算(&conv2,&sr,&conv1_data[j],i,j);
		}//end
		//conv2_data(:,:,i) = max(conv2_data(:,:,i) + biases_conv2(i), 0);
		加上偏移(&conv2,sr.偏移_conv2_数据,i);
		conv2_data.push_back(conv2);

		//保存32张特征图
		im_tt=卷积矩阵2im(&conv2);
		sprintf(txt, "conv2_data_0%d.jpg", i);   
		saveimage(txt,	&im_tt);
		cout<<i<<endl;
	}//end

这个卷积核是1x1,所以不用卷积函数,用第二层运算代替:

//conv2_data(:,:,i) = conv2_data(:,:,i) + weights_conv2(j,:,i) * conv1_data(:,:,j);
bool 第二层运算(卷积矩阵 *conv2,SCREEN模型 *sr,卷积矩阵 *conv1_data, int num1,int num2)//32   64
{
	// 第二层卷积:卷积核尺寸1×1(f2×f2),卷积核数目32(n2),输出32张特征图;
	int w=conv2->width;
	int h=conv2->height;

	//float* r2=conv2->data;
	//float* r1=conv1_data;
	float weirht=sr->权重_conv2_数据[num1*sr->权重_conv2_长度+num2];
	//cout<<"权重:"<<weirht<<"-"<<num1<<endl;

	for(int i=0;i<w*h;i++)
	{
		
		conv2->data[i]+=conv1_data->data[i]*weirht;
		//r1++;//r2++;

	}

	return true;
}

再加上偏移:

bool 加上偏移(卷积矩阵 *res,float* biases ,int num)
{
			
	//	conv1_data(:,:,i) = max(conv1_data(:,:,i) + biases_conv1(i), 0);


	float*b=biases;
	b+=num;
cout<<*b<<"-"<<num<<endl;
	float temp;
	for(int i=0;i<res->width*res->height;i++)
	{
		temp=(res->data[i]) + (*b); 
		res->data[i]=(temp>0)?temp:0;

	}
	return true;
}

32张特征图:


从这里可以看到有的已经比原图更清了,拿一张出来和原图比一下:


第二层完成。


猜你喜欢

转载自blog.csdn.net/juebai123/article/details/80566128