人臉識別圖像的模糊度判別算法的優化

人臉識別圖像的模糊度判別算法的優化

最近在做一個項目,需要處理網絡攝像頭傳過來的圖像,判斷圖像質量,識別圖像中的人員,再做分割處理后,發給百度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
}

質量判斷

可通過人臉檢測接口,基于以下字段和對應閾值,進行質量檢測的判斷,以保證人臉質量符合后續業務操作要求。

指標 字段與解釋 推薦數值界限

  1. 遮擋范圍 occlusion(0~1),0為無遮擋,1是完全遮擋
  2. 含有多個具體子字段,表示臉部多個部位
  3. 通常用作判斷頭發、墨鏡、口罩等遮擋 left_eye : 0.6, #左眼被遮擋的閾值
  4. right_eye : 0.6, #右眼被遮擋的閾值
  5. nose : 0.7, #鼻子被遮擋的閾值
  6. mouth : 0.7, #嘴巴被遮擋的閾值
  7. left_check : 0.8, #左臉頰被遮擋的閾值
  8. right_check : 0.8, #右臉頰被遮擋的閾值
  9. chin_contour : 0.6, #下巴被遮擋閾值
  10. 模糊度范圍 Blur(0~1),0是最清晰,1是最模糊 小于0.7
  11. 光照范圍 illumination(0~255)
  12. 臉部光照的灰度值,0表示光照不好
  13. 以及對應客戶端SDK中,YUV的Y分量 大于40
  14. 姿態角度 Pitch:三維旋轉之俯仰角度[-90(上), 90(下)]
  15. Roll:平面內旋轉角[-180(逆時針), 180(順時針)]
  16. Yaw:三維旋轉之左右旋轉角[-90(左), 90(右)] 分別小于20度
  17. 人臉完整度 completeness(0或1),0代表完整,1代表不完整 小于0.4
  18. 人臉大小 人臉部分的大小
    . 建議長寬像素值范圍: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.09841446
y2 blur: 924.740511

這次真的驚得掉了下巴,竟然和百度的運算一致! 看來算法并沒問題,那么問題出在哪里呢?
思考片刻,找到答案,原來是這樣:

  1. 造成圖片的模糊有2個原因,一種是目標快速移動,還一種是攝像機本身抖動.
  2. 目前監控攝像頭造成的迷糊原因是目標快速移動,而背景不動
  3. 拉普拉斯方差計算會使用拉普拉斯掩模對整張圖做卷積運算,而背景不動的部分其實很清晰,只是移動的目標部分模糊罷了,這樣整個結果值就低了.

下面,我們采用獲取人臉區域,只計算人臉區域的拉普拉斯卷積值.
圖片如下:


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.203306267
y2 blur: 1196.72339094

結果和預想的一樣完美!
這樣就知道百度API對圖像的模糊度判斷的問題了.

解決方案

我們目前,直接使用拉普拉斯卷積算子計算,只是不再最整張圖片處理,只針對臉部區域計算.這樣結果就很好.
我們建議百度能過修改AIP face中Blur的算法,及考慮相機抖動也考慮目標移動2種情況下產生的模糊問題,使得計算的blur值更加靠譜.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • 不同圖像灰度不同,邊界處一般會有明顯的邊緣,利用此特征可以分割圖像。需要說明的是:邊緣和物體間的邊界并不等同,邊緣...
    大川無敵閱讀 13,905評論 0 29
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,637評論 25 708
  • 文:寫不長 ▼ 今天起床很早,慢悠悠地吃完早飯,把兒子送到幼兒園時,院子里空無一人......我們到的太早了。 看...
    劇不終閱讀 497評論 0 2
  • 關于暢銷小說,東野圭吾的作品在當下廣為流傳,廣為流傳的幾個作品框架都非常大,講述著每一個人。 讓人無法細道主人公的...
    卿誠1閱讀 229評論 0 0
  • 我覺得彩色樹葉就像…… 紅色的樹葉就像紅寶石, 橙色的樹葉就像橙水晶, 黃色的樹葉就像黃金, 綠色的樹葉就像綠寶石...
    小種子教室孫銳鑫閱讀 700評論 1 1