Dieses Projekt konzentriert sich auf das Erstellen eines Dienstes, der ähnliche ordinale Bilder anzeigt.
Die UI ist unter https://ordsimaility.com/ erhältlich. Die API (Details unten) ist unter https://api.ordsimaility.com verfügbar.
Die Bilder werden unter Verwendung des average hash -Algorithmus klassifiziert, der sie in eine Bitsequenz von 0S und 1s umwandelt. Sie werden dann mit dem Hamming distance verglichen, der misst, wie viele Bits zwischen zwei Bildern üblich sind. Eine detaillierte Beschreibung finden Sie in diesem Link.
Die durchschnittlichen Hashes aller Ordnungen werden in einer JSON -Datei gespeichert. Beispieldaten sind in average_hash_example.json zu sehen.
HINWEIS: Wir verwenden JSON -Datei anstelle eines "normalen DB", da wir immer alle Daten durchschlafen müssen, und es stellt sich heraus, dass es viel schneller ist, alle Daten aus der JSON -Datei zu laden als von einem DB wie SQLite3.
Die Hauptverarbeitungsfunktion ist get_matches_from_data in get_matches.py . Diese Funktion iteriert alle angegebenen durchschnittlichen Hashes und vergleicht ihre Ähnlichkeit mit dem durch die bereitgestellten Daten berechneten durchschnittlichen Hash - entweder einer Ordnungs -ID oder dem benutzerdefinierten Bildinhalt. Es gibt eine Liste der meisten ähnlichen Ordnungen zurück, die nach ihrer Ähnlichkeit sortiert sind.
get_matches.py bietet auch CLI -Zugriff auf die Funktion. Weitere Informationen finden Sie unter python get_matches.py --help .
Die API wird in python mit dem FastAPI -Framework implementiert. Beim Start wird die durchschnittlichen Hashes aus der JSON -Datei in den Speicher geladen. Für jede Anfrage liefert sie diese Daten für die oben genannte Funktion get_matches_from_data und sammelt das Ergebnis. Bevor das JSON -Ergebnis an den Client zurückgibt, bereichert es die ähnlichen Ordinalsdaten mit zusätzlichen nützlichen Eigenschaften oder Links.
Hinweis: Die API nennt tatsächlich die Rust -API, die eine viel bessere Leistung bietet. Weitere Informationen finden Sie im Abschnitt Rust server .
Die API enthält mehrere Endpunkte für Ähnlichkeitssuche, die in api.py definiert sind:
GET /ord_id/{ord_id}?top_n=Ntop_n beträgt 20 und ist optional. Wenn nicht angegeben, wird es zu 20 standardmäßig.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 ist in diesem Fall unbegrenzt und optional. Wenn nicht angegeben, wird es zu 20 standardmäßig. Für eine verbesserte Leistung wurde auch die Funktion get_matches in Rust implementiert, um die Ähnlichkeitssuche zu beschleunigen.
similar_pictures enthält zu diesem Zweck eine Rust -Binärin und Bibliothek.
Die Verbindung zu Rust von python ist in get_matches_rust.py hergestellt, die dieselbe CLI -Schnittstelle wie get_matches.py enthüllt. Diese Verbindung wird durch eine Rust Bibliothek ermöglicht, die unter similar_pictures/target/release/libsimilar_pictures.so liegt.
Zusätzlich wird eine eigenständige Rust -Binärin als CLI unter similar_pictures/target/release/similar_pictures erstellt. CLI -Hilfe ist durch Rennen zu sehen ./similar_pictures/target/release/similar_pictures --help Seine Verwendung ähnelt der python -Version.
Sowohl die Rust -Bibliothek als auch die Binary verwenden die Common get_matches -Funktion von similar_pictures/src/get_matches.rs , die dieselbe Aufgabe wie die python -Version ausführt. Um die Rost -Binär- und Bibliothek für Ihr Betriebssystem zu bauen, führen Sie cargo build --release .
Der Ansatz beim Laden der durchschnittlichen Hashes in den Speicher beim Server -Start, um Anforderungen zu erfüllen, wurde auch in Rust repliziert - in rust_http_server .
Es enthält einen (nicht öffentlichen) Server mit ähnlichen Endpunkten wie die python -API - der einzige Unterschied besteht darin, dass es kein Dateiobjekt akzeptiert, sondern eine direkte Datei_Hash erhalten muss.
Es sollte nicht direkt verwendet werden, sondern als Backend für die python -API. Die Verbindung wird in rust_server.py hergestellt.