Windowsでchainerを使った畳み込みニューラルネットワークを用いたハリネズミの種類識別をやってみる
今回は独自のデータセットを用いてハリネズミの種類を分類したいと思います。
ハリネズミには何種類か色の種類があるのはご存知でしょうか?
今回はこのハリネズミ分類器をディープラーニングを用いて自動生成させたいと思います。
1.アルビノ
2.ノーマル
3.パイド
4.シナモン
今回はこの4種類のハリネズミの分類をディープラーニングを用いて行いたいと思います。データセットはグーグル画像検索で拾ってきたデータをもとにリサイズ、切り抜き等の操作を行い、1~4までのカラーのハリネズミ画像をすべて90枚程度ずつの計366枚集めました。
作成した学習データの一部
(※画像はグーグル画像検索の結果から引用していますので、もし不都合があればすぐに消します。)
- 学習の準備
学習データ、テストデータのあるフォルダへのパスが書いたファイルを用意します。https://github.com/shi3z/chainer_imagenet_tools
上記リンクの開発者さんのmake_train.pyを利用してtrain.txtとtest.txtを作成しました。ありがとございます。
- 学習データの正規化を行う
chainerのimagenetのサンプルコード内にcompute_mean.pyというコードがあるので、これを用いて平均画像を作ります。平均画像を用いる事で学習画像を正規化し、画像の輝度値をある一定の値域以内に収めるという処理を挟みます。
>$ python compute_mean.py train.txt - 学習スタート!
>$ python train_imagenet.py train.txt test.txt -g 0 > log.txt
を実行するとgpuで学習が始まり、ログがlog.txtに書き出されます。
学習データが少ないので、epoch 100まで回しました。学習の結果が以下のように収束していることが分かります。errorは誤答率で、学習の最終段階でも約1割程度間違えが起きてしまうようです。
-
学習したモデルを用いた識別を行う
学習が終わると、modelという学習済みのモデルのファイルが出来上がります。この学習済みモデルを用いて実際に識別してみましょう。識別のコードもhttps://github.com/shi3z/chainer_imagenet_tools
こちらのinspection.pyというコードをお借りします。
識別する画像は私の愛ハリのマロンの画像を用います。
マロンはノーマルのハリネズミなので、識別結果がノーマルと出ればokです。
画像1:顔のアップ
識別結果
尤も高いのがノーマルでその次がパイドとなっており、正しく識別できてます。
画像2:おなか辺りのアップ
識別結果
この画像もノーマルが最も高く正解しています。
画像3:横腹のアップ
識別結果
3回目にしてパイドが一番高い結果となり、間違いました。
しかし、かなり良い精度で見分けることが出来るのではないでしょうか?
ちなみに、アルビノ、シナモン、パイドのハリネズミ画像の識別結果
それぞれ、テストデータの画像ですが、正しく識別できています。
学習済みのモデルを配布しますので、もし試してみたいマニアな方はダウンロードしてみてください。inspection.pyを使って好きなハリネズミ画像を分類できます。
http://fast-uploader.com/file/7016949787728/
また、実際に識別する際にはこれに加え、labels.txtというテキストファイルにラベル(アルビノ、ノーマル、パイド、シナモン)を書いたもの必要です。