自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于Qdrant和FiftyOne的最近鄰嵌入搜索算法實戰(zhàn)

譯文 精選
開源
本文將向您展示如何借助兩個開源工具Qdrant和FiftyOne助力向量相似性搜索,從而使得自動標記計算機視覺數(shù)據(jù)集的工作更加容易。

譯者 | 朱先忠

審校 | 孫淑娟

簡介

神經(jīng)網(wǎng)絡(luò)嵌入能夠?qū)崿F(xiàn)輸入數(shù)據(jù)的低維表示,從而服務(wù)于各種類型的神經(jīng)網(wǎng)絡(luò)應(yīng)用程序。嵌入有一些有趣的功能,因為它們可以捕獲數(shù)據(jù)點的語義。這對于圖像和視頻等非結(jié)構(gòu)化數(shù)據(jù)尤其有用,這樣不僅可以對像素相似性進行編碼,還可以對一些更復雜的關(guān)系進行編碼。

使用FiftyOne和Plotly可視化針對BDD100K數(shù)據(jù)集的嵌入

在這些嵌入上執(zhí)行搜索可以應(yīng)用于許多場景下,如分類任務(wù)、建立推薦系統(tǒng),甚至是異常檢測任務(wù)。對嵌入執(zhí)行最近鄰搜索以完成這些任務(wù)的主要好處之一是,無需為每個新問題創(chuàng)建自定義網(wǎng)絡(luò);您可以經(jīng)常使用預先訓練的模型。而且,使用某些公開可用模型生成的嵌入是完全可能的,而無需任何進一步的微調(diào)。

雖然有很多涉及嵌入的強大使用場景,但在執(zhí)行嵌入搜索的工作流中往往都存在一些不同程度的挑戰(zhàn)。具體而言,在大型數(shù)據(jù)集上執(zhí)行最近鄰搜索,然后有效地對搜索結(jié)果采取行動——例如執(zhí)行自動標記數(shù)據(jù)等工作流,都存在技術(shù)和工具方面的挑戰(zhàn)。為此,借助于Qdrant和FiftyOne這兩個開源軟件可以幫助簡化這些工作流任務(wù)。

  • Qdrant是一個開源的向量數(shù)據(jù)庫,旨在對密集的神經(jīng)嵌入執(zhí)行近似最近鄰搜索(ANN),這對于任何預計將擴展到大數(shù)據(jù)量的生產(chǎn)就緒系統(tǒng)都是非常必要的。
  • FiftyOne是一個開源數(shù)據(jù)集管理和模型評估工具,允許開發(fā)人員有效地管理和可視化數(shù)據(jù)集,生成嵌入并改進模型結(jié)果。

在本文中,我們將MNIST數(shù)據(jù)集加載到FiftyOne中,并基于ANN進行分類。數(shù)據(jù)點將通過從訓練數(shù)據(jù)集中的K個最近點中選擇最常見的參考答案標簽進行分類。換句話說,對于每個測試樣本,我們將使用選定的距離函數(shù)選擇其K個最近的鄰居,然后通過投票選擇最佳標簽。另一方面,向量空間中的所有搜索都將使用Qdrant來完成,以加快速度。然后,我們將在FiftyOne中評估該分類的結(jié)果。

安裝

如果您想開始使用Qdrant的語義搜索,您需要運行它的一個實例,因為該工具以客戶機—服務(wù)器方式工作。要做到這一點,最簡單的方法是使用一個官方Docker映像,只需一個命令即可啟動Qdrant:

docker run -p“6333:6333-p“63 34:6334-d qdrant/qdrant

運行該命令后,我們將運行Qdrant服務(wù)器,端口6333處暴露HTTP API,端口6334處暴露gRPC接口。

此外,我們還需要安裝一些Python包。我們將使用FiftyOne來可視化數(shù)據(jù)、它們的參考答案標簽以及嵌入相似性模型預測的數(shù)據(jù)。嵌入將通過torchvision中提供的MobileNet v2創(chuàng)建。當然,我們也需要以某種方式與Qdrant服務(wù)器通信,因為我們將使用Python,所以Qdrant_client是實現(xiàn)這一任務(wù)的首選方式。

pip install fiftyone
pip install torchvision
pip install qdrant_client

整體任務(wù)流程

1. 加載數(shù)據(jù)集

2. 生成嵌入

3. 將嵌入加載到Qdrant

4. 最近鄰分類

5. FiftyOne評估

加載數(shù)據(jù)集

為了使事情順利進行,我們需要采取幾個步驟。首先,我們需要加載??MNIST數(shù)據(jù)集??,并從中提取訓練樣本,因為我們將在搜索操作中使用它們。為了使一切更快,我們不打算使用所有的樣本,只使用2500個樣本。我們可以使用??FiftyOne數(shù)據(jù)集Zoo??,并通過一行代碼來加載所需的MNIST子集。

import fiftyone as fo
import fiftyone.zoo as foz

# 加載數(shù)據(jù)
dataset = foz.load_zoo_dataset("mnist", max_samples=2500)

