Utilice el servicio Volcano Cloud Search ESCloud para crear aplicaciones de recuperación de imágenes y texto (buscar imágenes por texto/buscar imágenes por imágenes)

La recuperación de imágenes y texto tiene una amplia gama de aplicaciones en la vida diaria. La recuperación de imágenes comunes incluye la búsqueda de contenido basada en texto y la búsqueda de contenido basada en imágenes. Los usuarios pueden encontrar rápidamente imágenes iguales o similares en la enorme biblioteca de imágenes ingresando descripciones de texto o cargando imágenes. Este método de búsqueda es ampliamente utilizado en campos populares como el comercio electrónico, la publicidad, el diseño y los motores de búsqueda.

Basado en el servicio de búsqueda en la nube del motor de volcanes ESCloud y el modelo de extracción de características de imagen y texto CLIP, este artículo crea rápidamente una solución integral para buscar imágenes por imágenes y buscar imágenes por texto.

Introducción al principio

La tecnología de búsqueda de imágenes, que utiliza descripciones de texto e imágenes como objetos de recuperación, extrae características de la imagen y el texto respectivamente y establece correlaciones entre el texto y las imágenes en el modelo, luego realiza la recuperación de vectores de características en bases de datos de imágenes masivas y devuelve la colección de objetos de recuperación más relevante de registros Entre ellos, la parte de extracción de características adopta el modelo CLIP, y la recuperación de vectores utiliza el servicio de búsqueda en la nube del motor de volcanes para buscar rápidamente entre características de imágenes masivas.

 

preparación dependiente del entorno

1. Inicie sesión en el servicio de búsqueda en la nube de Volcano Engine, cree un clúster de instancias y seleccione 7.10 para la versión del clúster.

2. Preparación de la dependencia de la clave del cliente de Python

pip install -U sentence-transformers # 模型相关 pip install -U elasticsearch7==7.10.1 # ES向量数据库相关 pip install -U pandas #分析splash的csv

Preparación del conjunto de datos

Elegimos Unsplash como el conjunto de datos de la imagen. Para obtener más información, consulte: https://unsplash.com/data. En este ejemplo, elegimos descargar el conjunto de datos Lite, que contiene aproximadamente 25 000 fotos. Cuando se complete la descarga, obtendrá un archivo comprimido que contiene un archivo CSV que describe la imagen. Al leer el archivo CSV con Pandas, obtendremos la dirección URL de la imagen.

def read_imgset(): path = '${下载的数据集所在路径}' documents = ['photos', 'keywords', 'collections', 'conversions', 'colors'] datasets = {} for doc in documents: files = glob.glob(path + doc + ".tsv*") subsets = [] for filename in files: # pd 分析csv df = pd.read_csv(filename, sep='\t', header=0) subsets.append(df) datasets[doc] = pd.concat(subsets, axis=0, ignore_index=True) return datasets

Selección de modelo

Este artículo selecciona el modelo de búsqueda de imágenes por imágenes e imágenes por texto . Este modelo está entrenado en base al modelo del documento OpenAI 2021. El modelo CLIP puede vincular imágenes y texto. El objetivo es obtener un modelo que pueda expresar ambos. imágenes y clip-ViT-B-32texto

Preparación de asignación de ESCloud

PUT image_search { "mappings": { "dynamic": "false", "properties": { "photo_id": { "type": "keyword" }, "photo_url": { "type": "keyword" }, "describe": { "type": "text" }, "photo_embedding": { "type": "knn_vector", "dimension": 512 } } }, "settings": { "index": { "refresh_interval": "60s", "number_of_shards": "3", "knn.space_type": "cosinesimil", "knn": "true", "number_of_replicas": "1" } } }

Funcionamiento de la base de datos ESCloud

conectar

Inicie sesión en el servicio de búsqueda en la nube de Volcano Engine, seleccione la instancia recién creada y seleccione copiar la dirección de acceso a la red pública (si está cerrada, puede optar por abrirla):

# 连接云搜索实例 cloudSearch = CloudSearch("https://{user}:{password}@{ES_URL}", verify_certs=False, ssl_show_warn=False)

