Tensorflow+Kerasの環境構築を前回やってみて、無事環境構築に成功しました。
そのときはMNISTデータセットで正常な実行を確認しましたが、実用的な面を考えると、自分で学習画像を用意して訓練するというケースが多くなると思います。
そこで、予めフォルダに分類した学習画像からクラス名(及びクラス数)を自動で読み取り、各クラスの分類学習を行うソースコードを書いてみました。
また、前回からの差分として、分類のモデルはAlexNet(畳み込み層5層、全結合層3層モデル)を用いることとしました。
AlexNetのモデル部分のコードに関しては、
参考ページ:KerasによるAlexNetを用いた犬猫分類モデル – Qiita
上記のコードを参考にさせていただきました。ありがとうございます(厳密には上記のコードはLRNがBN((Batch Normalization)に変わっているので、AlexNetの論文実装とは異なっています)。
・OS : Windows10(64bit)
・GPU: GeForce GTX 950
・Anaconda
・CUDA 9.0
・cuDNN v7.0.5
・Tensorflow 1.11.0
・Keras 2.2.4
上記全て環境構築済
先にソースコードを載せちゃいます。説明は先を読んでください。
今回は自作画像……といいつつ、自作画像を用意するのは面倒なので、JPGやPNGなどの一般的な画像形式で提供されている公開データセットを使うことにしました。
ただ、今回のソースコードに関しては、自分で学習画像を収集して、フォルダに分類し、そのフォルダ名をソースコード内に入れるだけで使っていただけるような構成になっています。
では、今回のソースコードを動かすためのデータセットの準備方法を説明します。
今回、「animeface-character-dataset」というアニメキャラの顔画像のデータセットを使用しています。以下のページからダウンロード可能です。
外部サイト:animeface-character-dataset
ダウンロードしたZIPファイルを解凍すると、以下のように各キャラクター別に分類された画像が入ったフォルダ群が展開されます。
多数のキャラクターがあるのですが、学習にあまり時間を掛けたくないという事情から、10キャラ分のフォルダだけを、訓練データ配置用のフォルダへ移動します。
訓練データ配置用のフォルダに関してはソースコードの方から変更可能ですが、私は実行ファイルからの相対パスで見て「..\\training_dataset\\training_anime1」のフォルダに画像を置きました。
あとは、ソースコードの29-35行目に訓練データ配置フォルダへのパスと、各クラスごとの画像が入ったフォルダ名を指定して、認識を行うことができます。
一部コードをかいつまんで説明します。
今回は最初の方でCOLOR_CHANNELという変数を定義し、これを1のときは画像をグレースケールとしてネットワークへ入力、3のときはカラー画像としてネットワークに入力できるようにしました。
以下の部分のコードにて、 グレースケール入力とカラー入力を自動で切り替えるようにしています。入力が元々グレースケールだとカラーで入れても意味がない気がしますが、元々カラー画像で用意されている場合は、グレースケールに変換して入力してくれます。
また、ネットワークの入力の部分にも、COLOR_CHANNELを変数として与えて、グレースケールとカラーの場合で入力の形が自動で変わるようにしています。
今回は10人のキャラクターの顔を分類するので、当然クラスは10になります。
フォルダごとに分類した学習画像を用意すれば、クラス数はフォルダ数と同一になるため、以下のようにフォルダ数から自動でクラス数をカウントし、
ネットワークの出口のところの数はクラス数に合わせないとエラーが起こります。
結構画像数の少ないデータセットなので、少々実験としては心許ない部分がありますが、実際に実行をしてみました。
今回はカラーチャンネルを変更し、グレースケール化した訓練画像で認識する場合と、カラー化した訓練画像で認識する場合を比較してみましょう。
エポックは100、バッチサイズは32で統一しました。
COLOR_CHANNEL = 1でプログラムを回したところ、以下のような結果が出ました。
上の190は検証に用いた画像の枚数で、Lossは損失を示し、低ければ低いほど良い結果であることを示します。
そして、肝心の精度は81.6%というところでした。
今回は10クラス分類なので、ランダムで正解当てをした場合は精度は10%ですが、81.6%とモデルの訓練が成功していることがわかります。
また、以下がsummary()関数で表示したモデルの構成です。
次に、COLOR_CHANNELを3に変えて実験をしました。
結果は以下となりました。
精度は88.4%と、グレースケールの場合よりも精度が高まりました。
これは、アニメのキャラクターの分類には髪の色などの色情報が非常に重要な情報であり、色があることで認識率が上がりそう……という直感的な予想にも見合う結果となりました。
今回は自作画像から学習を行う準備を整えると共に、実際にモデルを作って精度を確認してみました。
今回はAlexNetを扱いましたが、他のネットワーク等も試してみようと思います。