這人誰啊?這是啥?話在嘴邊說不出,Milvus 幫你智能分析視頻

陳室餘, Zilliz 數據工程師,畢業於西安電子科技大學計算機學系。自加入 Zilliz 以來,致力於在音視頻分析、化學分子式檢索等各領域爲 Milvus 開源項目探索解決方案,目前也在持續探索更多有趣的方案。爲了好好生活、延年益壽,平時非常熱愛運動。

週末在看《失控玩家》時,覺得巴迪保安眼熟,演過什麼卻說不上來,腦子裏想的全是“這?人?誰?啊?” 隱隱約約有印象,越着急越想不出來 💢

還有一次,視頻中男主喝的飲料是自己之前很喜歡的,想下單卻忘了品牌。

呼之欲出,總也不出。“啪”,我的腦子像是斷網了。

這種話到嘴邊說不出的“舌尖現象”(Tip of the tongue),在看影片的時候真是太令人抓狂了,我特別希望有一個類似於“以圖搜圖”系統,讓我搜索視頻、分析視頻。

以前,我用 Milvus 搭建過一個以圖搜圖系統。視頻分析和圖片分析多少有些類似,於是,我搭建了一個基於 Milvus 的視頻分析系統 🚀

物體檢測

概述

首先,要想分析視頻中的物體,得先進行目標檢測。如何高效、準確地識別視頻中的物體是這項任務的主要挑戰。

從早期的傳統圖像算法到當前的深度神經網絡,主流的目標檢測(Object Detection)方法包括:RCNN、FRCNN、SSD、YOLO 等。本文介紹的基於 Milvus 的視頻分析系統,可以通過結合深度學習模型,智能並快速地識別目標。

實現方案

爲了實現視頻中的物體檢測和識別,首先需要對視頻截幀,利用目標檢測技術識別圖片上的物體,再對檢測到的物體圖片做特徵提取,通過特徵向量分析其是否包含該目標,最終得出結論。

  • 視頻截幀

視頻分析問題通常會利用截幀技術獲取單幀畫面,轉換爲圖像分析問題。目前截幀技術十分成熟,FFmpeg、OpenCV 等都可以按照一定的時間來截取視頻幀。本文將利用 OpenCV 對視頻按每秒進行截幀。

  • 目標檢測

目標檢測的任務是希望在截取到的圖片幀中找到物體,同時根據該物體的位置提取出相應的截圖。如下圖所示,可以檢測出自行車、狗和汽車三個物體,並提取出它們的圖像。本文將利用 YOLOv3 網絡做目標檢測,這也是目前比較流行的網絡檢測方式。

  • 圖像特徵提取

特徵提取是指將機器難以識別的非結構化數據轉化爲容易識別的特徵向量。比如,圖像可以通過深度學習神經網絡模型轉換爲多維特徵向量,目前比較流行的圖像識別 AI 模型有 VGG、CNN、ResNet 等。本文將利用 ResNet50 模型對視頻中的目標物體圖片進行特徵提取。

  • 特徵向量分析

將提取到的圖像特徵向量與圖像庫進行相似度比較,找出與檢測到的物體圖像最相似的結果,最終得出物體檢測的相關信息。

當特徵向量數據規模較大時,向量計算將會是一個巨大的挑戰。本文將採用 Milvus 向量數據庫來分析特徵向量數據。

關鍵技術

OpenCV

OpenCV 是一個跨平臺的計算機視覺庫, 它實現了圖像處理和計算機視覺方面的很多通用算法,在計算機視覺領域使用十分廣泛。以下將使用 Python 編程,用 OpenCV 按一定間隔截取視頻幀,並保存爲圖片:

import cv2 
cap = cv2.VideoCapture(file_path)   
framerate = cap.get(cv2.CAP_PROP_FPS)   
allframes = int(cv2.VideoCapture.get(cap, int(cv2.CAP_PROP_FRAME_COUNT)))  
success, image = cap.read() 
cv2.imwrite(file_name, image)

