#include <stdio.h> #include "fie.h" // FIE関数の異常終了時に処理終了するためのマクロ定義 #define ERROR_CHECK(expr) if ((err = (expr)) != F_ERR_NONE) { printf("err: %d, line: %d\n", err, __LINE__); goto exit; } #define ASSERT(expr) if (!(expr)) { err = F_ERR_UNKNOWN; printf("assertfail at line: %d\n", __LINE__); goto exit; } // 特徴ベクトルの次元数 #define FEATURE_DIM 2 // 乱数により生成する教師データ数 // 識別精度の向上のため、教師データ数は十分に多く用意してください。 #define NUM_TRAIN_DATA 100 // -- 内部関数 -- // 教師データを乱数とXOR演算により生成し、機械学習モデルを訓練する。 // 機械学習オブジェクトを返す。 static FHANDLE generate_xor_dataset_and_train(INT num_train_data) { // 教師データオブジェクト FHANDLE hml_sample = NULL; // 機械学習オブジェクト FHANDLE hml = NULL; // 擬似乱数用デスクリプタ F_RANDDESC rnd; INT i; INT err = F_ERR_UNKNOWN; // -- 教師データオブジェクト作成 -- // サンプルのため、教師データは疑似乱数により生成する。 // 教師データの特徴ベクトルは2次元とする。 // 2次元とも符号が等しければラベルは0、そうでなければラベルは1とする。 // 疑似乱数初期化 fnFIE_mtrand_init(1, &rnd); hml_sample = fnFIE_ml_sample_alloc(FEATURE_DIM); ASSERT(hml_sample != NULL); for (i = 0; i < num_train_data; i++) { // 平均0.0の乱数により教師データ生成 DOUBLE data[] = { fnFIE_mtrand_gauss(&rnd), fnFIE_mtrand_gauss(&rnd), }; // 符号のXORによりラベルを生成 INT label = (data[0] > 0) ^ (data[1] > 0); // 教師データ追加 ERROR_CHECK(fnFIE_ml_sample_add_data(hml_sample, data, label)); } // -- 機械学習モデルの訓練 -- { // ここでは決定木を使用する INT max_depth = 12; INT min_sample = 4; INT k_fold = 1; INT pruning_type = F_ML_DTREE_NO_PRUNING; INT var_type = F_ML_SAMPLE_NUMERICAL; INT preprocess = 0; INT time = 0; hml = fnFIE_ml_do_train_dtree( hml_sample, max_depth, min_sample, k_fold, pruning_type, var_type, preprocess, time, NULL); ASSERT(hml != NULL); } // note: 一般に機械学習の訓練には多くの処理時間を要します。 // アプリの実行の度に訓練を行わないようにするには、下記の手順を実施してください。 // 1. fnFIE_ml_get_train_data() 関数を用いて学習結果をバイナリデータとして出力する。 // 2. そのバイナリデータをファイルに保存する。 // 3. アプリの実行時に、保存したバイナリデータを読み込み、 // fnFIE_ml_restore_train_data() 関数で機械学習オブジェクトを復元する。 err = F_ERR_NONE; exit: // 各種解放 fnFIE_free_object(hml_sample); if (err == F_ERR_NONE) { return hml; } else { fnFIE_free_object(hml); return NULL; } } // -- サンプル本体 -- // 機械学習のサンプル。 // 疑似乱数で生成した教師データによる機械学習モデルの訓練と、訓練したモデルを用いた識別を行う。 static INT do_train_and_predict_xor_data() { // テスト用データ DOUBLE test_data[][FEATURE_DIM] = { {+1, -1}, {+1, +1}, {-1, +1}, {-1, -1} }; // 上記テスト用データに対応するクラスラベル INT expected_test_labels[] = { 1, 0, 1, 0 }; // 機械学習オブジェクト FHANDLE hml = NULL; INT i; INT err; // -- 機械学習モデルの訓練 -- hml = generate_xor_dataset_and_train(NUM_TRAIN_DATA); // -- テスト実施 -- for (i = 0; i < sizeof(test_data) / sizeof(test_data[0]); i++) { // テスト用画像のラベル(識別結果) INT response_label; // データの識別 ERROR_CHECK(fnFIE_ml_predict(hml, test_data[i], &response_label)); // 識別結果表示 printf("data: (%.1f, %.1f), predict: %d, success: %s\n", test_data[i][0], test_data[i][1], response_label, response_label == expected_test_labels[i] ? "Yes" : "No"); } exit: // 解放 fnFIE_free_object(hml); return err; } INT main() { INT err; // FIEライブラリのセットアップ fnFIE_setup(); // 機械学習の実施 err = do_train_and_predict_xor_data(); // ライブラリの終了処理 fnFIE_teardown(); return err; }
data: (1.0, -1.0), predict: 1, success: Yes data: (1.0, 1.0), predict: 0, success: Yes data: (-1.0, 1.0), predict: 1, success: Yes data: (-1.0, -1.0), predict: 0, success: Yes
#include <stdio.h> #include "fie.h" // FIE関数の異常終了時に処理終了するためのマクロ定義 #define ERROR_CHECK(expr) if ((err = (expr)) != F_ERR_NONE) { printf("err: %d, line: %d\n", err, __LINE__); goto exit; } #define ASSERT(expr) if (!(expr)) { err = F_ERR_UNKNOWN; printf("assertfail at line: %d\n", __LINE__); goto exit; } // ラベル0は赤色を、ラベル1は赤色以外を表す #define LABEL_RED 0 #define LABEL_NON_RED 1 // -- 内部関数 -- // カラー画像ファイル名リスト train_img_fnames とクラスラベルのリスト train_labelsを受け取り、 // カラー分類用機械学習モデルを訓練する。 // 赤色と赤色以外の2クラス分類とする。 // 機械学習オブジェクトを返す。 // 色を抽出する領域はマスクを表すリージョン hmask にて指定する。 static FHANDLE load_imgs_and_train( const CHAR** train_img_fnames, INT* train_labels, INT num_train_data, const FHANDLE hmask) { // 画像 FHANDLE himg = NULL; // 教師データオブジェクト FHANDLE hml_sample = NULL; // 機械学習オブジェクト FHANDLE hml = NULL; INT i; INT err = F_ERR_UNKNOWN; // -- 教師データオブジェクト作成 -- hml_sample = fnFIE_ml_sample_alloc_color(); ASSERT(hml_sample != NULL); for (i = 0; i < num_train_data; i++) { // パタン画像読み込み ERROR_CHECK(fnFIE_load_img_file(train_img_fnames[i], &himg, F_COLOR_IMG_TYPE_UC8)); // 教師データ追加 ERROR_CHECK(fnFIE_ml_sample_add_color_area(hml_sample, himg, hmask, train_labels[i])); fnFIE_free_object(himg); himg = NULL; } // -- 機械学習モデルの訓練 -- { // ここではブースティングを使用する INT var_type = F_ML_SAMPLE_NUMERICAL; INT boost_type = F_BOOST_TYPE_DISCRETE; INT pred_num = 100; DOUBLE stop_rate = 0.00001; INT preprocess = 0; INT time = 0; hml = fnFIE_ml_do_train_boost( hml_sample, var_type, boost_type, pred_num, stop_rate, preprocess, time, NULL); ASSERT(hml != NULL); } // note: 一般に機械学習の訓練には多くの処理時間を要します。 // アプリの実行の度に訓練を行わないようにするには、下記の手順を実施してください。 // 1. fnFIE_ml_get_train_data() 関数を用いて学習結果をバイナリデータとして出力する。 // 2. そのバイナリデータをファイルに保存する。 // 3. アプリの実行時に、保存したバイナリデータを読み込み、 // fnFIE_ml_restore_train_data() 関数で機械学習オブジェクトを復元する。 err = F_ERR_NONE; exit: // 各種解放 fnFIE_free_object(himg); fnFIE_free_object(hml_sample); if (err == F_ERR_NONE) { return hml; } else { fnFIE_free_object(hml); return NULL; } } // -- サンプル本体 -- // カラー分類用機械学習のサンプル。 // 機械学習モデルの訓練と、訓練したモデルを用いた識別を行う。 static INT do_train_and_predict_using_color() { // 学習用画像のファイルパス const CHAR* train_img_fnames[] = { "train/red/red_0.png", "train/red/red_1.png", "train/red/red_2.png", "train/non_red/blue_0.png", "train/non_red/brown_0.png", "train/non_red/dark_green_0.png", "train/non_red/orange_0.png", "train/non_red/yellow_0.png", }; // 上記学習用画像に対応するクラスラベル。それぞれの画像に、ラベルに対応する数字が含まれている INT train_labels[] = { LABEL_RED, LABEL_RED, LABEL_RED, LABEL_NON_RED, LABEL_NON_RED, LABEL_NON_RED, LABEL_NON_RED, LABEL_NON_RED, }; // テスト用画像のファイルパス const CHAR* test_img_fnames[] = { "test/red/red_3.png", "test/red/red_4.png", "test/non_red/blue_1.png", "test/non_red/brown_1.png", "test/non_red/dark_green_1.png", "test/non_red/lime_1.png", "test/non_red/orange_1.png", "test/non_red/white_1.png", "test/non_red/yellow_1.png", }; // 画像 FHANDLE himg = NULL; // 機械学習オブジェクト FHANDLE hml = NULL; // 学習用画像から教師データの画素を取得する範囲マスクを表すリージョン FHANDLE hmask_train = NULL; // テスト用画像に対して推論を行う画素の位置 PNT_T infer_point = { 50, 50 }; INT i; INT err; // -- 機械学習モデルの訓練 -- // マスクを設定。画像の特定領域とする hmask_train = fnFIE_create_region_rect(40, 40, 20 - 1, 20 - 1); ASSERT(hmask_train != NULL); hml = load_imgs_and_train( train_img_fnames, train_labels, sizeof(train_img_fnames) / sizeof(train_img_fnames[0]), hmask_train); // -- テスト実施 -- for (i = 0; i < sizeof(test_img_fnames) / sizeof(test_img_fnames[0]); i++) { // テスト用画像のラベル(識別結果) INT response_label; // テスト用画像読み込み ERROR_CHECK(fnFIE_load_img_file(test_img_fnames[i], &himg, F_COLOR_IMG_TYPE_UC8)); // カラーの識別 ERROR_CHECK(fnFIE_ml_predict_color_point(hml, himg, infer_point, &response_label)); // 識別結果表示 printf("img: %s, predict: %d (%s)\n", test_img_fnames[i], response_label, response_label == LABEL_RED ? "RED" : "NON_RED"); fnFIE_free_object(himg); himg = NULL; } exit: // 各種解放 fnFIE_free_object(himg); fnFIE_free_object(hmask_train); fnFIE_free_object(hml); return err; } INT main() { INT err; // FIEライブラリのセットアップ fnFIE_setup(); // カラー分類機械学習の実施 err = do_train_and_predict_using_color(); // ライブラリの終了処理 fnFIE_teardown(); return err; }
![]() train/red/red_0.png | ![]() train/red/red_1.png | ![]() train/red/red_2.png |
![]() train/non_red/blue_0.png | ![]() train/non_red/brown_0png | ![]() train/non_red/dark_green_0.png |
![]() train/non_red/orange_0.png | ![]() train/non_red/yellow_0.png |
![]() test/red/red_3.png | ![]() test/red/red_4.png | ![]() test/non_red/blue_1.png |
![]() test/non_red/brown_1png | ![]() test/non_red/dark_green_1.png | ![]() test/non_red/orange_1.png |
![]() test/non_red/yellow_1.png | ![]() test/non_red/lime_1.png | ![]() test/non_red/white_1.png |
img: test/red/red_3.png, predict: 0 (RED) img: test/red/red_4.png, predict: 0 (RED) img: test/non_red/blue_1.png, predict: 1 (NON_RED) img: test/non_red/brown_1.png, predict: 1 (NON_RED) img: test/non_red/dark_green_1.png, predict: 1 (NON_RED) img: test/non_red/lime_1.png, predict: 1 (NON_RED) img: test/non_red/orange_1.png, predict: 1 (NON_RED) img: test/non_red/white_1.png, predict: 1 (NON_RED) img: test/non_red/yellow_1.png, predict: 1 (NON_RED)
#include <stdio.h> #include "fie.h" // FIE関数の異常終了時に処理終了するためのマクロ定義 #define ERROR_CHECK(expr) if ((err = (expr)) != F_ERR_NONE) { printf("err: %d, line: %d\n", err, __LINE__); goto exit; } #define ASSERT(expr) if (!(expr)) { err = F_ERR_UNKNOWN; printf("assertfail at line: %d\n", __LINE__); goto exit; } // -- 内部関数 -- // 二値画像ファイル名リスト train_img_fnames とクラスラベルのリスト train_labels を受け取り、 // リージョンの形状識別を行う機械学習モデルを訓練する。 // 機械学習オブジェクトを返す。 static FHANDLE load_imgs_and_train(const CHAR** train_img_fnames, INT* train_labels, INT num_train_data) { // 画像 FHANDLE himg = NULL; // リージョン FHANDLE hreg = NULL; // 教師データオブジェクト FHANDLE hml_sample = NULL; // 機械学習オブジェクト FHANDLE hml = NULL; // リージョンのオフセット PNT_T offset = { 0, 0 }; INT i; INT err = F_ERR_UNKNOWN; // -- 教師データオブジェクト作成 -- hml_sample = fnFIE_ml_sample_alloc_region_shape(); ASSERT(hml_sample != NULL); for (i = 0; i < num_train_data; i++) { // パタン画像読み込み ERROR_CHECK(fnFIE_load_img_file(train_img_fnames[i], &himg, F_COLOR_IMG_TYPE_UC8)); // リージョンに変換 hreg = fnFIE_region_encode(himg, offset); ASSERT(hreg != NULL); // 教師データ追加 ERROR_CHECK(fnFIE_ml_sample_add_region(hml_sample, hreg, train_labels[i])); fnFIE_free_object(himg); fnFIE_free_object(hreg); himg = NULL; hreg = NULL; } // -- 機械学習モデルの訓練 -- { // ここでは線形SVMを使用する INT svm_type = F_ML_SVM_TYPE_C_SVM; DOUBLE margin = 10.0; DOUBLE stop_rate = 0.001; INT kernel_type = F_ML_SVM_KERNEL_LINEAR; INT preprocess = 1; INT time = 0; hml = fnFIE_ml_do_train_svm( hml_sample, svm_type, margin, stop_rate, kernel_type, 0, 0, 0, preprocess, time, NULL); ASSERT(hml != NULL); } // note: 一般に機械学習の訓練には多くの処理時間を要します。 // アプリの実行の度に訓練を行わないようにするには、下記の手順を実施してください。 // 1. fnFIE_ml_get_train_data() 関数を用いて学習結果をバイナリデータとして出力する。 // 2. そのバイナリデータをファイルに保存する。 // 3. アプリの実行時に、保存したバイナリデータを読み込み、 // fnFIE_ml_restore_train_data() 関数で機械学習オブジェクトを復元する。 err = F_ERR_NONE; exit: // 各種解放 fnFIE_free_object(himg); fnFIE_free_object(hreg); fnFIE_free_object(hml_sample); if (err == F_ERR_NONE) { return hml; } else { fnFIE_free_object(hml); return NULL; } } // -- サンプル本体 -- // リージョンの形状識別用の機械学習のサンプル。 // 機械学習モデルの訓練と、訓練したモデルを用いた識別を行う。 static INT do_train_and_predict_using_regions() { // 学習用画像のファイルパス const CHAR* train_img_fnames[] = { "train/1_1.bmp", "train/1_2.bmp", "train/1_3.bmp", "train/2_1.bmp", "train/2_2.bmp", "train/2_3.bmp", "train/3_1.bmp", "train/3_2.bmp", "train/3_3.bmp", }; // 上記学習用画像に対応するクラスラベル。それぞれの画像に、ラベルに対応する数字が含まれている INT train_labels[] = { 1, 1, 1, 2, 2, 2, 3, 3, 3, }; // テスト用画像のファイルパス const CHAR* test_img_fnames[] = { "test/1_4.bmp", "test/1_5.bmp", "test/2_4.bmp", "test/2_5.bmp", "test/3_4.bmp", "test/3_5.bmp", }; // 画像 FHANDLE himg = NULL; // リージョン FHANDLE hreg = NULL; // 機械学習オブジェクト FHANDLE hml = NULL; // リージョンのオフセット PNT_T offset = { 0, 0 }; INT i; INT err; // -- 機械学習モデルの訓練 -- hml = load_imgs_and_train( train_img_fnames, train_labels, sizeof(train_img_fnames) / sizeof(train_img_fnames[0])); // -- テスト実施 -- for (i = 0; i < sizeof(test_img_fnames) / sizeof(test_img_fnames[0]); i++) { // テスト用画像のラベル(識別結果) INT response_label; // テスト用画像読み込み ERROR_CHECK(fnFIE_load_img_file(test_img_fnames[i], &himg, F_COLOR_IMG_TYPE_UC8)); // リージョンに変換 hreg = fnFIE_region_encode(himg, offset); ASSERT(hreg != NULL); // リージョンの識別 ERROR_CHECK(fnFIE_ml_predict_region_shape(hml, hreg, &response_label)); // 識別結果表示 printf("img: %s, predict: %d\n", test_img_fnames[i], response_label); fnFIE_free_object(himg); fnFIE_free_object(hreg); himg = NULL; hreg = NULL; } exit: // 各種解放 fnFIE_free_object(himg); fnFIE_free_object(hreg); fnFIE_free_object(hml); return err; } INT main() { INT err; // FIEライブラリのセットアップ fnFIE_setup(); // リージョン識別機械学習の実施 err = do_train_and_predict_using_regions(); // ライブラリの終了処理 fnFIE_teardown(); return err; }
![]() train/1_1.bmp | ![]() train/1_2.bmp | ![]() train/1_3.bmp |
![]() train/2_1.bmp | ![]() train/2_2.bmp | ![]() train/2_3.bmp |
![]() train/3_1.bmp | ![]() train/3_2.bmp | ![]() train/3_3.bmp |
![]() test/1_4.bmp | ![]() test/1_5.bmp | ![]() test/2_4.bmp |
![]() test/2_5.bmp | ![]() test/3_4.bmp | ![]() test/3_5.bmp |
img: test/1_4.bmp, predict: 1 img: test/1_5.bmp, predict: 1 img: test/2_4.bmp, predict: 2 img: test/2_5.bmp, predict: 2 img: test/3_4.bmp, predict: 3 img: test/3_5.bmp, predict: 3