人臉識別影像的模糊度判別演算法的最佳化
人臉識別影像的模糊度判別演算法的最佳化
最近在做一個專案,需要處理網路攝像頭傳過來的影像,判斷影像質量,識別影像中的人員,再做分割處理後,發給百度AIP face做人臉識別和比對.
因為,攝像頭髮過來的影像的質量參差不齊,需要判斷圖片的清晰程度,因為是做人臉識別,尤其是要臉部清晰.所以需要判斷圖片的模糊度,來決定是否採錄圖片還是放棄.
1.強大的百度 AIP Face
百度在AI領域做的非常不錯,而且他的人臉識別的API也是開放的,嘗試採用類似Openface等類似的人臉識別框架後,難以達到商業級別的應用,所以我們考慮採用百度的人臉識別系統作為BACKEND.
使用過程中,也覺得非常不錯,介面引數和識別率也都很不錯.
2.百度API的介面引數
我們需要做圖片的清晰度的檢查,術語就是取得圖片的blur值.blur直譯就是模糊,就是我們所說的圖片模糊度,值越小就越模糊.
在識別前,我們這邊伺服器呼叫人員的圖片,做人臉檢測,百度AIP face會返回很多引數來判斷人臉的可信度,光照,角度,可信度及人員的年齡性別等等. 當然這裡也有blur值,表明圖片的模糊程度.
人臉檢測 返回示例:
{ "result_num": 1, "result": [ { "location": { "left": 117, "top": 131, "width": 172, "height": 170 }, "face_probability": 1, "rotation_angle": 2, "yaw": -0.34859421849251, "pitch": 2.3033397197723, "roll": 1.9135693311691, "landmark": [ { "x": 161.74819946289, "y": 163.30244445801 }, ... ], "landmark72": [ { "x": 115.86531066895, "y": 170.0546875 }, ... ], "age": 29.298097610474, "beauty": 55.128883361816, "expression": 1, "expression_probablity": 0.5543018579483, "gender": "male", "gender_probability": 0.99979132413864, "glasses": 0, "glasses_probability": 0.99999964237213, "race": "yellow", "race_probability": 0.99999976158142, "qualities": { "occlusion": { "left_eye": 0, "right_eye": 0, "nose": 0, "mouth": 0, "left_cheek": 0.0064102564938366, "right_cheek": 0.0057411273010075, "chin": 0 }, "blur": 1.1886881756684e-10, "illumination": 141, "completeness": 1, "type": { "human": 0.99935841560364, "cartoon": 0.00064159056637436 } } } ], "log_id": 2493878179101621}
質量判斷
可透過人臉檢測介面,基於以下欄位和對應閾值,進行質量檢測的判斷,以保證人臉質量符合後續業務操作要求。
指標 欄位與解釋 推薦數值界限
遮擋範圍 occlusion(0~1),0為無遮擋,1是完全遮擋
含有多個具體子欄位,表示臉部多個部位
通常用作判斷頭髮、墨鏡、口罩等遮擋 left_eye : 0.6, #左眼被遮擋的閾值
right_eye : 0.6, #右眼被遮擋的閾值
nose : 0.7, #鼻子被遮擋的閾值
mouth : 0.7, #嘴巴被遮擋的閾值
left_check : 0.8, #左臉頰被遮擋的閾值
right_check : 0.8, #右臉頰被遮擋的閾值
chin_contour : 0.6, #下巴被遮擋閾值
模糊度範圍 Blur(0~1),0是最清晰,1是最模糊 小於0.7
光照範圍 illumination(0~255)
臉部光照的灰度值,0表示光照不好
以及對應客戶端SDK中,YUV的Y分量 大於40
姿態角度 Pitch:三維旋轉之俯仰角度[-90(上), 90(下)]
Roll:平面內旋轉角[-180(逆時針), 180(順時針)]
Yaw:三維旋轉之左右旋轉角[-90(左), 90(右)] 分別小於20度
人臉完整度 completeness(0或1),0代表完整,1代表不完整 小於0.4
人臉大小 人臉部分的大小
. 建議長寬畫素值範圍:8080~200200 人臉部分不小於100*100畫素
當然,百度的介面引數還很多,可以到官網檢視
3.百度的API的一個小問題
我們先看這兩張圖片:
y1.jpg
y2.jpg
很明顯,我們透過肉眼觀察就可以馬上判斷出來上面的照片更加模糊,下面的照片還算可以.
我們呼叫百度的facedetect,返回的值判斷一下那個模糊度範圍 Blur,發現 上一張的值要比下面的小很多,也就是百度判斷上面的照片比下面的照片要清楚很多. 這個太反直覺了,難道百度算錯了嗎?
4. 找到原因
是什麼讓百度的計算有問題,難道是Blur的演算法有問題嗎?
我們決定自己寫一套清晰度的演算法,我們採用用 OpenCV和拉普拉斯運算元來計算圖片中的模糊量,也就是拉普拉斯方差演算法(Variance of the Laplacian).
只需要將圖片中的某一通道(但一般用灰度值)用下面的拉普拉斯掩模做卷積運算:
用拉普拉斯運算元與輸入影像做卷積
然後計算方差(即標準差的平方)。
如果某圖片方差低於預先定義的閾值,那麼該圖片就可以被認為是模糊的。高於閾值,就不是模糊的。
這種方法湊效的原因就在於拉普拉斯運算元定義本身。它被用來測量圖片的二階導數,突出圖片中強度快速變化的區域,和 Sobel 以及 Scharr 運算元十分相似。並且,和以上運算元一樣,拉普拉斯運算元也經常用於邊緣檢測。此外,此演算法基於以下假設:如果圖片具有較高方差,那麼它就有較廣的頻響範圍,代表著正常,聚焦準確的圖片。但是如果圖片具有有較小方差,那麼它就有較窄的頻響範圍,意味著圖片中的邊緣數量很少。正如我們所知道的,圖片越模糊,其邊緣就越少。
藉助opencv,程式碼很簡單:
import cv2 imagePath ='./data/y1.jpg'image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) print('y1 blur:',cv2.Laplacian(gray, cv2.CV_64F).var()) imagePath ='./data/y2.jpg'image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) print('y2 blur:',cv2.Laplacian(gray, cv2.CV_64F).var())
y1 blur: 1663.09841446y2 blur: 924.740511
這次真的驚得掉了下巴,竟然和百度的運算一致! 看來演算法並沒問題,那麼問題出在哪裡呢?
思考片刻,找到答案,原來是這樣:
造成圖片的模糊有2個原因,一種是目標快速移動,還一種是攝像機本身抖動.
目前監控攝像頭造成的迷糊原因是目標快速移動,而背景不動
拉普拉斯方差計算會使用拉普拉斯掩模對整張圖做卷積運算,而背景不動的部分其實很清晰,只是移動的目標部分模糊罷了,這樣整個結果值就低了.
下面,我們採用獲取人臉區域,只計算人臉區域的拉普拉斯卷積值.
圖片如下:
y10.jpg
y20.png
import cv2 imagePath ='./data/y10.jpg'image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) print('y1 blur:',cv2.Laplacian(gray, cv2.CV_64F).var()) imagePath ='./data/y20.png'image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) print('y2 blur:',cv2.Laplacian(gray, cv2.CV_64F).var())
y1 blur: 418.203306267y2 blur: 1196.72339094
結果和預想的一樣完美!
這樣就知道百度API對影像的模糊度判斷的問題了.
解決方案
我們目前,直接使用拉普拉斯卷積運算元計算,只是不再最整張圖片處理,只針對臉部區域計算.這樣結果就很好.
我們建議百度能過修改AIP face中Blur的演算法,及考慮相機抖動也考慮目標移動2種情況下產生的模糊問題,使得計算的blur值更加靠譜.
作者:gaoshine
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/36/viewspace-2804581/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 前端人臉識別--兩張臉相似度前端
- 樹莓派利用OpenCV的影像跟蹤、人臉識別等樹莓派OpenCV
- opencv 人臉識別OpenCV
- OpenCV — 人臉識別OpenCV
- Mars演算法實踐——人臉識別演算法
- 百度人臉識別模組使用分享
- 小程式--人臉識別功能(百度ai)AI
- 【基於PCA的人臉識別演算法】從QR分解到PCA,再到人臉識別PCA演算法
- 人臉檢測識別,人臉檢測,人臉識別,離線檢測,C#原始碼C#原始碼
- 如何理解並實現一個簡單的人臉識別演算法(下):人臉識別演算法
- 人臉識別之人臉檢測的重要性
- java 百度人臉識別 介面程式碼Java
- C#人臉識別入門篇-STEP BY STEP人臉識別--入門篇C#
- 智慧人臉識別門禁系統開發,人臉識別開鎖流程
- 如何評價美顏api中人臉識別和人臉檢測的準確度?API
- Android平板百度人臉識別開發Android
- 人臉識別之特徵臉方法(Eigenface)特徵
- 人臉識別智慧考勤系統開發_人臉識別考勤管理系統開發
- 人臉識別技術應用
- 前端如何玩轉人臉識別前端
- python—呼叫API人臉識別PythonAPI
- 從零玩轉人臉識別
- 人臉活體檢測人臉識別:眨眼+張口
- 人臉識別背後:可怕的不是技術
- 乾貨 | AI人臉識別之人臉搜尋AI
- 刷臉支付人臉識別特徵點越多是別越精確特徵
- 人臉識別之Python DLib庫進行人臉關鍵點識別Python
- 人臉識別 -- 活體檢測(張嘴搖頭識別)
- 人臉識別 — 活體檢測(張嘴搖頭識別)
- AI+慈善 ▏人臉識別+人臉模擬助力失散親人找到回家的路AI
- 基於深度學習的人臉識別系統系列(Caffe+OpenCV+Dlib)——【六】設計人臉識別的識別類深度學習OpenCV
- 人臉識別與人體動作識別技術及應用pdf
- 儀表影像識別演算法演算法
- 如何最佳化並改進美顏sdk人臉識別技術?
- 口袋無人機DOBBY:我的“人臉識別”已上線無人機
- 用Azure上Cognitive Service的Face API識別人臉API
- 中國人臉識別產業鏈全景圖產業
- Python人臉識別微笑檢測Python