使用 Elasticsearch 向量搜尋功能
目標
在本指導教學中,您部署 Databases for Elasticsearch 的實例,並使用它來儲存映像檔的 向量表示法,然後您可以搜尋這些映像檔,以尋找與新的未看到映像檔的相似性。
這些向量表示法 (稱為內嵌) 是使用機器學習演算法所建立。 機器學習 是人工智慧 (AI) 和電腦科學的分支,著重於使用資料和演算法來模擬人類學習的方式,逐漸提高其精確度。 透過使用統計方法,會訓練演算法進行分類或預測,以及揭露資料採礦專案中的重要見解。
這些學習演算法稱為「模型」。 在本教程中,我們使用一個這樣的模型,OpenAI's夾子。 CLIP (對比語言-影像預先訓練) 是在各種 (影像、文字) 配對上訓練的神經網路。
傳統上,尋找影象之間的相似性,對人類來說相對簡單的東西,對於計算機來說是很難做到的。 Machine Learning 已轉換此搜尋欄位。
請參閱下列 Elasticsearch 機器學習系列中的其他指導教學:
Databases for Elasticsearch 是已付費服務,因此遵循本指導教學將產生費用。
提高生產力
若要開始佈建程序,請安裝一些必須具有生產力的工具:
- 您需要有 IBM Cloud 帳戶。
- Terraform-編纂及佈建基礎架構。
- Python
您還需要提供語料庫以執行相似性搜尋的影像資料集。 例如,您可能具有汽車影像或鳥影像的資料集。 您通常需要數千個這些影像。 由於對影像的版權限制,我們不能在此提供。
在本指導教學中,您不會將映像檔本身上傳至資料庫。 向量表示法將在本端計算,且只會上傳那些向量表示法。 在實際實務範例中,您可能會將映像檔儲存在某處 (例如 Object Storage 儲存區),並將映像檔位置的參照與向量表示法一起儲存以進行擷取。
取得 API 金鑰
建立 IBM Cloud API 金鑰,以讓 Terraform 將基礎架構佈建至您的帳戶。 您可以建立最多 20 個 API 金鑰。
基於安全理由,只可在建立時複製或下載 API 金鑰。 如果 API 金鑰遺失,必須建立新的 API 金鑰。
複製專案
從 GitHub 儲存庫複製專案。
git clone https://github.com/IBM/elasticsearch-ml-vector-search-tutorial.git
安裝 Elasticsearch 集群
-
導覽至所複製專案的 terraform 資料夾。
cd elasticsearch-ml-vector-search-tutorial/terraform
-
在機器上,建立名為
terraform.tfvars
的文件,並包含下列欄位:ibmcloud_api_key = "<your_api_key_from_step_1>" region = "<your_region>" elastic_password = "<make-up-a-password>"
terraform.tfvars
文件包含您可能想要保密的變數,因此會從公用 Github 儲存庫中排除它。 -
使用以下命令安裝基礎架構:
terraform init terraform apply --auto-approve
-
最後,將資料庫存取 URL 匯出到您的終端環境。 後續步驟將需要它。
terraform output --json export ES_URL="<the url value obtained from the output>"
安裝相依關係
您需要安裝部分 Python 相依關係:
pip3 install elasticsearch
pip3 install Pillow
pip3 install imgbeddings
pip3 install requests
產生影像的向量內嵌
在專案資料夾結構的根目錄建立稱為 images
的資料夾。 在其中,建立一個以上具有不同影像的資料夾。 例如,如果您有汽車資料集,則可能想要建立不同汽車類型的資料夾,例如 fordescort
和 fordcortina
。 這並非嚴格必要 (所有影像都可以放在稱為 cars
的資料夾中),但組織資料夾可能會讓稍後更容易識別搜尋相符項。
您已準備好執行 create.py
Script。 在專案類型的根目錄中:
python3 create.py
此 Script 會在 Databases for Elasticsearch 資料庫中建立稱為 images
的 Elasticsearch 索引。
然後,它會輪流選取 images
資料夾,並針對每一個映像檔,發現它使用 此開放程式碼 Python 套件來建立一組 內嵌,這會使用開放程式碼
來自 OpenAI 的 CLIP 模型。 使用這些內嵌及少量 meta 資料 (檔案路徑及檔案 ID),Script 會建立文件,然後上傳至 Elasticsearch 索引。
視資料集的大小而定,此程序可能需要數小時才能完成。
搜尋資料集
您現在已準備好測試新資料集。 若要這樣做,您需要尋找不屬於原始資料集的汽車 (如果您正在使用汽車) 的另一個影像。 將此映像檔 (例如,myimage.jpg
) 儲存至專案的根目錄。
執行 search.py
Script,並傳入映像檔名稱:
python3 search.py myimage.jpg
此 Script 會使用與之前相同的演算法,為所提供的映像檔產生一組內嵌。 它會嘗試在資料集上進行 已知最近鄰接項 搜尋,以尋找資料集中與搜尋中提供的影像最接近的相符項。 它會傳回最相符項的詳細資料。
{"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"]}}]}}
您可以對其他映像檔重複此處理程序。
影像相似性,不是鳥類相似性
您所建置的更像是影像相似性搜尋,而不是鳥類 (或汽車) 相似性搜尋。 向量搜尋演算法正在分析整個影像並尋找相符項。 坐在樹枝上的柳鶯的影像可能更像坐在樹枝上的柳鶯的影像,而不是飛行中的柳鶯的影像。 然而,它是一個強大的工具,可以使物體之間的關係 (直到最近) 即使不是不可能,也很難。
拆除基礎架構
您的 Databases for Elasticsearch 會產生費用。 完成本指導教學之後,您可以移至專案的 terraform
目錄,並使用下列指令來移除所有基礎架構:
terraform destroy
後續步驟
如果您已準備好進一步探索,則也可以使用 Databases for Elasticsearch,不僅儲存向量內嵌,還可以產生它們。 這是本系列 下一個指導教學 的主題。