大規模 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)與即時狀態查詢,增加了系統操作的靈活性。

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *