このリポジトリは、CLIP モデルを利用したローカル写真の画像検索エンジンを実装します。驚くほど正確で、複雑なクエリを指定して画像を検索できます。詳細については、こちらの Medium ブログ投稿を参照してください。
描かれている人物に応じて写真を分類する追加機能は、 face_recognition
ライブラリで実装されています。いくつかのフィルターも利用可能で、グループ写真やスクリーンショットなどを見つけることができます。
Python 3.8 以降の仮想環境では、PIP またはソースからインストールします。
pip install image-searcher
pip install face_recognition # Optional to enable face features
pip install flask flask_cors # Optional to enable a flask api
pip install -r dev_requirements.txt
pip install face_recognition # Optional to enable face features
pip install flask flask_cors # Optional to enable a flask api
トラブルシューティング: face_recognition のインストール中に dlib のホイールを構築する際に問題が発生した場合は、必ずpython3.8-dev
パッケージ (それぞれpython3.x-dev
) をインストールし、インストール後に前述のコマンドを使用して仮想環境を最初から再作成してください。
現在の使い方は以下の通りです。ライブラリは最初にすべての画像の埋め込みを 1 つずつ計算し、さらに参照できるように選択した辞書に保存します。写真内の人物に関する情報を計算して保存するには、 include_faces
フラグを有効にします (インデックス作成プロセスが最大 10 倍遅くなることに注意してください)。
from image_searcher import Search
searcher = Search ( image_dir_path = "/home/manu/perso/ImageSearcher/data/" ,
traverse = True ,
include_faces = False )
このプロセスが Python を通じて一度実行されると、ライブラリはそのまま使用されます。
from image_searcher import Search
searcher = Search ( image_dir_path = "/home/manu/perso/ImageSearcher/data/" ,
traverse = True ,
include_faces = False )
# Option 1: Pythonic API
from PIL import Image
ranked_images = searcher . rank_images ( "A photo of a bird." , n = 5 )
for image in ranked_images :
Image . open ( image . image_path ). convert ( 'RGB' ). show ()
# Option 2: Launch Flask api from code
from image_searcher . api import run
run ( searcher = searcher )
クエリの最後にタグを追加すると (例: A bird singing #photo
)、タグ リストに基づいて検索がフィルタリングされます。現時点でサポートされているタグは次のとおりです。
今後のサポートは次のとおりです。
対象の画像にインデックスを付けた後、Flask API を使用してモデルを 1 回ロードし、効率的に検索できます。
image_dir_path : /home/manu/Downloads/facebook_logs/messages/inbox/
save_path : /home/manu/
traverse : true
include_faces : true
reindex : false
n : 42
port :
host :
debug :
threaded :
from image_searcher . api import run
# Option 1: Through a config file
run ( config_path = "path_to_config_file.yml" )
# Option 2: Through an instanciated Search object
from image_searcher import Search
run ( searcher = Search ( image_dir_path = "/home/manu/perso/ImageSearcher/data/" ,
traverse = True ,
include_faces = False ))
gunicorn プロセスは、次のコマンドを使用してローカルで起動することもできます。
gunicorn " api.run_flask_gunicorn:create_app('path_to_config_file.yml') "
--name image_searcher
--bind 0.0.0.0: ${GUNICORN_PORT :- 5000}
--worker-tmp-dir /dev/shm
--workers= ${GUNICORN_WORKERS :- 2}
--threads= ${GUNICORN_THREADS :- 4}
--worker-class=gthread
--log-level=info
--log-file ' - '
--timeout 30
注: 多数の新しい画像のインデックスが作成されている場合は、タイムアウト パラメータ (秒単位) を調整します。
ブラウザでデモ検索エンジンsearch.html
を使用して Web ページを開きます。
オンラインの API エンドポイント経由: http://127.0.0.1:5000/get_best_images?q=a+photo+of+a+bird
Python の場合:
import requests
import json
import urllib . parse
query = "a photo of a bird"
r = requests . get ( f"http://127.0.0.1:5000/get_best_images?q= { urllib . parse . quote ( query ) } " )
print ( json . loads ( r . content )[ "results" ])
このツールを休暇の写真、メッセンジャーや Whatsapp の写真アーカイブで使用すると、古い写真の再発見につながり、長い間紛失していた写真を驚くほど見つけ出すことができます。
でテストを実行します
python -m unittest
そしてリントを実行します:
pylint image_searcher
このリポジトリは、最近開始された進行中の作業です。そのままでは、最初のインデックス作成フェーズでは 1 秒あたり約 10 枚の画像が計算され、クエリフェーズではほぼ瞬時に計算されます。
機能のリクエストや貢献は歓迎されます。検索 Web インターフェイスの改善も大歓迎です。
Search クラスのインスタンス化を簡素化および堅牢化します。
スピード:
特徴:
埋め込みファイル:
フロントエンド:
導入: