分類: 影像處理工作

  • 大規模 RTSP 串流的一對多物件偵測:基於 ThreadPool 的資源調度與效能優化實踐

    背景:

    這是用在一個環境監測的系統,
    影像方面可以在光影下利用成色來判別不特定形狀的物件偵測模型。

    會有這種不特定形狀的規格,
    是配合甲方需求,否則機器學習訓練特定物件即可。

    但此不特定物件偵測模型為我既有技術轉移,
    未來應該會開一篇來解說,以下簡稱檢測模型。

     

    瓶頸:

    這次專案的瓶頸在於希望盡可能的提昇檢測速度,
    並且讓一臺正常的 PC 服務約 200支監視鏡頭。

    這是我第一次用一臺 PC服務 200支鏡頭,
    之前專案大概是 8支攝影鏡頭,
    所以要考慮計算資源的分配。

     

    解決之路:

    我一開始想讓這 200支鏡頭都連上 RTSP,
    定時去啟動檢測任務。

    遇到第一個問題是初始化資源用得太多。

    因為一開始我用迴圈去一支一支初始化攝影機,
    這麼大規模的 RTSP 連接量,
    會讓原本已經連上的攝影機又斷線 -> 重複連線。

    由於 200 路 RTSP 的全量維持長連線搶佔了大量 Socket 資源與網路頻寬,導致嚴重的封包遺失,觸發 OpenCV 的斷線重連機制,陷入惡性循環,最終造成系統崩潰與遠端連線中斷。


    後來我先改一個讓遠端可以動的架構,
    把這 200支分 10組,每 6分鐘就算一組 20支左右的鏡頭檢測任務,
    並在每組裡面採用 ThreadPool 開 5個 worker 去執行任務,
    也就是說我最多會有 5個檢測任務在跑,
    跑完了就去拿組內剩下的攝影機任務。

    這樣是稍微能跑了,但是對於單支攝影機檢測間隔來說太長了,
    會來到一個小時檢測一次。

    並且因為仍是維持全部 RTSP 在線架構,
    會有斷線重連的問題。

    最終架構:

    異物檢知系統架構圖
    系統架構圖

    最後我設計了隨選連線的架構,
    需要檢測時再讓鏡頭連上 RTSP,
    雖然這樣每輪檢測都需要對鏡頭重新連線,
    並在偵測完畢立即釋放資源。

    這樣不僅能根絕斷線重連的問題,
    且可以有效縮短單支攝影機的檢測間隔。

     

    成果:

    200支攝影機跑一輪檢測的時間大約會是 5分鐘,
    也就是說單支攝影機的檢測間隔也會是 5分鐘,
    比一個小時的間隔來說提升了 1200%。

    並且在檢測模型內含有物件偵測模型且在 5 個 Worker 併發的情境下,
    透過即時的資源回收,將系統 RAM 穩定壓制在 4GB 以內,
    驗證了此資源調度架構的高效能。

    另外整合了 Flask Web API,實現了檢測目標的動態遮蔽(Mute)與即時狀態查詢,增加了系統操作的靈活性。

  • 穩健的矩形 OCR 前處理校正技巧 – 特徵點順序校正

     

    上個月被派了幾個工項,
    其中一個是解我們開單員拍到的車牌照片。

    (閱讀全文…)