このプロジェクトは、同様の順序画像を表示するサービスの作成に焦点を当てています。
そのUI https://ordsimilarity.com/で入手できます。 API (詳細)は、https://api.ordsimilarity.comで入手できます。
写真は、 average hashアルゴリズムを使用して分類され、0Sおよび1Sのビットシーケンスに変換されます。次に、 Hamming distanceを使用して比較されます。これは、2つの写真の間で一般的なビット数を測定します。このリンクには、詳細な説明があります。
すべての条例の平均ハッシュはJSONファイルに保存されます。例データは、 average_hash_example.jsonで見ることができます。
注:「通常のDB」の代わりにJSONファイルを使用します。なぜなら、常にすべてのデータを内部のすべてのデータをループする必要があるため、SQLite3のようなDBよりもJSONファイルからすべてのデータをロードする方がはるかに高速であることがわかります。
主な処理機能は、 get_matches.pyのget_matches_from_dataです。この関数は、指定されたすべての平均ハッシュを繰り返し、類似性を提供されたデータから計算された平均ハッシュ(順序IDまたはカスタム画像コンテンツ)と比較します。類似性によってソートされた、最も類似した条例のリストを返します。
get_matches.py 、関数へのCLIアクセスも提供します。詳細については、 python get_matches.py --helpを参照してください。
APIは、 FastAPIフレームワークを使用してpythonに実装されています。起動時には、JSONファイルからの平均ハッシュをメモリにロードします。次に、各リクエストに対して、上記のget_matches_from_data関数にこのデータを提供し、結果を収集します。 JSON結果をクライアントに返す前に、追加の有用なプロパティまたはリンクを使用して、同様の条例データを豊かにします。
注:APIは実際にRust APIを呼び出し、パフォーマンスがはるかに優れています。詳細については、 Rust serverセクションを参照してください。
APIには、 api.pyで定義されている類似性検索の複数のエンドポイントが含まれています。
GET /ord_id/{ord_id}?top_n=Ntop_nの最大値は20で、オプションです。指定されていない場合、デフォルトは20になります。POST /file?top_n=Ncurl -X POST -H "Content-Type: multipart/form-data" -F "file=@images/1.jpg" http://localhost:8001/file?top_n=10top_nは無制限であり、オプションです。指定されていない場合、デフォルトは20になります。パフォーマンスを改善するために、 get_matches機能もRustに実装されており、類似性検索を加速します。
similar_picturesには、この目的のためにRustバイナリとライブラリが含まれています。
pythonからのRustへの接続は、 get_matches_rust.pyに確立されており、 get_matches.pyと同じCLIインターフェイスを公開します。この接続は、 similar_pictures/target/release/libsimilar_pictures.soの下にあるRust共有ライブラリによって可能になります。
さらに、 CLIとして作用するスタンドアロンのRustバイナリが作成され、 similar_pictures/target/release/similar_picturesの下で作成されます。 CLIヘルプは./similar_pictures/target/release/similar_pictures --helpを実行することで見ることができます。その使用は、 pythonバージョンに似ています。
Rustライブラリとバイナリの両方が、 pythonバージョンと同じタスクを実行するsimilar_pictures/src/get_matches.rsの一般的なget_matches関数を利用しています。オペレーティングシステム用のRustバイナリとライブラリを構築するには、 cargo build --release 。
サーバーの起動に平均ハッシュをメモリにロードするアプローチがリクエストをより速く提供するアプローチも、 rust_http_serverでRust -in Rustで複製されました。
python APIと同様のエンドポイントを持つ(非公開の)サーバーが含まれています。唯一の違いは、ファイルオブジェクトを受け入れないことです。ファイル_hashを直接提供する必要があります。
直接使用するのではなく、 python APIのバックエンドとして使用する必要があります。接続はrust_server.pyで確立されています。