2019年7月30日火曜日

Kerasによるニューラルネットワークモデルの構築方法

概要

Kerasによるニューラルネットワークモデルの構築方法素のメモです。

用語

・Anaconda:データサイエンスおよび機械学習関連アプリケーション(大規模データ処理、予測分析、科学計算)のためのPythonおよびRプログラミング言語のフリーでオープンソースのディストリビューション
・Python:機械学習プログラミングに人気のプログラミング言語。
・Keras:Pythonで書かれたオープンソースニューラルネットワークライブラリ。tensorflowをラッピングして作られている。
・ニューラルネットワーク:脳機能を模して考案された機械学習のアルゴリズムの1つ。
・xlrd:pythonでxlsxファイルを読み書きするためのライブラリ

事前準備(前提とする環境)

・Windows10 Professional
・Anaconda
・Python3(バージョン3.7.2)
・Keras2.1.5

手順

学習させるデータ

学習の題材には日経平均株価を扱いたいと思います。そこで、日経平均株価の情報をエクセル形式で準備します。 説明変数は、「日付」「終値」「始値」「高値」「安値」「前日比」「5日移動平均」「25日移動平均」「75日移動平均」「14日RSI」です。予測値は、「翌日の日経平均株価」です。
用意するデータ
ファイル論理名 ファイル物理名 概要
日経平均株価学習データ nikkei225.xlsx ニューラルネットワークモデルに学習させるデータセット
日経平均データファイル定義 nikkei225_def.xlsx データセットのファイル定義
日経平均株価学習結果テストデータ nikkei225_test.xlsx 学習結果のテスト用データ

xlrdのインストール

xlrdをインストールします。xlrdを用いて、エクセル形式の日経平均株価を読み込みます。
$ pip install xlrd

エクセルデータ読み込みプログラム作成(importXLSX.py)

まずはxlsファイルを読み込み、0~1の値に正規化するプログラムを作成します。
著者のプログラム能力不足により若干残念ですが、例えば以下みたいな感じで。
import pandas as pd
import keras
from keras.preprocessing.text import one_hot

# dateFlg:0の場合->日付データをそのまま学習、1の場合->日付データは無視して学習
# stringFlg:0の場合->文字列データをそのまま学習、1の場合->文字列データは無視して学習
def getData(fileDefinition, filename, dateFlg, stringFlg, superviser):
    # xlsxファイルの定義ファイルの読み込みを行う
    csv_def = pd.read_excel(fileDefinition, encoding='utf-8')

    # xlsxファイルの読み込みを行う
    csv_data = pd.read_excel(filename, encoding='utf-8')

    # 正規化処理(型毎に0~1の値になるように正規化)
    for raw in csv_def:
        array = []

        # Date型の場合
        if(csv_def[raw][0] == 'Date'):
            max = 0
            min = 9999999
            for value in csv_data[raw]:
                if dateFlg == 0:
                    if pd.isnull(value):
                        tmpValue = -1
                    else:
                        tmpValue = one_hot(value, len(csv_data[raw]) + 1)[0]
                    # 正規化するための最大値取得
                    if max < tmpValue:
                        max = tmpValue
                    # 正規化するための最小値取得
                    if min > tmpValue:
                        min = tmpValue
                else:
                    tmpValue = 0
                array.append(tmpValue)

        # float型の場合
        elif(csv_def[raw][0] == 'float'):
            max = 0.0
            min = 9999999.999
            for value in csv_data[raw]:
                if pd.isnull(value):
                    tmpValue = 0.0
                else:
                    tmpValue = value
                # 正規化するための最大値取得
                if max < tmpValue:
                    max = tmpValue
                # 正規化するための最小値取得
                if min > tmpValue:
                    min = tmpValue
                array.append(tmpValue)

        # long型の場合
        elif(csv_def[raw][0] == 'long'):
            max = 0
            min = 9999999
            for value in csv_data[raw]:
                if pd.isnull(value):
                    tmpValue = 0.0
                else:
                    tmpValue = value
                # 正規化するための最大値取得
                if max < tmpValue:
                    max = tmpValue
                # 正規化するための最小値取得
                if min > tmpValue:
                    min = tmpValue
                array.append(tmpValue)

        # String型の場合
        if(csv_def[raw][0] == 'String'):
            max = 0
            min = 9999999
            for value in csv_data[raw]:
                if stringFlg == 0:
                    if pd.isnull(value):
                        tmpValue = -1
                    else:
                        tmpValue = one_hot(value, len(csv_data[raw]) + 1)[0]
                    # 正規化するための最大値取得
                    if max < tmpValue:
                        max = tmpValue
                    # 正規化するための最小値取得
                    if min > tmpValue:
                        min = tmpValue
                else:
                    tmpValue = 0
                array.append(tmpValue)

        # 学習データの場合は0~1の値に正規化を行う
        result = []
        if max != 0 and raw != superviser:
            if max == min:
                min = 0
            for value in array:
                result.append((value - min) / (max - min))
        else:
            result = array

        csv_data[raw] = result

    print(csv_data)

    return csv_data

