« ドスパラの今どきのスティックPCは意外と使える!? | トップページ | GPD Pocket2の廉価版モデルが性能アップ »

2019年2月20日 (水)

SONY Neural Network Consoleで独自データの学習・推論をやらせてみた

以前から気にはなっていたのですが、ようやく使ってみることにしました、SONYのNeural Network Console。

GUIでニューラルネットワークが組めて、簡単にディープラーニングが体験できるという優れもの。実は、Kerasなどと比べると計算速度が遅いので、あまり実用には向いていないかもしれませんが、簡単な画像認識に使ってみたり、あるいは教育用にはうってつけなツールです。

てことで、独自データで組んでみるところまでをやってみます。

まずは、以下のサイトから入手します。

Neural Network Console

「Windowsアプリで始める」をクリックすると、メールアドレスを聞かれます。そこにメアドを入れると、ダウンロードページのリンクが帰ってくるので、それに従ってダウンロードします。

すると「neural_network_console_130.zip」というのが落ちてくるので、それを解凍。

(130のところはバージョンナンバー。私が落としたのは1.3.6897.7956でした)

まずはインストール・・・ですが、方法はとっても簡単。

ZIPファイルを解凍して、出てきたフォルダを適当なところに置くだけ。デスクトップでも可。

これで、完了です。

ただし、全角文字やスペースの入ったフォルダの下にはおけません。このため、ユーザー名に全角文字を使っている人は、デスクトップは不可(絶対パスに全角文字が入るため)。また、「Program Files」もダメ。

その場合は、例えばCドライブの下に「neural_network_console_130」フォルダを作り、そこに入れるのがいいでしょう。

Nnc01

フォルダの中は、こうなっているはずです。「neural_network_console.exe」をダブルクリック。

最初は規約だの環境だのをいろいろと聞かれるはずです。

Nnc02

で、こんな感じの画面にたどり着くはずです。

真ん中には、サンプルデータがいくつか入っています。

とりあえず動かしてみたい方は、チュートリアル(チュートリアル:サンプルプロジェクトを用いた学習 – Docs - Neural Network Console)を参考に動かしてみるといいと思います。

ここでは、いきなり独自データを使います。

さて、まずは「教師データ」を準備します。

私の過去のディープラーニング用コード(TensorFlowの画像認識プログラムをKerasに書き換えてみた: EeePCの軌跡等)と似てますが、SONY Neural Network Consoleは、ラベルごとにフォルダ分けした画像データを読み込んで、教師データと評価用データとして使うようになっています。

まずは、それを準備。

私は過去に作った(TensorFlowで”日本のお城”を識別させてみた: EeePCの軌跡参照)”お城”データを使いました。

まず、私の今回のテストのフォルダ構成ですが、以下のようにしました。

【学習環境】

Neural Network Console:デスクトップ\neural_network_console_130

(パスは”C:\Users\{半角小文字のユーザー名}\Desktop\neural_network_console_130”)

【教師データ置き場と推論コードの置き場】

C:\linux\nncs\

まず、C:\linux\nncsに「data」というフォルダを作り、7種類のお城のデータを入れます。

Nnc03

本当は「inuyama」(犬山城)、「kumamoto」(熊本城)のように長い名前だったんですが、どういうわけか長い名前だと読みません。5文字程度に抑えた方がよさそうです。

中身はこんな感じ。

Castle02

フリーソフトVIXなどを使い、全てのフォルダ内の画像サイズを64×64にしておいてください。

また、画像ファイル以外を入れないよう注意してください。

Neural Network Console側でこのデータセットを格納するフォルダをあらかじめ作ります。

私は「C:\Users\{半角小文字のユーザー名}\Desktop\neural_network_console_130」の下に「dataset_out」というフォルダを作っておきました。

これで、教師データの準備は完了。

Neural Network Consoleへ行き、左端の「DATASET」をクリックし、その近くにある「+Create Dataset」をクリックします。

Nnc04

こんな画面が出ます。私の環境では以下の項目を書き換えました。

・Source Dir: C:\linux\nncs\data

・Output Dir: C:\Users\{半角小文字のユーザー名}\Desktop\neural_network_console_130\dataset_out

・Output Color Ch: 3(RGB)

・Output Width: 64

・Output Height: 64

・Output file 1: の後ろのRatio(%): 90

・Output file 2: の後ろのRatio(%): 10

