人脸识别图像的模糊度判别算法的优化

人脸识别图像的模糊度判别算法的优化

最近在做一个项目,需要处理网络摄像头传过来的图像,判断图像质量,识别图像中的人员,再做分割处理后,发给百度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阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • 不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘...
    大川无敌阅读 13,628评论 0 29
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,565评论 25 707
  • 文:写不长 ▼ 今天起床很早,慢悠悠地吃完早饭,把儿子送到幼儿园时,院子里空无一人......我们到的太早了。 看...
    剧不终阅读 452评论 0 2
  • 关于畅销小说,东野圭吾的作品在当下广为流传,广为流传的几个作品框架都非常大,讲述着每一个人。 让人无法细道主人公的...
    卿诚1阅读 188评论 0 0
  • 我觉得彩色树叶就像…… 红色的树叶就像红宝石, 橙色的树叶就像橙水晶, 黄色的树叶就像黄金, 绿色的树叶就像绿宝石...
    小种子教室孙锐鑫阅读 607评论 1 1