Utilizzare le capacità di ricerca vettore Elasticsearch
Obiettivi
In questa esercitazione, distribuisci un'istanza di Databases for Elasticsearch e la utilizzi per memorizzare rappresentazioni vettoriali di immagini che puoi quindi cercare per trovare somiglianze con nuove immagini non viste.
Queste rappresentazioni vettoriali, note come embeddings, sono create utilizzando algoritmi di apprendimento automatico. Machine learning è un ramo dell'intelligenza artificiale (AI) e dell'informatica che si concentra sull'uso di dati e algoritmi per imitare il modo in cui gli esseri umani imparano, migliorandone gradualmente l'accuratezza. Utilizzando metodi statistici, gli algoritmi vengono addestrati per creare classificazioni o previsioni e per scoprire informazioni chiave nei progetti di data mining.
Questi algoritmi di apprendimento sono noti come "modelli". In questo tutorial utilizziamo uno di questi modelli,OpenAI's CLIP. CLIP (Contrastive Language - Image Pre-Training) è una rete neurale formata da una varietà di coppie (immagine, testo).
Tradizionalmente, trovare somiglianze tra immagini, qualcosa che è relativamente semplice per l'occhio umano, è stato difficile per un computer da fare. Machine Learning ha trasformato questo campo di ricerca.
Consultare le altre esercitazioni in questa serie di machine learning Elasticsearch:
- Utilizza ELSER, modello di elaborazione del linguaggio naturale di Elastic
- Utilizza modelli di machine learning con Elasticsearch per contrassegnare il contenuto
Databases for Elasticsearch è un servizio a pagamento, quindi dopo questa esercitazione verranno addebitati degli addebiti.
Aumentare la produttività
Per iniziare il processo di provisioning, installare alcuni strumenti di produttività indispensabili:
- Devi avere un IBM Cloud.
- Terraform- Per codificare ed eseguire il provisioning dell'infrastruttura.
- Python
È inoltre necessario un dataset di immagini che fornisca il corpus per eseguire la ricerca di similarità. Ad esempio, è possibile disporre di un dataset di immagini di auto o di immagini di uccelli. Tipicamente hai bisogno di migliaia di queste immagini. Non possiamo fornirlo qui a causa delle limitazioni del diritto d'autore sulle immagini.
In questa esercitazione non caricherai le immagini stesse nel tuo database. Le rappresentazioni vettoriali verranno calcolate localmente e solo quelle verranno caricate. In uno scenario reale, probabilmente le immagini sono memorizzate da qualche parte (come un bucket Object Storage ) e un riferimento alla posizione dell'immagine viene memorizzato insieme alla rappresentazione del vettore per il richiamo.
Ottieni una chiave API
Crea una chiave API IBM Cloud che consente a Terraform di eseguire il provisioning dell'infrastruttura nel tuo account. Puoi creare fino a 20 chiavi API.
Per motivi di sicurezza, la chiave API è disponibile per essere copiata o scaricata solo durante la fase di creazione. Se la chiave API viene persa, dovrai crearne una nuova.
Clona il progetto
Clonare il progetto dal repositoryGitHub.
git clone https://github.com/IBM/elasticsearch-ml-vector-search-tutorial.git
Installare il cluster Elasticsearch
-
Naviga nella cartella terraform del progetto clonato.
cd elasticsearch-ml-vector-search-tutorial/terraform -
Sulla macchina, creare un documento denominato
terraform.tfvars, con i seguenti campi:ibmcloud_api_key = "<your_api_key_from_step_1>" region = "<your_region>" elastic_password = "<make-up-a-password>"Il documento
terraform.tfvarscontiene le variabili che potresti voler mantenere segrete, quindi viene escluso dal repository Github pubblico. -
Installare l'infrastruttura con il seguente comando:
terraform init terraform apply --auto-approve -
Infine, esportate l' URL di accesso al database nel vostro ambiente terminale. Sarà richiesto dalle fasi successive.
terraform output --json export ES_URL="<the url value obtained from the output>"
Installa le dipendenze
Devi installare alcune dipendenze Python:
pip3 install elasticsearch
pip3 install Pillow
pip3 install imgbeddings
pip3 install requests
Genera embeddings vettoriali per le immagini
Creare una cartella denominata images nella root della struttura della cartella del progetto. Al suo interno, creare una o più cartelle con immagini diverse. Ad esempio, se si dispone di un dataset di auto, è possibile creare cartelle
per diversi tipi di auto, ad esempio fordescort e fordcortina. Ciò non è strettamente necessario (tutte le immagini potrebbero essere inserite in una cartella denominata cars), ma l'organizzazione delle
cartelle potrebbe rendere più semplice l'identificazione delle corrispondenze di ricerca in un secondo momento.
Si è pronti per eseguire lo script create.py. Nella root del progetto, immettere:
python3 create.py
Questo script crea un indice Elasticsearch denominato images nel database Databases for Elasticsearch.
Quindi, passa attraverso la cartella images e per ogni immagine che trova crea una serie di incorporazioni utilizzando il pacchetto Python open source, che utilizza il modello CLIP open source da OpenAI. Con tali integrazioni e una piccola quantità
di metadati (percorso file e id file), lo script crea un documento che viene quindi caricato sull'indice Elasticsearch.
A seconda delle dimensioni del dataset, il completamento di questo processo potrebbe richiedere più ore.
Ricerca nel dataset
Ora si è pronti a testare il nuovo set di dati. Per fare questo è necessario trovare un'altra immagine di un'auto (se si utilizzano le auto) che non fa parte del dataset originale. Salvare questa immagine (ad esempio, myimage.jpg)
nella root del progetto.
Eseguire lo script search.py, passando il nome immagine:
python3 search.py myimage.jpg
Lo script genera una serie di incorporazioni per l'immagine fornita utilizzando lo stesso algoritmo di prima. Tenta una ricerca elemento adiacente più vicino noto sul dataset per trovare la corrispondenza più vicina nel dataset all'immagine fornita nella ricerca. Restituisce i dettagli della corrispondenza più vicina.
{"took": 4947, "timed_out": false, "_shards": {"total": 1, "successful": 1, "skipped": 0, "failed": 0}, "hits": {"total": {"value": 1, "relation": "eq"}, "max_score": 0.97320974, "hits": [{"_index": "images", "_id": "5c910de5357cb9a3f1b43e6618b141afa6666bfca8676269d5e10a14e1688819", "_score": 0.97320974, "fields": {"file_path": ["./images/Bald_Eagle/26897.jpg"], "desc": ["Bald_Eagle"]}}]}}
È possibile ripetere questo processo con altre immagini.
Somiglianza di immagini, non somiglianza di uccelli
Quello che hai costruito è più di una ricerca di somiglianza di immagini che di una ricerca di somiglianza di uccelli (o auto). L'algoritmo di ricerca vettoriale analizza l'intera immagine e cerca le corrispondenze. Un'immagine di una parula seduta su un ramo di un albero potrebbe essere più simile a un'immagine di un passero seduto su un ramo di un albero che a un'immagine di una parula in volo. Tuttavia, è un potente strumento per rendere le relazioni tra oggetti che (fino a poco tempo fa) erano difficili, se non impossibili.
Demolisci la tua infrastruttura
Il tuo Databases for Elasticsearch comporta degli addebiti. Dopo aver terminato questa esercitazione, puoi rimuovere tutta l'infrastruttura andando alla directory terraform del progetto e utilizzando il seguente comando:
terraform destroy
Passi successivi
Se sei pronto a esplorare ulteriormente, puoi anche utilizzare Databases for Elasticsearch non solo per archiviare le integrazioni di vettori, ma anche per generarli. Questo è l'oggetto del nostro prossimo tutorial in questa serie.