def setSupData(superviser, data):
    svData = pd.DataFrame()
    lnData = pd.DataFrame()
    for raw in data:
        if raw == superviser:
            # 指定されたカラムの場合は教師データとして扱う
            svData[raw] = data[raw]
        else:
            # 指定されたカラム以外の場合は学習データとして扱う
            lnData[raw] = data[raw]

    return lnData, svData

# このプログラム単体でも実行可能です
if __name__ == '__main__':
    data = getData('nikkei225_def.xlsx', 'nikkei225.xlsx', 1, 1, '翌日日経平均')

モデル作成プログラム作成(createModel.py)

続いて、ニューラルネットワークモデルをプログラムを作成します。
著者のプログラム能力不(ry
実行が完了すると、「nikkei225.h5」というファイルが生成されます(これがニューラルネットワークモデルになります)。
import sys
import datetime
import importXLSX as ic
from keras.models import Sequential
from keras.layers import Dense, Dropout, BatchNormalization

def getData(fileDefinition, trainFilename, testFileName, superviser):
    # 入力データの作成 -------------------------------------------------------------------------
    # 入力データの全件取得
    print(datetime.datetime.today(), ' トレーニング用データの取得を開始します')
    trainData = ic.getData(fileDefinition, trainFilename, 1, 1, superviser)

    # 学習データと教師データの作成(Pandas)
    print(datetime.datetime.today(), ' トレーニング用データから学習データと教師データを作成します')
    x_train, y_train = ic.setSupData(superviser, trainData)

    # テストデータの作成 -----------------------------------------------------------------------
    # テスト用データの全件取得
    print(datetime.datetime.today(), ' テスト用データを作成します')
    testData = ic.getData(fileDefinition, testFileName, 1, 1, superviser)

    # テストデータと正解データの作成(Pandas)
    print(datetime.datetime.today(), ' テスト用データからテストデータと正解データを作成します')
    x_test, y_test = ic.setSupData(superviser, testData)

    return x_train, y_train, x_test, y_test


def createModel(x_train, y_train, x_test, y_test):
    '''
    モデルの作成
    '''
    print(datetime.datetime.today(), ' モデルを作成します')
    model = Sequential()

    model.add(Dense(x_train.shape[1], activation='sigmoid'))
    model.add(BatchNormalization())
    model.add(Dropout(0.8))
    model.add(Dense(179, activation='sigmoid'))
    model.add(BatchNormalization())
    model.add(Dropout(0.8))
    model.add(Dense(179, activation='sigmoid'))
    model.add(BatchNormalization())
    model.add(Dropout(0.8))
    model.add(Dense(1))

    model.compile(loss='mean_squared_error', optimizer='adam')
    model.fit(x_train.values, y_train.values, epochs=500, batch_size=32, verbose=1, validation_split=0.1)
    score = model.evaluate(x_test.values, y_test.values, verbose=0)
    print('Test MSE : ', score)

    return model


def main(fileDefinition, trainFilename, testFileName, modelName, superviser):
    # パラメータの表示
    print(datetime.datetime.today(), ' fileDefinition(データ定義) : ', fileDefinition)
    print(datetime.datetime.today(), ' trainFilename(トレーニングデータ) : ', trainFilename)
    print(datetime.datetime.today(), ' testFileName(テストデータ) : ', testFileName)
    print(datetime.datetime.today(), ' modelName(作成するモデル名称) : ', modelName)
    print(datetime.datetime.today(), ' superviser(予測対象項目) : ', superviser)

    # 入力データとテストデータの作成
    x_train, y_train, x_test, y_test = getData(fileDefinition, trainFilename, testFileName, superviser)

    # モデルの作成
    model = createModel(x_train, y_train, x_test, y_test)

    # モデルの保存
    print(datetime.datetime.today(), ' モデルを保存します')
    model.save(modelName)


# 動かす際は、下記コメントアウト内の文字列をコマンドライン引数として与えてください
# python createModel.py nikkei225_def.xlsx nikkei225.xlsx nikkei225_test.xlsx nikkei225.h5 翌日日経平均
if __name__ == '__main__':
    args = sys.argv
    main(args[1], args[2], args[3], args[4], args[5])

計算実行プログラム(run.py)

最後に、作成したニューラルネットワークモデルを用いて予測を実行します。
import sys
import datetime
import importXLSX as ic
import keras
from keras.models import load_model

def main(modelName, fileDefinition, preFileName, superviser):
    '''
    パラメータの表示
    '''
    print(datetime.datetime.today(), ' modelName(用いるモデル名称) : ', modelName)
    print(datetime.datetime.today(), ' fileDefinition(データ定義) : ', fileDefinition)
    print(datetime.datetime.today(), ' preFileName(検証データ) : ', preFileName)
    print(datetime.datetime.today(), ' superviser(予測対象項目) : ', superviser)

    '''
    予測データの取得
    '''
    # 予測データの取得
    preData = ic.getData(fileDefinition, preFileName, 1, 1, superviser)

    x_pre, dummy = ic.setSupData(superviser, preData)

    '''
    モデルの作成
    '''
    # モデル生成
    model = load_model(modelName)

    '''
    予測の実行
    '''
    predicted = model.predict(x_pre) 
    print(predicted)

# python rarun.py nikkei225.h5 nikkei225_def.xlsx nikkei225_test.xlsx 翌日日経平均
if __name__ == '__main__':
    args = sys.argv
    main(args[1], args[2], args[3], args[4])
結果は以下のコマンドラインの値になります。日経平均予測に必要なデータ項目も全然足りていないし、ニューラルネットワークのハイパーパラメーターのチューニングも全然していないため、予測値がマイナスになるものもあり全然です。が、Kerasの使い方はこんな感じです。
>
$ python rarun.py nikkei225.h5 nikkei225_def.xlsx nikkei225_test.xlsx 翌日日経平均
Using TensorFlow backend.
2019-05-24 17:44:41.663010  modelName(用いるモデル名称) :  nikkei225.h5
2019-05-24 17:44:41.665976  fileDefinition(データ定義) :  nikkei225_def.xlsx
2019-05-24 17:44:41.665976  preFileName(検証データ) :  nikkei225_test.xlsx
2019-05-24 17:44:41.666974  superviser(予測対象項目) :  翌日日経平均
2019-05-24 17:44:42.156586: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
[[ 10371.795 ]
 [-50451.01  ]
 [ 17245.732 ]
 [   523.5143]
 [ 16382.622 ]
 [ 15044.639 ]
 [ -6003.2383]
 [-17564.129 ]
 [ -4260.0283]
 [ 17274.5   ]
 [ 17795.049 ]
 [ 18401.918 ]
 [ 19743.291 ]
 [  4336.625 ]
 [ 22392.877 ]
 [ 22660.785 ]
 [ 23163.428 ]
 [ 22441.758 ]]

2019年7月27日土曜日

Web上から大量の画像ファイルを収集する方法

概要

深層学習による画像解析を行う場合、学習データとして大量の画像ファイルが必要になるかと思います。そのために、Web上から大量の画像ファイルを収集する方法をメモします。

Microsoft AzureなどにもWebから画像ファイルを収集する機能がありますが、アカウント作成が必要であったり場合によっては有料になってしまう事もあるため、当ブログでは本方法をオススメしています。

事前準備(前提とする環境)

Vagrant(ubuntu/xenial64)で構築したUbuntu16.04

手順

「概要」に記載したとおりのため、当ブログでは「Google 画像検索」でスクレイピングする方法を選択しており、「https://qiita.com/skcvim/items/efc296ae1bf0e62f6704」様にて記載されている方法を採用しました。

動作に必要なライブラリのインストール

$ sudo apt -y update
$ sudo apt -y upgrade
$ sudo apt-get install python3-pip
$ sudo pip3 install bs4
$ sudo pip3 install lxml

プログラムの準備

「https://qiita.com/skcvim/items/efc296ae1bf0e62f6704」様に記載されている「image_collector_cui.py」をダウンロードする。

実行方法

$ python3 image_collector_cui.py 検索キーワード 件数
(ex)
$ python3 image_collector_cui.py cat 100

以上になります。

2019年7月22日月曜日

動画の顔認識プログラム(SSD Keras)を動かす

概要

VIrtualBoxで構築したUbuntu環境でSSD Kerasを動かし、動画の顔認識をやってみます。

用語

顔認識:画像から人を自動識別するための技術
SSD:Single Shot MultiBox Detectorの略。深層学習モデル
Keras:tensorflowをラッピングした機械学習OSS。tensorflowをより容易に利用可能としている
tensorflow:google社が公開しているOSSの機械学習フレームワーク
h5py:バイナリーデータファイルのフォーマット HDF を扱う ためのPython ライブラリー。ここでは画像認識のための機械学習モデルをh5py形式で扱っている。
OpenCV:インテルが公開しているOSSの画像解析フレームワーク

事前準備(前提とする環境)

Ubuntu 16.04(Virtual Boxに構築)(Python3.5.2含)
※クリーンインストールされた状態

構築する環境

Keras v1.2.2
tensorflow v1.1.0
h5py v2.7.1
OpenCV v3.1.0

手順

OpenCVのインストール

opencv3.1.0をインストールする前に依存モジュールをインストールします。以下をそのまま実行してください。

$ sudo apt-get install \
        build-essential \
        cmake \
        git \
        pkg-config \
        libjpeg8-dev \
        libtiff5-dev \
        libjasper-dev \
        libpng12-dev \
        libavcodec-dev \
        libavformat-dev \
        libswscale-dev \
        libv4l-dev \
        libatlas-base-dev \
        libgtk2.0-dev \
        gfortran

依存モジュールが準備出来たら、gitからopenCVをダウンロードします。

$ cd ~
$ git clone git://github.com/opencv/opencv
$ cd opencv
$ git checkout 3.1.0

プログラムをmakeします。

$ cmake .
$ make -j2
$ sudo make install
$ sudo ldconfig

tensorflowとKerasのインストール

tensorflowとKerasをインストールします。

$ sudo apt install python-pip python3-pip
$ pip3 install tensorflow==1.1.0
$ sudo pip3 install keras==1.2.2

ssd_keras をダウンロード

ssd_kerasのソースコード本体と、画像解析のためのモデル(.hdf5ファイル)をダウンロードします。

ssd_kerasのソースコード本体をダウンロードします。

$ git clone https://github.com/rykov8/ssd_keras.git

画像解析のためのモデル(weights_SSD300.hdf5)を以下からダウンロードします。
https://mega.nz/#F!7RowVLCL!q3cEVRK9jyOSB9el3SssIA

ssd_kerasを実行

ssd_kerasフォルダの中のファイルを編集します。

ssd_keras/testing_utils/videotest.py

wget https://bootstrap.pypa.io/get-pip.py
87行目を以下のように修正
(修正前)
vidw = vid.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)
vidh = vid.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)

