天天看點

一款開源視訊分析結構化架構:VideoPipe

作者:不秃頭程式員
一款開源視訊分析結構化架構:VideoPipe

在這個視訊無處不在的資訊時代,我們享受着個性化推送帶來的便捷,每一次重新整理都能遇到仿佛量身定制的視訊内容。是否曾有一刻,你對這背後的“智慧篩選”感到好奇?究竟是什麼技術支撐着系統在龐大的視訊海洋中,精準捕捉到你的興趣所在,并且僅憑幾個關鍵詞就能為你找到相比對的視訊片段?在這看似簡單的浏覽體驗之下,實則蘊含着計算機科學對視訊内容的深度分析與了解。

計算機如何看懂海量視訊的呢?

視訊本質上是一系列連續的圖像幀,按照一定的幀率播放,進而形成連續的動态效果。計算機分析視訊的基本原理,具體而言,可分為三個核心步驟:

「1. 解碼:視訊到圖像幀的轉換」

視訊首先被解碼,這一過程将連續播放的動态畫面分解成一幀幀靜态圖像。

「2. 分析/推理:AI算法的魔法」

解碼後的圖像幀随後進入分析階段,這裡便是AI技術大顯身手之處。利用深度學習、機器學習等先進算法,計算機不僅能夠識别圖像中的物體、人臉、文字等基本元素,還能進一步了解場景語境、檢測動作行為、甚至分析情緒與意圖。進而為視訊内容的标簽化、摘要生成及主題提取等提供了可能。

「3. 編碼」

将經過特定處理(如增加标注、過濾、特效等)的圖像幀重新組合成視訊。

一款開源視訊分析結構化架構:VideoPipe

盡管這看起來就寥寥幾步,但其中涉及許多技術細節和複雜的算法。比如,如何将訓練好的AI圖像算法模型,快速部署落地到實際應⽤場景中呢?對于沒有接觸過計算機視覺(Computer Vision,後簡稱 CV)的程式員,或是純搞算法的算法工程師,要實作+落地AI視訊分析相關功能可能會有點難度。然而,随着視訊在日常生活中的普及和應用越來越廣泛,處理和分析視訊類資料的需求也在逐漸增加。

一款開源視訊分析結構化架構:VideoPipe

今天,筆者将為大家介紹一款開源視訊分析結構化架構:VideoPipe,旨在讓開發視訊分析應用像使用Django寫Web一樣友善。

https://github.com/sherlockchou86/VideoPipe

VideoPipe是一個用于視訊分析和結構化的架構,采用C++編寫,依賴少,易于內建。它采用管道設計形式,其中每個節點互相獨立并可自行搭配,可用來建構不同類型的視訊分析應用,适用于視訊結構化、圖檔搜尋、人臉識别、交通/安防領域的行為分析(如交通事件檢測)等場景。

一款開源視訊分析結構化架構:VideoPipe

VideoPipe介紹

VideoPipe類似于英偉達的DeepStream和華為的mxVision架構,但它更易于使用、更具備可移植性。它完全由原生 C++ 編寫,僅依賴于少量主流的第三方子產品(如 OpenCV)。

VideoPipe采用面向插件的編碼風格,可以根據不同的需求按需搭配,我們可以使用獨立的插件(即架構中的Node類型),來建構不同類型的視訊分析應用。你隻需準備好模型并了解如何解析其輸出即可,推理可以基于不同的後端實作,如 OpenCV::DNN(預設)、TensorRT、PaddleInference、ONNXRuntime 等,任何你喜歡的都可以。VideoPipe工作示意圖如下所示。

一款開源視訊分析結構化架構:VideoPipe

由此可以看出它提供了以下功能:

  • 流讀取/推送:支援多種視訊流協定,如udp、rtsp、rtmp等實時傳輸協定。
  • 視訊解碼/編碼:內建OpenCV與GStreamer庫,提供高性能的視訊與圖像編解碼能力,支援硬體加速,確定視訊處理的實時性和流暢度。
  • 基于深度學習的算法推理:内置支援多種深度學習模型,涵蓋目标檢測、圖像分類、特征提取等,為視訊内容的智能分析提供強大算力支援。
  • 目标跟蹤:內建IOU(Intersection over Union)、SORT(Simple Online and Realtime Tracking)等先進追蹤算法,實作對移動物體的穩定、準确追蹤。
  • 行為分析(BA):基于目标跟蹤技術,進一步分析特定行為,如交通違規(越線、違章停車)、人群流動分析等,為交通管理、安防監控提供決策依據。
  • 資料代理:将分析得到的結構化資料(如JSON、XML或自定義格式)高效地轉發至指定目的地,便于後續的資料存儲、分析或展示。
  • 錄制與截圖:根據需求,自動錄制特定時間段的視訊或捕獲關鍵幀截圖。
  • 螢幕顯示(OSD):将模型輸出結果疊加到視訊幀上顯示(On-Screen Display),如框選出檢測到的目标、标注行為分析結果,提升使用者互動體驗和系統透明度。

