億規模の画像検索を最適化する旅 (1/2)
Yupoo Picture Managerは数千万人のユーザーにサービスを提供し、数百億枚の画像を管理しています。そのユーザーギャラリーが大きくなるにつれて、Yupooは画像を素早く見つけることができるソリューションの緊急のビジネスニーズを持っています。言い換えれば、ユーザーが画像を入力すると、システムはその元画像とギャラリー内の類似画像を見つける必要があります。画像による検索サービスの開発は、この問題に対する効果的なアプローチを提供します。
画像検索サービスは、2つの進化を遂げてきた:
1.2019年初頭に最初の技術検討を開始し、2019年3月と4月に第一世代のシステムをローンチ; 2.2020年初頭にバージョンアップ計画の検討を開始し、2020年4月に第二世代システムへの全面的なバージョンアップを開始。
本稿では、2世代の画像による検索システムの技術選定と基本原理について、筆者自身のプロジェクト経験を踏まえて解説する。
概要
画像とは何か?
画像を扱う前に、画像とは何かを知らなければならない。
その答えは、画像とはピクセルの集まりであるということです。
例えば、この画像の赤枠の部分は、事実上ピクセルの集まりである。
図1](https://assets.zilliz.com/1_what_is_an_image_021e0280cc.png)
仮に赤枠の部分が画像だとすると、画像中の独立した小さな正方形のひとつひとつが、基本的な情報単位であるピクセルである。すると、画像の大きさは11×11pxとなる。
図2](https://assets.zilliz.com/2_what_is_an_image_602a91b4a0.png)
画像の数学的表現
各画像は行列で表すことができます。画像の各画素は行列の要素に対応します。
バイナリ画像
2値画像のピクセルは黒か白のどちらかなので、各ピクセルは0か1で表すことができます。 例えば、4 * 4 の二値画像の行列表現は次のようになります:
0 1 0 1
1 0 0 0
1 1 1 0
0 0 1 0
RGB 画像
3原色(赤、緑、青)を混ぜてどんな色にもできる。RGB画像の場合、各ピクセルは3つのRGBチャンネルの基本情報を持っています。同様に、各チャンネルが8ビットの数値(256レベル)を使ってグレースケールを表現する場合、ピクセルの数学的表現は次のようになります:
([0 .. 255], [0 .. 255], [0 .. 255])
4 * 4のRGB画像を例にとると、次のようになる:
図3](https://assets.zilliz.com/3_4_x_4_rgb_image_136cec77ce.png)
画像処理の本質は、これらのピクセル行列を処理することである。
画像による検索の技術的問題
元の画像、つまり全く同じピクセルを持つ画像を探しているのであれば、それらのMD5値を直接比較することができる。しかし、インターネットにアップロードされた画像は圧縮されていたり、透かしが入っていることが多い。画像にわずかな変更が加えられただけでも、MD5の結果は異なってしまうのです。ピクセルに不一致がある限り、元の画像を見つけることは不可能です。
画像単位で検索するシステムでは、類似した内容の画像を検索したい。その場合、2つの基本的な問題を解決する必要がある:
- 画像をコンピュータで処理可能なデータ形式として表現または抽象化すること。
- データは計算のために比較可能でなければならない。
具体的には、以下のような機能が必要である:
- 画像の特徴抽出。
- 特徴計算(類似度計算)。
第一世代の画像検索システム
特徴抽出 - 画像の抽象化
第一世代のサーチバイイメージシステムは、特徴抽出にPerceptual hashまたはpHashアルゴリズムを使用しています。このアルゴリズムの基本は何でしょうか?
第一世代画像検索](https://assets.zilliz.com/4_first_generation_image_search_ffd7088158.png)
上図に示すように、pHashアルゴリズムはハッシュ値を得るために画像に対して一連の変換を行います。変換プロセス中、アルゴリズムは画像を連続的に抽象化し、それによって類似画像の結果を互いに近づける。
特徴計算-類似度計算
2つの画像のpHash値の類似度を計算するには?答えはハミング距離を使うことです。ハミング距離が小さいほど、画像の内容が似ていることになります。
ハミング距離とは?異なるビットの数です。
例えば
値1: 0 1 0 1 0
値 2: 0 0 0 1 1
上記の2つの値には2つの異なるビットがあるので、それらの間のハミング距離は2である。
これで類似度計算の原理はわかった。次の問題は、1億枚の写真から1億枚のデータのハミング距離をどのように計算するかである。要するに、どのようにして類似画像を検索するのか?
プロジェクトの初期段階では、ハミング距離を素早く計算できる満足のいくツール(あるいは計算エンジン)が見つからなかった。そこで私は計画を変更した。
私の考えは、2つのpHash値のハミング距離が小さければ、pHash値をカットすれば、対応する小さな部分は等しくなる可能性が高いというものだ。
例えば
値1: 8 a 0 3 0 3 f 6
値2: 8 a 0 3 0 3 d 8
上記の2つの値を8つのセグメントに分割すると、6つのセグメントの値はまったく同じである。ハミング距離が近いことから、この2つの画像は類似していると推測できます。
変換後、ハミング距離の計算問題が等価性のマッチングの問題になったことがわかる。各pHash値を8つのセグメントに分割すると、まったく同じ値を持つセグメントが5つ以上ある限り、2つのpHash値は類似していることになる。
したがって、等価マッチングを解くのは非常に簡単である。従来のデータベースシステムの古典的なフィルタリングを使えばいいのだ。
もちろん、私は多項式マッチングを使い、ElasticSearchのminimum_should_matchを使ってマッチングの度合いを指定しています(この記事ではESの原理は紹介しませんので、自分で勉強してください)。
なぜElasticSearchなのか?第一に、前述の検索機能を備えていること。第二に、イメージ・マネージャー・プロジェクト自体がESを利用して全文検索機能を提供しており、既存のリソースを利用できるので非常に経済的である。
第一世代システムの概要
第一世代の画像検索システムでは、pHash + ElasticSearchのソリューションを選択しており、以下のような特徴がある:
- pHashアルゴリズムは使いやすく、ある程度の圧縮、透かし、ノイズに耐えることができる。
- ElasticSearchは、検索に追加コストをかけることなく、プロジェクトの既存のリソースを利用する。
しかし、このシステムの限界は明らかだ。pHashアルゴリズムは画像全体を抽象的に表現している。オリジナル画像に黒枠を加えるなど、いったん画像の完全性を壊してしまうと、オリジナルと他の画像との類似性を判断することはほとんど不可能になる。
このような限界を打破するために、全く異なる基盤技術を持つ第二世代の画像検索システムが登場した。
この記事は、Milvusのユーザーであり、UPYUNのソフトウェアエンジニアであるrifewangによって書かれました。この記事が気に入ったら、ぜひご挨拶に来てください! https://github.com/rifewang
読み続けて

The AWS Outage Was a Wake-Up Call for Vector Database Cross-Region Disaster Recovery
Zilliz Cloud Had the Answer Before the Crisis. Zilliz Cloud is the world's first vector database with native cross-region disaster recovery.

How to Install and Run OpenClaw (Previously Clawdbot/Moltbot) on Mac
Turn your Mac into an AI gateway for WhatsApp, Telegram, Discord, iMessage, and more — in under 5 minutes.

Knowledge Injection in LLMs: Fine-Tuning and RAG
Explore knowledge injection techniques like fine-tuning and RAG. Compare their effectiveness in improving accuracy, knowledge retention, and task performance.