(修正後) vidw = vid.get(cv2.CAP_PROP_FRAME_WIDTH) vidh = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
※物体検出結果をコンソールでも確認したい場合、162行目に以下を追加 print(text)

ssd_keras/testing_utils/videotest_example.py

wget https://bootstrap.pypa.io/get-pip.py
# 18行目でweights_SSD300.hdf5ファイルのパスを指定
model.load_weights('weights_SSD300.hdf5')

#24行目で動画のパスを入力 vid_test.run('test.mp4')

h5pをインストールします。

$ pip3 install h5py --user

これで準備完了です!ssd_kerasを実行することができます。

$ python3 ssd_keras/testing_utils/videotest_example.py

2019年7月18日木曜日

Kerasで構築したニューラルネットワークのハイパーパラメータを自動チューニングする方法

概要

Kerasで構築したニューラルネットワークのハイパーパラメータを自動チューニングする方法のメモです。

用語

・Anaconda:データサイエンスおよび機械学習関連アプリケーション(大規模データ処理、予測分析、科学計算)のためのPythonおよびRプログラミング言語のフリーでオープンソースのディストリビューション
・Python:機械学習プログラミングに人気のプログラミング言語。
・Keras:Pythonで書かれたオープンソースニューラルネットワークライブラリ。tensorflowをラッピングして作られている。
・ニューラルネットワーク:脳機能を模して考案された機械学習のアルゴリズムの1つ。
・optuna:Kerasで構築するニューラルネットワークモデルのハイパーパラメータを自動チューニングしてくれるオープンソースライブラリ

