レシピの画像検索に必要な技術

研究開発部の @ayemos です。ダイエット中です。

画像検索とは

検索という言葉からは、いくつかの単語を入力してそれを含む文章を検索するという体験を自然と連想できるかと思います。このような検索の体験の第一歩は、ユーザーが欲しい情報に対して単語の列としてクエリを構築するということから始まります。例えば、「支払うべき住民税の額」という情報を得たい時には「目黒区 住民税」というクエリを自ら考えて入力するといったようにです。

単語列を利用した文章検索を行う際、検索クエリが来るたびに検索対象となる文章を上から下まで全探索するのでは時間がかかってしまいます。そのためしばしば全探索の代わりに転置インデックスを用いて高速化された探索手法を用います。転置インデックスは端的に単語からそれを含む文章(とその位置)をマップする情報であり、これを用いることで、単語の列をクエリとして、それらのすべてあるいは一部を含む文章を高速に引いてくることができます。

一方で例えば、名前を知らない植物や料理を見た時、「赤い 小さい 花」「タイ 屋台 辛い麺」のような単語によるクエリを構築し、欲しい情報にたどり着くのは簡単ではありません。このような場合は例えば、スマートフォンで撮った写真をクエリとして利用した画像検索ができると良いでしょう。しかしながら、単語 => 文書 の転置インデックスを基礎とした検索手法はテキストを主としたデータセットに対しては有効ですが、画像や音声の検索にそのまま転用することはできません。

このような単語列によるクエリの構築にまつわる問題を解決する1つの方法が、画像の特徴量を用いた類似検索です。画像をクエリとした研究は1990年ごろから活発に行われており、[1]にはその経緯と最近の動向がよくまとまっています。そこで今回は、クックパッドのデータを用いて、レシピの写真を利用した類似画像検索を実現した手法について紹介します。

類似画像検索

特徴量を用いた類似検索とは、クエリ画像(以後クエリ)と検索対象画像(以後コンテンツ)からそれぞれ特徴量を抽出し、あらかじめ定義された特徴量同士の類似度の指標に基づいて、クエリから抽出された特徴量と”近い”特徴量を持つコンテンツを特定するという手法です。

検索の準備としてまず、検索対象となるデータ(コンテンツ)に対してその特徴量を抽出し、必要であればインデックスを構築します。ここでいうインデックスについては後に説明しますが、類似な特徴量を持つコンテンツを効率的に見つけるための仕組みであり、文章検索のための転置インデックスとは異なります。

検索の実行時には、入力されたクエリから同様に特徴量を抽出し、それに近いコンテンツを見つけます。この作業を最近傍探索と呼びます。画像を入力とした類似画像検索においては、クエリとコンテンツがともに画像であるため、クエリとコンテンツに対して同じ特徴量抽出器を用いることが多いでしょう。

https://cacoo.com/diagrams/jO707b3qI3EwfwrH-0E135.png

またクエリとコンテンツに対して異なる特徴量抽出器を用いることで、音声から画像を検索したり、画像からテキストデータを検索したりすることも可能です[2]。ただしこの2つの特徴量抽出器は互いに同じ特徴量空間において、似た(似ていない)コンテンツに対して近い(遠い)特徴量を抽出する必要があります。

https://cacoo.com/diagrams/jO707b3qI3EwfwrH-9C154.png

前置きが長くなりましたが、ここからは料理写真の類似画像検索を実現した具体的な方法について説明していきます。

特徴量抽出器の作成

まずは料理写真の特徴量を抽出する方法を説明します。画像の特徴量としては、RGBの統計値やSIFT特徴量などの静的な特徴量や、多層のニューラルネットワークとして構成された画像認識モデルの中間層の出力値を用いることがありますが、今回は画像認識モデルを利用しました。

画像認識モデルを用いた特徴量抽出を行う最も手軽な手法の1つが、ImageNetのデータを用いて構築されたILSVRCデータセットの分類タスクに対して学習されたモデルを利用することです。ILSVRCデータセットは端的にいえば1000種類にあらかじめ分類された大量の画像が含まれるデータセットです。これを分類するために学習されたモデルはそのラベルに該当する写真をよく分類することができるだけでなく、そのような分類を行う過程で、一般的な物体を分類するのに必要な特徴量を画像から抽出することが期待できます。

https://cacoo.com/diagrams/jO707b3qI3EwfwrH-548AE.png

実際に画像認識モデルを応用する多くのケースにおいて、ILSVRCデータセットに対して学習した画像認識モデルを利用し、その分類レイヤーのみを再学習することで必要なタスクに最適化するという手法が取られます。しかしながら、タスクの領域を料理画像に限定する場合など、タスクのドメインによる変化が大きい場合、この手法が有効でない場合があります。その意味で、ILSVRCデータセットは一般的な物体の写真の認識を目的としていますから、料理に関する詳細な特徴を画像から抽出するのに必ずしも適しているとはいえません。

