【Mercari Summer Internship】商品画像の色推定を行いました!

はじめまして! Mercari Summer Internship 2017 機械学習エンジニアコースに参加していました上川優太です。
現在は大学院に所属し、機械学習を学んでいます。

レベルの高い環境で成長したい!あのメルカリの社内の雰囲気を感じてみたい!と考え、メルカリのインターンに参加しました。
8月1日から8月31日まで機械学習を用いた業務を行ったので、それについて紹介します。

商品の色推定

私が取り組んだのは、商品画像から商品部分の色を推定し、自動的に色情報をタグ付けするというタスクです。

私自身、よくメルカリを利用するのですが、欲しい物を選ぶ基準として色というのは重要であると考えています。
実際に、欲しい物を検索するときに【Tシャツ 青】みたいに検索をするのですが、
明示的に色の情報が記載されている商品は少なく、欲しい商品にたどり着けないことも多々あります。
そこで、出品者が明示的に色情報を記載しなくても画像から自動的に色情報のタグ付けができれば、検索結果に反映できて便利!ということでこのタスク取り掛かりました。

ちなみに、現在メルカリでは、これ以外にも画像認識や機械学習への取り組みが積極的に行われており、その内容についてはこちらで紹介されています。

tech.mercari.com

色推定へのアプローチ

商品の色推定には、画像内のどの位置に商品があり、どんな色であるのか、ということを推定する必要があるので畳み込みニューラルネットワークを使用しました。
畳み込みニューラルネットワークとは、ディープニューラルネットワーク/深層学習の一種であり、画像や動画認識に広く使われているモデルです。
最終的な目標は、モデルに画像を入力するとその画像がどの色(カテゴリ)であるのか出力されるようなイメージです。

実装には、ディープラーニングのライブラリであるKerasを利用しました。
モデルは、VGG-like convnetを参考に、以下のような構成になっております。

f:id:kumonworld:20170901111832j:plain

昨今のディープラーニングのモデルは非常に層が多く深いものが目立ちますが、予備実験では色識別の場合は層を増やしても精度改善が見られませんでした。
これは、色情報は入力層に近い部分に残っているモデルになっているためかと思われます。

データセットの作成

畳み込みニューラルネットワークで学習することを前提にデータセットの作成からはじめました。ここでは、人間が感じる色と数値的な色の違いに苦労しました。
例えば、この2枚のTシャツを見ていただくと、白のTシャツとグレーのTシャツなのがなんとなくわかると思います。
しかし、この2枚のTシャツの色の数値はほぼ同じものでありこのような画像を別色(カテゴリ)としてラベリングするのが非常に困難でしたが、データセットが肝なのでしっかり時間をかけて作成しました。

f:id:kumonworld:20170901111608j:plain:h300f:id:kumonworld:20170901111612j:plain:h300

このようにしてRGB色空間を12個の代表色の空間に分け、データセット全画像(約9万枚)に対してラベリングしたものがこちらになります。
ほぼすべての画像がそれらしい色にマッピングされているようになったのでこのデータセットを用いて学習を行いました。

f:id:kumonworld:20170901111617j:plain

学習 / 評価

学習には、AWS EC2 p2.xlarge(GPU: Tesla K80 x 1)を用いて、10epoch回しました(epochとはひとつの画像を何度学習に利用したかを意味します)。
テストデータによる評価では、予測値の上位1位の正解率が73.2%、上位3位までの正解率が94.7%という結果になりました。

こちらが、作成したデータセットにより学習したモデルで商品画像の色推定を行った結果です。

Tシャツ画像の分類結果

f:id:kumonworld:20170901111558j:plain

ほとんどすべての画像が正しい色(カテゴリ)として推定できています。     

全カテゴリ画像の結果

服の場合、ディープラーニングを用いなくてももっと単純なモデルでも識別可能かと思いますが、メルカリでは多様な商品が出品されるため、それらに対応するためにディープラーニングを用いています。

Tシャツ以外の場合でもうまく識別できていることを確認できました。背景色に影響されずに正しく識別されているように見えます。

f:id:kumonworld:20170901111554j:plain

今後の課題

今回作成したモデルで、単色商品に関しては高精度で色の推定を行うことができました。
しかし、ボーダーや柄物など複数の色を含む商品では、2色目まで推定することができないなどの問題があり、まだまだ改善の余地があります。

左:1色しか認識されなかった例 / 右:2色と認識された例
f:id:kumonworld:20170901143154j:plain

まとめ

今記事では、私の取り組んだタスクについて紹介させていただきましたが、機械学習エンジニアコースには私の他に6名のインターン生が参加しており、それぞれが別々のタスクに取り組んでいました。
私自身まだまだ勉強不足なので他の参加者から学ぶことも多かったです。
業務以外では、メンバー全員でオフィス近辺の美味しいランチを探しに行ったり、終業後には、居酒屋でお互いの趣味や将来のこととかついて、熱いトークを交わしたりしました。
インターンは終わってしまいましたが、これからも切磋琢磨し合えるような関係が築けたと思います。

機械学習コース以外にもソフトウェアエンジニアコース、プロダクトマネージャーコースがあり、その分野で優秀な学生達から興味深いお話をたくさん聞くことができ、とても有意義な時間を過ごすことができました。
社員の方々も本当に優秀な方ばかりで、技術的なところはもちろん、働く姿勢なども学べたことは多く、今後に活かせるものになったと考えています。

最後になりますが、メルカリのインターンは、やる気がある人であれば、必ず有意義な時間を過ごせるような最高の環境だと思います。
今回サマーインターンの一期生として参加させていただきましたが、これからもインターンは実施されると思うので、興味のある方は、ぜひ応募してみてください。