サンプルコード
[機械学習]

基本的な使用例

コード

#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;
}

訓練用画像

red_0.png

train/red/red_0.png

red_1.png

train/red/red_1.png

red_2.png

train/red/red_2.png

blue_0.png

train/non_red/blue_0.png

brown_0.png

train/non_red/brown_0png

dark_green_0.png

train/non_red/dark_green_0.png

orange_0.png

train/non_red/orange_0.png

yellow_0.png

train/non_red/yellow_0.png

テスト用画像

red_3.png

test/red/red_3.png

red_4.png

test/red/red_4.png

blue_1.png

test/non_red/blue_1.png

brown_1.png

test/non_red/brown_1png

dark_green_1.png

test/non_red/dark_green_1.png

orange_1.png

test/non_red/orange_1.png

yellow_1.png

test/non_red/yellow_1.png

lime_1.png

test/non_red/lime_1.png

white_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;
}

訓練用画像

1_1.bmp

train/1_1.bmp

1_2.bmp

train/1_2.bmp

1_3.bmp

train/1_3.bmp

2_1.bmp

train/2_1.bmp

2_2.bmp

train/2_2.bmp

2_3.bmp

train/2_3.bmp

3_1.bmp

train/3_1.bmp

3_2.bmp

train/3_2.bmp

3_3.bmp

train/3_3.bmp

テスト用画像

1_4.bmp

test/1_4.bmp

1_5.bmp

test/1_5.bmp

2_4.bmp

test/2_4.bmp

2_5.bmp

test/2_5.bmp

3_4.bmp

test/3_4.bmp

3_5.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
	


Documentation copyright © 2009-2024 FAST Corporation.
Generated on Fri Aug 9 16:38:48 2024 for FIEライブラリ by doxygen 1.5.6-FASTSP-p2