Es una búsqueda similar al motor para imágenes.
Esta es una aplicación web que le permite buscar imágenes similares en la base de datos.
La idea básica es que puede eliminar o agregar imágenes en cualquier momento mientras mantiene la consistencia de los datos. También se implementa una característica útil: buscar imágenes similares por solicitud (por ejemplo, encontrar imágenes similares, pero solo busca entre los labradores)
Actualmente estoy usando:
img2vec_pytorch - Envoltura alrededor de Alexnet para la extracción de características de imagen (https://github.com/christiansafka/img2vec)postgeSQL con extensión CUBE ; Los vectores son muy grandes, por lo que no puedo crear un índice, pero Postgres permite consultar datos incluso en JSON Fields En la última versión, he usado hnswlib , fue más rápido, pero no tan flexible como Postgres (puede verlo en la rama 'HNSW')
docker-compose build
docker-compose up Requisitos: PostGesql; Será más sencillo ejecutar Postgres en Docker '/Postgres/Dockerfile', de lo contrario, debe recompilar la extensión de cubos (como en DockerFile) también especificar PG_USER , PG_DATABASE , PG_PASSWORD Params en settings/env
virtualenv venv --python=python3.6
source venv/bin/activate
pip install -r requirements.txt
uvicorn run:app --host 0.0.0.0 --port 8001La aplicación estará disponible en 0.0.0.0:8001 en ambos casos
Todos los manejadores están disponibles en 0.0.0.0:8001/docs
POST /image Agregar imagen a la base de datos
Solicitudes de Python
import requests
r = requests . post (
url = 'http://0.0.0.0:8001/image' ,
files = { 'image' : open ( 'image_path' , 'rb' )}
)Rizo
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} Descargar imagen por ID
Solicitudes 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 )Rizo
curl -X GET "http://0.0.0.0:8001/image/{id}" --output {output_file_name}
DELETE /image/{id} Eliminar imagen por ID
Solicitudes de Python
import requests
r = requests . delete ( url = 'http://0.0.0.0:8001/image/{id}' )Rizo
curl -X DELETE "http://0.0.0.0:8001/image/{id}"
POST /image/search?k={k} Buscar k Imágenes más cercanas
Manejador más complejo. Puede buscar imágenes más cercanas en todas las bases de datos o puede seleccionar solo imágenes específicas (por ejemplo, solo 'terriers irlandeses') para tales seleccionar que necesita agregar datos a las imágenes como campos JSON (consulte POST data/{id} ) también puede seleccionar imágenes por 'nombre' o 'ruta' de la misma manera. Para tales consultas, pase un dict válido en params
Solicitudes 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' })}
)Rizo
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} Agregar información adicional para la imagen por ID
Pasar todos los datos de imagen en el campo JSON
Solicitudes de Python
import requests
r = requests . post (
url = 'http://0.0.0.0:8001/data/{id}' ,
json = { 'dog_type' : 'Irish_terrier' }
)Rizo
curl -X POST "http://0.0.0.0:8001/data/{id}"
-H "Content-Type: application/json" -d "{"dog_type":"Irish_terrier"}"
GET /data/{id} Obtener datos para la imagen por ID (vector y alguna información adicional)
Solicitudes de Python
import requests
r = requests . get ( url = 'http://0.0.0.0:8001/data/{id}' )Rizo
curl -X GET "http://0.0.0.0:8001/data/{id}"
POST /data/query Obtener datos para la imagen por consulta
Puede buscar imágenes consultando datos (consulte POST /image/search ) pero debe pasar los datos de consulta en el campo JSON
Solicitudes de Python
import requests
r = requests . post (
url = 'http://0.0.0.0:8001/data/query' ,
json = { 'dog_type' : 'Irish_terrier' }
)Rizo
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"}"