Il s'agit d'un moteur similaire pour la recherche d'images.
Il s'agit d'une application Web vous permet de rechercher des images similaires dans la base de données.
L'idée de base est que vous pouvez supprimer ou ajouter des images à tout moment tout en maintenant la cohérence des données. Une fonctionnalité utile est également implémentée: recherchez des images similaires par demande (par exemple, recherchez des images similaires, mais recherchez uniquement parmi ceux qui sont des labradors)
J'utilise actuellement:
img2vec_pytorch - Wrapper autour d'Alexnet pour l'extraction des fonctionnalités de l'image (https://github.com/christiansafka/img2vec)postgeSQL avec extension CUBE ; Les vecteurs sont très grands, donc je ne peux pas construire un index, mais Postgres permet de demander des données même dans les champs JSON Dans la dernière version, j'ai utilisé hnswlib c'était plus rapide, mais pas aussi flexible que Postgres (vous pouvez le vérifier sur la succursale 'HNSW')
docker-compose build
docker-compose up Exigences: Postgesql; Il sera plus simple d'exécuter Postgres dans docker '/ postgres / dockerfile', sinon vous devez recompiler l'extension du cube (comme dans dockerfile) spécifie également PG_USER , PG_DATABASE , PG_PASSWORD paramètres dans settings/env du fichier
virtualenv venv --python=python3.6
source venv/bin/activate
pip install -r requirements.txt
uvicorn run:app --host 0.0.0.0 --port 8001L'application sera disponible sur 0.0.0.0:8001 dans les deux cas
Tous les gestionnaires sont disponibles sur 0.0.0.0:8001/Docs
POST /image Ajouter une image à la base de données
Demandes de python
import requests
r = requests . post (
url = 'http://0.0.0.0:8001/image' ,
files = { 'image' : open ( 'image_path' , 'rb' )}
)Boucle
curl -X POST "http://0.0.0.0:8001/image"
-H "Content-Type: multipart/form-data" -F "image=@{image_path};type=image/jpeg"
GET /image/{id} télécharger l'image par id
Demandes de python
import requests
r = requests . get ( url = 'http://0.0.0.0:8001/image/{id}' )
with open ( 'output_file_name' , 'wb' ) as f :
f . write ( r . content )Boucle
curl -X GET "http://0.0.0.0:8001/image/{id}" --output {output_file_name}
DELETE /image/{id} supprimer l'image par id
Demandes de python
import requests
r = requests . delete ( url = 'http://0.0.0.0:8001/image/{id}' )Boucle
curl -X DELETE "http://0.0.0.0:8001/image/{id}"
POST /image/search?k={k} Rechercher k images les plus proches
Le plus complexe de gestionnaire. Vous pouvez rechercher des images les plus proches dans toutes les bases de données ou vous ne pouvez sélectionner que des images spécifiques (par exemple uniquement «Irish Terriers») pour ces sélections, vous devez ajouter des données à des images en tant que champs JSON (voir POST data/{id} ) Vous pouvez également sélectionner des images par «nom» ou «chemin» de la même manière. Pour de telles requêtes passer un dict valide dans les paramètres
Demandes de python
import json
import requests
r = requests . post (
url = 'http://0.0.0.0:8001/image/search' ,
files = {
'image' : open ( 'image_path' , 'rb' ),
},
params = { 'k' : 3 , 'query' : json . dumps ({ 'dog_type' : 'Irish_terrier' })}
)Boucle
curl -X POST "http://0.0.0.0:8001/image/search?k={k}&query=%7B%22dog_type%22%3A%20%22Irish_terrier%22%7D"
-H "accept: application/json"" -H "Content-Type: multipart/form-data" -F "image=@{image_path};type=image/jpeg"
POST /data/{id} Ajouter des informations supplémentaires pour l'image par ID
Passez toutes les données d'image dans le champ JSON
Demandes de python
import requests
r = requests . post (
url = 'http://0.0.0.0:8001/data/{id}' ,
json = { 'dog_type' : 'Irish_terrier' }
)Boucle
curl -X POST "http://0.0.0.0:8001/data/{id}"
-H "Content-Type: application/json" -d "{"dog_type":"Irish_terrier"}"
GET /data/{id} obtenir des données pour l'image par id (vecteur et quelques informations supplémentaires)
Demandes de python
import requests
r = requests . get ( url = 'http://0.0.0.0:8001/data/{id}' )Boucle
curl -X GET "http://0.0.0.0:8001/data/{id}"
POST /data/query OBTENEZ DONNÉES POUR L'IMAGE PAR REDONNE
Vous pouvez rechercher des images en interrogeant les données (voir POST /image/search ) mais vous devez transmettre les données de requête dans le champ JSON
Demandes de python
import requests
r = requests . post (
url = 'http://0.0.0.0:8001/data/query' ,
json = { 'dog_type' : 'Irish_terrier' }
)Boucle
curl -X POST "http://0.0.0.0:8001/data/query" -H "accept: application/json"
-H "Content-Type: application/json" -d "{"dog_type":"Irish_terrier"}"