Milvus 與 ONNX 格式的多種模型結合應用

開放神經網絡交換(Open Neural Network Exchange,簡稱 ONNX)是一個開放的生態系統 ,它提供了基於人工智能模型的一種開源格式。 自 2017 年開源以來,ONNX 在短短几年時間內發展爲表示人工智能模型的實際標準,提供了一個統一的交互格式,用於優化深度學習和傳統的機器學習。 ONNX 定義了一組與環境和平臺無關的標準格式,實現不同框架之間的互操作性,並簡化從研究到生產的路徑,有助於提高人工智能社區的創新速度。

Milvus 是一款開源的向量數據庫,支持針對特徵向量的增刪改操作和近實時查詢。Milvus 集成了業界成熟的向量檢索技術,包括 Faiss、NMSLIB、Annoy 等,同時提供了一整套簡單直觀的 API,支持針對不同場景選擇不同的索引。得益於其簡單易用的特性,Milvus 獲得了大量用戶的青睞,被廣泛應用於 AI 場景,包括圖像/音視頻搜索、文本搜索、推薦、交互式問答、新藥搜索等領域。

本文將介紹如何基於 ONNX 和 Milvus 實現多模型以圖搜圖系統。本文以 VGG16 和 ResNet50 模型爲例,使用 ONNX 運行不同的 AI 模型對圖片數據進行推理生成特徵向量,最後在 Milvus 中進行特徵向量檢索,返回相似的圖片。我們在 GitHub 上開源了該項目的 Jupyter Notebook 代碼文件( https://github.com/milvus-io/bootcamp/blob/master/etc/onnx_and_milvus/milvus_with_different_models.ipynb ),接下來將介紹其具體實現。

  使用 ONNX 處理模型


ONNX 格式可以輕鬆實現人工智能模型之間的交換,例如 TensorFlow 模型轉換爲 ONNX 格式後即可在 Caffe 環境下運行。本文示例中,我們將 Keras 框架下預訓練好的 ResNet50 模型轉換爲 ONNX 格式,再調用另一個 ONNX 格式的 VGG16 模型,從而實現不同模型的處理分析。


注:在模型轉換過程中,使用官方的接口 keras2onnx.convert_keras(model, model.name) 時返回錯誤AttributeError: 'KerasTensor' object has no attribute 'graph'。後按照 Stack Overflow 的解決方案,使用 Python 的 Bash 命令執行後成功轉換模型

  模型推理提取特徵向量


預訓練好的 ResNet50 模型經過以上處理轉化爲 ONNX 格式後,可以通過 inference 接口即可直接提取圖片的特徵向量。 

注:提取特徵向量後需要對向量數據進行歸一化。


使用經過同樣處理的 ONNX 格式 VGG16 模型處理圖片數據:


  特徵向量存儲


諸如圖片等非結構化數據無法被計算機直接識別,但可通過 AI 模型轉換爲特徵向量,從而用於計算機處理分析。 Milvus 向量數據庫旨在解決海量非結構化數據分析的問題,可以存儲向量數據並執行近實時的分析。

首先,在 Milvus 中創建對應模型的 collection ,然後再插入圖片向量數據。


數據插入成功後 Milvus 會返回向量對應 ID,之後需根據 ID 找出對應圖片。由於本文案例使用的 Milvus 1.1 版本不支持存儲其他標量信息(目前 Milvus 2.0 版本已經支持),因此採用 Redis 存儲向量 ID 和圖片路徑的 key-value 值。


  相似圖片檢索


數據存儲完成後,就可以在 Milvus 中檢索向量了。Milvus 支持多種常見的距離計算方式,包括歐式距離、內積距離和漢明距離等。本文的圖片分析通過 Milvus 來計算向量之間的歐式距離,返回相似的向量 ID,然後在 Redis 中找出 ID 對應的圖片,從而實現相似圖片檢索的功能。


以 VGG16 和 ResNet50 模型爲例,本文詳述了通過 ONNX 處理多個模型並結合 Milvus 進行相似向量檢索得出相似圖片的過程。以上兩個模型都基於 Keras 框架,可以快速推理提取特徵向量。從 Notebook 中可以看出,Milvus 基於這兩個模型在 COCO 數據集上搜索圖片的結果雖然相似,但歐氏距離卻不盡相同。你也可以嘗試使用其他數據集比對兩者的搜索結果。

Milvus 是一款高性能、高可用的向量數據庫,可用於處理海量非結構化數據生成的特徵向量,更多案例參考 Milvus bootcamp( https://github.com/milvus-io/bootcamp )。


參考資料:
1. https://github.com/onnx/onnx
2. https://onnx.ai/
3. https://milvus.io/cn/
4. https://github.com/milvus-io/bootcamp

✏️  作者:陳室餘,Zilliz 數據工程師。自加入 Zilliz 以來,致力於爲 Milvus 開源項目探索解決方案,從 Docker 部署到應用 Milvus 在更多 AI 項目,幫助諸多用戶實現應用場景落地。畢業於西安電子科技大學計算機學系。

Github @Milvus-io|CSDN @Zilliz Planet|Bilibili @Zilliz-Planet


Zilliz 以重新定義數據科學爲願景,致力於打造一家全球領先的開源技術創新公司,並通過開源和雲原生解決方案爲企業解鎖非結構化數據的隱藏價值。 


Zilliz 構建了 Milvus 向量數據庫,以加快下一代數據平臺的發展。Milvus 目前是 LF AI & Data 基金會的畢業項目,能夠管理大量非結構化數據集。我們的技術在新藥發現、計算機視覺、推薦引擎、聊天機器人等方面具有廣泛的應用。

本文分享自微信公衆號 - ZILLIZ(Zilliztech)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章