この記事では、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 | 【画像処理入門】アルゴリズム&プログラミング |
コメント
# 学習結果の検証(テストデータを入力)
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様
コメントありがとうございます。
ご指摘いただいた通り、誤りですので修正致しました。
ありがとうございました。
テストデータの順番を変えると結果が正しい解が得られません