ディープラーニングの画像認識精度向上に関する工夫に関しての補足
以下LTで「AI x IoTデバイスとしての Google Vision Kitの可能性と使いこなし」というタイトルでLTしました。
この記事では、上記のLTでは、話しきれなかったことの補足をしようと思います。
タスクとしては、Vision Kitを使ってディープラーニングで、手の形を「グー」「チョキ」「パー」を認識してジャンケンするというたわいのないものです。詳細は以下記事参照下さい。
実際に、デモで使うにあたって、こんな工夫をしたよという話です。特別難しいことをしているわけでなく、地味な泥臭いことの積み重ねです。
環境構築
安定した環境構築を行うことが重要です。これができるとできないとでは全然結果が変わってきます(体感20〜30%くらい)。もし安定した環境が作れるなら絶対やったほうが良いです。
私の場合は、以下のように100均で買ったプラボードと照明を用意しました。
テストや学習は以下のような環境で行いました
失敗するパターンの学習
一回学習させてモデルを作って、テストすることで弱点をあぶり出すことも大事です。例えば、同じ自分ので手でも以下のようなものを変えると、簡単に誤認識してしまいました。
- 手首の角度
- 指の開き度合い
- 何もない場合
指が開いてないとパーをグーと誤認識
何もないのにチョキ
失敗したパターンを、教師データとして加えたり。何もない状態を「その他」という新しいラベル付けをして学習させることにしました。その他には、グー、チョキ、パー以外の例えば以下のような形を加えたりして、誤判定を減らすことにしました。
これ何ていうのでしたっけ?
その他、少しでも多くの人の手のデータを撮りたかったので、妻にも協力してもらい女性の手も教師データとして加えたりしました。
性能向上のグラフ確認
テストすると、いとも簡単に精度が100%達成してしまったりすることがありますが、これは信用してはなりません。
いともたやすく100%達成している学習曲線
そういうときは、大体教師データの質も量も足りていません。上の項で説明したような失敗するパターンを、たくさん教師データに追加して学習しなおしてから再度テストを行いましょう。
教師データが増えるたびに、学習曲線は以下のように変化していきました。
データが増えるほど、学習曲線は複雑な挙動を示しています。これが必ずしも正しいというわけではないですが、少なくともすぐに精度が100%まで上がりきって張り付いていたら、データやプログラムを疑ったほうが良いです。
ハードウェア的な問題
今回、Vision Kitのラズパイカメラで撮影していて、たまに画面の色が変になる問題がありました。
色が変になる例
結局今だに原因不明なのですが、撮影のパラメータを変更して頻度を減らすことはできました(0には成りませんでした)。こういった、理想的なデータセットでは起こらないようなハードウェア的な問題にも対処する必要があります。
OMMF2018のデモ結果
デモでは、70〜80%程度は正しく成功していたかなという印象です(正確に測定できていないです)。失敗は色々あって、原因としては以下あたりです。
- 照明の電池が切れて来て暗くなってきた
- 子供の手で失敗(学習させてないパターン)
- 服の袖がノイズとなって失敗
- ボードが動いてしまって余計な背景が写り込んでしまった
デモ中も、色々な人のデータは取得し続けました。教師データとして使えば更に精度上げられると思います。このような貪欲にデータを集める姿勢が制度向上に重要だと思います(多分)。
ちなみに、同じようなディープラーニングの画像認識を使った展示をしていた他のグループで、非常に逆光が厳しい場所の展示をしているグループがいました。当然、ほとんど認識できていなかったです。環境がいかに重要か分かりますね。私は奥の方の場所だったので問題なかったのですが、デモや本番テストの時は環境を事前に確認することも重要です。
まとめ
ディープラーニングの画像認識性能向上のために自分が実際試してみたテクニックを紹介しました。知っている人にとっては「こんなの当たり前だよ」と鼻で笑われるような内容かとは思います。
ただ、ディープラーニングの精度向上というと、理想的なデータセットは既に与えられていて、いかにモデルや学習のハイパーパラメータをいじって性能を向上させるかという話は多いのですが、意外と実世界でどうやって教師データ集めて、精度を上げるかという泥臭い話は少なかったりするので、多少なりとも需要はあるのかな?とか思って書いてみました。
モデルやパラメータを改良して1%向上させるというのも、もちろん重要なことですし、ビッグデータを扱う世界ではその1%で億という単位の利益が出たりするのも事実ですが、私は実世界でディープラーニング応用するために、いかに性能を発揮させるかという、エンジニアリング的なことにわりと興味がある方だったりします。
今後もこういった実用的な使いこなしの部分を中心に、色々試しつつ知見を貯めていこうと思います。
参考記事
Inside of Deep Learning (ディープラーニングの性能改善手法 一覧) - Qiita
関連記事
変更履歴
2018/12/27 文章を微修正