事前準備(前提とする環境)

・Windows10 Professional
・Anaconda
・Python3(バージョン3.7.2)
・Keras2.1.5

手順

optunaのインストール

まずは事前準備として、ハイパーパラメータを自動チューニングしてくれるライブラリのoptunaをインストールします。

$ pip install optuna

ハイパーパラメータ自動チューニングプログラムを作成

インストールが完了したら、早速プログラムを作成します。
自動チューニングするのは、前回本ブログで作成したニューラルネットワークモデル作成プログラムの「createModel.py」です。
具体的なプログラムは以下です。
今回も著者のプログラム能力不(ryです。

import datetime
import importXLSX as ic
import numpy as np
import optuna

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization
from keras.utils import np_utils


def getData(fileDefinition, trainFilename, testFileName, superviser):
    # 入力データの作成 -------------------------------------------------------------------------
    # 入力データの全件取得
    print(datetime.datetime.today(), ' トレーニング用データの取得を開始します')
    trainData = ic.getData(fileDefinition, trainFilename, 1, 1, superviser)

    # 学習データと教師データの作成(Pandas)
    print(datetime.datetime.today(), ' トレーニング用データから学習データと教師データを作成します')
    x_train, y_train = ic.setSupData(superviser, trainData)

    # テストデータの作成 -----------------------------------------------------------------------
    # テスト用データの全件取得
    print(datetime.datetime.today(), ' テスト用データを作成します')
    testData = ic.getData(fileDefinition, testFileName, 1, 1, superviser)

    # テストデータと正解データの作成(Pandas)
    print(datetime.datetime.today(), ' テスト用データからテストデータと正解データを作成します')
    x_test, y_test = ic.setSupData(superviser, testData)

    return x_train, y_train, x_test, y_test


def objective(trial):
    # パラメータ
    fileDefinition = 'nikkei225_def.xlsx'
    trainFilename = 'nikkei225.xlsx'
    testFileName = 'nikkei225_test.xlsx'
    superviser = '翌日日経平均'

    # データをロード
    x_train, y_train, x_test, y_test = getData(fileDefinition, trainFilename, testFileName, superviser)

    # 調整したいハイパーパラメータの設定
    n_layer = trial.suggest_int('n_layer', 1, 3) # 追加する層を1-3から選ぶ
    mid_units = int(trial.suggest_discrete_uniform('mid_units', 100, 500, 1)) # ユニット数
    dropout_rate = trial.suggest_uniform('dropout_rate', 0, 1) # ドロップアウト率
    activation = trial.suggest_categorical('activation', ['relu', 'sigmoid']) # 活性化関数
    optimizer = trial.suggest_categorical('optimizer', ['sgd', 'adam', 'rmsprop']) # 最適化アルゴリズム

    model = Sequential()

    model.add(Dense(x_train.shape[1], activation=activation))
    model.add(BatchNormalization())
    model.add(Dropout(dropout_rate))

    for i in range(n_layer):
        model.add(Dense(mid_units, activation=activation))
        model.add(BatchNormalization())
        model.add(Dropout(dropout_rate))

    model.add(Dense(1))

    model.compile(loss='mean_squared_error', optimizer=optimizer)
    history = model.fit(x_train.values, y_train.values, epochs=500, batch_size=16, verbose=1, validation_split=0.1)
    score = model.evaluate(x_test.values, y_test.values, verbose=0)
    print('Test MSE : ', score)


    # 学習モデルの保存
    model_json = model.to_json()
    with open('keras_model.json', 'w') as f_model:
        f_model.write(model_json)
    model.save_weights('keras_model.hdf5')

    # 最小値探索なので
    return -1 * score


def main():
    study = optuna.create_study(sampler=optuna.samplers.TPESampler())
    study.optimize(objective, n_trials=15)
    print('best_params')
    print(study.best_params)
    print('-1 x best_value')
    print(-study.best_value)

    print('\n --- sorted --- \n')
    sorted_best_params = sorted(study.best_params.items(), key=lambda x : x[0])
    for i, k in sorted_best_params:
        print(i + ' : ' + str(k))


if __name__ == '__main__':
    main()

2019年7月16日火曜日

OpenCVで実行可能なCascade分類機自作

概要

OpenCV3.4.1で実行可能なCascade分類器を自作する手順をメモします。

OpenCVでは人の顔を判断する分類器や犬を判断する分類器などがデフォルトで準備されています。そのため、それらを分類する用途であれば何も準備する事なく分類器を作成する事が出来ます。しかし、その他(特定の生物や、物体などを判断させたい等)の用途では、専用の分類器を準備する必要があります。そこで、今回は専用の分類器を自作したのでその手順をメモしたいと思います。

用語

・Anaconda:データサイエンス向けに作成された Pythonパッケージ。科学技術計算などを中心とした数多くのモジュールやツールが含まれている。
・OpenCV:インテルが公開しているOSSの画像解析フレームワーク。
・Cascade分類器:OpenCVで画像の中から物体を識別するための判定機

事前準備(前提とする環境)

・Windows10 Pro 1803
・Anaconda 5.3.0

※Ubuntu16.04にOpenCV3.4.1をインストールして下記と同じ手順を試してみましたが、(おそらく)ライブラリのインストールが足りず、うまくCascade分類器を作成する事が出来ませんでした(2週間以上格闘しましたが、何故上手くいかないか特定出来ず)。そのため、Cascade分類器作成には、Anacondaをインストールして実施する事をオススメします。

手順

OpenCVのダウンロードと解凍

OpenCVのダウンロードサイト「https://opencv.org/releases.html」からOpenCV本体(.exe)をダウンロードし、解凍します。exeを実行すると解凍が開始されます。

(解凍先)
「C:\」
※解凍先はお好みのフォルダにアレンジして頂いてOKです。

Cascadeファイル作成フォルダの準備

「C:\conda_opencv」フォルダを作成します。

その後、「conda_opencv」フォルダにCascadeファイル作成に必要な実行ファイルを配置します。配置する対象ファイルは以下です。

(対象ファイル)
opencv_traincascade.exe
opencv_createsamples.exe
opencv_world343.dll

対象ファイルはダウンロードしたOpenCVの下記フォルダ内にあります。

(位置)
C:\opencv\build\x64\vc15\bin

正解ファイルと非正解ファイルの準備

物体の分類器を作成するためには物体の正解画像と非正解画像を覚えさせる必要があります。そのため、正解画像と非正解画像を以下のとおり準備します。

まず、正解画像を準備します(準備する正解画像は1枚でOKです)。正解画像は、「C:\conda_opencv」に「pos」フォルダを作成し、同配下に配置します。

続いて、非正解画像を準備します(こちらは大量に準備する必要があります)。非正解画像は、「C:\conda_opencv」に「neg」フォルダを作成し、同配下に配置します。
因みに、画像を大量に収集する方法は「http://blog.livedoor.jp/k_k_it/archives/13507518.html」で紹介しているので参考にしてみてください。

ここまで準備出来ると、以下のようなフォルダ構成になっているはずです。

Cascadeファイル作成

いよいよCascadeファイル作成ですが、まずは正解ファイルを学習させるために大量に増幅します。

(コマンド)
$ opencv_createsamples -img ./pos/<正解画像ファイル名> -vec ./vec/image.vec -num <増幅する枚数> -bgcolor 255 -maxidev 40 -maxxangle 0.8 -maxyangle 0.8 -maxzangle 0.5
(例)
$ opencv_createsamples -img ./pos/correct_image.jpg -vec ./vec/image.vec -num 1000 -bgcolor 255 -maxidev 40 -maxxangle 0.8 -maxyangle 0.8 -maxzangle 0.5

続いて、正解ファイルと非正解ファイルからいよいよCascadeファイルを作成します。

(コマンド)
$ opencv_traincascade -data ./cascade/trained_data/ -vec ./vec/image.vec -bg nglist.txt -numPos <正解画像枚数> -numNeg <非正解画像枚数>
(例)
$ opencv_traincascade -data ./cascade/trained_data/ -vec ./vec/image.vec -bg nglist.txt -numPos 900 -numNeg 190

※ここで、正解画像枚数は、実際の正解画像枚数×0.9程度(上記例では正解画像を1000枚に増幅しているため、900枚に指定している)とうまくいきます。うまくいかないとエラーが発生してCascadeファイル作成失敗します。



以上でCascadeファイルがうまく作成出来ました。
あとは本Cascadeファイルを用いて画像解析を行うと、物体認識が出来ると思います。

2019年7月15日月曜日

Vagrantで構築したローカルサーバのDBをビューアで参照する方法

概要

Vagrantでローカルに構築したDBサーバー(PostgreSQL)に、ホストPCからDBエディタ経由で参照する方法をメモします。

用語

・Ubuntu:LinuxのOS。
・Vagrant:Virtual Boxに仮想環境を構築するためのツール。
・PostgresSQL:オープンソースのRDBMS。
・A5:SQL(データベース用フリーソフト)

事前準備(前提とする環境)

・Ubuntu14.04(Vagrantで構築したゲストマシン)
・PostgresSQL9.3.24(Vagrantで構築したゲストマシン)
・A5:SQL(ゲストマシン側)

手順

postgreSQLサーバーの設定

まずはゲストマシンにssh接続し、postgreSQLサーバーの設定ファイルを修正します。修正内容としては、
①サーバー外からのアクセス権限を与える
②peer設定(サーバーのログインユーザーとpsqlのユーザー名が 一致していないとダメという設定)を解除する
の2点になります。

①サーバー外からのアクセス権限を与える

下記のとおり「postgresql.conf」を開きます。

$ sudo apt-get update
$ sudo apt-get install nano
$ cd /etc/postgresql/9.3/main/postgresql.conf
$ sudo nano postgresql.conf

下記部分のコメントアウトを外します。

listen_addresses = '*'

②peer設定を解除する

下記のとおり「pg_hba.conf」を開きます。

$ sudo nano pg_hba.conf

下記部分の定義を修正します。

# Database administrative login by Unix domain socket
# ↓コメントアウト
#local all postgres peer
# ↓追加
local all postgres md5

# "local" is for Unix domain socket connections only
# ↓コメントアウト
#local all all peer
# ↓追加
local all all Trust

因みに、「Trust」はおまじないではなく、下記のように幾つか権限付与の種類があります。
Ident : DB の所有者がシェルを実行している OS のユーザ名と一致するかで認証
MD5 : PW 認証 (MD5-hashed)
Trust : 認証せず、DB への接続許可 (PW スルー)

PostgreSQLサーバー再起動

Vagrantゲストマシンを再起動した後、下記コマンドでPostgreSQLサーバーを再起動します。

$ sudo service postgresql restart

ホストマシンからの接続

以下を「A5:SQL」に入力し、接続すれば繋がります。
【基本】
サーバー名:お好きに
データベース名:接続先のDB名
ユーザーID:postgres
パスワード:(なし)

【SSH2トンネル】
SSHホスト名:127.0.0.1
ユーザーID:vagrant
パスフレーズ:vagrant

2019年7月13日土曜日

postgreSQLのto_dateで発生するエラーの対処方法

概要

PostgreSQLでto_dateを用いていてERROR: function to_date(timestamp without time zone, unknown) does not existが発生したのでその解決方法をメモします。

用語

・PostgresSQL:オープンソースのRDBMS。

事前準備(前提とする環境)

・Ubuntu16.04
・PostgresSQL(バージョン9.3.24)

対処

現象

クエリの中で以下のようにto_date()を用いると、当該エラーが出るようです。
  to_date(now_time,'YYYY-MM-DD')  # now_timeはtext型

対策

「now_time」をtext型と認識出来ていない事が原因で、エラーが発生しています。そのため、「::text」をつけてやれば正しく実行されます。
  to_date(now_time::text,'YYYY-MM-DD')

2019年7月11日木曜日

PostgreSQLのインストール手順

概要

PostgreSQLをUbuntu環境にインストールする手順を記載します。
※Ubuntu14.04/16.04ではaptでのinstallが出来ないため本手順をとっています。

用語

・Ubuntu:LinuxのOS。
・PostgresSQL:オープンソースのRDBMS。

事前準備(前提とする環境)

・Ubuntu14.04

手順

aptにPostgreSQLを追加

pgdg.listをnano(Linuxにデフォルトでインストールされているテキストエディタ)でopenします。

$ sudo nano /etc/apt/sources.list.d/pgdg.list

pgdg.listに「deb http://apt.postgresql.org/pub/repos/apt/ YOUR_UBUNTU_VERSION_HERE-pgdg main」を追記し、保存します。nanoでの保存は「ctrl + x」⇒「y」⇒「enter」で出来ます。

PostgreSQLをインストール

以下を実行してpostgresqlをインストールします。

$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install postgresql

インストール確認

インストール確認として、バージョン確認をします。PostgreSQLは、インストール時にLinuxユーザー「postgres」を追加し、これがPostgreSQLのスーパーユーザーとなります(インストール直後は「postgres」以外のLinuxユーザーでは起動出来ません)。そのため、Linuxユーザーを「postgres」に変更してからPostgreSQLを起動し、バージョンを確認する流れになります。

$ sudo su postgres
$ psql —version
以上になります。

2019年7月10日水曜日

PythonでPostgreSQLを操作する方法

概要

PythonでPostgreSQLを操作するライブラリpsycopg2をインストールし、Pythonプログラムから実行するまでの手順を説明します。

用語

・Ubuntu:LinuxのOS。
・Python:機械学習プログラミングに人気のプログラミング言語。
・PostgresSQL:オープンソースのRDBMS。
・psycopg2:PythonからPostgreSQLを操作するためのライブラリ。

事前準備(前提とする環境)

・Ubuntu14.04
・Python2(バージョン2.7.2)
・PostgresSQL(バージョン9.3.24)

手順

psycopg2をインストール

psycopg2をインストールします。

$ sudo apt-get install python-dev libpq-dev
$ sudo apt-get install python-psycipg2
$ sudo pip install -U psycopg2

Pythonのサンプルプログラム(sample.py)

以下のとおりプログラムを書きます。今回は、pythonのPostgreSQLのバージョンを取得するだけのクエリです。

import sys
import psycopg2

# メイン処理
def main():
    # 事前処理(コネクションの生成)
    # パラメータでDB名、ユーザー名、パスワード、ホスト名(IPアドレス)を指定する
    conn = psycopg2.connect('dbname=hoge user=postgres password=postgres host=172.16.0.1')
    cur = conn.cursor()

    # クエリ実行
    cur.execute("select version()")

    # コミット(今回はselectなのでコミットは不要)
    # conn.commit()

    # 事後処理(コネクションクローズ)
    conn.close()

# プログラム開始処理
if __name__ == '__main__':
    main()

実行結果

$ python sample.py
                                                   version
--------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.3.24 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4, 64-bit

2019年7月8日月曜日

Vagrantで構築したCentOSゲストマシンにRランタイムをインストールする方法

概要

Rを開発出来る環境であるR Studio SeverをVagrantで作成したCentOSのゲストマシンに構築する手順のメモです。

用語

・CentOS:LinuxのOS。
・R:統計解析向けプログラミング言語
・R Studio Server:Linuxサーバー上で走っているRに対してブラウザベースのインターフェースを提供するアプリケーション

事前準備(前提とする環境)

・CentOS7.6.1810

手順

ゲストマシンのポートフォワーディング設定

ホストマシンからアクセス出来るように「Vagrant」ファイルの設定を修正します下記のとおり修正します。

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "private_network", ip: "192.168.33.10"  # ←ここの行を追加

上記の設定変更が完了した後、Vagrantをupしてゲストマシンに接続します。

R runtimeをインストール

事前に、CentOS 標準のリポジトリでは提供されていないパッケージをyumコマンドでインストール出来るようにするために、下記コマンドでepelをインストールします

$ sudo yum install epel-release

下記事前準備が完了したら、コマンドを実行してR runtimeをインストールをインストールします。

$ sudo yum install R

R Studio Serverをインストール

以下のコマンドでR Studio Serverの公式からrpmをwgetしてインストールします

$ wget https://download2.rstudio.org/server/centos6/x86_64/rstudio-server-rhel-1.2.1335-x86_64.rpm
$ sudo yum install rstudio-server-rhel-1.2.1335-x86_64.rpm

R Studio Serverの起動とホストマシンからのログイン

下記コマンドでR Studioサーバーを起動します。(備忘でstopとrestartも残しておきます)

$ sudo rstudio-server stop
$ sudo rstudio-server start
$ sudo rstudio-server restart

起動したらホストマシンからアクセスします。
アクセスするアドレスは以下です。
http://192.168.33.10:8787/
アクセスに成功するとログイン画面が表示され、ユーザーIDとパスワードの入力を求められます。それらはR Studio ServerのIDとパスワードの情報を引き継いでいるので、「vagrant/vagrant」でログイン出来ます。

2019年7月7日日曜日

UbuntuでOSError: [Errno 98] Address already in useが出た時のプロセス終了方法

概要

UbuntuでOSError: [Errno 98] Address already in useが出た時のプロセス終了方法メモです。

手順

そもそもこのエラーが出る原因は、前回に実行した同プロセスが残ってしまっているためです。そこで、残ってしまっているプロセスはどれかを確認し、同プロセスを終了させることで解決できます。

まず、残ってしまっているプロセスは何かを以下で調べます。

$ sudo apt-get install npm
$ lsof -i :5000
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python3 2347 vagrant    4u  IPv4  14177      0t0  TCP *:5000 (LISTEN)
python3 2347 vagrant    6u  IPv4  15482      0t0  TCP vagrant-ubuntu-trusty-64:5000->192.168.33.1:51772 (CLOSE_WAIT)

※5000はポート番号です。状況にあわせて変更してください。

続いて、当該プロセスを終了させます。

$ sudo apt-get install npm
$ kill -9 2347

※「-9」はプロセスを強制killするためのオプションです。

以上になります。

2019年7月6日土曜日

Vagrantでローカル環境に自作のBoxファイルを作成・展開する方法

概要

Vagrantでローカル環境に自作のBoxファイルを作成・展開する方法を記載します。

用語

・Vagrant:Virtual Boxに仮想環境を構築するためのツール。
・Box:仮想マシンのイメージと構成情報を記述した設定ファイル

事前準備(前提とする環境)

・Windows10 Pro 1803 ・Vagrant

手順

boxの作成

box作成はホストマシンで以下コマンドで実施します。

$ cd 
$ vagrant package

boxの展開

$ cd 
$ vagrant box add my_ubuntu package.box
$ vagrant init my_ubuntu
$ vagrant up
以上になります。

2019年7月4日木曜日

Rでxlsxファイルをopen/closeする方法

概要

Rでxlsxファイルをopenするための手順メモです。

xlsxを操作するパッケージは幾つかありますが、openxlsxが使いやすいかと思いましたのでその使い方をまとめます。


用語

・R:統計解析向けプログラミング言語
・openxlsx:Rでエクセルファイルのopen、read、writeを実装したライブラリ
    

手順

openxlsxをインストール

openxlsxをインストールします。インストールは「install.packages('openxlsx')」と入力するだけです。

> install.packages('openxlsx')
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/ken/Documents/R/win-library/4.0’
(as ‘lib’ is unspecified)
also installing the dependencies ‘Rcpp’, ‘zip’, ‘stringi’

 URL 'https://cran.rstudio.com/bin/windows/contrib/4.0/Rcpp_1.0.5.zip' を試しています 
Content type 'application/zip' length 3265686 bytes (3.1 MB)
downloaded 3.1 MB

 URL 'https://cran.rstudio.com/bin/windows/contrib/4.0/zip_2.1.1.zip' を試しています 
Content type 'application/zip' length 1119105 bytes (1.1 MB)
downloaded 1.1 MB

 URL 'https://cran.rstudio.com/bin/windows/contrib/4.0/stringi_1.5.3.zip' を試しています 
Content type 'application/zip' length 15243599 bytes (14.5 MB)
downloaded 14.5 MB

 URL 'https://cran.rstudio.com/bin/windows/contrib/4.0/openxlsx_4.2.3.zip' を試しています 
Content type 'application/zip' length 2756703 bytes (2.6 MB)
downloaded 2.6 MB

package ‘Rcpp’ successfully unpacked and MD5 sums checked
package ‘zip’ successfully unpacked and MD5 sums checked
package ‘stringi’ successfully unpacked and MD5 sums checked
package ‘openxlsx’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\ken\AppData\Local\Temp\RtmpSw6Td8\downloaded_packages
「package ‘openxlsx’ successfully unpacked and MD5 sums checked」
と表示されればインストール成功です。

実行

以下のように記述すればエクセルの内容を取得・アウトプット出来ます。

> library(openxlsx)
> # Linuxの場合。ホームディレクトリからのパスを入力しないとダメ
> df <- read.xlsx("./shared/hoge.xlsx", sheet=1)
> # Windowsの場合。相対パスでも出来るがわかりにくいので絶対パスで記載。
> df <- read.xlsx("C:/Users/ken/hoge.xlsx", sheet=1)
> # オープンするシートは上記のシート番号の他に、シート名を指定しても開くことが可能。
> df <- read.xlsx("C:/Users/ken/hoge.xlsx", sheet="Sheet1")

逆に、データフレームをエクセルにアウトプットするのは以下のとおりです。

> write.xlsx("C:/Users/ken/hoge.xlsx", sheet=1)
> write.xlsx(hoge, "C:/Users/ken/hoge.xlsx", row.names=FALSE)

本日はここまでで。

2019年7月3日水曜日

Windows 10の「Microsoft IME の変換精度を高めるため、誤変換データ収集にご協力ください」の通知を表示させなくする方法

概要

Windows 10の「Microsoft IME の変換精度を高めるため、誤変換データ収集にご協力ください」の通知を表示させなくする方法のメモです。

手順

Microsoft IMEの「誤変換データ収集に協力する」のチェックボックスを外す手法が巷では数多く紹介されています。が、実際やってみると、チェックボックスを外すだけでは消えず、通知は引き続き表示されてしまいます。

通知を消す唯一の方法は、文字入力のアプリケーションとして「Microsoft IME」以外のものを用いる事です。文字入力アプリケーションは幾つか存在しますが、最もメジャーなものの1つであるgoogleの文字入力アプリケーションを「https://tools.google.com/dlpage/japaneseinput/eula.html?platform=win」からダウンロードする事が、通知作成の簡単な削除方法になります。

以上になります。

FX自動トレード_2021年6月実績

      概要 2021年6月が終わり、FX自動トレードによる収益実績を取り纏めましたので振り返ってみたいと思います。 2021年6月結果 2021年6月の実績は、実利利益額:\66,761、実績利益率は1.42%でした。 今月もボラが全く出ず。利益率の連続過去最低記録更新は免...