機械学習でオバマとスモーリングを判別したい-後編-

機械学習
Nishipy
ある界隈で似ていると評判のオバマとスモーリングを、機械学習を使って判別します。後編では、前編で用意した画像を用いて、CNNを学習していきます。

1. はじめに

1.1. 背景

詳しくは、前編の記事をご覧ください。

機械学習でオバマとスモーリングを判別したい-前編-
Nishipyある界隈で似ていると評判のオバマとスモーリングを、機械学習を使って判別します。前編では、訓練データを用意していきます。1. はじめに1.1. 背景遡ること2014年、ブラジルでサッカーW杯が開催されていま...

1.2. 今回やりたいこと

前編で用意した画像を用いで、CNN(畳み込みニューラルネットワーク)のモデルを学習させていきます。
学習後のモデルで、問題の画像がオバマなのかスモーリングなのかを判定します。
以下のページが大変参考になりました。

fchollet/deep-learning-with-python-notebooks
Jupyter notebooks for the code samples of the book "Deep Learning with Python" - fchollet/deep-learning-with-python-notebooks

2. 画像の振り分け

用意したデータを3種類に振り分けます。

  • 訓練データ
  • 検証データ
  • テストデータ

2.1. ディレクトリの作成

まずは、画像を振り分けて格納するディレクトリを用意します。



2.2. 画像数の再確認

前編を書いた後に再確認した結果、別人の画像を取り除けていませんでした。
用意できた画像の枚数を再度、確認しておきます。

出力は、以下の通りでした。
* Smalling has 231 faces
* Obama has 255 faces

2.3. 振り分け

2.2の通り、それぞれの合計枚数が違いますが、せっかく収集したので、全部使いたいです。
訓練データと検証用データは同じ枚数にしたいので、以下のように振り分けてみます。

data #Smalling #Obama
訓練データ 130 130
検証データ 50 50
テストデータ 51 75

ここまではローカルで作業していました。


3. モデルの構築と学習

これ以降は、GPUも使いたいので、すべてGoogle Colab上で作業します。

3.1. データのアップロード

振り分けた画像をzipファイルとして、Google Colab環境にアップロードします。 あらかじめ、zipファイルはGoogle Driveのマイドライブに入れておきます。
以下のようにマイドライブを/conten/driveにマウントして、アップロードしてください。

また、Google Colabに移ってきたので、ディレクトリ名を入れていた変数を再定義します。


3.2. 訓練画像の水増し

訓練画像が少ないと過学習してしまうので、kerasのImageDataGeneratorをつかって水増しを行います。回転させたり、シフトさせたり、ズームしたりして、画像を水増しするようです。

何枚か、水増しされた画像の例をみてみます。

3.3. モデルの構築

今回学習させるCNNを構築します。

一応サマリをみておきます。

3.4. モデルの学習

CNNを学習させます。500epoch回して、5分くらいで終わりました。

学習の過程はこんな感じ。順調ではないでしょうか。

学習済みのモデルを保存しておきます。


4. モデルの評価

テストデータを使って、評価していきます。

4.1. テストデータにおける精度

まず、evaluate_generatorをつかって、精度を評価します。

4.2. テストデータにおける予測

最後に、今回学習させたモデルを使って、与えられた画像がオバマなのかスモーリングなのかを予測してみます。

4.3. 問題の画像を予測!!

マグカップにプリントされてしまった顔写真を予測してみます。

たぶんできた

5. 最後に

5.1. 今回できたこと

  • スモーリングとオバマを判別するCNNを作りました
  • 人類がスモーリングのマグカップにオバマの顔写真をプリントすることがなくなりました

5.2. これからやりたいこと

  • kerasじゃなくて、PyTorchつかいたい


以上

コメント