最近有合作公司的項目需要服務端人臉識別的開發,於是就用了公司的人臉識別SDK開發,由於之前對服務端開發介紹的資料比較少,正好這次又做了這個項目,花了幾天的開發,這里就簡單分享一下個人的見解。
影響性能的幾個關鍵點
1、人臉檢測
人臉檢測接口就是可以把一張圖片的人臉照片圖, 經過FaceEngine的處理,檢測出人人臉框信息。檢測模式有兩種,image模式和video模式,image模式對於人臉檢測准確率比較高,但性能沒有video模式高。video模式適用於在視頻流模式下,在視頻流模式有更快的處理性能和更好的人臉框穩定性。Video模式下,處理一幀圖片在10毫秒內,所以在30幀的視頻中,可以輕松的對每幀進行人臉檢測。
2、特征提取
特征提取是在檢測出人臉框的基礎上,尋找出該人臉最具特別性的描述,該描述可被傳輸和保存,在ArcFace2.0中,一個特征占用1032字節,特征提取要花100-150毫秒,所以每幀都做特征提取是不可行的,但借助TrackID,可以做到一張人臉只要提取一次人臉特征。
3、人臉比對
人臉比對即特征比對,對兩張人臉照片圖分別提取特征,然后進行比較,獲取相似度。該比對的時間是微妙級的,但在實際的應用過程中,往往是幾千個特征甚至幾萬個特征進行比對,所以處理時間要成倍的增加。假設處理一個特征需要3微妙,那么在5萬的特征庫中進行比較,時間就是3*50000=150毫秒
如何應對實時性高的場景
無感是永遠的痛
人臉識別經常用在一些實時性比較高的場合,比如門禁這類系統,客戶往往要求我們要“無感”通過。這些實時性高的系統,通常利用網絡傳輸視頻流,服務器來處理再反饋結果,如果沒有在網絡,內存,CPU上做足夠的優化,往往帶來的就是延遲高,響應慢。
光看上面文字,大家可能沒什么印象。咱們還是來一張圖,一起來直觀的感受一下耗時分析
咱們來算算,假設100個設備,每秒鍾30幀的照片,每幀100K,那么每秒鍾有多少流量?每分鍾有多少?每天呢?
按照標准的算法,每個設備每秒鍾流量:1*30幀*100KB=3MB
換算到分的話3MB*60秒=16MB/分
1天的話16MB*60分鍾*24小時=23040MB/天
100個設備的話23040MB*100=2T/天,也就是每天有T級別流量
哇,這么一算,一般的服務器和網絡怎么受得了
老規矩,咱們看圖來分析下現狀
如上圖,照片實時上傳到服務器,服務器人臉檢測和特征提取,服務器特征比對,排序,結果輸出。
全部交給服務器處理,服務器壓力太了,讓客戶端分擔點吧 。
優化后...
把人臉檢測和特征提取全放客戶端,客戶端每次上傳人臉特征,服務端做特征比對、排序,結果輸出。