成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于Qdrant和FiftyOne的最近鄰嵌入搜索算法實戰

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

譯者 | 朱先忠

審校 | 孫淑娟

簡介

神經網絡嵌入能夠實現輸入數據的低維表示,從而服務于各種類型的神經網絡應用程序。嵌入有一些有趣的功能,因為它們可以捕獲數據點的語義。這對于圖像和視頻等非結構化數據尤其有用,這樣不僅可以對像素相似性進行編碼,還可以對一些更復雜的關系進行編碼。

使用FiftyOne和Plotly可視化針對BDD100K數據集的嵌入

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

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

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

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

安裝

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

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

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

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

pip install fiftyone
pip install torchvision
pip install qdrant_client

整體任務流程

1. 加載數據集

2. 生成嵌入

3. 將嵌入加載到Qdrant

4. 最近鄰分類

5. FiftyOne評估

加載數據集

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

import fiftyone as fo
import fiftyone.zoo as foz

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

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

接下來,讓我們仔細分析一下FiftyOne應用程序中所使用的數據集。

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

生成嵌入

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

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

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

將嵌入結果加載到Qdrant

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

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

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

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

# 把已經訓練的嵌入加載到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)

最近鄰分類

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

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

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

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

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,
)
# 統計每個類型的出現次數,并選擇最常見的標簽,置信度估計為最常見標簽的出現次數除以結果總數
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 = []

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

test_view.set_values("ann_prediction", predictions)

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

FiftyOne評估

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

session = fo.launch_app(test_view)

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

# 根據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),允許我們點擊單元格并自動更新應用程序以顯示相應的樣本。

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

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

from fiftyone import ViewField as F

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

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

就這么簡單,我們使用FiftyOne和Qdrant作為嵌入后端創建了一個ANN分類模型,因此查找向量之間的相似性可以不再像傳統k-NN那樣成為我們任務的瓶頸了。

請自己試試看

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

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

譯者介紹

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

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

責任編輯:華軒 來源: 51CTO
相關推薦

2023-11-30 09:55:27

鴻蒙鄰分類器

2023-05-30 07:58:01

谷歌搜索算法

2019-03-29 09:40:38

數據結構算法前端

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

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算法搜索

2021-11-03 15:01:50

算法開源技術

2011-01-04 11:02:08

程序員

2012-06-27 10:05:55

App Store搜索算法

2017-03-20 13:09:33

Swift廣度優先搜索手游開發

2022-04-26 10:27:52

機器算法KNN數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产二区在线播放 | 一区二区三区小视频 | 中文字幕乱码一区二区三区 | av网站在线看| 成人一区二区三区在线观看 | 亚洲天堂一区 | 91在线免费观看 | www.788.com色淫免费 | 亚洲精品av在线 | 亚洲国产成人精品女人 | 国产精久久久久久久 | 一区二区在线不卡 | www.日韩| 鲁视频| 国产乱码精品一区二区三区五月婷 | 久久综合888| 99精品网 | 草久久| 亚洲一区二区免费 | 国产精品视频导航 | 国产日韩91 | 成人久久| 国产精品地址 | 欧美片网站免费 | 91精品国产91久久久久久最新 | 天堂久久天堂综合色 | 美女拍拍拍网站 | 久久久久电影 | 国产重口老太伦 | 日韩一区二区在线视频 | 亚洲成人一区二区 | 日韩在线| 日韩在线观看一区 | 高清国产午夜精品久久久久久 | 国产免费福利在线 | 一级毛片在线播放 | 日韩在线第一 | 久久免费香蕉视频 | 国产做a爱片久久毛片 | 久久久久久影院 | 在线永久看片免费的视频 |