web AR系統-1 架構探索
之前的專欄中曾經寫過一個BoW圖像檢索演算法的實現。本篇文章討論將這樣一個系統部署起來的一些技術以及特點。
BoW相似圖像檢索演算法的大致實現如下:
1 首先基於多個圖像所提取的海量特徵,形成聚類中心,繼而創建單詞樹。
2 其次再把各個待匹配圖像的特徵,插入單詞樹,做成樹形的資料庫。
3 最後當需要檢索時候,把攝像頭拍到圖像的多個特徵,分別到資料庫中進行「投票」處理,投票分值最高的即為匹配度最高的圖像。
目前正在閉門造車開發調研的H5相關的圖像檢索系統,需要基於上面提到的BoW,完成以下功能。
在Web網站前端,打開攝像頭(可以基於webRTC)。獲取camera video,然後將每一幀的圖像進行處理,並將提取後的信息發送給服務端。服務端檢索圖像,計算圖像Pose,並將結果返回給web前端。這樣通過瀏覽器前端處理 + 伺服器後端處理,實現增強現實相關的功能。
目前基礎架構的原型正在開發中,目前實現的方式分為三個主要層面。
- 前端:前端通過webRTC持續獲取到攝像頭video,通過canvas獲取到圖像。然後將圖像進行Grey/Gaussian blur/ReSample等處理,然後將處理後的圖像通過ajax post給服務端。
- 服務端:服務端目前基於docker + NodeJS架構,這樣可以方便的進行伺服器的添加/縮減/負載均衡。在阿里雲多台Linux伺服器上,架設了多個docker,每個docker都運行一套NodeJS環境。NodeJS接受Post的參數以後,把參數包裝,並傳遞給C++插件,C++插件提供了NodeJS調用Linux圖像處理介面相關的功能。
- Linux圖像處理模塊,也部署在每一個docker環境中。這個模塊基於OpenCV,提供了多種圖像操作介面,其中包括上面提到的BoW圖像檢索介面。
作為一個原型剛出來的實驗性工程來說。雖然整體可以運行。但還有很多問題需要解決。主要包含以下的問題:
1 webRTC目前很多瀏覽器並不支持。所以基於瀏覽器的javascript目前還不具備實現增強現實相關技術的實力。Chrome以外的瀏覽器什麼時候可以完全支持到,是一個很難說的問題。前端javascript處理圖像的能力比較弱,速度也比較差。要想達到實時處理的效果,需要多種優化。這裡面有很多可以優化的點。
2 很多演算法,比如複雜計算,以及BoW等圖像檢索,前端JS無法獨自處理,需要依賴服務端,這個涉及到ajax的數據量,需要儘可能在前端壓縮需要發送的數據量,僅傳遞必要的信息。
3 服務端實時處理前端請求,壓力還是很大的。即使多Docker並發也無法保證量稍大的情況。這一點還需要繼續調研,把ajax替換為socket是否能進一步縮短通信時間也是一個可以嘗試的點。
4 服務端未來需要僅保持必備功能,把大部分圖像處理的操作放到前端JS,進一步縮短服務端的壓力。
未來應該會基於這一個話題,在這個過程中寫一些新的發現以及心得。也會探索目前這幾個步驟的細節以及問題的解決。
推薦閱讀:
※基於 WebRTC 的視頻聊天技術在 iOS 端的實現
※Webrtc的多路事件分離器及網路API
※Kurento是否可以讓客戶端選擇不同的實時監控視頻?
※WebRTC有前途嗎?