ML_hack!2017 with 電通大 ~第3回~ アプリ開発
「ML_hack!」とは、電気通信大学の学生団体であるレッドインパルス株式会社が主催する勉強会やハッカソンなどを行うイベントです。自社は協賛企業として協力させて頂きました。
ML_hack!関連記事
第3回 アプリ開発
この記事は「第3回 アプリ開発」です。
前回の記事で、eF-4のインターン生チームが筆跡認証アプリ開発を行うと決定するところまでご紹介しました。
今回は、実際に開発を行った際の様子に関して、その過程で生じた課題と、その問題点に対して考えた対応策に焦点を当ててご紹介していきます。
目次
1.アプリ開発について
題材が決まり、eF-4のインターン生チームはアプリ開発に取り掛かりました。
アプリの概要は以下の通りです。
アプリの概要
機械学習を用いた画像認識により、筆跡の判定を行う。判定結果を本人認証に用い、本人であると認証された場合にのみログインができる筆跡認証アプリ。
アプリの開発環境
アプリ開発にはDjangoというwebアプリケーション作成のフレームワークを利用し、言語にはpythonを用いました。また、機械学習では、画像認識に強いディープラーニングとして畳み込みニューラルネットワーク(CNN)モデルを採用し、tensorflowによる実装を行いました。
アプリ開発の流れ
今回はアプリ側と機械学習側に分かれ、同時並行で開発を進めていきました。
アプリ側:アプリ開発経験がなかったため、まずはwebの仕組みやDjangoの使い方などを勉強することから始めました。その後、社員の方からアドバイスを頂きつつ、アプリの作成を進めていきました。
機械学習側:これまでにニューラルネットワークを扱っていたことがあるため、その知識をもとに画像認識を行うプログラムの作成を行いました。まずは、学習データの収集を行い、データセットを用意しました。その後、プログラムを作成し、精度の向上を目指して改良を加えていきました。
今回のアプリ作成では、アプリ側と筆跡の判定を行う機械学習側にわかれて作業を進めたため、それぞれの立場ごとに課題とその対応策を取り上げていきます。
2.アプリ側の課題と対応策
アプリ側の課題として最も大きかったのは、文字入力の方法でした。
初めの段階では、パソコンに保存されている画像データをアップロードし、その画像を機械学習に渡すという形を考えていました。
しかし、この方法では、事前に画像データを用意している必要があります。そこで、書いたものをそのまま機械学習に渡せるよう、
・ペンタブを用いて入力を行う方法
・マウスを用いて入力を行う方法
の2つを考えました。
ペンタブを用いて入力を行う方法
ペンタブで文字を書いた後、画像として保存し、機会学習に渡す
問題点…画像を一度保存しなければならない点で、初めの方法と変わらない、ペンタブを用意できるかわからない
マウスを用いて入力を行う方法
canvasを用い、マウスで書いた文字をそのまま機械学習に渡す
問題点…書いた画像を機械学習側へ上手く受け渡すことができない
しかし、これらの方法を取り入れる場合、初めに機械学習へ教示データとして与えていた手書き文字とデータが変わってしまうため、データの取り直しが必要でした。時間的にそれは難しいということで、最終的な形としては、当初の方法(判定したい文字の画像をあらかじめパソコンに保存しておき、その画像データを機械学習に渡す)をとることになりました。
3.機械学習側の課題と対応策
機械学習側の課題としては、次の2つが主なものでした。
・大量なデータセットの収集
・精度の向上
「大量なデータセットの収集」への対応策
データセットの収集に関しては、収集したデータを読み込んでビットマップデータに変換し、そのデータを拡大縮小、回転、移動などを行いました。これにより、結果的には大量のデータを用意することができました。
「精度の向上」への対応策
精度の向上に関する課題としては、以下のものがありました。
・筆跡を字の大きさで判断してしまう
・テストデータを別の条件下で集めると精度が落ちる
・学習結果のモデルごとに精度が極端に変わる
・CNNをそのまま使うと他人判定ができない
これらの問題に対する対応策は以下の通りです。
なかには対応策を考えたものの、実装出来なかったものもあります。
1.筆跡を字の大きさで判断してしまう
→データ収集の段階で複製方法に拡大縮小を追加することで解決しました。
2.テストデータを別の条件下で集めると精度が落ちる
→データを長期的に多様な条件下で収集する、文字の種類または個数を増やす、ピクセル数を増やすといった対応策を考えましたが、時間の都合上、実装までは出来ませんでした。
3.学習結果のモデルごとに精度が極端に変わる
→二つのモデルを掛け合わせた確率を採用することにより、解決することができました。
4.CNNをそのまま使うと他人判定ができない
→確率にボーダーを設け、それを超えない確率での判定は他人とするという対応策を考え、実装することができました。また、CNNの確率をベクトルとして、サポートベクターマシン(SVM)というパターン認識の手法を用いるという案も出ましたが、こちらは実装まではいきませんでした。
4.まとめ
アプリ開発をする中で、私たちが普段利用しているサービスを実際に作るのがどれだけ難しいかということを実感しました。短期間で一つのものを作り上げるという経験をこれまでしていなかったため、とても勉強になりました。
この後、筆跡認証アプリの開発成果をハッカソンで発表しました。その様子は、次の記事「ML_hack!2017 with 電通大 ~第4回~ 発表」で紹介しています。
IT業界について知りたくて、インターンを始めました。
まだまだ未熟ですが、力をつけられるよう頑張っていきます!