1. HOME
  2. ブログ
  3. IT技術
  4. 【後半】KerasとKivyを使って簡易手書き数字認識アプリを作ってみよう【機械学習】

【後半】KerasとKivyを使って簡易手書き数字認識アプリを作ってみよう【機械学習】

手書き数字認識アプリを作る〜後編〜

前回は、Kivyで「キャンバス画面・ペイント機能 」を実装していきました。

後半となる今回は、Kerasで「機械学習部 」を実装し、完成させていきたいと思います。

最終的に作れるアプリケーション

この記事を読んで最終的に完成するのは、「手書きで数字を書くと、その数字を認識するというアプリ」です。

【図 最終的に作れるアプリケーション】

それでは、後半いってみましょう!

前半の記事についてはこちら

【前半】KerasとKivyを使って簡易手書き数字認識アプリを作ってみよう【機械学習】

Keras (機械学習)部分

今回のアプリの要である、機械学習部分と識別部分を作成していきます。

イメージとしては、このような流れで作っていきます。

  1. ① アプリが立ち上がる
  2. ② 機械学習を始める
  3. ③ キャンパスが表示される
  4. ④ 手書き数字を学習済みネットワークに流す

ここでは、Kerasの学習部は別の learning.py というファイルに実装していきます。

それでは、まず、アプリを実行した後の「②機械学習を始める」の部分から考えていきたいと思います。

学習部分の大枠

アプリ実行時、すなわち最初に呼び出されるクラスのコンストラクタで機械学習を行い、そのネットワークをメンバ変数として保持しておきます。

したがって、以下のようにコードを加筆します。

このとき、 learning.py にMNISTデータセットを学習する learn_MNIST() という関数がある前提で加筆します。

したがって、このような関数を実際に learning.py に作っていきましょう!

ネットワークを作成

今回は、以下のようなネットワークを作成していきます。

【図 ネットワーク構成】

ここでDenseとは、全結合層を指し、Dropoutとは過学習を抑制するための手法の一つを指します。

簡単に説明すると、Dropoutは訓練パターンが入力される度にランダムでニューロンを非活性にし、そのニューロンと接続しているシナプス結合は学習を行わないという手法です。

こうすることにより、学習の自由度を下げて訓練パターンへの過学習を防ぐことができます。

活性化関数

また、今回のネットワークで用いるReLUと呼ばれる活性化関数は、以下のような形をしており、画像識別ではよく使われます。

【図 ReLU関数の概形】

最終層の活性化関数であるsoftmaxは、出力値の合計を1にする関数、つまり確率を出力にする関数です。

Kerasで実装

ひとまず、ここまでをKerasで実装してみます。

このような形になりますが、教師信号のOne-hot-encodeingとはもともとのクラスラベルを[0, 1]の配列にすることを指します。

例えばクラスラベル「3」であれば、 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0] のようになります。

この方が、機械学習では扱いやすいためです。

学習部分の実装

次に、学習部分を実装していきます。

ですがその前に、どのような目的関数を使い、どのような最適化手法を使うかを明示的に設定する必要があります。

今回は、最適化手法にAdamと呼ばれる学習の収束を早める手法を使い、目的関数はクロスエントロピーという関数を用いることにします。

  1. 最適化手法に「Adam」
  2. 目的関数は、「クロスエントロピー」という関数

その次に、実際に学習をしていくのですが、Kerasには、 fit() という関数一つで学習が行えます。

実装

これらの実装例は以下のようになります。

これで学習部分の実装完了です。

ちなみに verbose は学習過程をログとして出力するかを指定しています。

0ならログなし、1ならプログレスバーを表示、2ならエポックごとにログを出力させます。

あとは、これによって作られたネットワーク(model)を戻り値として返すだけです。

ですが折角なので、テスト精度も表示させるようにしましょう。

これで学習部分は完成です!

識別部分

最後に、キャンパスに描いた手書き数字をネットワークに流してネットワークの答えを出力させるだけです。

main.py の predict() を作っていきましょう!

流れ

  1. ① キャンパスを画像として保存
  2. ② Pillowでその画像を読み込み、不要な部分(ボタン類)を切り取る
  3. ③ グレースケール、28×28に変換
  4. ④ 画像を配列に変換
  5. ⑤ ネットワークに流す

実装

これらを実装してみます。

以上で実装は終わりです!

お疲れ様でした!

最終的なコード

main.py

MyPaint.kv

learning.py

 

一緒に働いてくれる仲間を募集中!

ライトコードでは、仲間を募集しております!

ライトコードのモットーは「好きなことを仕事にするエンジニア集団」。そのため、あなたがやりたい仕事を全力で応援します。

どうせなら、好きなことを仕事にする方が人生は何倍も素晴らしいものになるはず!また、ライトコードはこれからの会社ですので、みんなで新しい事業や組織を作っていく楽しみもあります。

あなたからのご応募をお待ちしております!

ライトコードでは一緒に働いていただける方を募集しております!
お気軽にご応募ください。

採用情報はこちら

書いた人はこんな人

ライトコードメディア編集部
ライトコードメディア編集部
「好きなことを仕事にするエンジニア集団」の(株)ライトコードのメディア編集部が書いている記事です。

関連記事