ゼロから始めたDeep Learning――其の弐

Pocket

はじめに

前回、下記記事で、私がAIチームに配属されてからの学習ステップをご紹介しました。

この記事ではそこで学んだ内容を活かして、画像判別器の実装を行っていきたいと思います。画像判別の分野では一般的な手順だとは思いますが、画像判別器の実装から精度確認まで各ステップごとに紹介していきます

1.判別テーマ決め

今回の画像判別で扱う判別対象となる画像は、寿司ネタにしました。

サケ、マグロ、サバ、イクラ、ウニ、イカ、ハマチ、タイ、タコ、エビ
の計10種類の判別に挑戦してみます!

2.トレーニングおよびテストデータとなる画像の収集

画像判別の分野では、トレーニング時に使用するデータ枚数は一般的にカテゴリーごとに数千枚くらいはあったほうが良いと言われますが、この画像を集めるところが一番時間もかかりますし、非常に大変です。たくさん画像を集めるのが困難な場合でも、次のステップでご紹介する手法を用いれば画像枚数を増やすことができます。今回はネットでの画像検索や実際に寿司を食べに行き、各ネタごとになんとか150枚程度画像を収集しました。

【参考】今回は使用しませんでしたが、画像収集に用いられる方法にはWebスクレイピング(扱いには要注意)やFlickrなどのサイトのAPIを使う方法があります。これだと簡単にたくさん収集することができます。
※Webスクレイピングをする場合、Webページ上に書かれている内容をデータに変換しても問題ないか、対象先のサイトにWebブラウザーからではなくプログラムからアクセスしても良いのかなど、確認すべき点がいくつかあります。

それでは、収集した画像を見てみましょう。

寿司がお皿の上に乗っているものやそうでないものなど様々な画像があることが分かります。寿司ネタは形状の違いがあまりないですが、果たしてうまく判別できるのでしょうか。

3.画像の前処理(データの水増し)

画像の収集が終わりましたが、ただでさえあまり集められていない各画像を、トレーニングデータとテストデータに分けてしまうとさらに枚数が少なくなってしまいます。そこで学習前の前処理として、画像の水増しを意味するData Augmentationを行っていきます。元画像に対して、左右反転と回転(15度、30度、45度、60度、75度、285度、300度、315度、330度)の処理を適用しました。ここでの前処理には画像操作ライブラリのPILを使っています。

前処理結果は以下のようになり、画像枚数が10倍に増えました!

水増ししたことにより画像の枚数が増えたので、トレーニングデータを10500枚、精度確認のためのテストデータを4500枚としてみようと思います。また、学習時の検証データはトレーニングデータのうち3割を使うことにします。

4.各種ライブラリのインポートとデータ整形

ここでは画像判別器の実装に向けた各種ライブラリのインポートと、上記で準備しておいた画像を読み込み、学習時に扱いやすいように整形を行います。

5.モデル作成

データの準備が終わり、いよいよモデルの作成です。今回は、初心者にもとっつきやすいと評判のkerasを使ってモデル構築をします。モデルのタイプとしては全結合層だけでなく、畳み込み層とプーリング層を用いたCNNを採用しています。これは、画像の分野では頻繁に用いられています。一般的にゼロからモデルを作るというのはあまりしないと思いますが、今回はCNNの基礎ともいえるLeNetというモデルをベースに自作していこうと思います。

作成したモデルの詳細は以下の通りです。

6.モデルの学習

モデルの作成も完了したので、最初に準備しておいた画像を使ってモデルの学習を行っていきます。今回はGPU環境が使えるGoogle Colaboratoryを使って処理を行っています。Google Colaboratoryに関しては、別記事で紹介しているので参考にしてみてください。

学習の推移もグラフで見てみましょう。

エポック数を30としていましたが、学習が進み、精度がこれ以上は向上しないと判断したら学習を止める手法であるEarly Stoppingが機能したため、途中で学習が打ち切りになりました。上のグラフからはValidation Lossの方が途中から飽和していき、Training Lossとの差が広がっていることが分かりますね。これはトレーニングデータの学習しすぎによる過学習が起きてしまっていると言えます。本来であれば、パラメータ等を変更し再度学習させるべきところですが、今回はこのまま最後まで行きたいと思います。

7.推論/精度確認

では、精度を確認してみましょう!

lossが高く、精度は約45%とかなり低い精度になりました。数値だけではしっくりこないので、どのネタが何のネタと判定されたのか画像つきでいくつか見てみましょう。判定結果はpredictionsの中に格納されています。

※正しく認識されたものは、判定結果のセルが赤くなっています。

寿司ネタ(正解ラベル) 画像 判定結果
イカ タイ
サバ サバ
タコ イカ
サケ サケ
ウニ タコ

明らかに違うでしょ!と思うものもありますね。一番下のウニの画像はお皿の割合も大きいので、対象物のみが画像内に写るように前処理を行った方がよいのかもしれません。

次は精度上げに挑戦!

今回は寿司ネタ判別器の実装に挑戦してみました!結果的には正解率が約45%とあまりよい結果は得られませんでした。次回はこの認識精度の向上を目指して、いくつか精度向上につながりそうな手法を取り入れていきたいと思います。

お問い合わせ先

執筆者プロフィール

Kubota Wataru
Kubota Watarutdi デジタルイノベーション技術部
配属後、ロボコン担当として、ETロボコン2017東京地区大会優勝・ITAロボコン2017優勝に貢献。現在は、AIチームの一員として、機械学習、ディープラーニングなどに挑戦しています。
Pocket

関連記事