Это поиск, аналогичный двигателю для изображений.
Это веб -приложение позволяет искать аналогичные изображения в базе данных.
Основная идея заключается в том, что вы можете удалить или добавлять изображения в любое время при поддержании согласованности данных. Также реализована полезная функция: поиск аналогичных изображений по запросу (например, найдите аналогичные изображения, но поиск только среди тех, кто является лабрадором)
Я сейчас использую:
img2vec_pytorch - wrapper around Alexnet for image feature extraction (https://github.com/christiansafka/img2vec)postgeSQL with CUBE extension; Векторы очень большие, поэтому я не могу создать индекс, но Postgres позволяет запросить данные даже в полях JSON In last version i have used hnswlib it was faster, but not so flexible as postgres (you can check it out on 'hnsw' branch)
docker-compose build
docker-compose up Требования: postgesql; It will be simpler to run postgres in docker '/postgres/Dockerfile', otherwise you have to recompile CUBE extension (like in Dockerfile) also specify PG_USER , PG_DATABASE , PG_PASSWORD params in settings/env file
virtualenv venv --python=python3.6
source venv/bin/activate
pip install -r requirements.txt
uvicorn run:app --host 0.0.0.0 --port 8001Приложение будет доступно на 0,0.0.0:8001 в обоих случаях
Все обработчики доступны на 0.0.0.0:8001/docs
POST /image add image to database
Python запросы
import requests
r = requests . post (
url = 'http://0.0.0.0:8001/image' ,
files = { 'image' : open ( 'image_path' , 'rb' )}
)Загрязнение
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} download image by id
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 )Загрязнение
curl -X GET "http://0.0.0.0:8001/image/{id}" --output {output_file_name}
DELETE /image/{id} delete image by id
Python запросы
import requests
r = requests . delete ( url = 'http://0.0.0.0:8001/image/{id}' )Загрязнение
curl -X DELETE "http://0.0.0.0:8001/image/{id}"
POST /image/search?k={k} search k nearest images
Самый сложный обработчик. You can search nearest images n all database or you can select only specific images (for example only 'Irish terriers') For such selects you need to add data to images as json fields (see POST data/{id} ) Also you can select images by 'name' or 'path' in the same way. Для таких запросов проходит действительный дикт в параметрах
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' })}
)Загрязнение
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} add additional info for image by id
Передайте все данные изображения в поле JSON
Python запросы
import requests
r = requests . post (
url = 'http://0.0.0.0:8001/data/{id}' ,
json = { 'dog_type' : 'Irish_terrier' }
)Загрязнение
curl -X POST "http://0.0.0.0:8001/data/{id}"
-H "Content-Type: application/json" -d "{"dog_type":"Irish_terrier"}"
GET /data/{id} get data for image by id (vector and some additional info)
Python запросы
import requests
r = requests . get ( url = 'http://0.0.0.0:8001/data/{id}' )Загрязнение
curl -X GET "http://0.0.0.0:8001/data/{id}"
POST /data/query get data for image by query
You can search for images by querying data (see POST /image/search ) But you need to pass query data in json field
Python запросы
import requests
r = requests . post (
url = 'http://0.0.0.0:8001/data/query' ,
json = { 'dog_type' : 'Irish_terrier' }
)Загрязнение
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"}"