Exemplo n.º 1
0
//-- Load an image list file but only return camera image names
static bool loadImageList( std::vector<std::string> & vec_camImageName,
                           const std::string & sListFileName,
                           bool bVerbose = true )
{
  vec_camImageName.clear();
  std::vector<openMVG::SfMIO::CameraInfo> vec_camImageIntrinsicInfo;
  std::vector<openMVG::SfMIO::IntrinsicCameraInfo> vec_focalGroup;
  if (loadImageList( vec_camImageIntrinsicInfo,
                      vec_focalGroup,
                      sListFileName,
                      bVerbose) )
  {
    for ( std::vector<openMVG::SfMIO::CameraInfo>::const_iterator
      iter_camInfo = vec_camImageIntrinsicInfo.begin();
      iter_camInfo != vec_camImageIntrinsicInfo.end();
      iter_camInfo++ )
    {
      vec_camImageName.push_back( iter_camInfo->m_sImageName );
    }
  }
  return (!vec_camImageName.empty());
}
Exemplo n.º 2
0
/**
 * ニューラルネットワークを構築
 * const char * network:ネットワークのファイルパス
 * const char * image:学習イメージデータのファイルパス
 * int data:学習するデータタイプ(imageを読み込むならば0)
 */
int createNeuralNetworkPP(const char * network, const char * image, int data) {
	int i, j;
	int in, out; //入力層のユニット数,出力層のユニット数
	/*入出力に必要なユニット数を計算*/
	if (data == 0 && strcmp(image, "\0") != 0) {
		/*トレーニングデータの読み込み*/
		if (loadImageList(image, &image_list) < 0) {
			printf("ERROR:Not loaded %s file.\n", image);
			return -1;
		}
		in = image_list.height * image_list.width * image_list.channel;
		out = image_list.labelNum;
		/*一度のパターン数*/
		if (image_list.imageNum < array_size) {
			input.pattern = image_list.imageNum;
		} else {
			input.pattern = array_size;
		}
	} else if (data == 1) {
		in = 784;
		out = 10;
		image_list.height = 28;
		image_list.width = 28;
		image_list.channel = 1;
		/*一度のパターン数*/
		if (NUM_IMAGES < array_size) {
			input.pattern = NUM_IMAGES;
		} else {
			input.pattern = array_size;
		}
	} else if (1 < data && data < 6) {
		in = 2;
		out = 1;
		input.pattern = 4;
	} else {
		printf("ERROR:Input data.\n");
		return -1;
	}

	/*ネットワークを構築*/
	if (strcmp(network, "\0") != 0) {
		/*保存データからニューラルネットワークを復元*/
		printf("->Loading Neural Network\n");
		if (neuralNetworkLoader(network, &numLayer, &dropout, &input, &hidden, &output) < 0) {
			printf("ERROR:Not loaded %s file.\n", network);
			return -1;
		}
		/*学習データとニューロン数の比較*/
		if (input.num != in || output.num != out) {
			printf("ERROR:Not loaded %s file.\n", network);
			return -1;
		}
	} else {
		/*新規にネットワークを構築*/
		input.dropRate = dropRate_in;
		input.num = in;
		output.num = out;

		/*新規に生成するニューロンのパラメータを手入力*/
		int ch;
		int units[numLayer - 2];
		int buff_max = C_LENGTH; //入力時に保持する文字数
		char str[C_LENGTH] = "\0"; //入力値を格納
		/*中間層のニューロン数を入力*/
		for (i = 0; i < (numLayer - 2); i++) {
			j = 0;
			printf("Input number neuron in hidden layer\n");
			fflush(0);
			while ((ch = getchar()) != EOF) {
				if (ch == '\n') {
					/*入力値を判断*/
					if (CharToInteger(str, &units[i]) < 0) {
						j = 0;
					} else if (CharToInteger(str, &units[i]) > 0 && units[i] > 0) {
						break;
					} else {
						j = 0;
					}
				} else {
					str[j] = ch;
					str[j + 1] = '\0';
					j++;
				}
				fflush(0);
				if (j + 1 >= buff_max) {
					printf("input char is over for input limit\n");
					j = 0;
					ch = '\0';
				}
			}
		}
		/*中間層レイヤーのメモリを確保*/
		hidden = (Layer *) malloc(sizeof(Layer) * (numLayer - 2));
		/*中間層の初期化*/
		for (i = 0; i < (numLayer - 2); i++) {
			hidden[i].num = units[i];
			if (i > 0) {
				init_Layer(hidden[i - 1].num, &hidden[i]);
			} else {
				init_Layer(input.num, &hidden[i]);
			}
			hidden[i].dropRate = dropRate_hid;
			hidden[i].act = 2;
		}

		/*出力層の初期化*/
		printf("output:%d\n", output.num);
		init_Layer(hidden[numLayer - 3].num, &output);
		output.dropRate = 1.0;

		/*出力層の活性化関数を選択*/
		i = 0;
		printf("Select of activation function in output layer.\n");
		printf("logistic sigmoid function to 1,tanh to 2,softmax to 3,identity to 4\n");
		fflush(0);
		while ((ch = getchar()) != EOF) {
			if (ch == '\n') {
				/*入力値を判断*/
				if (CharToInteger(str, &output.act) < 0) {
					i = 0;
				} else if (CharToInteger(str, &output.act) > 0 && 0 < output.act && output.act < 5) {
					break;
				} else {
					i = 0;
				}
			} else {
				str[i] = ch;
				str[i + 1] = '\0';
				i++;
			}
			fflush(0);
			if (i + 1 >= buff_max) {
				printf("input char is over for input limit\n");
				i = 0;
				ch = '\0';
			}
		}
	}

	/*トレーニングデータを用意*/
	x = (double *) malloc(sizeof(double) * input.pattern * input.num);
	d = (double *) malloc(sizeof(double) * input.pattern * output.num);
	printf("--Train Data--\n");
	if (data == 0) {
		inputToImageData(&image_list, 0, input.pattern, x, d);
	} else if (data == 1) {
		/*MNISTの手書き数字のデータセット*/
		DataSetTrainMNIST(input.pattern, x, d);
		writeDataSetNum(28, 28, 1, input.pattern, input.num, output.num, x, d);
	} else if (data == 2) {
		//論理演算ORのデータセット
		DataSetLogicalOperation(1, x, d);
		writeDataSet(input.pattern, input.num, output.num, x, d);
	} else if (data == 3) {
		//論理演算ANDのデータセット
		DataSetLogicalOperation(2, x, d);
		writeDataSet(input.pattern, input.num, output.num, x, d);
	} else if (data == 4) {
		//論理演算XORのデータセット
		DataSetLogicalOperation(3, x, d);
		writeDataSet(input.pattern, input.num, output.num, x, d);
	} else if (data == 5) {
		//論理演算NANDのデータセット
		DataSetLogicalOperation(4, x, d);
		writeDataSet(input.pattern, input.num, output.num, x, d);
	} else {
		printf("使用するデータを正しく選択してください\n");
		return -1;
	}
	printf("--Train Data--\n");
	printf("\n");

	/*入力層を初期化*/
	init_Input(output.num, &input);
	setInput(output.num, &input, x, d);
	/*終了処理*/
	data_type = data;
	state = 1;
	free(x);
	free(d);
	return 1;
}
Exemplo n.º 3
0
void CFileTreeCtrl::initialise()
{
    loadImageList();

    populate();
}