YOLOv3

YOLOv3 是近年來提出的單階段檢測器,該檢測器與達到同樣精度的傳統目標檢測方法相比,推斷速度能達到近兩倍。本文使用 PaddlePaddle 實現的 YOLOv3 增強模型,在該版本中使用了多種優化方法,推斷速度更快。

ResNet50

ResNet 模型曾在 ImageNet 比賽中奪得圖像分類任務第一名。由於它簡單與實用並存,之後很多圖像分析方法都會在 ResNet50 或者 ResNet101 的基礎上實現。圖像檢測、分割、識別等領域都紛紛使用 ResNet,可以看出 ResNet 確實十分受歡迎。

Milvus

Milvus 是一款開源的向量數據庫,支持使用多種 AI 模型將非結構化數據向量化,併爲向量數據提供搜索服務,可廣泛應用於計算機視覺、自然語言處理、語音識別、推薦系統以及新藥發現等。具體實現方式是:

  1. 通過深度學習模型將非結構化數據轉化爲特徵向量,並導入 Milvus 庫。

  2. 對特徵向量進行存儲並建立索引。

  3. 接收到用戶的向量搜索請求後,返回與輸入向量相似的結果。

系統實現

通過前面的介紹,相信你對基於 Milvus 的視頻分析系統已經有所瞭解。如下圖所示,該系統主要分爲兩部分:

  • 紅色箭頭表示的數據導入過程:利用 ResNet50 模型提取圖像數據集的特徵向量,然後將特徵向量導入 Milvus 向量數據庫。

  • 黑色箭頭表示的視頻分析過程:首先將視頻截幀,然後把截取到的圖片利用 YOLOv3 進行目標檢測提取出物體圖像,然後再通過 ResNet50 模型提取圖像的特徵向量,最後在 Milvus 中檢索物體圖像的特徵向量,找出視頻中出現的物體信息。

關於系統的具體實現過程和源碼,請參考我們的 bootcamp 項目

數據導入

數據導入過程十分簡單,首先將待導入的數據轉化爲 2048 維向量數據,然後把向量數據導入 Milvus。

vector = image_encoder.execute(filename)
entities = [vector]
collection.insert(data=entities)

視頻分析

正如前面所介紹的,視頻分析需要先進行視頻截幀,然後對每幀圖片做目標檢測,將檢測到的物體圖像通過提取,得到特徵向量數據,最後在 Milvus 中使用歐氏距離(“L2”)進行相似度計算,返回檢測到的結果。

images = extract_frame(filename, 1, prefix)   
detector = Detector()   
run(detector, DATA_PATH)       
vectors = get_object_vector(image_encoder, DATA_PATH)
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(vectors, param=search_params, limit=10)

總結

越來越多的 AI 平臺集成了目標檢測技術和圖像處理技術,實現了很多可以落地的應用場景。

比如,以圖搜圖,聲紋識別,還有……本文實現的基於 Milvus 向量數據庫的視頻識別系統✨

看視頻失憶抓狂?有 Milvus 在手,你就可以快速識別視頻信息,媽媽再也不用擔心我看劇暴走啦!

參考文獻

[1] A. D. Bagdanov, L. Ballan, M. Bertini, A. Del Bimbo. “Trademark matching and retrieval in sports video databases.” Proceedings of the international workshop on Workshop on multimedia information retrieval, ACM, 2007. 

[2] J. Kleban, X. Xie, W.-Y. Ma. “Spatial pyramid mining for logo detection in natural scenes.” IEEE International Conference, 2008.

[3] R. Boia, C. Florea, L. Florea, R. Dogaru. “Logo localization and recognition in natural images using homographic class graphs.” Machine Vision and Applications 27 (2), 2016. 

[4] R. Boia, C. Florea, L. Florea. “Elliptical asift agglomeration in class prototype for logo detection.” BMVC, 2015. 


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

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


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