これで、教師データの作成が完了。学習用が90%、バリデーション用が10%に自動で割り振られるはずです。

ちなみに、DATASETの一覧に「train.csv」「test.csv」というのができるはずです。

例えば「train.csv」をクリックすると、こんな画面に。

Nnc05

IndexNo.と画像の横、そしてラベル名(ここでは0~6)が割り振られます。

ここでは、

0:犬山城
1:熊本城
2:松本城
3:名古屋城
4:大垣城
5:岡崎城
6:大坂城

となってました。

これ、推論の時に使うので、事前に調べておいてください。

教師データができたので、今度はニューラルネットワークを作ります。

左端の「PROJECT」をクリックし、「+New Project」をクリックします。

Nnc06

こんなまっさらな画面が出てくるはずです。

まずはここでこのからプロジェクトを保存しておきます。上のディスクのアイコンをクリックすると、保存できます。

私は「C:\Users\{半角小文字のユーザー名}\Desktop\neural_network_console_13」フォルダの下に「castle」という名前のフォルダを作り、「castle.sdcproj」という名前で保存しました。

ではいよいよ、ここにニューラルネットワークを作っていきます。

Nnc07

まずは、「IO」-「Input」をぴゅーっと引っ張ってやります。

こんな感じに、ブロックができます。

Nnc08

ですが、このままでは使えません。

左下にある「Layer Property」のSizeのところを「1,28,28」を「3,64,64」に変えてやります。

これでRGBの64×64の画像が読めるようになります。

続いて、下の方にある「Basic」-「Convolution」を、さきほどのInputにぶつけるようにドラッグ&ドロップします。

Nnc09

ただし、こいつもデフォルトでは使えません。Layer Propertyをいじります。

Nnc10

私はKernelShapeを「5,5」から「3,3」に、Paddingを「0,0」から「1,1」に変えます。

もしPaddingを「0,0」のままにすると、Convolution層を通るたびに画像サイズが上下左右1ドットづつ小さくなっていきます。これを防ぐために、Paddingに入れた分だけ補正して増やしてやる必要があります。

もしKernelShapeを「5,5」のままにするならば、Paddingを「2,2」とすると画像サイズが小さくならずに済みます。

続いて、「Activation」の「ReLU」をドラッグ&ドロップします。

が、左のメニューからこの「ReLU」が探せなくなっているはず。

どういうわけかこの左メニューはホイールマウスのスクロール機能が効きません。頑張ってマウスでニューラルネットワークの部品の並んだ窓の端にあるバーをつまんで、動かすしかありません。

Nnc11

ReLUはデフォルトのままでいいです。

同様に、「Pooling」-「MaxPooling」をつけます。

Nnc12

で、この後、第2層目、第3層目のConvolution - ReLU - MaxPoolingのセットを作ります。

Nnc13

だたし、

【2つ目のConvolutionのLayer Property】

・OutMaps : 「32」

・KernelShape:「3,3」

・Padding:「1,1」

【3つ目のConvolutionのLayer Property】

・OutMaps : 「64」

・KernelShape:「3,3」

・Padding:「1,1」

としてください。

その下に、「Basic」-「Affine」をつけます。

Nnc14

Layer Propertyの「OutShape」を512としてください。

その下にReLUを付けた後、左の部品メニューのずーっと下にある「Other」-「Dropout」を引っ付けてください。なくてもいいですが、過学習を防ぐため、あったほうが無難です。

Nnc15

最後に、Affine(Layer PropertyのOutShapeをラベル数に、ここでは「7」)、「Activation」-「Softmax」をつけて、最後に「Loss」-「CategoricalCrossEntropy」というのを引っ付けてください。

Nnc16b

これで、完了です。

さて、ここで教師データを選んでやります。

画面の赤丸のある辺りにある「DATASET」をクリックします。

Nnc18

分かりにくい図で申し訳ありませんが、まず左の「Training」を選び、右の斜め上矢印と四角のアイコンをクリックし、そこで現れる一覧から「train.csv」を選びます。

同様に、「Validation」では「test.csv」を選択します。

続いて、画面右上のある「CONFIG」をクリックして、以下のような画面を出します。

Nnc19

ここでは、Max Epoch:を50に、Batch Size:を20、Precision:をHalfとしておきました。

Nnc20

ここでようやく学習開始です。「Training」の下の再生ボタンっぽいのを押しましょう。 

Nnc21a

こんな感じに、なんか学習が進みます。正常なら、エラー率がどんどん減っていくはずです。