#取得所有的訓練樣本
train_view = dataset.match_tags(tags=["train"])

接下來,讓我們仔細分析一下FiftyOne應(yīng)用程序中所使用的數(shù)據(jù)集。

# 可視化FiftyOne中的數(shù)據(jù)集
session = fo.launch_app(train_view)

生成嵌入

下一步是在數(shù)據(jù)集中的樣本上生成嵌入。這始終可以在FiftyOne之外使用您的自定義模型完成。然而,F(xiàn)iftyOne也在其中的FiftyOneModelZoo中提供了各種模型,這些模型可以直接用于生成嵌入。

在本例中,我們使用在ImageNet上訓練的MobileNetv2來計算每個圖像的嵌入。

#計算每個圖像的嵌入
model = foz.load_zoo_model("mobilenet-v2-imagenet-torch")
train_embeddings = train_view.compute_embeddings(model)

將嵌入結(jié)果加載到Qdrant

Qdrant不僅可以存儲向量,還可以存儲一些相應(yīng)的屬性——每個數(shù)據(jù)點都有一個相關(guān)的向量,還可以選擇附帶一個JSON類型的屬性項。我們想用這個來傳遞參考答案標簽,以確保我們可以在稍后做出預測。

ground_truth_labels = train_view.values("ground_truth.label")
train_payload = [
{"ground_truth": gt} for gt in ground_truth_labels
]

創(chuàng)建嵌入后,我們可以開始與Qdrant服務(wù)器進行通信了。需要說明的是,QdrantClient有一個類實例比較有用,因為它包含了所有必需的方法。讓我們連接并創(chuàng)建一個名為“mnist”的點集合。向量大小取決于模型輸出;因此,如果我們想在以后使用不同的模型進行實驗,我們需要導入不同的模型,但其余的將保持不變。最終,在確保集合存在后,我們可以發(fā)送所有向量及其包含其真實標簽的有效載荷。

import qdrant_client as qc
from qdrant_client.http.models import Distance

# 把已經(jīng)訓練的嵌入加載到Qdrant
def create_and_upload_collection(
embeddings, payload, collection_name="mnist"
):
client = qc.QdrantClient(host="localhost")
client.recreate_collection(
collection_name=collection_name,
vector_size=embeddings.shape[1],
distance=Distance.COSINE,
)
client.upload_collection(
collection_name=collection_name,
vectors=embeddings,
payload=payload,
)
return client

client = create_and_upload_collection(train_embeddings, train_payload)

最近鄰分類

現(xiàn)在對數(shù)據(jù)集執(zhí)行推斷。我們可以為測試數(shù)據(jù)集創(chuàng)建嵌入,但忽略基本事實,并嘗試使用ANN找到它,然后比較兩者是否匹配。讓我們一步一步地從創(chuàng)建嵌入開始。

#通過在每個樣本的鄰居中選擇最常見的標簽,將標簽分配給測試嵌入
test_view = dataset.match_tags(tags=["test"])
test_embeddings = test_view.compute_embeddings(model)

是時候“施展魔法”了。讓我們遍歷測試數(shù)據(jù)集的樣本和相應(yīng)的嵌入,并使用搜索操作從訓練集中找到15個最接近的嵌入。我們還需要選擇有效載荷,因為它們包含找到特定點附近最常見標簽所需的參考答案標簽。借助于Python的Counter類,我們可以避免再重寫任何樣板代碼。最常見的標簽將作為“ann_production”存儲在FiftyOne中的每個測試樣本上。

這些內(nèi)容都體現(xiàn)在下面這個函數(shù)中。該函數(shù)將使用嵌入向量作為輸入,并使用Qdrant搜索功能查找與測試嵌入最近的鄰居,生成類型預測,并返回一個FiftyOne Classification對象,我們可以將其存儲在FiftyOne數(shù)據(jù)集中。

import collections
from tqdm import tqdm

def generate_fiftyone_classification(
embedding, collection_name="mnist"
):
search_results = client.search(
collection_name=collection_name,
query_vector=embedding,
with_payload=True,
top=15,
)
# 統(tǒng)計每個類型的出現(xiàn)次數(shù),并選擇最常見的標簽,置信度估計為最常見標簽的出現(xiàn)次數(shù)除以結(jié)果總數(shù)
counter = collections.Counter(
[point.payload["ground_truth"] for point in search_results]
)
predicted_class, occurences_num = counter.most_common(1)[0]
confidence = occurences_num / sum(counter.values())
prediction = fo.Classification(
label=predicted_class, confidence=confidence
)
return prediction

predictions = []

#調(diào)用Qdrant查找最近的數(shù)據(jù)點
for embedding in tqdm(test_embeddings):
prediction = generate_fiftyone_classification(embedding)
predictions.append(prediction)

test_view.set_values("ann_prediction", predictions)

