虹軟人臉識別SDK - Java服務端的那些事

虹哥聊AI發表於2019-04-16

最近有合作公司的專案需要服務端人臉識別的開發,於是就用了公司的人臉識別SDK開發,由於之前對服務端開發介紹的資料比較少,正好這次又做了這個專案,花了幾天的開發,這裡就簡單分享一下個人的見解。

###影響效能的幾個關鍵點 ####1、人臉檢測 人臉檢測介面就是可以把一張圖片的人臉照片圖, 經過FaceEngine的處理,檢測出人人臉框資訊。檢測模式有兩種,image模式和video模式,image模式對於人臉檢測準確率比較高,但效能沒有video模式高。video模式適用於在視訊流模式下,在視訊流模式有更快的處理效能和更好的人臉框穩定性。Video模式下,處理一幀圖片在10毫秒內,所以在30幀的視訊中,可以輕鬆的對每幀進行人臉檢測。

虹軟人臉識別SDK - Java服務端的那些事
####2、特徵提取 特徵提取是在檢測出人臉框的基礎上,尋找出該人臉最具特別性的描述,該描述可被傳輸和儲存,在ArcFace2.0中,一個特徵佔用1032位元組,特徵提取要花100-150毫秒,所以每幀都做特徵提取是不可行的,但藉助TrackID,可以做到一張人臉只要提取一次人臉特徵。
虹軟人臉識別SDK - Java服務端的那些事
####3、人臉比對 人臉比對即特徵比對,對兩張人臉照片圖分別提取特徵,然後進行比較,獲取相似度。該比對的時間是微妙級的,但在實際的應用過程中,往往是幾千個特徵甚至幾萬個特徵進行比對,所以處理時間要成倍的增加。假設處理一個特徵需要3微妙,那麼在5萬的特徵庫中進行比較,時間就是3*50000=150毫秒
虹軟人臉識別SDK - Java服務端的那些事

###如何應對實時性高的場景 無感是永遠的痛 人臉識別經常用在一些實時性比較高的場合,比如門禁這類系統,客戶往往要求我們要“無感”通過。這些實時性高的系統,通常利用網路傳輸視訊流,伺服器來處理再反饋結果,如果沒有在網路,記憶體,CPU上做足夠的優化,往往帶來的就是延遲高,響應慢。 光看上面文字,大家可能沒什麼印象。我們們還是來一張圖,一起來直觀的感受一下耗時分析

虹軟人臉識別SDK - Java服務端的那些事
我們們來算算,假設100個裝置,每秒鐘30幀的照片,每幀100K,那麼每秒鐘有多少流量?每分鐘有多少?每天呢? 按照標準的演算法,每個裝置每秒鐘流量:1*30幀*100KB=3MB 換算到分的話3MB*60秒=16MB/分 1天的話16MB*60分鐘*24小時=23040MB/天 100個裝置的話23040MB*100=2T/天,也就是每天有T級別流量 哇,這麼一算,一般的伺服器和網路怎麼受得了 老規矩,我們們看圖來分析下現狀
虹軟人臉識別SDK - Java服務端的那些事
如上圖,照片實時上傳到伺服器,伺服器人臉檢測和特徵提取,伺服器特徵比對,排序,結果輸出。 全部交給伺服器處理,伺服器壓力太了,讓客戶端分擔點吧 。

優化後...

虹軟人臉識別SDK - Java服務端的那些事
虹軟人臉識別SDK - Java服務端的那些事
把人臉檢測和特徵提取全放客戶端,客戶端每次上傳人臉特徵,服務端做特徵比對、排序,結果輸出。

相關文章