escribir

from sentence_transformers import SentenceTransformer from elasticsearch7 import Elasticsearch as CloudSearch from PIL import Image import requests import pandas as pd import glob from os.path import join # We use the original clip-ViT-B-32 for encoding images img_model = SentenceTransformer('clip-ViT-B-32') text_model = SentenceTransformer('clip-ViT-B-32-multilingual-v1') # Construct request for es def encodedataset(photo_id, photo_url, describe, image): encoded_sents = { "photo_id": photo_id, "photo_url": photo_url, "describe": describe, "photo_embedding": img_model.encode(image), } return encoded_sents # download images def load_image(url_or_path): if url_or_path.startswith("http://") or url_or_path.startswith("https://"): return Image.open(requests.get(url_or_path, stream=True).raw) else: return Image.open(url_or_path) # 从unsplash的csv文件解出图片url,然后下载图片, # 下载完了后用model 生成embedding,并构造成ES的请求进行写入 def get_imgset_and_bulk(): datasets = read_imgset() datasets['photos'].head() kwywords = datasets['keywords'] docs = [] #遍历CSV, 根据photo_url 去download photo for idx, row in datasets['photos'].iterrows(): print("Process id: ", idx) # 获取CSV 中的url photo_url = row["photo_image_url"] photo_id = row["photo_id"] image = load_image(photo_url) # 找到photo_id 且 suggested true 对应的图片描述 filter = kwywords.loc[(kwywords['photo_id'] == photo_id) & (kwywords['suggested_by_user'] == 't')] text = ' '.join(set(filter['keyword'])) # 封装写入ES的请求 one_document = encodedataset(photo_id=photo_id, photo_url=photo_url, describe=text, image=image) docs.append({"index": {}}) docs.append(one_document) if idx % 20 == 0: # 20条一组进行写入 resp = cloudSearch.bulk(docs, index='image_search') print(resp) docs = [] return docs if __name__ == '__main__': docs = get_imgset_and_bulk() print(docs)

Preguntar

Buscar imágenes por texto: vectorización de texto, ejecutar consulta knn

def extract_text(text): # 文搜图 res = cloudSearch.search( body={ "size": 5, "query": {"knn": {"photo_embedding": {"vector": text_model.encode(text), "k": 5}}}, "_source": ["describe", "photo_url"], }, index="image_search2", ) return res fe = FeatureExtractor() @app.route('/', methods=['GET', 'POST']) def index(): # ... resp = fe.extract_text(text) return render_template('index.html', query_text=text, scores=resp['hits']['hits']) # ...

Buscar puesta de sol e imprimir el resultado

 

Buscar por imagen: vectorización de imágenes, ejecutar knn query

def extract(img): # 图搜图 res = cloudSearch.search( body={ "size": 5, "query": {"knn": {"photo_embedding": {"vector": img_model.encode(img), "k": 5}}}, "_source": ["describe", "photo_url"], }, index="image_search2", ) return res fe = FeatureExtractor() @app.route('/', methods=['GET', 'POST']) def index(): # ... # Save query image img = Image.open(file.stream) # PIL image uploaded_img_path = "static/uploaded/" + datetime.now().isoformat().replace(":", ".") + "_" + file.filename img.save(uploaded_img_path) # Run search resp = fe.extract(img) return render_template('index.html', query_path=uploaded_img_path, scores=resp['hits']['hits']) # ...

Buscar imágenes de focas e imprimir resultados

 


El servicio de búsqueda en la nube del motor de volcanes ESCloud es compatible con Elasticsearch, Kibana y otro software y complementos de código abierto de uso común, que proporciona recuperación, estadísticas e informes de múltiples condiciones de texto estructurado y no estructurado, lo que permite la implementación con un solo clic, escalado elástico, simplificado operación y mantenimiento, y construcción rápida Capacidades comerciales como análisis de registros y análisis de recuperación de información.

Supongo que te gusta

Origin blog.csdn.net/weixin_46399686/article/details/132091026
Recomendado
Clasificación