終わったら、横の「Evaluation」の再生ボタンを押してみましょう。

Nnc22a

評価用の画像と、その推測ラベルが表示されます。

「Confusion Matrix」というラジオボタンを押すと、各ラベルと全体の正答率が出てきます。

Nnc23

なんと、Accuracyが「1.0」でした!全問正解!たまたまでしょうが、すごい正答率ですね。

さて、今度はこれを使って「推論コード」を作ります。

ここまではノンプログラミングでしたが、推論に関してはそれを使って何かをさせる必要があるため(不良品を見つけて機械を止めるとか、画像を見て機械に仕分けさせるとか)、Pythonのコードに持っていくのがベターかと思われます。

そこで、今回学習させた学習器を使って推論をさせるPythonプログラムの最低限の作り方を書きます。

その前に、まずはWindows上でAnaconda3を使えるようにしておいてください。

SONY Neural Network Consoleで作ったニューラルネットワークとモデルを使うための最低限の準備は、以下の記事を参照。

NNabla(Neural Network Libraries)をWindowsのanaconda(python3)環境にインストール - "BOKU"のITな日常

この記事に加えて、ここではOpenCVを使うため

> pip install opencv-python

も入れておいてください。

ここで設定したAnacondaプロンプトが使えることを前提として、進めます。

まず、先ほど学習の終わったNeural Network Consoleで、左上の「EDIT」をクリックします。

Nnc24

そこでまず一番下のブロック「CategoricalCrossEntropy」を消します。

そのうえで右クリックすると、上のようなメニューが出るので、「Export」-「Python Code」を選択します。

Nnc25

クリップボードにコードが張り付けられた旨が表示されるため、適当なテキストエディタに張り付けてください。

Nnc26

(ここでは、VS Codeに張り付け)

こんな感じに、コードが張り付きます。

その下に、以下のコードを張り付けてください。

import cv2
# load parameters
nn.load_parameters('モデルのパス')

# Prepare input variable
x=nn.Variable((1,3,64,64))

IMAGE_SIZE = 64
im = cv2.imread('推論させたい画像ファイル名')
im = cv2.resize(im, (IMAGE_SIZE,IMAGE_SIZE)).transpose(2,0,1)
x = nn.Variable((1, ) + im.shape)
x.d = im.reshape(x.shape)

# Build network for inference
y = network(x, test=True)

# Execute inference
y.forward()
print(y.d)

赤字の部分を2箇所変えます。

「モデルのパス」のところですが、SONY Neural Network Consoleのプロジェクトを保存したフォルダに「(プロジェクト名).files」というのがあって、その下に日付っぽいフォルダがあり、その下に学習済みモデルが入っています。

Nnc27

こんな感じのファイルがあるはずです。

この中の「results.nnp」というのが、学習済みモデルです。

このパスを上の「モデルのパス」のところに記載してもいいですし、Pythonプログラムと同じ場所において「./results.nnp」としてもいいです。

画像は

これを「test_app.py」と保存します。

これを実行

> python test_app.py

すると、以下のような結果が。

Nnc28

うーん、分かりにくいですよね。

最後に出てくる”[[1. 0. 0. 0. 0. 0. 0.]]”というのが推論結果なんですが・・・

これは、要するに0~7のラベルの内、この画像はラベル0だ!と言っているんです。

ちなみに、推論させた画像はこれ。

2_inuyama01

ちなみに、事前に調べておいたラベルによれば・・・

0:犬山城
1:熊本城
2:松本城
3:名古屋城
4:大垣城
5:岡崎城
6:大坂城

だったので、ラベル0 = 犬山城 ということになります。

つまり、正解!

他にも

3_matumoto01

を入れてみると

Nnc29

ラベル2ということだから・・・松本城!正解です!

という具合に、まあまあの学習モデルができて、しかもPython上で動かすところまで行けました。

サンプルも充実しているので、このNeural Network Console、結構使えそうです。

ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

« ドスパラの今どきのスティックPCは意外と使える!? | トップページ | GPD Pocket2の廉価版モデルが性能アップ »

数値解析系」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: SONY Neural Network Consoleで独自データの学習・推論をやらせてみた:

« ドスパラの今どきのスティックPCは意外と使える!? | トップページ | GPD Pocket2の廉価版モデルが性能アップ »

当ブログ内検索

スポンサード リンク

ブログ村

無料ブログはココログ