画像認識 with chainer

2017.05.25

chainerを使って画像に写っているものを識別させる学習と、学習後のモデルを使ったテストを行ってみました。

画像の識別には教師あり学習が必要なため画像と識別させたいものの名前のデータセットが必要となります。
これは多ければ多いほど精度が上がっていきますが、その分学習時間も長くなります。

今回はCIFAR-10という32×32の解像度の十種類の画像が学習用とテスト用で計6万枚のデータセットを使って学習させました。

学習から実装までの流れは以下のようになります

学習機の作成

データセットを使って学習

学習後のモデルを書き出し

書き出したモデルを使って画像を判別

それでは今回使ったコードを見ていきます。


学習用コード

 

一般的に学習の際は学習とテストをセットで1エポックとし、それを繰り返し行っていきます。

結果は下のグラフのようになりました。

accuracy loss

今回は100エポックで学習させましたが、40エポックを越えたあたりからはかなり緩やかな変化しかないのがみてとれます。
また、テストでの結果は15エポックあたりからむしろ悪くなっているのがわかります。これはいわゆる過学習というケースだと思われます。
学習用データの分析がうまくなっても必ずしも一般のデータについても同じとは言えないということです。
これが機械学習の難しさでもあり面白さといったところでしょうか。

 

モデル使用時のコード

今回はテスト用画像の中からランダムに二十枚選んで識別させてみました。
また識別のくせのようなところも知りたかったので確率がプラスの値で出たもののラベルとその確率も同時に出力させてみました。

結果

確実性はなかなかといったところでしょうか。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-15 %e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-18

大体は上の二つのようにうまく特徴を捉えているなといった印象でした。
蛙の画像に関しては猫の確率もそこそこ高くなっていますが、確かにと思えるあたり機械学習の優秀さを物語っています。

 

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-201 %e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-13

しかし中には上二つのように正解が確率として出ていながらも不正解のものもありました。
不正解のものの共通点としては確率の高いラベルが多いという点がひとつ挙げられるかもしれません。

 

まとめ

今回は画像を使って学習モデル作成からテストまで行ってみました。
動画での利用に関してはまだまだ調整しなくてはいけない部分が多いですが、調整しだいではかなり面白い挙動を見せてくれそうです。