Este repositório implementa um mecanismo de busca de imagens em fotos locais alimentado pelo modelo CLIP. É surpreendentemente preciso e é capaz de encontrar imagens a partir de consultas complexas. Para obter mais informações, consulte a postagem do blog Medium aqui.
A funcionalidade adicional de classificação de imagens dependendo das pessoas retratadas é implementada com a biblioteca face_recognition
. Vários filtros também estão disponíveis, permitindo que você encontre fotos do seu grupo, capturas de tela, etc...
Em um ambiente virtual Python 3.8+, instale a partir do PIP ou da fonte:
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
Solução de problemas: Se forem encontrados problemas na construção de rodas para dlib durante a instalação do face_recognition, certifique-se de instalar o pacote python3.8-dev
(respectivamente python3.x-dev
) e recrie o ambiente virtual do zero com o comando mencionado acima, uma vez instalado.
Atualmente, o uso é o seguinte. A biblioteca primeiro calcula as incorporações de todas as imagens, uma por uma, e as armazena em um dicionário escolhido para referência futura. Para calcular e armazenar informações sobre as pessoas na imagem, habilite o sinalizador include_faces
(observe que isso torna o processo de indexação até 10x mais lento).
from image_searcher import Search
searcher = Search ( image_dir_path = "/home/manu/perso/ImageSearcher/data/" ,
traverse = True ,
include_faces = False )
Uma vez feito esse processo uma vez, através do Python, a biblioteca é usada como tal:
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 )
Adicionar tags no final da consulta (exemplo: A bird singing #photo
) filtrará a pesquisa com base na lista de tags. As tags suportadas no momento são:
Por vir está o suporte para:
Depois de indexar as imagens de interesse, uma API Flask pode ser usada para carregar os modelos uma vez e então pesquisar com eficiência.
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 ))
Um processo gunicorn também pode ser iniciado localmente com:
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
Nota: Adapte o parâmetro timeout (em segundos) se muitas imagens novas estiverem sendo indexadas/
Ao abrir em um navegador a página da web com o mecanismo de busca de demonstração search.html
.
Através do endpoint da API on-line: http://127.0.0.1:5000/get_best_images?q=a+photo+of+a+bird
Em 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" ])
Usar esta ferramenta com fotos de férias ou arquivos de fotos do Messenger e Whatsapp leva à redescoberta de fotos antigas e é incrível para localizar fotos perdidas há muito tempo.
Execute os testes com
python -m unittest
e fiapos com:
pylint image_searcher
Este repo é um trabalho em andamento que foi iniciado recentemente. Do jeito que está, ele calcula cerca de 10 imagens por segundo durante a fase inicial de indexação e, em seguida, é quase instantâneo durante a fase de consulta.
Solicitações de recursos e contribuições são bem-vindas. Melhorias na interface de pesquisa na Web também seriam muito apreciadas!
Simplifique e robusteça a instanciação da classe Search:
Velocidade:
Características:
Incorporando arquivos:
Front-end:
Implantação: