コンテンツにスキップ

Blog

Image Vector PoC: Gradioによるデモアプリの構築と実験結果

Image Vector PoC プロジェクトの一環として、Gradioを使用したデモアプリを作成し、実際のデータを用いた検証を行っています。

デモアプリの概要

今回作成したデモアプリでは、以下の主要な機能を実装しました。

  • テキスト検索機能: 自然言語で画像を検索
  • 類似画像検索機能: アップロードした画像に似た画像を検索
  • フィルタリング機能: イベントごとの絞り込み

モデルには、事前の実験で多言語対応において良好な結果を示した Google SigLIP を採用しています。

検証データ

検証には、PyCon JP がFlickrで公開している3万枚を超える写真データを使用しました。

実験結果

できたこと

  • テキスト検索: 「おやつ」や「ビール」といった日本語のキーワードを入力すると、多くの関連画像が高い精度でヒットすることを確認しました。
  • 類似画像検索: 画像を入力すると、構図や色合いなど「雰囲気」が似ている写真が検索結果として表示されました。

以下が、デモアプリのスクリーンショットです。

デモアプリのスクリーンショット(ステージを検索) デモアプリのスクリーンショット(類似画像検索)

できていないこと・課題

  • 人物検索: 特定の人の顔画像を入れても、まったくの別人が検索結果に出ることがあります。これは本システムが顔認識(Face Recognition)ではなく、画像全体のベクトル化を行っているためであり、想定される挙動ではありますが、利用時には注意が必要です。

考察

実際に触ってみて感じた点は以下の通りです。

  • 大量のデータからの絞り込み: さまざまなキーワードを使って検索すると、3万枚という膨大な写真の中からある程度絞り込まれた画像が瞬時に出てくるのは非常に便利だと感じました。
  • 雰囲気や構図の一致: 画像から画像を検索する場合、同じような構図や、服装を含めた「雰囲気」まで似た写真が出てくることが確認できました。
  • クロップ検索の有用性: さらに、画像の一部をクロップしてその部分を指定して検索すると、同じようなカットの写真をピンポイントで取得できることがわかりました。これは素材探しなどで便利に使えそうです。

また、過去のイベント写真を眺めていると、個人的に懐かしい写真にも予期せず出会うことがあり、技術的な検証以上の感慨深さがありました。

データの利用に関する注記

本検証で使用した写真データについて、以下の通り付記します。 - 使用した写真は CC-BY PyCon JP のライセンス下で公開されているものです。 - 筆者(寺田)は一般社団法人PyCon JP Associationの理事を務めておりますが、写真の取得にあたっては他の理事の許可を得た上でAPIキーを取得し、実施しました。

新プロジェクト「Image Vector PoC」を開始しました

新しいプロジェクトとして、画像のベクトル検索を検証する Image Vector PoC を開始しました。

プロジェクトの目的

この実験的なプロジェクトでは、昨今のマルチモーダルモデルの進化を受けて、画像のベクトル化による検索システムがどこまで実用的かを検証します。特に、自然言語(日本語)で「どのような画像か」を説明することで、意図した画像を見つけ出せるかどうかに焦点を当てています。

取り組みの現状

現在、いくつかのモデルを比較検討していますが、日本語での検索においては Google SigLIP が比較的意図に近い結果を返す傾向が見られています。

まずはこの SigLIP を使用したシンプルな画像検索システムをサンプルとして構築し、実際の検索精度や使い勝手を確認していく予定です。

リポジトリはこちら: https://github.com/cmscom/image-vector-poc

既存DBで実現するベクトル検索:理論的な「下界フィルタ」より単純な「範囲検索」を選んだ理由

前回の記事(2月4日の一部)では、複雑化したLSH Overlap手法を捨て、数学的に扱いやすい「Pivot(参照点)」ベースの手法へ転換する話を書きました。

その後、理論的に美しい「三角不等式を用いた下界(Lower Bound)フィルタ」の実装と検証を進めていましたが、実験結果は予想外のものでした。 結論から言えば、「理論的に正しい厳密なフィルタ」は、「単純でヒューリスティックな範囲検索」に実用面で完敗しました。

今回は、一連のベンチマーク実験から得られた知見と、最終的にたどり着いた「最もシンプルで実用的な構成」について報告します。

Project紹介: net-vis - JupyterLabで手軽にネットワーク可視化をするために

今回は、現在開発・メンテナンスを行っている OSS プロジェクト net-vis について紹介します。

JupyterLab 上で複雑なネットワーク構造(グラフ理論のグラフ)を可視化したいとき、これまでは「決定版」といえるツールがなかなか見当たらない状況でした。NetworkX 標準の nx.draw では静的な描画しか生成されず細かい確認が難しいですし、かといって多機能な可視化ライブラリを使おうとするとセットアップが面倒だったりします。

そんな「ちょうどいい」ツールがない隙間を埋めるために開発したのが net-vis です。

軽量ベクトル検索の最適化:LSHのビット列を「三角不等式」へ転換してスリム化を実現

エンジニアリングにおいて、複雑なヒューリスティックを積み重ねた結果、管理しきれないほどの複雑さを抱え込んでしまうことがあります。 今回のプロジェクトでも、まさにその「泥沼」に足を踏み入れかけていました。

軽量なベクトル検索を実現するために採用していた「LSH(Locality Sensitive Hashing)」のOverlap戦略が限界を迎え、よりシンプルで数学的な裏付けのある「Pivot(参照点)ベース」の手法へと転換した話をします。31個のカラムを8個に削減し、劇的なスリム化と柔軟性を手に入れた過程の記録です。

ベクトル検索の基本と実践

前回の記事では、少しマニアックな「LSH Cascade」という独自のアプローチについて書きましたが、今回は基本に立ち返って「ベクトル検索(Vector Search)」そのものの一般的な仕組みや、私が普段利用している技術スタックについてまとめたいと思います。

近年、RAG (Retrieval-Augmented Generation) の流行とともに必須技術となりつつあるベクトル検索ですが、その構成要素を分解してみると、非常に興味深い技術の集合体であることがわかります。

LSH Cascade PoCプロジェクトの紹介

CMScom Labの2つ目の記事として、現在進行中のLSH Cascade PoCについて紹介します。 1月の最終週に集中的に実験を行い、良い成果が得られたため、その概要をまとめます。