Ce référentiel implémente un moteur de recherche d'images sur des photos locales alimenté par le modèle CLIP. Il est étonnamment précis et est capable de trouver des images à partir de requêtes complexes. Pour plus d'informations, reportez-vous au blog Medium ici.
La fonctionnalité supplémentaire de classification des images en fonction des personnes représentées est implémentée avec la bibliothèque face_recognition
. Plusieurs filtres sont également disponibles, vous permettant de retrouver vos photos de groupe, captures d'écran, etc...
Dans un environnement virtuel Python 3.8+, installez soit depuis PIP, soit depuis les sources :
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
Dépannage : Si des problèmes surviennent lors de la création de roues pour dlib lors de l'installation de face_recognition, assurez-vous d'installer le package python3.8-dev
(respectivement python3.x-dev
) et de recréer l'environnement virtuel à partir de zéro avec la commande mentionnée ci-dessus une fois installé.
Actuellement, l'utilisation est la suivante. La bibliothèque calcule d'abord les intégrations de toutes les images une par une et les stocke dans un dictionnaire choisi pour référence ultérieure. Pour calculer et stocker des informations sur les personnes dans l'image, activez l'indicateur include_faces
(notez qu'il rend le processus d'indexation jusqu'à 10 fois plus lent).
from image_searcher import Search
searcher = Search ( image_dir_path = "/home/manu/perso/ImageSearcher/data/" ,
traverse = True ,
include_faces = False )
Une fois ce processus effectué une fois, via Python, la librairie est utilisée comme telle :
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 )
L'ajout de balises à la fin de la requête (exemple : A bird singing #photo
) filtrera la recherche en fonction de la liste des balises. Les balises prises en charge pour le moment sont :
À venir, un soutien pour :
Après avoir indexé les images d'intérêt, une API Flask peut être utilisée pour charger des modèles une fois puis effectuer une recherche efficace.
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 ))
Une démarche gunicorn peut également être lancée localement avec :
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
Remarque : Adaptez le paramètre timeout (en secondes) si beaucoup de nouvelles images sont en cours d'indexation/
En ouvrant dans un navigateur la page Web avec le moteur de recherche de démonstration search.html
.
Via le point de terminaison de l'API en ligne : http://127.0.0.1:5000/get_best_images?q=a+photo+of+a+bird
En 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" ])
L'utilisation de cet outil avec des photos de vacances ou des archives de photos Messenger et Whatsapp permet de redécouvrir d'anciennes photos et est incroyable pour localiser celles perdues depuis longtemps.
Exécutez les tests avec
python -m unittest
et pelucher avec :
pylint image_searcher
Ce dépôt est un travail en cours qui a récemment démarré. En l'état, il calcule environ 10 images par seconde lors de la phase d'indexation initiale, puis est quasi instantané lors de la phase d'interrogation.
Les demandes de fonctionnalités et les contributions sont les bienvenues. Des améliorations de l'interface de recherche Web seraient également grandement appréciées !
Simplifiez et renforcez l'instanciation de la classe Search :
Vitesse:
Caractéristiques:
Intégration de fichiers :
L'extrémité avant:
Déploiement: