皆様、お久しぶりです。LeapMindのインターン生、堂園です。
前回のブログの続き(見ていない方は、コチラからどうぞ)、後編でございます。
まずは大まかな作業フローをご紹介いたします。
◾️DeLTA-Liteで学習モデル作成
↓
◾️DeLTA-Kitを使ってエッジ側で推論
という流れで進めます。
1. DeLTA-Liteで学習モデル作成
前回の続きですが、OpenCVでトリミング、オーグメンテーションまで完了した教師データ(Smile:2503枚、Not_Smile:2468枚)を使ってモデルを作成します。
本当はTensorFlowを使ってモデル作成をしたかったのですが、TensorFlow、正直わかりません。書けません。
ですので、ここはマウスをぽちぽちするだけでモデルが作成できるプロダクトの力をお借りして、モデルを作成します。
(今回のブログの内容は、DeLTA-Liteの使い方を伝えたい訳ではないので、細かい使い方はご紹介しません。細かい使い方を知りたい方はYoutubeに動画があります。そちらをご覧ください!)
Link: https://www.youtube.com/watch?v=WblTYpLhHWM&t=3s
さらに、上記の動画には無い朗報があります。
僕が後編を書いている最中にDeLTA-Liteがアップデートされました!!
「高度な設定」機能が追加され、学習率の設定や自動オーグメンテーション機能が追加されました。
あれ、そういや、オーグメンテーション前回OpenCV使って、セルフでかけてモタ...
まあ、気にせずモデル構築しますか。。。
では、実際にモデル構築していきます!
■ 1回目
【トレーニング用データセット】
データセット名:Smile or Not Smile 3
・Smile : 2485枚
・Not_Smile : 2462枚
(前編の時より枚数が少し減っておりますが、もう一回データを全部確認しました。ノイズが乗りすぎている画像や、色を変化させて何かわからなくなった画像等を除去しました。その作業を行った3回目のモノになるので、3という文字がついております。。。めっちゃ大変でした...)
【評価用データセット】
今回は個別で登録しません。
(登録しない場合は、アップロードしたデータセット(今回はSmile or NotSmile 3)を、DeLTA-Liteがランダムに9:1に分けます。そして10%の方を評価用データセットとして自動登録します。)
【エポック数】
100
【学習率の初期値】
0.1
【学習率の設定】
2段階の減衰
【データオーグメンテーション】
- クロップ
- 左右反転
- 色の変化
よし、これでトレーニング実行!
現在19時、明日の朝確認しよう...
よし、結果を見てみます。
んん? TrainとValidationが共に1.00。。。
なんかおかしい。
ハイパーパラメーターを再調整して、もう一回トレーニングしてみます。
■ 2回目
【トレーニング用データセット】
1回目と同じ
【評価用データセット】
1回目と同じで、トレーニング用データセットから自動で登録します。
【エポック数】
65
【学習率の初期値】
0.05
【学習率の設定】
2段階の減衰
【データオーグメンテーション】
- クロップ
- 左右反転
- 色の変化
これでトレーニングを実行してみます。
また同じ現状...
何でだろう?
相談したり、調べたりして、ついに1つの仮説を導きました。
トレーニングデータとテストデータのバリエーションがほぼ一緒なのではないか?
もう少し掘り下げてみます。
- トレーニングデータには元のデータと、オーグメンテーションされたデータが入っている。
- オーグメンテーションされたデータは、元データに似ている。(元データにノイズを乗せたり、色を変えたりしている)
- そのトレーニングデータを9:1にランダムに分けて、1の方をテストデータとして使用している。
ということは、「テストデータの中に、トレーニングデータと似ているデータが入っている可能性がある」ということになります。
では、この仮説が正しいのか検証してみます。
■3回目
1、2回目との設定の違いをまとめます。
- テストデータは別途用意して、評価用データセットとしてアップロードする。
- 「高度な設定」機能のみを使ってオーグメンテーションするため、トレーニングデータには元データのみを登録。(トレーニングデータをシンプルにします。)
上記の2点を考慮して、準備します。
【トレーニング用データセット】
データセット名:Smile or Not Smile_Train
・Smile : 649枚
・Not_Smile : 411枚
【評価用データセット】
データセット名:Smile or Not Smile_Test
・Smile : 181枚
・Not_Smile : 181枚
(人のオープンデータをダウンロードして、笑顔と真顔の画像を抽出して、評価用データセットとして使用しました。これもまたまた人力の作業...)
【エポック数】
250
【学習率の初期値】
0.01
【学習率の設定】
2段階の減衰
【データオーグメンテーション】
- クロップ
- 左右反転
- 色の変化
- 短形領域の消去
さて、これでトレーニング実行します!
(だいたい4時間後)
トレーニングが終わったので、結果を見てみます。
Train:0.95
Validation:0.93
いいんじゃないですか??
どっちも精度が100%になる問題は解決しました!
よし、ではこのモデルをDeLTA-Kitの方に書き込んで、実際に推論してみます。
2. DeLTA-Kitを使ってエッジ側で推論
さて、ここまでで学習のフェーズは完了しました。
次は推論です。
エッジ側で推論となると、モデルをコンパイルして、書き込むハードウェアに最適化する必要があります。
DeLTA-Liteでは作ったモデルをFPGA用のバイナリーデーターとしてダウンロードできます。
ハードウェア全然詳しくない&コンパイラー書けない私にとって、この機能はめちゃめちゃありがたいです。
では、この機能を利用して、DeLTA-Kitに書き込みたいと思います。
ダウンロードボタンを押すと、result.zipというファイルをダウンロードできます。
これをDeLTA-Kitに書き込み、解凍して、実行!!
いい感じですねー。しっかりと笑顔と認識しています。
真顔もしっかりと認識しています。
まとめ
今回、実際に素人がDeep Learningのモデルを作ってみて、全体を通して感じたことをまとめます。
- データセットのクリーニングなど、結局は1枚1枚人間の目で見る必要がある。
- 1回でいいモデルは出来ないので、複数回トレーニングしなければならない。
- 精度向上のための仮説を立てて、すぐに検証(トレーニング)する形が効率良さそう。
- ネットワークの構造よりも、データセットのクリーニングなど人力&スマートではない部分がかなり大事だと実感。
データセットの準備だけでもかなり時間がかかったので、このような簡単にDeep Learningのモデルが構築できるツールを使って、すぐに検証するというのは効率が良かったかなーと思います。
(ネットワーク構築の部分も自分でやろうとなると、TensorFlowの勉強やサーバー準備など、今から始めると1年くらいかかりそう...)
前編、後編とお付き合いいただきありがとうござました!
それでは!!
Back to Index