Utilisez le service Volcano Cloud Search ESCloud pour créer des applications de récupération d'images et de texte (recherche d'images par texte/recherche d'images par images)

La récupération d'images et de textes a un large éventail d'applications dans la vie quotidienne. La récupération d'images courante comprend la recherche de contenu à base de texte et la recherche de contenu à base d'images. Les utilisateurs peuvent rapidement trouver des images identiques ou similaires dans la vaste bibliothèque d'images en saisissant des descriptions textuelles ou en téléchargeant des images.Cette méthode de recherche est largement utilisée dans des domaines populaires tels que le commerce électronique, la publicité, la conception et les moteurs de recherche.

Basé sur le service de recherche cloud du moteur de volcan ESCloud et le modèle d'extraction de caractéristiques image-texte CLIP, cet article crée rapidement une solution de bout en bout pour la recherche d'images par images et la recherche d'images par texte.

Présentation du principe

La technologie de recherche d'images, utilisant des descriptions de texte et des images comme objets de récupération, extrait les caractéristiques de l'image et du texte respectivement, et établit des corrélations entre le texte et les images dans le modèle, puis effectue la récupération de vecteurs de caractéristiques dans des bases de données d'images massives et renvoie la collection d'objets de récupération la plus pertinente d'enregistrements. Parmi eux, la partie d'extraction de caractéristiques adopte le modèle CLIP et la récupération de vecteurs utilise le service de recherche cloud du moteur de volcan pour rechercher rapidement parmi des caractéristiques d'image massives.

 

préparation dépendante de l'environnement

1. Connectez-vous au service de recherche cloud Volcano Engine, créez un cluster d'instances et sélectionnez 7.10 pour la version du cluster.

2. Préparation de la dépendance de la clé du client Python

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

Préparation du jeu de données

Nous choisissons Unsplash comme ensemble de données d'image. Pour plus de détails, veuillez consulter : https://unsplash.com/data. Dans cet exemple, nous avons choisi de télécharger le jeu de données Lite, qui contient environ 25 000 photos. Une fois le téléchargement terminé, vous obtiendrez un fichier compressé contenant un fichier CSV décrivant l'image. En lisant le fichier CSV avec Pandas, nous obtiendrons l'adresse URL de l'image.

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

Sélection du modèle

Cet article sélectionne le modèle de recherche d'images par images et d'images par texte . Ce modèle est formé sur la base du modèle de l'article OpenAI 2021. Le modèle CLIP peut lier des images et du texte. Le but est d'obtenir un modèle qui peut exprimer à la fois images et texte clip-ViT-B-32.Modèle

Préparation ESCloud Mapping

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" } } }

Fonctionnement de la base de données ESCloud

connecter

Connectez-vous au service de recherche cloud Volcano Engine, sélectionnez l'instance nouvellement créée et choisissez de copier l'adresse d'accès au réseau public (s'il est fermé, vous pouvez choisir de l'ouvrir) :

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

pour écrire

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)

Renseigner

Recherche d'images par texte : vectorisation du texte, exécution de la requête 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']) # ...

Rechercher le coucher du soleil et imprimer le résultat

 

Recherche par image : vectorisation d'image, exécution de la requête knn

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']) # ...

Rechercher des images de sceaux et imprimer les résultats

 


Le service de recherche cloud du moteur de volcan ESCloud est compatible avec Elasticsearch, Kibana et d'autres logiciels et plug-ins open source couramment utilisés, fournissant une récupération multi-conditions de texte structuré et non structuré, des statistiques et des rapports, permettant un déploiement en un clic, une mise à l'échelle élastique, simplifiée exploitation et maintenance, et construction rapide Capacités commerciales telles que l'analyse de journaux et l'analyse de récupération d'informations.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_46399686/article/details/132091026
conseillé
Classement