相似視頻搜索—Opera 的 Milvus 實踐


✏️  作者介紹:


李兆星 Opera News 高級工程師



  場景介紹


Opera 成立於 1995 年,總部位於挪威奧斯陸,是全球領先的瀏覽器提供商及數字內容發現和推薦平臺領域的先驅。20 多年來,數百萬名用戶通過 Opera 網頁瀏覽器訪問網站、閱讀、進行創作以及使用其他網絡娛樂功能。

由於大量視頻內容高度重複,爲提升視頻內容推薦的體驗,多媒體處理平臺需要在視頻審覈時過濾內容過於相似的視頻。

通常在搜索相似視頻時,多媒體處理平臺會抽取多個關鍵幀的特徵向量並融合成單個向量進行搜索。但是,Opera ⽬前暫時不具備融合多個特徵向量的能⼒,因此採用另一種方法——將視頻視作圖⽚的集合。先計算圖⽚相似度,再計算圖⽚集間的相似度,最終得出視頻間的相似度。對於圖片間的相似度計算,可以將圖片通過深度學習模型轉化爲特徵向量,然後利用 Milvus 向量搜索引擎來計算圖片特徵向量的相似度。


  項目要點


1. 將視頻轉化爲圖片集

FFprobe 是一個多媒體流分析工具。它從多媒體流中收集信息,並以人類和機器可讀的形式打印出來。它可以用來檢測多媒體流的容器類型,以及每一個多媒體流的格式和類型。[1]我們在本項目中調⽤ FFprobe 命令獲取視頻時⻓信息。

   
   
   
ffprobe -show_format -print_format json -v quiet input.mp4

FFmpeg 是一個開源音視頻軟件,可以運行音頻和視頻多種格式的錄製、轉換、流功能[2]。我們在本項目中使用 FFmpeg ⼯具,按照固定間隔從視頻中抽取 10 幀。假設視頻時⻓爲 100 秒,每隔 10 秒抽取⼀幀,則⽐例爲 0.1

   
   
   
ffmpeg -i input.mp4 -r 0.1 ./images/frames_%02d.jpg

2. 將圖片轉化爲特徵向量

先對圖⽚進⾏預處理,包括裁剪、縮放、調節灰度等。利⽤預先訓練好的深度學習模型 VGG ResNet 模型,將圖片轉化爲 1000 維的特徵向量。

   
   
   
# Use the nativeImageLoader to convert to numerical matrix File f=new File(absolutePath, "drawn_image.jpg"); NativeImageLoader loader = new NativeImageLoader(height, width, channels); # put image into INDArrayINDArray image = loader.asMatrix(f); # values need to be scaled DataNormalization scalar = new ImagePreProcessingScaler(0, 1); # then call that scalar on the image dataset scalar.transform(image); # pass through neural net and store it in output array output = model.output(image);

3. 計算圖片集間的相似度

定義如下規則以計算圖⽚集間的相似度:
  • 圖⽚與圖⽚的相似度——圖片特徵向量的內積 ;
  • 圖⽚與圖⽚集的相似度——圖⽚與圖⽚相似度的最⼤值 ;
  • 圖⽚集與圖⽚集的相似度——圖⽚與圖⽚集的相似度的平均值。

4. 利用 Milvus 向量搜索引擎搜索 TopK 個相似視頻結果

Milvus 是一款開源的分佈式向量相似度搜索引擎。通過集成業界成熟的向量相似度搜索技術和大幅度優化高性能計算框架,Milvus 支持針對 TB 級向量的增刪改操作和近實時查詢,具有高度靈活、穩定可靠以及高速查詢等特點。Milvus 集成了 Faiss、NMSLIB、Annoy 等廣泛應用的向量索引庫,提供了一整套簡單直觀的 API,用戶可以針對不同場景選擇不同的索引類型。

Milvus 適用於多種場景,與深度學習相融合的架構如下圖所示:


採用 Milvus 的數據處理流程包括以下幾個步驟:
  1. 與深度學習模型相結合,將非結構化數據轉化爲特徵向量。
  2. 將特徵向量存儲到 Milvus 並建立索引。   
  3. 返回向量相似性搜索結果。   

在本項目中,利用 Milvus 搜索 TopK 的相似視頻需要進行如下步驟:
  1. 將圖片特徵向量及對應的視頻 ID 存儲在 Milvus 數據庫中。
  2. 將視頻轉換爲 10 個圖片向量後,向 Milvus 發起批量相似搜索,得到相似圖片以及圖片相似度。
  3. 利用上述提到的圖片集間相似度的計算方式,計算視頻相似度,過濾返回 TopK 的結果。


  系統流程


根據上述四個項目要點,我們設計了以下系統流程:


  • 將視頻上傳至服務器,保存視頻元信息,同時將視頻持久化存儲,隨後在消息隊列中發佈事件。
  • 視頻處理任務被觸發時,對視頻進行預處理、抽幀,將圖片轉化爲特徵向量後導入 Milvus 庫中。
  • 上傳待查重視頻或視頻 ID,將視頻轉化爲多個特徵向量。在 Milvus 庫中搜索相似向量,通過上文中的圖片集相似度計算方法得出視頻相似度,返回 TopK 個結果。


  後續優化


基於相似視頻搜索系統目前的設計,我們考慮未來在以下幾個方面進行優化:
  • 優化抽幀策略,抽取更具代表性的鏡頭;
  • 減小視頻時長等因素對視頻相似度的影響;
  • 進行相似度加權平均,爲持續時間較長的鏡頭增加權重。


  結語


通過結合深度學習模型和 Milvus 向量相似性搜索引擎,我們搭建了一套視頻相似搜索的系統。Milvus 的性能不斷持續優化,能夠高效檢索相似向量。此外,Milvus 的用戶交流羣十分活躍,用戶互相交流工程問題和項目思路,提問也會得到及時反饋。在搭建這個相似視頻搜索系統時,我受到了 Milvus 以圖搜圖教程的啓發。官網上還有許多其他成功案例可以參考。

在當前這個文本、圖像、音頻等非結構化數據爆炸式增長的時代,通過 embedding 技術將非結構化數據映射成多維向量後再進行檢索已成爲趨勢。Milvus 作爲分佈式向量檢索引擎,具有高性能、易部署的特性。Milvus 極大地節省了項目開發成本,顯著提高了系統檢索性能,並很好地滿足了本項目的技術和業務需求。


參考文獻

[1] FFprobe使用指南:https://developer.aliyun.com/article/311898
[2] FFmpeg:https://zh.wikipedia.org/wiki/FFmpeg
[3] Milvus 教程:https://www.zilliz.com/solutions
[4] Milvus 用戶案例:https://www.zilliz.com/user-stories


相關文章推薦

Milvus實戰| 以圖搜視頻系統

你追劇的好幫手-Milvus 視頻人臉檢索系統

快來體驗 Milvus 視頻目標檢測系統!




   歡迎加入 Milvus 社區


github.com/milvus-io/milvus | 源碼
milvus.io | 官網
milvusio.slack.com | Slack 社區
zhihu.com/org/zilliz-11| 知乎
zilliz.blog.csdn.net | CSDN 博客
space.bilibili.com/478166626 | Bilibili

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

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