Watson Studioで自動運転に必要な画像処理技術を学ぶ（３）の前半

自動運転に必要な画像処理技術シリーズの3回目。今回は道路標識の認識です。今回も参照先は以下になります。

https://github.com/aruizga7/Self-Driving-Car-in-DSX

今回は上記で提供されるコードそのままではなく、Watson Studio独自の機能である、Neural Network Modelerを使用してみます。前半ではモデルを構築し、後半ではモデルを使って標識認識のアプリを作成します。

# 道路標識の認識
今回は[こちら](http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset)で公開されている、German Traffic Sign Dataset を使用します。以下のような道路標識の画像とそのクラス（43分類）のデータが提供されています。Neural Network Modeler作成したネットワークをこれらのデータで学習し、分類ができることをテストします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/7c1cf07c-3a28-c098-cbde-39324c998bb7.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/8e1c6e05-1c6a-8987-fc35-ae73b4666231.png)


# 手順
## データの取得
データを取得し保管するためにIBM Cloud Object Storage(ICOS) にバケットを作成します。バケットの作成は以下等を参照してください。

https://qiita.com/schiyoda/items/c1fe7438e50087ff97ef

Watson Studioでプロジェクトを作成して、以下リンク先から Notebook を作成します。
https://github.com/schiyoda/Self-Driving-Car/blob/master/3.1.Prepare-Data.ipynb

NotebookでICOSのcredentialとバケット名を指定した上で、全て実行すると、データをpickleに変換した上で、ICOSに保管されます。

## Neural Networkの構築
Watson Studioで適当なプロジェクトを作成します。プロジェクトのSettingsタブからWatson Machine Learningのサービスを紐付けておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/634ad6e8-7b2a-1d7a-6408-b2fa6639cb46.png)

Assets タブに戻り、新規 Modeler Flow を作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/45b2b09d-f224-3078-3fcc-22e5dd6423e0.png)

左側のパレットからNeural Networkの入力となる Image Data をドラッグ&ドロップします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/034f0dca-b9ea-b5b9-1938-febb400f350f.png)

Image Data をダブルクリックすると右側にパネルが表示されるので以下のように設定します。

1. Data Connections -> Connection to project COS(デフォルト)
2. Backets -> 先の手順でpickleを保存したバケット
3. Train data file -> training_data.pkl
4. Image height, Image width -> 32, 32
5. Classes -> 43
6. Data format -> Python Pickle
7. Epochs -> 50

>Test data file, Validation data file を指定しないと、学習時にTrain dataを分割して Test, Validation に使用します。

以降、以下のようにノードを配置してネットワークを構成します。

1. Image Data（構成済み）
2. Conv 2D 
    - Number of filters -> 6
    - Kernel row, Kernel col -> 5, 5
    - Weight LR multiplier,Weight decay multiplier -> 1, 1
    - Bias LR multiplier, Bias decay multiplier -> 1, 1
3. ReLU
4. Pool 2D
    - Kernel row, Kernel col -> 2, 2
    - Stride row, Stride col -> 2, 2
5. Conv 2D 
    - Number of filters -> 16
    - Kernel row, Kernel col -> 5, 5
    - Weight LR multiplier,Weight decay multiplier -> 1, 1
    - Bias LR multiplier, Bias decay multiplier -> 1, 1
6. ReLU
7. Pool 2D
    - Kernel row, Kernel col -> 2, 2
    - Stride row, Stride col -> 2, 2
8. Flatten
9. Dense
    - #nodes -> 120
10. ReLU
11. Dense
    - #nodes -> 84
12. ReLU
13. Dense
    - #nodes -> 43
14. Softmax
15. Accuracy, Cross-Entropy Loss (Softmaxから2箇所に繋ぐ)
16. Adam
    - Learning rate -> 0.01
 
完成したネットワークは以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/c628158c-4f58-ac30-398d-238d194985e1.png)

右上の![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/1e8bfc53-c916-9adc-f5c1-bd32c971ba8d.png)をクリックし、training definition として publish します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/f606e81d-6f9e-7407-ece9-a7ee65a615c6.png)

プロジェクトのページに戻り、新規 Experiment を作成します。

Cloud Object Storage bucket for storing training source files、Cloud Object Storage bucket for storing results には Existing connectionsから先の手順で作成した既存のバケットを選択します。

Add training definition では Existing training definition から先の手順で publish した training definition を選択します。

Compute plan は K80(1GPU)を選択します。

設定が完了したら以下の画面で Create and run をクリックし、学習を開始します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/3665307f-e25e-27b5-9692-0882cb547ceb.png)

学習が開始すると、以下のよう学習曲線や実行のログや参照可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/379315f4-ef52-2e4a-0614-07494e58b339.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/c0c8513f-e861-d0b5-ff93-1767e117010f.png)

学習が完了するとステータスが Completed となります。今回の学習の結果、79%くらいのAccuracyのモデルが構築できたことが分かります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/fa177ac3-d07d-2564-9109-4bd0c62332b5.png)

次回は、このモデルを使って標識認識のアプリを作成してみます。