Neural Network Consoleでキャラ判定

SONYが公開しているNeural Network Console を使用して、キャラクター判定をさせてみました。

NNCはWindows用なのですが、学習させたモデルの利用はMac(Anaconda + Python 3.6)でも動作しました。

ヴィヴィオとアインハルトのみですので適当に答えても50%の確率なので、あまり面白みはないけど…

Neural Network Console

https://dl.sony.com/ja/

SONYが公開しているニューラルネットワークを作成するためのGUI環境です。

今回は以下のようなネットワークを作成してみました。

 ネットワーク構成

 学習状況(2000Epoch)

画像データはBingの画像検索を使用してヴィヴィオとアインハルトの画像を収集しました。

画像については以下のルールで生成しています。

  • 変身前か変身後は関係なくキャラクター毎に30枚程度を用意
  • 描かれているキャラクターは一人だけ(背景はあってもなくてもよい)
  • 画像サイズは64×64に縮小(パディングは0(黒)で行う)

画像はかなり少ないのですが2000Epoch程学習をさせて、評価を行います。

評価方法

NNC上でも評価出来るのですが、生成したモデルをPythonやC++から使用することが出来ます。

今回は以下のようなコードを生成しました。

# -*- coding: utf-8 -*-
import sys

import nnabla as nn
import nnabla.utils.data_source_loader as U_dsl
import nnabla.functions as F
import nnabla.parametric_functions as PF

# Neural Network Console から出力した Python コード
# ---- ここから ----
def network(x, y, test=False):
    # Input -> 3,64,64
    # Convolution -> 16,31,31
    with nn.parameter_scope('Convolution'):
        h = PF.convolution(x, 16, (3,3), (0,0), (2,2))
    # ReLU
    h = F.relu(h, True)
    # MaxPooling -> 16,16,16
    h = F.max_pooling(h, (2,2), (2,2))
    # Dropout_2
    if not test:
        h = F.dropout(h, 0.2)
    # Convolution_2 -> 27,7,7
    with nn.parameter_scope('Convolution_2'):
        h = PF.convolution(h, 27, (3,3), (0,0), (2,2))
    # ReLU_5
    h = F.relu(h, True)
    # Convolution_3 -> 16,3,3
    with nn.parameter_scope('Convolution_3'):
        h = PF.convolution(h, 16, (3,3), (0,0), (2,2))
    # ReLU_3
    h = F.relu(h, True)
    # Dropout
    if not test:
        h = F.dropout(h)
    # Affine -> 20
    with nn.parameter_scope('Affine'):
        h = PF.affine(h, (20,))
    # ReLU_4
    h = F.relu(h, True)
    # Affine_2 -> 10
    with nn.parameter_scope('Affine_2'):
        h = PF.affine(h, (10,))
    # ReLU_2
    h = F.relu(h, True)
    # Affine_4 -> 1
    with nn.parameter_scope('Affine_4'):
        h = PF.affine(h, (1,))
    # SquaredError
    # ここはコメントアウト
    # h = F.squared_error(h, y)

    return h
# ---- ここまで ---- 

def main():

    nn.clear_parameters()
    nn.load_parameters("parameters.h5")

    x = nn.Variable(shape=(1, 3, 64, 64))
    y = network(x, None)

    x.d = U_dsl.load_image(sys.argv[1], shape=(3, 64, 64), normalize=True)

    y.forward()

    print(y.d)

if __name__ == "__main__":
    main()

# [EOF]

学習結果はフォルダにHDF5形式で格納されていますので、そのまま使用することが出来ます。

ソースコードもNNCが生成したものをそのまま使用可能となっています。

評価に使用するデータ

画像は自分が描いた2枚の画像を使用してみました。

 ヴィヴィオ( vivio = 1 )

 アインハルト( einhald = 0 )

実行結果

 0.978

 0.042

0に近いほどアインハルト、1に近いほどヴィヴィオという判定が出るように学習させましたので、どうやら正しく判定してくれたようです。

自分以外の絵でも試してみましたが、正答率は80%ぐらいでした。

.