では実際にILSVRCデータセットに対して学習されたInceptionV3モデルが抽出する特徴量を見てみましょう。特徴量としては、最終層付近のPooling層の出力(2048次元)を用います。クックパッドに掲載されていない私の作った料理の写真をクエリとして、クックパッドのレシピ写真の中から近い特徴量を持つ写真を集めてみます。

クエリ画像候補レシピ123
f:id:ayemos:20180828140834j:plain

(ゴーヤチャンプルー)

Cpicon 鮭ソテーの味噌マヨ丼 by SHIORINGO☆ Cpicon ケチャップとマヨネーズで簡単豚肉炒め by KKYYOO Cpicon スタミナ満点★夏野菜ドライカレー by chxa_juni
f:id:ayemos:20180828143802j:plain

(グリーンカレー)

Cpicon ゚・。+☆ナスのあんかけ゚・。+☆ by ゆーちょこ Cpicon 納豆とオクラと長芋となめ茸のサラダ! by ☆sohta☆ Cpicon マヨ少なめポテトサラダ by ◉さっちゃん◉
f:id:ayemos:20180828133246j:plain

(チーズとハムのホットサンド)

Cpicon カボチャの煮物でパンプキンケーキ by ayutomoya Cpicon ケチャチーズトースト♡ by chisafu Cpicon 豆乳黒糖フレンチトースト☆ by okanao

おおむね質感や色味、構図の似た写真が抽出されているように見えますが、料理の種類や品目を見分けるのに有効な特徴量を選択的に捉えられているようには見えません。

そこで今回は、クックパッドに投稿されたレシピのデータを利用し、料理画像により最適化された画像認識モデルを構築しました。まずは、そのようなモデルを学習するためのデータをどのように収集したのかを説明します。

ラベル付きデータの質と量について

クックパッドには現在280万品以上のレシピが公開されており、その大部分について

  • トップ写真
  • タイトル
  • 手順
    • 本文
    • 写真
  • 材料
    • 名前
    • 分量
  • レシピのアクセス/クリックログ
    • 到達した際の検索クエリ

といったメタデータが付与されています。ここから教師あり学習に利用するラベル付きデータを生成することができると考えられます。今回は、似た料理あるいは同じ料理の写真を抽出する画像検索(を行うための画像認識モデルの学習)を目的とするため、 料理のカテゴリ あるいは 料理名 をよく表すデータを得ることを目指します。

ところで、ラベル付きデータの有用さを測る重要な指標としてはまずその質が挙げられます。ラベル付けに間違いがなく、そのラベルの選び方もまた、対象とするドメインに対してMECEな集合を構築していることが望ましいと考えられます。

一方、ラベルを用意するのにかかるコストも見過ごせません。「和食/洋食/中華」のようなラベルはレシピあるいは料理画像にとって重要な情報である一方で、これを得るためには手作業でのラベル付が必要になります。それに対して「手順の本文の長さの合計」など、統計的な処理のみによって得られるメタデータは、それを 自動で 付与できるという利点を持ちます。一方でこのデータは調理にかかる時間や手間との相関が期待できるという意味で示唆のあるデータでもあります。

このように多くの場合において、ラベル付きデータの質と、量あるいは生成コストがトレードオフとなります。従って、機械学習に利用するラベル付きデータの有用さは少なくともその質と量という視点から多面的に評価する必要があるでしょう。特に人手でラベルづけを行う場合、その速度や効率の限界により、生成できるデータのスケールに対して強い制限があるという点には注意が必要です。

ラベル付きレシピデータの大量生成

クックパッドに投稿されたレシピには、先述したとおりタイトル情報が付与されています。しかしながらこれはレシピを投稿したユーザーが入力したものであり、料理名以外の情報が含まれていたり、その表記が様々であったりと、そのままラベルに利用できる状態ではありません。

手作業で料理名ラベルを付けていくことも可能ですが、時間がかかってしまうことに加え、本来的に階層的であると思われる料理名の全体集合とその要素を定めることは難しいという事が予測できます。ただし、料理のオントロジー[3]を構築する取り組みもあるということは補足しておきます。そこで今回は、「質はそこそこ、量はたくさん」なラベル付きデータを生成することを目指し、タイトルからラベルを抽出する仕組みをルールベースで構築しました。

具体的な抽出方法の説明は省きますが、この手法を取ることでクックパッドに公開されている280万以上のレシピデータの中から、120万のレシピに対して約1800種類の料理名ラベルを付与したラベル付きデータを生成することができました。

https://cacoo.com/diagrams/jO707b3qI3EwfwrH-65516.png

モデルの学習と結果の確認

ImageNetで事前学習されたInceptionV3モデルを利用し、上記の方法で得られたラベル付き料理画像データセットの分類タスクに対して学習を行います。学習したモデルを利用してクックパッド外の料理写真の特徴量を抽出し、クックパッドのレシピの中から近い特徴量を持つものを集めてみます。