快速上手

VideoPipe不挑硬體。無論是高端配備有專業加速卡的伺服器,還是僅依靠CPU的普通計算機,VideoPipe都能順暢運作。同時,VideoPipe項目内包含了多個詳細示例代碼,如下代碼展示了如何使用VideoPipe架構快速搭建一個人臉識别應用。

/*
* 名稱:1-1-N sample
* 完整代碼位于:samples/1-1-N_sample.cpp
* 功能說明:1個視訊輸入,1個視訊分析任務(人臉檢測和識别),2個輸出(螢幕輸出/RTMP推流輸出)
* 注意:模型和視訊檔案需要自行準備
*/

int main() {
    // 日志配置
    VP_SET_LOG_INCLUDE_CODE_LOCATION(false);
    VP_SET_LOG_INCLUDE_THREAD_ID(false);
    VP_LOGGER_INIT();

    // 1、建立節點
    // 建立視訊源節點
    // 從本地視訊檔案(./test_video/10.mp4)讀取視訊流
    auto file_src_0 = std::make_shared<vp_nodes::vp_file_src_node>("file_src_0", 0, "./test_video/10.mp4", 0.6);
    // 2、模型推理 Node
    // 一級推理:人臉檢測,使用預先訓練好的模型face_detection_yunet_2022mar.onnx
    auto yunet_face_detector_0 = std::make_shared<vp_nodes::vp_yunet_face_detector_node>("yunet_face_detector_0", "./models/face/face_detection_yunet_2022mar.onnx");
    // 二級推理:人臉識别,利用模型face_recognition_sface_2021dec.onnx提取人臉特征
    auto sface_face_encoder_0 = std::make_shared<vp_nodes::vp_sface_feature_encoder_node>("sface_face_encoder_0", "./models/face/face_recognition_sface_2021dec.onnx");
    // 3、OSD Node
    // 将人臉識别的結果繪制到視訊幀上
    auto osd_0 = std::make_shared<vp_nodes::vp_face_osd_node_v2>("osd_0");
    // 在本地螢幕顯示處理後的視訊
    auto screen_des_0 = std::make_shared<vp_nodes::vp_screen_des_node>("screen_des_0", 0);
    // 通過RTMP協定推流到指定伺服器(rtmp://192.168.77.60/live/10000)
    auto rtmp_des_0 = std::make_shared<vp_nodes::vp_rtmp_des_node>("rtmp_des_0", 0, "rtmp://192.168.77.60/live/10000");

    // 建構管道,将各個節點按處理順序連接配接起來,形成了一個資料處理流水線
    // 視訊資料從源節點開始,經過人臉檢測、人臉識别,最後到OSD節點處理,并同時輸出到螢幕和RTMP流
    yunet_face_detector_0->attach_to({file_src_0});
    sface_face_encoder_0->attach_to({yunet_face_detector_0});
    osd_0->attach_to({sface_face_encoder_0});

    // 管道自動拆分,通過螢幕/推流輸出結果
    screen_des_0->attach_to({osd_0});
    rtmp_des_0->attach_to({osd_0});

    // 啟動管道
    file_src_0->start();

    // 可視化管道
    vp_utils::vp_analysis_board board({file_src_0});
    board.display();
}           

由以上代碼,可以發現VideoPipe架構将視訊分析/處理的步驟,抽象成了一個管道(pipe),每一步的處理都是管道中的一個節點(Node),處理流程如下:

  1. 視訊讀取(Node):從檔案或網絡流中讀取視訊資料,并進行初步的解碼處理,為後續的分析做好準備。
  2. 模型推理(Node):将深度學習模型的推理過程封裝起來,使得人臉識别等進階功能的內建變得直接而高效。
  3. OSD(Node):将分析結果可視化,即将識别到的人臉資訊以圖形方式疊加到視訊幀上。
  4. 建構管道:将各個節點按照處理邏輯順序連接配接起來,形成一個完整的處理鍊路。
  5. 啟動與監控:通過啟動管道的源頭節點(如視訊讀取節點),整個處理流程得以啟動。同時,提供可視化功能,開發者可以直覺監控管道的運作狀态。
一款開源視訊分析結構化架構:VideoPipe

代碼運⾏後,會出現如上圖所示的3個畫⾯。它們分别是管道運⾏狀态圖(狀态⾃動重新整理)、螢幕顯⽰結果(GUI)、播放器顯⽰結果(RTMP),至此就算上手 VideoPipe 了!

繼續閱讀