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