クエリ画像候補レシピ123
f:id:ayemos:20180828140834j:plain

(ゴーヤチャンプルー)

Cpicon 特製☆ゴーヤチャンプル by もんきちP Cpicon 苦くない♪ゴーヤチャンプルー♡ by mii♡cafe Cpicon ゴーヤチャンプルー by 料理大好き男子
f:id:ayemos:20180828143802j:plain

(グリーンカレー)

Cpicon 簡単☆本格グリーンカレー by ricorico♡ Cpicon 簡単☆ココナッツカレー by junuts Cpicon タイ・グリーンカレー  by ちむのダンナごはん
f:id:ayemos:20180828133246j:plain

(チーズとハムのホットサンド)

Cpicon 簡単‼︎ロールパンでホットサンド‼︎ by まりえcafe Cpicon 《ストウブ》オーブン不要ミルクちぎりパン by kurara1230 Cpicon リメイク♡牛丼でホットサンドっ by 白ぽこ

ImageNetで事前学習されたモデルをそのまま使った場合に比べて、料理としてより近いものが抽出できているように見えます。この辺りは明確な指標で比較するのが難しいですが、少なくとも類似の料理画像を抽出するという目的においてより優れた特徴量抽出ができていると言えそうです。

弱教師あり学習という選択肢

ラベルの正確性をあえて犠牲にし、その引き換えに大量のデータを得るという手法が有効である場合があります。このような手法をweakly supervised learningと呼ぶことがありますが、同様な手法として最近ではInstagramのハッシュタグ情報を利用したFacebook Researchによる実験[4]が有名です。

この手法は『手動でのラベルづけコストが高く、且つラベルの付いていないデータが大量にある』というケースにおいて特に有効と考えられますが、自社でデータをもつ企業にとっては珍しい状況ではないはずです。その意味でweakly supervised learningは、現場での実用性に優れた手法の1つでしょう。

高次元ベクトルの高速な近傍探索

ところで、類似コンテンツの検索を行うためにはクエリから得られた特徴量に対して、それと距離の近いコンテンツを見つけ出す必要があります。検索対象となるコンテンツ(レシピなど)がN件あり、それぞれD次元の特徴量(ベクトル)をもつ場合、クエリに対して距離の近いコンテンツを探すためにはN件全てとの比較が必要となり、それぞれの比較に大雑把に次元数分の計算が必要になります。

これはいうなれば転置インデックスのない文章を上から下まで順番に検索しているようなものですが、検索のユースケースによってはこの計算のコストが受け入れられない場合があります。より正しくは、大きいNに対してインデックスを用いない検索を行う場合、クエリ画像からの特徴量抽出(t0)に対して探索にかかる時間(t1)が、クエリ1件の検索にかかる時間(t0+t1)において支配的になります。

https://cacoo.com/diagrams/jO707b3qI3EwfwrH-31462.png

このような場合には、t1を削減するために近似最近傍探索を用いるという手があります。ベクトルの近似最近傍探索とは、必ずしも正しい最近傍のベクトルを得られる保証がないという点を受け入れる代わりに探索を高速化する手法であり、Facebook Researchの公開するfaissやYahoo! JapanによるNGTなど、いくつかの実装が公開されています。[5]ではその問題設定に始まり各種手法の比較が行われいます。

ちなみにt0とt1をあえて区別した上で議論しましたが、t1を十分に削減できた時に今度は特徴量抽出にかかる時間(t0)がボトルネックとなりうるという点についても述べておきます。これは巨大な画像認識モデルを利用する場合は特に注意が必要です。

まとめ

一般画像認識と異なるドメインにおいて画像検索を行うために、そのドメインのデータを用いて画像認識モデルを学習することで画像検索の性能を向上する手法を紹介しました。また完全なラベル付きデータがない状況で学習を行うために取る方法として、データの質を犠牲にしつつもそれを大量生成するという選択肢を挙げ、実際に生成したデータを用いて学習した結果を示しました。

また今回は得られた特徴量を検索に利用した際の有用性のみを紹介しましたが、分類やレコメンデーションなど、その他のタスクに流用できる可能性もあります。クックパッドにはレシピという中心的なデータがありますが、その様なデータに対してこのような汎用性の期待できる特徴量を用意することで、画像検索を含む様々な応用への可能性を広げるとも考えられます。

レシピは1つの料理を作るのに必要なすべての情報を含み、その名前から写真、材料と手順に至るまで1箇所に集まっているという、饒舌で密度の高いデータです。そんなレシピのデータを使った研究開発に興味のある方は是非採用ページからご応募ください。

参考文献

[1]: https://arxiv.org/abs/1706.06064

[2]: http://im2recipe.csail.mit.edu

[3]: http://www.ls.info.hiroshima-cu.ac.jp/cgi-bin/cooking/wiki.cgi

[4]: https://research.fb.com/publications/exploring-the-limits-of-weakly-supervised-pretraining/

[5]: https://arxiv.org/abs/1610.02455