一、說明
? ? ?? ?數據太多了。數據湖和數據倉庫;廣闊的像素牧場和充滿文字的海洋。找到正確的數據就像大海撈針一樣!如果你喜歡開源機器學習庫 FiftyOne,矢量搜索引擎通過將復雜數據(圖像的原始像素值、文本文檔中的字符)轉換為稱為嵌入矢量的實體來解決此問題。
????????矢量搜索引擎通過將復雜數據(圖像的原始像素值、文本文檔中的字符)轉換為稱為嵌入矢量的實體來解決此問題。然后對這些數值向量編制索引,以便您可以有效地搜索原始數據。毫不奇怪,像Qdrant,Pinecone,LanceDB和Milvus這樣的矢量搜索引擎已經成為幾乎所有新AI應用程序的重要組成部分。
????????如果您正在處理圖像或視頻數據,并且希望將矢量搜索合并到工作流程中,則可能會產生相當多的開銷:
- 您如何實現跨模式檢索,例如搜索帶有文本的圖像?
- 如何整合置信度閾值或類標簽等傳統搜索篩選器?
- 在圖像中搜索物體(人、貓、狗、汽車、自行車等)怎么樣?
????????這些只是您將遇到的眾多挑戰中的一小部分。等。停。別急。有更好的方法...
FiftyOne是用于矢量搜索的計算機視覺接口。FiftyOne開源工具包現在具有與Qdrant,Pinecone,LanceDB和Milvus的本機集成,因此您可以使用首選的矢量搜索引擎在一行代碼中有效地搜索視覺數據。
????????想要一鍵找到與數據集中第二個樣本最相似的 25 張圖像?想要通過點擊查找至少包含一個人和一輛自行車的交通圖片?您可以!
二、FiftyOne它是如何工作的?
1. 加載數據集。
為了便于說明,我們將加載 MS COCO 驗證拆分的子集。
import fiftyone as fo
import fiftyone.brain as fob
import fiftyone.zoo as foz
from fiftyone import ViewField as Fdataset = foz.load_zoo_dataset("coco-2017", split='validation', max_samples = 1000
)
session = fo.launch_app(dataset)
2. 生成相似度指數。
為了搜索我們的媒體,我們需要索引數據。在 FiftyOne 中,我們可以通過函數執行此操作。指定要用于生成嵌入向量的模型,以及要在后端使用的向量搜索引擎。您還可以為相似性索引指定一個名稱,如果要針對多個索引運行向量搜索,這將非常有用。compute_similarity()
## setup lancedb
pip install lancedb
## generate a similarity index
## with default model embeddings
## using LanceDB backend
fob.compute_similarity(dataset,brain_key="lancedb_index",backend="lancedb",
)## setup milvus
## download and start docker container +
pip install pymilvus
## generate a similarity index
## with CLIP model embeddings
## using Milvus backend
fob.compute_similarity(dataset,brain_key="milvus_clip_index",backend="milvus",metric="dotproduct"
)
3. 搜索索引。
現在,您可以使用該方法使用一行代碼對整個數據集運行圖像搜索。要找到與數據集中第二張圖像最相似的 25 張圖像,我們可以傳入樣本的 ID、我們想要返回的結果數以及我們要搜索的索引的名稱:sort_by_similarity()
## get ID of first sample
query = dataset.skip(1).first().id
## find 25 most similar images with LanceDB backend
sim_view = dataset.sort_by_similarity(query,k=25,brain_key="lancedb_index"
)## display results
session = fo.launch_app(sim_view)
您也可以完全通過?FiftyOne 應用程序中的 UI 執行此操作:
三、語義搜索變得簡單
????????處理多模式數據的麻煩已經一去不復返了。如果你想使用自然語言在語義上搜索你的圖像,你可以使用完全相同的語法!使用 CLIP 等多模式模型創建索引嵌入,然后傳入文本查詢而不是示例 ID:
## semantic query
query = "kites flying in the sky"## find 30 most similar images with Milvus backend
kites_view = dataset.sort_by_similarity(query,k=30,brain_key="milvus_clip_index"
)## display results
session = fo.launch_app(kites_view)
這在非結構化數據探索中特別有用,并且比現有標簽允許的更深入地挖掘數據。
這也可以完全在 FiftyOne 應用程序中執行:
四、傳遞預過濾器
????????對數據的特定子集運行矢量搜索通常涉及編寫復雜的預過濾器:在矢量搜索之前傳遞到矢量搜索引擎以應用于數據集的過濾器。
????????FiftyOne的矢量搜索集成為您處理這些細節!
????????如果要查找看起來像“交通”的圖像,但只希望將此搜索應用于包含人和自行車的圖像,可以通過調用篩選視圖來實現此目的:sort_by_similarity()
## create filtered view
view = dataset.match_labels(F("label").is_in(["person", "bicycle"]))## search against this view
traffic_view = view.sort_by_similarity("traffic",k=25,brain_key="milvus_clip_index"
)
session = fo.launch_app(traffic_view)
五、把你的東西整理好
????????上述所有功能也可以與對象檢測補丁一起開箱即用!
????????生成相似性索引時,您需要做的就是傳入參數 - 命名可以找到“對象”的標簽字段 - 并將為所有圖像中的每個對象生成嵌入向量。矢量數據庫為這些修補程序嵌入編制索引,以便您可以按與引用對象或自然語言查詢的相似性對這些檢測進行排序:patches_field
compute_similarity()
## setup qdrant
# pull and start docker container +
pip install qdrant-client## create a similarity index for ground truth patches
## with CLIP model, indexed with Qdrant vector database
fob.compute_similarity(dataset,patches_field="ground_truth",model="clip-vit-base32-torch",brain_key="qdrant_gt_index",backend="qdrant"
)## Search for the object that looks most like a tennis racket
tennis_view = dataset.to_patches("ground_truth").sort_by_similarity("tennis racket",k = 25,brain_key= "qdrant_gt_index"
)session = fo.launch_app(tennis_view)
六、結論
????????無論您有多少圖像或視頻,您都需要使用矢量搜索。FiftyOne的原生矢量搜索集成將使您的生活更輕松。使用 FiftyOne,相似性搜索與應用更傳統的篩選和查詢操作一樣簡單。將矢量搜索查詢與元數據查詢混合搭配,以滿足您的喜好。
????????有關 FiftyOne 中矢量搜索的一般信息,請查看 FiftyOne?App 中的按相似性排序,以及有關相似性的 FiftyOne Brain 用戶指南。
????????如果你喜歡開源機器學習庫 FiftyOne,請在?GitHub?上給這個項目?一個(3,900 顆星,而且還在增加!)來表示您的支持。