【Python/OpenCV】ニューラルネットワークの使い方

この記事では、Python版OpenCVでニューラルネットワークの使い方をソースコード付きで解説します。

ニューラルネットワーク

Python版OpenCV3には、ニューラルネットワークによる学習機能があります。
今回はこれを使って簡単な学習と予測をしてみます。

ソースコード(Python3+OpenCV3)

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import cv2
import numpy as np

def main():
    # 入力データxと出力データy
    x = np.array([[1.1, 1.2, 1.5, 2.2, 2.1, 1.5]], dtype=np.float32)
    y = np.array([[0, 0, 0, 1, 1, 0]] , dtype=np.float32)

    # ニューラルネットワークを生成
    ann = cv2.ml.ANN_MLP_create()

    # 階層構造の設定(入力層:入力数、隠れ層:4、出力層:出力数)
    ann.setLayerSizes(np.array([x.size, 4, y.size], dtype = np.uint8))

    # 学習方法の設定(バックプロパゲーションを指定)
    ann.setTrainMethod(cv2.ml.ANN_MLP_BACKPROP)

     # 活性化関数の設定(シグモイド関数)
    ann.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM, 0, 0)

    # 終了条件の設定(最大繰り返し回数:1000、最小変化量:0.01)
    ann.setTermCriteria((cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 1000, 0.01))

    # 学習
    ann.train(x, cv2.ml.ROW_SAMPLE, y)

    # 学習結果の検証(テストデータを入力)
    x_test = np.array([[1.4, 1.6, 1.5, 2.7, 2.4, 1.1]], dtype = np.float32)
    result = ann.predict(x_test)

    # 検証結果の表示
    print(result)


if __name__ == '__main__':
    main()

作成するニューラルネット

設定 説明
階層構造 入力層6、隠れ層4、出力層6
習方法 バックプロパゲーション
活性化関数 シグモイド
入力データ [1.1, 1.2, 1.5, 2.2, 2.1, 1.5]
出力データ [0, 0, 0, 1, 1, 0] ※入力データが2未満なら0、2以上なら1
テストデータ [1.4, 1.6, 1.5, 2.7, 2.4, 1.1]

実行結果

サンプルプログラムの実行結果です。

(4.0, array([[-0.05601246,  0.20535548,  0.05182505,  0.76666981,  0.90900791, -0.18717808]], dtype=float32))

このうち、以下の部分がテストデータによる検証結果です。

[-0.05601246,  0.20535548,  0.05182505,  0.76666981,  0.90900791, -0.18717808]

2以上の値は1に近くなり、2未満の値は0に近い出力値を得ていることがわかります。

関連記事
1 PythonでOpenCV入門 サンプル集
2 【Python】画像処理プログラミング入門
3 【画像処理入門】アルゴリズム&プログラミング

コメント

  1. Pascal より:

    # 学習結果の検証(テストデータを入力)
    x_test = np.array([[1.4, 1.6, 1.5, 2.7, 2.4, 1.1]], dtype = np.float32)
    result = nn.predict(x_test)
    上記の部分でresultのnnはannの誤りではないでしょうか。間違っていたらすみません。

    • 管理人 より:

      ※Pascal様

      コメントありがとうございます。
      ご指摘いただいた通り、誤りですので修正致しました。
      ありがとうございました。

  2. 匿名 より:

    テストデータの順番を変えると結果が正しい解が得られません