Open AIの前提条件のクリップモデルを使用して、クエリ(テキストまたは画像)に基づいて画像を取得します。
クエリとしてのテキスト。
クエリとしての画像。
Clip(コントラスト型言語イメージのプリトレーニング)は、さまざまな(画像、テキスト)ペアでトレーニングされたニューラルネットワークです。画像とテキストを同じ潜在スペースにマッピングすることで、類似性測定を使用して比較できます。
このリポジトリで作業を拡張して、テキストと画像の両方をクエリとして使用できるシンプルな画像検索エンジンを作成しました。検索エンジンは次のように機能します。
image_id: {"url": https://abc.com/xyz, "feature_vector": [0.1, 0.3, ..., 0.2]}
25,000の画像を含むUnsplashデータセットのLiteバージョンを使用しました。 K-nearest Neighbor Searchは、Amazon Elasticsearch Serviceを搭載しています。 AWS Lambda関数としてクエリサービスを展開し、その前にAPIゲートウェイを配置しました。フロントエンドは、Riremlitを使用して開発されています。
pip install -e . --no-cache-dir
python scripts/download_unsplash.py --image_width=480 --threads_count=32
これにより、データセット内の写真に関するメタデータを含むzipファイルをダウンロードして抽出します。スクリプトは、写真のURLを使用して、実際の画像をunsplash-dataset/photosにダウンロードします。ダウンロードはいくつかの画像で失敗する可能性があります(この問題を参照)。クリップはとにかく224 x 224に画像をダウンサンプリングするため、ダウンロードした画像の幅を調整してストレージスペースを削減することをお勧めします。また、 threads_countパラメーターを増やして、より速いパフォーマンスを実現することもできます。
python scripts/ingest_data.py
スクリプトは、前処理されたクリップモデルをダウンロードし、バッチで画像を処理します。ある場合はGPUを使用します。
AWS LambdaのDocker画像を構築します。
docker build --build-arg AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID
--build-arg AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY
--tag clip-image-search
--file server/Dockerfile .
docker画像をコンテナとして実行します。
docker run -p 9000:8080 -it --rm clip-image-search
ポストリクエストでコンテナをテストします。
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"query": "two dogs", "input_type": "text"}'
streamlit run streamlit_app.py