Ce projet se concentre sur la création d'un service qui affiche des images ordinales similaires.
Son UI est disponible sur https://ordsimilarity.com/. L' API (détails ci-dessous) est disponible sur https://api.ordsimilarity.com.
Les images sont classées à l'aide de l'algorithme average hash , qui les convertit en une séquence de 0 et 1. Ils sont ensuite comparés à l'aide de la Hamming distance , qui mesure le nombre de bits communs entre deux images. Une description détaillée peut être trouvée sur ce lien.
Les hachages moyens de toutes les ordinales sont stockés dans un fichier JSON . Des exemples de données peuvent être observés dans average_hash_example.json .
Remarque: Nous utilisons un fichier JSON au lieu d'un "DB normal" car nous devons toujours parcourir toutes les données à l'intérieur, et il s'avère qu'il est beaucoup plus rapide de charger toutes les données du fichier JSON que de certains DB comme SQLite3.
La fonction principale de traitement est get_matches_from_data dans get_matches.py . Cette fonction itère à travers tous les hachages moyens donnés et compare leur similitude avec le hachage moyen calculé à partir des données fournies - soit un ID ordinal, soit le contenu d'image personnalisé. Il renvoie une liste des ordinateurs les plus similaires, triés par leur similitude.
get_matches.py fournit également un accès CLI à la fonction. Voir python get_matches.py --help pour plus de détails.
L'API est implémentée dans python à l'aide du framework FastAPI . Au démarrage, il charge les hachages moyens du fichier JSON en mémoire. Ensuite, pour chaque demande, il fournit ces données à la fonction get_matches_from_data susmentionnée et collecte le résultat. Avant de retourner le résultat JSON au client, il enrichit les données ordinaires similaires avec des propriétés ou des liens utiles supplémentaires.
Remarque: L'API appelle en fait l'API Rust , qui offre de bien meilleures performances. Voir la section Rust server pour plus de détails.
L'API comprend plusieurs points de terminaison pour les recherches de similitude, qui sont définies dans api.py :
GET /ord_id/{ord_id}?top_n=Ntop_n est de 20 et elle est facultative. S'il n'est pas spécifié, il est par défaut à 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 est illimité dans ce cas et est facultatif. S'il n'est pas spécifié, il est par défaut à 20. Pour améliorer les performances, la fonctionnalité get_matches a également été implémentée dans Rust , pour accélérer la recherche de similitude.
similar_pictures contient une Rust binaire et une bibliothèque à cette fin.
La connexion à Rust de python est établie dans get_matches_rust.py , qui expose la même interface CLI que get_matches.py . Cette connexion est rendue possible par une bibliothèque partagée Rust , résidant sous similar_pictures/target/release/libsimilar_pictures.so .
De plus, un binaire Rust autonome agissant en tant que CLI est créé, sous similar_pictures/target/release/similar_pictures . L'aide CLI peut être vue en fonctionnant ./similar_pictures/target/release/similar_pictures --help . Son utilisation est similaire à la version python .
La bibliothèque Rust et le binaire utilisent la fonction get_matches commune à partir de similar_pictures/src/get_matches.rs , qui effectue la même tâche que sa version python . Pour construire la rouille binaire et la bibliothèque de votre système d'exploitation, exécutez cargo build --release .
L'approche avec le chargement des hachages moyens en mémoire sur le démarrage du serveur pour des demandes beaucoup plus rapidement a également été reproduit dans Rust - dans rust_http_server .
Il contient un serveur (non publique) avec des points de terminaison similaires à celui de l'API python - la seule différence est qu'il n'accepte pas l'objet de fichier, il doit être donné directement un fichier_hash.
Il ne doit pas être utilisé directement, mais plutôt comme backend pour l'API python . La connexion est établie dans rust_server.py .