基於Milvus快速實踐以圖搜圖

語言: CN / TW / HK

背景

圖片檢索在生活中應用廣泛,常見的圖片檢索包括基於文字內容搜尋和基於圖片內容搜尋。基於文字內容搜尋圖片是通過給圖片打標籤,然後通過搜尋標籤來實現對圖片的搜尋;而基於圖片內容搜尋即以圖搜圖,使用者通過輸入圖片在海量的圖片庫中快速找到同款或者相似圖片,這種搜尋方式被廣泛應用於電商、設計、媒體諮詢、智慧監控以及搜尋引擎等熱門領域。

本文基於Milvus和圖片特徵提取模型VGG,藉助SQL快速搭建了一套以圖搜圖端到端解決方案,為本地化進行海量圖片相似度量實施工作提供可能。

系統概覽

圖為基於Milvus的以圖搜圖系統架構,webclient通過一組web interface接收使用者請求併發送給webserver,webserver接到webclient發來的http請求後進行處理並返回處理結果。webserver由圖片特徵提取模型VGG和向量搜尋引擎Milvus組成,VGG模型負責將圖片轉換成向量,Milvus負責儲存向量並進行相似向量檢索。

SQLite負責儲存原始圖片資料,Milvus儲存向量後生成的唯一向量id與原始圖片資料建立關聯關係,在影象檢索時通過向量id找到對應的原始圖片資訊。

VGG模型

VGG於2014年由牛津大學視覺幾何組(Visual Geometry Group)提出,其突出貢獻是證明了增加網路的深度能夠在一定程度上影響網路最終的效能。VGG模型在多個遷移學習任務中的表現要優於GoogLeNet,從影象中提取CNN特徵,VGG模型是首選演算法。

VGGNet探索了CNN的深度及其效能之間的關係,通過反覆堆疊3*3的小型卷積核和2*2的最大池化層,VGGNet成功地構築了16-19層深的CNN。本文使用VGG16模型 ,技術實現上使用 Keras+TensorFlow:。

Milvus 向量資料庫

Milvus是一款開源的向量資料庫,賦能AI應用和向量相似度搜索。Milvus為海量向量搜尋場景而設計,它不但集成了業界成熟的向量搜尋技術如 Faiss和SPTAG,Milvus也實現了高效的NSG圖索引。同時,Milvus團隊針對Faiss IVF索引進行了深度優化,實現了CPU與多GPU的融合計算,並完成單機環境下SIFT1b十億級向量搜尋任務。具有使用方便、實用可靠、易於擴充套件、穩定高效和搜尋迅速等特點。

圖是Milvus在整個系統鏈路中的位置及應用場景。資料進入系統大致分為兩類:一類是需要比對的資料,另一類是需要真正去做查詢的資料。這些資料通過Encoder(如神經網路或深度學習模型)生成vector向量,然後這個向量就會寫入或通過Milvus去做查詢。所有的寫入過程在Milvus中都會轉化成檔案,儲存在物件儲存上面;而在查詢過程中基本是純記憶體操作,利用記憶體索引去找到距離比較近的向量,再對這些向量去做讀盤的retrived操作,獲取原始資料。

API呼叫過程

在整個以圖搜圖系統中,webserver對外提供5個api呼叫: train、process、count、search、delete,基本包含了系統的全部基礎功能。

train api

train api為圖片載入介面,通過post請求接收圖片的路徑並傳入系統。在預處理階段,即圖片檢索之前,需要將圖片庫載入進資料庫Milvus,由於Milvus僅支援向量資料的檢索,需要將圖片轉化為特徵向量,先通過 train api載入圖片庫路徑,再通過呼叫VGG模型的vgg_extract_feat()實現特徵提取,獲取特徵向量;然後通過insert_vectors()的介面匯入Milvus資料庫。特徵向量存入Milvus資料庫後,Milvus會為每個向量分配一個唯一id,並將此id反射儲存到源資料庫SQL中,與源圖片建立關聯關係。在後續圖片檢索時,通過特徵向量id查詢對應圖片的特徵向量。

process api

process api為get請求,提供檢視圖片載入的進度。呼叫可以看到train api執行過程中已經載入進Milvus庫的圖片數及總圖片數。

count api

count api為post請求,提供檢視當前Milvus庫的向量總條數,一條向量即表示一張圖片。

search api

search api為post請求,在圖片相似檢索時呼叫。待搜尋圖片傳入系統後,先通過VGG模型的vgg_extract_feat(img_path)轉化為特徵向量,然後呼叫search_vectors()在Milvus庫中進行向量相似檢索,返回top_k結果。

通過search介面拿到前top k相似結果的向量 ids,通過與SQL庫中儲存的向量id進行比對獲取與源圖片的對應關係。

delete api

delete api為post請求,用於刪除Milvus庫裡面的表,清空之前匯入的向量資料。

系統部署

基於Milvus搭建的以圖搜圖系統,通過容器化服務進行部署,主要包含Milvus docker部署、webserver docker部署和webclient docker 部署三部分(詳情可參見附錄)。部署完成後,瀏覽器輸入ip:port(如localhost:8001)即可訪問。

下圖是抽取 PASCAL VOC 圖片集部分圖片(約10000張圖片,涵蓋人物、動物、交通等20多個目錄)為例的以圖搜圖系統介面,輸入查詢圖片“飛機”得到的搜尋結果,通過調整top_k引數,右側結果欄即可更直觀的展示相似結果資訊。

結語

本文介紹了基於Milvus搭建以圖搜圖系統過程,能讓測試人員不必掌握tensorflow, pytorch等深度學習框架,及opencv之類的視覺演算法庫即可快速感知圖片的相似情況並給出更直觀的判斷,從而降低測試門檻。另外,基於雲AI而生的Milvus特徵向量庫,也為後續基於kubernete的部署提供了可能。

啟動 Milvus Docker

啟動 Server Docker

啟動 Client Docker