//-- 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()); }
/** * ニューラルネットワークを構築 * 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; }
void CFileTreeCtrl::initialise() { loadImageList(); populate(); }