纯C++超分辨率重建FSRCNN --改编--(一)数据结构 和 加载数据

前面已经得到FSRCNN的训练数据,现在拿来使用

先上一张图:

为了方便一点,层数据加入 输入 输出维度:

#define 总层数 8

struct 层数据
{
	char 类型[255];
	int 权重长度;
	float *	权重_数据;
	int 偏移长度; 
	float *	偏移_数据;
	int 激活长度;
	float *	激活_数据;
	int 输入维度;
	int 输出维度;
	int 核宽;
};

模型结构:

struct fscrcnn_x3模型
{
	int 层数; //8

	层数据 * 所有层;

	//构造函数
	fscrcnn_x3模型();

};

fscrcnn_x3模型::fscrcnn_x3模型()
{
	层数=总层数; //

	int size;
	size = sizeof(层数据)*层数;//
	所有层=(层数据 *)malloc(size);

	层数据 * 层=所有层;
	for (int k = 0;k<总层数;k++)
	{
		switch(k)
		{
			case 0:
				strcpy(层->类型, "卷积层");
				层->权重长度=56*1*5*5;
				层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
	层->输入维度=1;
	层->输出维度=56;
	层->核宽=5;
				层->偏移长度=56;
				层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
				层->激活长度=56;
				层->激活_数据=(float*)malloc(sizeof(float) * 层->激活长度);
				break;
			case 1:
				strcpy(层->类型, "卷积层");
				层->权重长度=12*56*1*1;
				层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
	层->输入维度=56;
	层->输出维度=12;
	层->核宽=1;
				层->偏移长度=12;
				层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
				层->激活长度=12;
				层->激活_数据=(float*)malloc(sizeof(float) * 层->激活长度);
				break;
			case 2:
			case 3:
			case 4:
			case 5:
				strcpy(层->类型, "卷积层");
				层->权重长度=12*12*3*3;
				层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
	层->输入维度=12;
	层->输出维度=12;
	层->核宽=3;
				层->偏移长度=12;
				层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
				层->激活长度=12;
				层->激活_数据=(float*)malloc(sizeof(float) * 层->激活长度);
				break;
			case 6:
				strcpy(层->类型, "卷积层");
				层->权重长度=56*12*1*1;
				层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
	层->输入维度=12;
	层->输出维度=56;
	层->核宽=1;
				层->偏移长度=56;
				层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
				层->激活长度=56;
				层->激活_数据=(float*)malloc(sizeof(float) * 层->激活长度);
				break;
			case 7:
				strcpy(层->类型, "上采样层");
				层->权重长度=56*1*9*9;
				层->权重_数据=(float*)malloc(sizeof(float) * 层->权重长度);
	层->输入维度=56;
	层->输出维度=1;
	层->核宽=9;
				层->偏移长度=1;
				层->偏移_数据=(float*)malloc(sizeof(float) * 层->偏移长度);
				层->激活长度=0;
				层->激活_数据=NULL;
				break;
		}
		层++;
	}

}

到数据位置加载数据:

void 到数据位置_blobs(std::ifstream &fin)
{
  char  line0[256];       //每次从文件读一行 
  while(!fin.eof())
  {
   fin.getline(line0,255);
   //cout<<line0<<endl;

   //char *strstr(const char *haystack, const char *needle)
	//在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。
   if(strstr(line0, "blobs"))
	   break;
  }
}

bool loadModel(fscrcnn_x3模型 *sr)
{
	char name[]="fscrcnn_caffemodel.txt";
	std::ifstream fin(name);

	//检查文件是否存在
	if (!fin)
	{
		return false;
	}

		cout<<"正在载入‘fscrcnn_x3.txt’的数据"<<endl;


	//从档案载入
	char str[40];
	int len;
	float *	data;


	层数据 * 层=sr->所有层;
	for (int k = 0;k<总层数;k++)
	{
		//cout<<k<<"层"<<endl<<endl;

		//先到数据位置 blobs
		到数据位置_blobs(fin);
		//1。读入权重
		len=层->权重长度;//需要载入的个数
		data=层->权重_数据;
			
		//float tmp;
		for(int i=0;i<len;i++)
		{
			fin >> str;
			fin >> *data++;
		}
		//2。读入偏置
		到数据位置_blobs(fin);
			len=层->偏移长度;//需要载入的个数

			data=层->偏移_数据;

			for(int i=0;i<len;i++)
			{
				fin >> str;
				fin >> *data++;
			}
		//3。读入激活值
			len=层->激活长度;//需要载入的个数
			if(len>0){
				到数据位置_blobs(fin);

				data=层->激活_数据;

				for(int i=0;i<len;i++)
				{
					fin >> str;
					fin >> *data++;
				}
			}else
				printf("载入数据完成\n");


		层++;//到下一层
	}//end


		
	fin.close ();  
	return true;
}

数据加载完成。

猜你喜欢

转载自blog.csdn.net/juebai123/article/details/82152696
今日推荐