« ドスパラの今どきのスティック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の廉価版モデルが性能アップ »

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

コメント

USBカメラをつないでリアルタイムで推論するやり方がわかれば書いていただくことはできますか。
(急いでいます)

はじめまして。

適切なネットワークの組み方について意見をいただくのは可能でしょうか?

> 所紀代香 さん

返事遅れました。適切なネットワーク、に対する回答になるかどうかですが。

最近の画像認識では「転移学習」「ファインチューニング」と呼ばれる、既存のニューラルネットワーク構造+学習済みデータを用いて学習させるという手法が一般的です。

このため私自身も最近の業務で、Convolusion層+ReLU層+MaxPooling層の組み合わせを自身で構築するということがなくなってます。

ちょっと探してみたのですが、SONY Neural Netowrk Consoleを使った転移学習の事例は見つかりませんでした。こちらではどうやら、実装されていない模様です。

転移学習、ファインチューニングで参考になりそうな記事で、比較的とりかかりやすいものは、

https://qiita.com/ps010/items/dee9413d3de28de7d2f9

か、こちらのブログなら、

https://arkouji.cocolog-nifty.com/blog/2020/12/post-eaffd7.html

辺りになります。ご参考まで。

コメントを書く

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

トラックバック


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

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

無料ブログはココログ

スポンサード リンク

ブログ村