こんにちは、データサイエンティストの髙橋です。業務では企画/分析/機械学習モデル作成/プロダクション向けの実装/効果検証を一貫して行っています。
この記事では類似画像検索システムを内製化したことで、既に社内で利用していた他社製のものと比較して精度を維持しながらコスト削減が実現できたことについて紹介します。
なお、類似画像検索システムの機械学習部分とシステム開発部分(GCP を利用した処理の高速化)との2つに分けて紹介します。今回は前者の機械学習部分についての記事となります。
内製化の目的
弊社が運営している CtoC EC サービス BUYMA は、CtoC という特性上同じ商品が異なる出品者から出品されている場合が多いです。そのため、どの商品が今売れ筋なのか、その商品のサイト全体での在庫状況はどうなのか、価格差はどの程度あるのかなどを正確に把握するには異なる出品者から出品されている同じ商品の名寄せが必要です。
それを実現するために、商品画像同士の類似度を計算し一定以上のものを人手でアノテーションすることで商品の名寄せを社内で行っていました。ここで商品画像同士の類似度を計算するために他社製の類似画像検索システムを利用していました。しかし、その費用がそれなりに高く、内製化することでコスト削減を実現したいというのが目的でした。
内製化による事業インパクト
内製化したシステムは既に稼働しており、これまでと比較して精度は維持したまま年間数百万円規模のコスト削減が見込まれています。
加えて、他社製の類似画像検索システムではコストが高く断念していた EC サイトでの購入者向けの画像を起点にしたレコメンドや、画像で類似商品を検索できる機能なども検討出来るようになりました。
内製化成功のポイント
以下2点が内製化成功のポイントであったと考えています。
1点目について、私の入社前から社内では名寄せに対する要望があり機械学習モデル開発を検討したことがあったようですが、 BUYMA には数百万件以上の膨大な商品があり機械学習モデルのトレーニング・評価のイテレーションに時間がかかる上に中々期待する精度までは至らずストップしている状態でした。
そこで、どうにかして精度を上げる方法は検討せず、世の中では大規模な深層学習モデルの開発が活発であったため、何か利用できそうなものがないか定期的に調査していました。すると、 Contrastive Language-Image Pre-Training (CLIP) や Segment-Anything Model (SAM) のようなトレーニング不要で高精度に画像の類似度計算やセグメンテーションが出来るモデルが登場し、このタイミングであれば時間をかけすぎずに内製化出来るのではないかと思い PoC をスタートさせました。
2点目については、精度が期待する水準に至らない場合に、 Fine-Tuning のような時間がかかることよりも先に、後述する簡易な画像処理アルゴリズムを利用して運用上問題ない精度まで向上させました。これにより、この PJ はほぼ1人での担当でしたが企画から本番運用まで約1年で完遂することが出来ました。おそらくですが、あまり時間をかけすぎてしまうとビジネス上の課題の優先度の変化などからペンディングする必要性が生じた可能性が高かったと考えています。
BUYMA における類似画像検索の課題
具体的にどのような方法で類似画像検索を実現したかの前に、 BUYMA における類似画像検索の課題について説明します。
BUYMA の商品画像は出品者の方が自由に設定できるものであり、商品単体よりも様々なものをコラージュしている場合が多いです。例えば、色違い/角度違いの商品、着用画像や文字などをコラージュしていることが多いです。
そのため、単純に何らかの手法で画像同士の類似度を計算しても、同じ商品の画像にも関わらず類似度が低く出てしまう課題がありました。
類似画像検索方法の概要
課題に対応するために、画像から商品部分を切り抜いてその部分同士で画像類似度を計算する方法を考えました。はじめは Object Detection が出来る深層学習モデルをトレーニングし、それにより商品部分を検知し切り抜く方法を考えましたが、BUYMA には様々な商品がありラベル作成の手間がかかる懸念がありました。
そこで、企画検討当時に発表された Segment-Anything Model (SAM) というトレーニング不要で画像から物体をセグメンテーション出来るモデルの利用を検討しました。詳細は後述しますが、 SAM と画像ハッシュを組み合わせることで既存の他社製の類似画像検索システムと同等の精度を実現しました。
類似画像検索各ステップの詳細
類似画像検索は以下のステップに分かれています。
- 商品画像内の物体存在箇所をセグメンテーションし切り抜き
- 切り抜いた画像の Embedding 計算
- Embedding により画像同士の類似度計算
- 画像ハッシュにより画像同士の類似度計算
- Embedding 類似度と画像ハッシュ類似度を組合せ同一商品の可能性判定
ここで、Embedding とは以下のように画像を数値の列に変換したものです。
似た画像同士が何らかの類似度計算関数(cos 類似度など)で高い値を持つようにトレーニングされた機械学習モデルを利用することで、画像同士の類似度を計算することが出来ます。
各ステップの詳細について説明します。
商品画像内の物体存在箇所をセグメンテーションし切り抜き
課題でも述べた通り、BUYMA の商品画像はコラージュされている場合が多く、例えば以下のような同じ商品であるが2つの異なる出品者の画像をそのまま Embedding 化し類似度を計算すると 0.496 となり、低い類似度となってしまいました。
そこで、SAM というモデルを利用して商品画像内から商品を含む物体存在箇所をセグメンテーションし切り抜きました。SAMとは、あらゆる物体をセグメンテーションするための汎用的なモデルであり、さまざまな画像に対して物体を抽出することが可能です。大量のデータで訓練されており、Fine-Tuning なしでも高い精度を発揮します。
実際にSAM を利用してそれぞれの画像から物体部分を切り抜くと以下のような画像群が作成されました。この中で黒の財布部分を切り抜けている画像をそれぞれ Embedding し類似度を計算すると0.975 と非常に高い値となりました。
切り抜いた画像の Embedding 計算
前ステップで商品画像から切り抜かれた各画像について、機械学習モデルを利用し Embedding を計算します。ここでもラベル作成やトレーニングの手間を削減するために、事前学習済みの深層学習モデルを利用しました。
事前学習済みモデルとしては、 Japanese-CLIP(Contrastive Language-Image Pre-Training) を利用しました。CLIP とは、大量の画像とテキストの対応関係を学習することにより、画像と自然言語の両方での検索や類似度計算が可能なモデルです。このモデルを選んだ理由は、PoC で実際の BUYMA 画像で精度を検証してみて問題なさそうであったのと、日本語での自然言語による画像検索の拡張性も考慮してのことです(CLIP ベースのモデルであるため、自然言語と画像の類似度も計算可能です)。
しかし、ある程度開発が進んだ段階で open_clip のいくつかの学習済みモデルと比較した結果、より精度が良いモデルがあり場合によってはそちらを採用しても良かったかもしれないです。今後、さらに精度向上が必要な場合には再度検証を行う予定です。
Embedding により画像同士の類似度計算
前ステップにより1商品画像に対して複数の Embedding が作成されます。画像同士の類似度を1つの値として算出するために、商品内の切り抜かれた部分の Embedding の全ての組み合わせの類似度を計算しその中の最大の値を画像同士の類似度としました。
前の説明で用いた商品画像を例とすると、以下のように切り抜かれた部分同士の全ての組み合わせの類似度を計算し、その中の最大の値(ここでは黒の傾いていない財布部分同士の類似度が 0.975 で最大であった)をもとの商品画像同士の類似度としました。
この方法を試してみた時点で、既存の他社製の類似画像検索システムに近い精度が出せましたがやや及ばない状態でした。そこで後述する画像ハッシュによる類似度計算も組み合わせることとしました。
画像ハッシュにより画像同士の類似度計算
前述したように Embedding よる類似度計算では既存のシステムに精度がやや及ばない状態であり、その主な原因は商品内の一部分での切り抜き同士で過剰に類似度が高くなってしまうパターンが主でした。
具体的な例としては、以下のように商品の一部と背景部分のみを切り抜いてしまい、それら画像同士の類似度が 0.9 以上と高くなるケースがありました。
これを防ぐために、Embedding による画像同士の類似度が一定以上である組み合わせについて、画像ハッシュによる類似度も計算しました。画像ハッシュとは、画像の視覚的特徴を数値化し簡略化した表現で画像を比較する手法です。これにより、細部の違いや大まかな構造の類似性を把握できます。例えば、Average Hash (aHash) では大まかに言うと画素値が平均よりも高いかで2値化して比較を行います。
実際に上記のようなケースにおいて画像ハッシュによる類似度を計算すると非常に高い値(画像ハッシュでは値が高いほど類似度が低い)となりました。
Embedding 類似度と画像ハッシュ類似度を組合せ同一商品の可能性判定
Embedding による類似度と画像ハッシュによる類似度を組み合わせたしきい値を設定し、それを超えた商品画像同士のペアを同一商品である可能性が高いと判定するようにしました。既存の他社製のものでも同様に類似度のしきい値が一定以上を同一商品の可能性が高いとしていました。
しきい値は、既存のものと判定数をおおよそ同じにした方が移行後の運用がしやすいと考え、そうなるように決めました。また、このとき既存のものとの比較も行い精度に大きな乖離がないことを確認しました。具体的には、しきい値調整用のデータ(約704億の画像ペア)とテスト用のデータ(約1785億の画像ペア)を用意し、既存のものでの判定結果を正としたときに Precision 、 Recall を計算したところ以下の値でした。
Precsion | Recall | |
---|---|---|
しきい値調整用のデータ | 0.7 | 0.72 |
テスト用のデータ | 0.8 | 0.77 |
Precision 、 Recall を悪化させる要因である既存システム/内製化システムでのみ同一の可能性が高いと判定された画像ペアをそれぞれ目視で確認してみると、既存システムでのみ同一と判定されたペアにも実際には異なる商品同士があったり、内製化システムでのみ判定されたペアには実際に同一であるペアがあったりし、既存の外部ツールでも誤検知や見逃しが多くありました。
また、人手でアノテーションいただく方々に既存システムと内製化システムを一定期間並行運用していただき、運用上の精度も問題ないことを確認いただいたため、現在内製化システムに移行しています。
まとめ
内製化により精度を維持しながら大幅なコスト削減を実現し、さらなる類似画像検索機能の活用可能性も広がりました。
次回は、GCP のマネージドサービスを利用して推論方法の各ステップを高速化したシステム開発部分の詳細を紹介する予定です。実運用では数十〜数千億規模の画像の組合せについて定期的に類似度計算する必要があり、高速化も非常に重要なポイントでした。
株式会社エニグモ すべての求人一覧