第1回AIチャレンジコンテスト参加記 (分類部門)

はじめに

こんにちは、takagiです。
このたび、内閣府などが主催する第1回AIチャレンジコンテストに社内チームで参加してきました。
これはクックパッドの提供する画像データを使用して、料理の領域検出・料理の分類モデルを作成し、その精度を競うものです。
ここでは私が担当した料理分類部門についてもう少し詳しく書きたいと思います。

料理分類部門のルール

料理分類部門では、10,000枚の料理画像を25個のカテゴリに分類して、その正解率を競います。
そもそも料理の画像認識は同じ料理でも形状や使われている素材にばらつきが多く、比較的難しい領域なんだそうです。

学習データ

正解ラベルが付与された画像(教師データ)が10,000枚と、ラベルのないものが50,000枚与えられます。
教師データは10,000枚ありますが、通常はこれを学習用と検証用に分割し、学習用データを使ってモデルを学習、検証用データでモデルの性能を評価します。ラベルなしのデータは料理画像の特徴検出などに使用します。

テストデータ

テスト画像は10,000枚です。
モデルを作成したらテスト画像を分類して、その結果をコンテストサイトに投稿します。
しばらくすると運営からスコアが通知され、ランキングに反映されます。

懸賞/賞金

最高精度賞とアイデア賞があり、最高精度賞では単純に分類の精度で順位が決まります。
アイデア賞ではモデルのレポートを提出し、審査によって順位が決まります。

最高精度賞

  • 1位:NVIDIA TITAN X
  • 2,3位:nintendo New3DS-LL
  • 4,5位:nintendo 2DS
  • 6-10位:ノベルティ詰合せ

アイデア賞

  • 1位:賞金10万円+ノベルティ
  • 2,3位:GeForce GTX 1060 6GB
  • 4,5位:GeForce GTX 1060 3GB

料理分類部門でやったこと

ここからは料理分類部門で社内チームが作成したモデルについて解説します。
前提として、我々のアプローチはディープラーニングが基本になってます。ディープラーニングそのものについては、ここでは説明しきれませんのでご了承下さい。ルール上手法の選択は自由ですが、昨今の画像認識の実績からするとほとんどのチームはディープラーニングを使用していたのではないかと思います。

フレームワーク選び

今やディープラーニングのフレームワークは溢れかえっていて、素人の私はまずフレームワーク選びから始めました。
調べた結果、初心者でも使いやすそうなのはChainerかKerasのようです。社内ではChainerを使ってるという人は結構いると聞いてたので、私はなんとなくみんなが使ったことのなさそうなKerasを使ってみることにしました(結果的にKerasを選んだのは当たりでした)。

モデル

Kerasの作者であり、GoogleのエンジニアであるFrançois Chollet氏が発明したXceptionというモデルを使用しました。
論文によると、XceptionはImageNetという有名な画像分類のデータセットに対し、これまた有名なモデルであるVGG、Inception V3、ResNetよりも高い認識精度を達成しているとのことです。

ImageNetのTop5エラー率の推移

【参考】ImageNetのTop5エラー率の推移

出典:https://www.slideshare.net/mlprague/xuedong-huang-deep-learning-and-intelligent-applications p.7

KerasではXceptionの他、有力なモデルが学習済みの重みと共に提供されており、それが他のフレームワークにない魅力の一つではないかと思います。

ファインチューニング

学習の際、別のデータセットで事前学習した重みを初期値として利用することをファインチューニングといい、少ないデータでも効率よく学習できるメリットがあります。実際、ファインチューニングあり/なしでは、ありの方がずっとスコアが良かったと思います。我々はKerasで提供されているImageNetの重みを初期値として使用しました。

Data Augmentation

学習データを変形(回転、鏡像反転、拡縮など)させてデータを水増しすることをData Augmentationといい、少ないデータで汎化性能を上げるための有名な手法です。

解像度別のモデル作成

Xceptionのデフォルトの入力解像度は299×299ですが、料理領域検出部門において入力解像度を大きくしたらススコアが伸びて5位以内に入ったという出来事があったので分類の方でも解像度を大きくして試してみることにしました。
実際、解像度を399×399に広げたところ結構スコアが上がりました。こうなると色々な入力解像度で試してベストなものを見つけたくなります。学習には時間が半日ほどかかるので、コンテスト終了間際には社内のGPUを4台動かし続けて色々な入力解像度のモデルを作成していました。

モデル平均

ニューラルネットは入力画像がそれぞれのカテゴリ(今回は25個)に属する確率を出力するため、このうち最も確率の高かったカテゴリを推論(ここでは画像を分類すること)の結果とします。モデル平均は複数の異なるモデルが出力した確率を平均することで、推論精度を向上させるテクニックです。一人の意見よりも多人数の意見を反映した方が信頼できる、というイメージです。
我々は先述の色々な入力解像度で学習したモデルの出力を、重みつき平均することにしました。重みは検証用データに対して精度が良くなるよう、粒子群最適化という手法で最適化しました。

Test Time Augmentation (TTA)

モデル平均同様、推論精度を向上させるテクニックです。
これはモデルを複数用意する代わりに、入力画像をData Augmentationで変形させて複数用意しそれぞれの画像に対する確率を平均します。TTAはKaggleのプランクトン画像分類で優勝したチームの記事で知りました。

ソース

参考までに、学習に用いたpythonスクリプトを載せておきます。
フレームワークが提供する機能のおかげで、初心者でもほとんど苦労なく書くことができました。

 

結果

テストデータに対する正解率は最終的に78%くらいで、9位に入賞しました。
振り返ると、Xeptionとファインチューニングで20位以内に入り、その他の工夫で着々とスコアと順位を伸ばしていったかなと思います。

やりのこしたこと

学習データのうち、ラベルなしの画像50,000枚を有効活用できなかったのが残念でした。
教師なし学習で料理の特徴を抽出したり、半教師あり学習で擬似的な訓練データとして利用するといったアイデアは試していたのですが、成果が出る前にコンテスト終了を迎えてしまいました。

おわりに

料理分類部門で取り組んだことについて解説しました。
コンテストに参加する前はディープラーニングについて本で読んだ知識しかなかったので、実際にやってみることはとても良い勉強になりました。
これからディープラーニングを勉強したい方は、こういったコンテストに参加してみてはいかがでしょうか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です