我們通過計算屬于最常見標簽的樣本分數(shù)來估計置信度。這給了我們一種直覺,即我們在預測每種情況的標簽時有多么確定,并且可以在FiftyOne中使用,輕松找出令人困惑的樣本。

FiftyOne評估

現(xiàn)在是取得一些成果的時候了!讓我們從可視化這個分類器的表現(xiàn)開始。我們可以輕松啟動??FiftyOne應(yīng)用程序??來查看參考答案標簽、預測結(jié)果和圖像。

session = fo.launch_app(test_view)

FiftyOne提供了各種內(nèi)置方法來評估模型預測,包括圖像和視頻數(shù)據(jù)集上的回歸、分類、檢測、多邊形、實例和語義分割。通過下面兩行代碼,我們即可以計算并打印分類器的評估報告。

# 根據(jù)ground_truth中的值評估ANN預測
results = test_view.evaluate_classifications(
"ann_prediction", gt_field="ground_truth", eval_key="eval_simple"
)

#顯示分類指標
results.print_report()

在評估FiftyOne之后,我們可以使用results對象生成一個交互式混淆矩陣(https://voxel51.com/docs/fiftyone/user_guide/plots.html#confusion-matrices),允許我們點擊單元格并自動更新應(yīng)用程序以顯示相應(yīng)的樣本。

plot = results.plot_confusion_matrix()
plot.show()

我們還可以再深入一點。我們可以使用FiftyOne復雜的??查詢語言??,輕松找到所有與實際情況不匹配的預測,但預測的可信度很高。這些通常是數(shù)據(jù)集中最令人困惑的樣本,不過也是我們可以從中獲得最深刻見解的樣本。

from fiftyone import ViewField as F

# 顯示FiftyOne應(yīng)用程序,但僅包括有相當把握預測出的錯誤預測
false_view = (
test_view
.match(F("eval_simple") == False)
.filter_labels("ann_prediction", F("confidence") > 0.7)
)
session.view = false_view

上圖中展示了模型中最令人困惑的樣本,正如您所看到的,與數(shù)據(jù)集中的其他圖像相比,它們非常不規(guī)則。我們可以采取的改進模型性能的下一步可能是使用FiftyOne來添加與這些類似的精確樣本。然后,可以通過FiftyOne與CVAT,以及Labelbox等工具之間的集成對這些樣本進行注釋。此外,我們可以使用更多的向量進行訓練,或者通過相似性學習對模型進行微調(diào),例如,使用三元組損失算法。但現(xiàn)在,這個使用FiftyOne和Quadrant進行向量相似性分類的示例已經(jīng)能夠很好地工作了。

就這么簡單,我們使用FiftyOne和Qdrant作為嵌入后端創(chuàng)建了一個ANN分類模型,因此查找向量之間的相似性可以不再像傳統(tǒng)k-NN那樣成為我們?nèi)蝿?wù)的瓶頸了。

請自己試試看

最后,Github代碼倉庫中的??筆記本文件??包含了你在本文中看到的所有內(nèi)容的源代碼。此外,它還包括該過程的一個實際用例,以在BDD100K道路場景數(shù)據(jù)集上執(zhí)行夜間和白天屬性的預注釋。

總之,F(xiàn)iftyOne和Qdrant兩個開源庫可以一起使用,有效地對嵌入執(zhí)行最近鄰居搜索,并對圖像和視頻數(shù)據(jù)集的結(jié)果進行操作。這個過程的美妙之處在于它的靈活性和可重復性。您可以輕松地將新字段的附加參考答案標簽加載到FiftyOne和Qdrant中,并使用現(xiàn)有嵌入重復此預注釋過程。這可以快速降低注釋成本,并更快地生成更高質(zhì)量的數(shù)據(jù)集。

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。

原文標題:??Nearest Neighbor Embeddings Search With Qdrant and FiftyOne??,作者:Eric Hofesmann

責任編輯:華軒 來源: 51CTO
相關(guān)推薦

2023-11-30 09:55:27

鴻蒙鄰分類器

2023-05-30 07:58:01

谷歌搜索算法

2019-03-29 09:40:38

數(shù)據(jù)結(jié)構(gòu)算法前端

2018-10-12 15:15:45

電商搜索算法

2024-04-25 11:51:23

點云開源工具

2025-02-26 05:00:00

DFS算法遞歸

2021-09-04 23:40:53

算法程序員前端

2022-09-24 09:03:55

前端單元測試冒泡排序

2012-02-29 13:32:28

Java

2021-11-10 09:17:18

程序員排序算法搜索算法

2023-02-09 07:39:01

2017-11-15 07:20:22

Facebook相似性搜索算法

2013-04-23 09:31:52

SQL Server

2020-12-08 05:52:28

js前端算法

2012-08-24 09:16:53

App Store

2019-10-29 15:22:24

Google算法搜索

2011-01-04 11:02:08

程序員

2021-11-03 15:01:50

算法開源技術(shù)

2012-06-27 10:05:55

App Store搜索算法

2017-03-20 13:09:33

Swift廣度優(yōu)先搜索手游開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號