こんにちは、Yahoo! JAPAN研究所エンジニアの東野です。
昨年9月には類似画像検索アプリFavNaviをリリースし、アプリの使い方とUIデザインについて紹介しました。(関連記事:流行アイテムを探してみよう。AIを使ったファッション画像検索アプリ)
今回の記事では、最近追加した機能と、その仕組みについて紹介します。
インテリアカテゴリーの追加
現状の仕様ではファッション(Ladies, Mens)のカテゴリー扱っていますが、今回のリリースでインテリアのカテゴリーも追加し、検索できるようにしました。近い将来に、家電のカテゴリーも追加する予定です。
カテゴリ一が一つ増えるだけに見えるかもしれませんが、実は思ったより大変です。
検出モデル
類似画像検索の対象となるのは画像全体ではなく、画像内の各対象物ですので、システムの構築にはまず検出モデルが必要です。日本のeコマース系画像とそれらをターゲットとした撮影画像に対して汎用的に使える検出モデルはなかったので、今の類似画像検索システムの開発着手の3年前から独自の検出モデルの開発を開始して、少しずつカテゴリーを拡充しています。
開発の中で、自分が一番大変だと思うのは、モデルを学習するためのデータセットの準備です。上記の図で示したように、一枚のファッションカテゴリーの画像に対して、画像の中で含まれている対象物を赤い矩形領域で明記します。この領域が対応するラベル(ファッションではラベルは19個)を手作業で生成することが必要です。この作業はアノテーションデータの作成といいます。ラベルはYahoo!ショッピングのカテゴリーをベースにしつつ、より類似画像検索にフィットしやすい体系を独自に設定しているので、実際に使う場合はYahoo!ショッピングのカテゴリー体系のマッピングも合わせて整備する必要があります。
ファッションカテゴリー用の検出モデルを学習する時に、ヤフオク!とYahoo!ショッピングの画像を使って、上記のようなアノテーションデータを7万枚を準備するために、Yahoo!クラウドソーシングの利活用、社内関連部門との連携、外部会社への委託などさまざまな手段を取っていました。
ただし、ファッション用の検出モデルはそのままインテリアのカテゴリーで適用できません。同じ精度のモデルを学習するために、またインテリアのカテゴリーおいて、25個のラベルで数万枚の画像のアノテーションデータを作成必要があります。このデータ作成には数カ月かかリました。
特徴量モデル
画像の中で検出され対象物の特徴量を抽出モデルも同じくて、ファッション用のモデルではそのまま使えません。商品情報のテキストを活用するVSE特徴量、同じ製品の複数のバリエーションの画像を学習するYPI特徴量はまたそれぞれ、インテリアカテゴリーのデータセットの作成、モデルの検証、パラメーターの調整など、リリースできる精度を達成するため、数カ月かかっていました。大量の画像を学習するために、ディープラーニング活用に特化したヤフー独自のスーパーコンピューターkukai(クウカイ)を活用しています。
検索インデックス
高速に検索するために、ヤフーが開発しオープンソース化したNGTを採用し、特徴量のインデックスを作成しています。インテリアのカテゴリーには二千万近くの商品がありますので、検索インデックスの作成及び運用のためのサーバー環境も増強しました。
撮影画像で検索
スマートフォンのカメラで写真を撮ることで検索できる機能を追加しました。
これにより、ユーザーの持ち物や普段の生活で見かけたアイテムを、言葉で表現しにくかったとしても、見た目上の特徴で検索できます。
撮影画像でも物体検出され、その結果から検索できます。また、物体検出の結果によらず、領域ボックス(赤い矢印で表記した白い角の矩形)を変形させて任意の領域で検索可能です。主な処理フロー(検出、特徴量計算、インデックスなど)は下記の記事を参照していただければと思います:
同一商品の表示
「FavNavi」には数千万の商品を登録しているので、検索インデックスのサイズが膨大です。運用を考えて、インデックスのサイズを削減するため、Perceptual Hash(phash)というアルゴリズムで計算したハッシュが同じの画像はインデックス時に排除しています。
しかし、そうすると除去されなかった代表の1枚の画像に紐づく商品しか検索結果に現れない結果になってしまいます。これを改善するために、排除されてしまった商品を束ねて、同一商品リストにまとめて、ユーザーに値段順で提示する機能を追加しました。
実現するための検索インデックスのシステムの変更及び全体図を簡単に説明します。上記の図のように、商品をインデックスに登録するには:
- 1-A: 商品情報と対応する画像をYahoo!ショッピングのデータベース(DB)から取得(Feederといいます)、効率に並行処理するため、Golangで作成
- 1-B: 新規商品や商品情報の変更や削除、画像の変更などをチェックするAPI(差分チェック)で確認
- 1-C: 商品画像のphashを計算し、以前登録するの商品と同一かどうかをチェックし、リストに保存し、ユーザーに提示する(今回のリリースで追加した処理)
- 2-A: 画像から対象物を検出
- 2-B: 対象物ごとに特徴量計算
- 3: ヤフーのインフラの1つであるMessage Queueを使って、NGTのインデックスに登録
GPUサーバーを利用する検出APIとMessage Queue以外の処理は、全部社内向けのContainers-as-a-Service(CaaS)環境ZCPで運用しています。デプロイが便利などメリットがたくさんありますが、落ちる前提でシステムを構成する必要がありますので、全部のプロセスで共通の監視処理を実装しています。これにより、インデックスの登録の処理のどこでエラーになったり、落ちたりすると、通知を送ってから、バックアップとプロセスの回復を自動的に行います。
まとめ
この記事では、類似画像検索アプリ「FavNavi」の三つの新機能について紹介してきました。ぜひアプリをダウンロードし、今回紹介した新機能を含めて使ってみてください。
検索方法のあたりまえが、テキストから画像に移っていく未来がいつか来ると信じています。よりオープンで、より多くの方がこの分野に興味を持ち、一緒に挑戦するために、「FavNavi」で使っている検出モデルのカテゴリーのカバレッジがもう少し広まったらモデルの公開を検討し始めています。
今後もヤフーの類似画像検索技術にご注目ください!
こちらの記事のご感想を聞かせください。
- 学びがある
- わかりやすい
- 新しい視点
ご感想ありがとうございました