如何用人脸识别自动给头像添加口罩及护目镜

作者: Evilran 2020-02-13 12:50:07

给头像添加口罩及护目镜

项目地址:https://github.com/Evilran/add-mask-and-goggle

写在前面

武汉爆发了2020新型冠狀病毒肺炎,大家都纷纷戴上了口罩以预防被传染。朋友圈也不例外,许多用户都为自己的头像戴上了口罩,但是p图调整口罩的位置浪费了大家很多时间。那么我们如何通过人脸识别自动给头像添加口罩及护目镜呢?

此项目使用人脸识别自动给头像添加口罩及护目镜,仅为呼吁大家积极佩戴口罩及护目镜,为武汉及奋斗在第一线的医护人员加油!

依赖🐍

在开始前,我们需要在python3上安装以下几个包:

  •  numpy==1.17.4
  •  Flask>=1.0.0
  •  requests==2.22.0
  •  opencv-python==4.0.0.21
  •  dlib==19.17.99

Flask为我们的项目提供了一个简单的Web服务器,dlib用以识别人脸及嘴唇和眼睛的部位(提供了口罩所在的位置),opencv库可以把口罩素材添加到人脸的嘴唇部位上,护目镜添加到人脸的眼部。

搭建Web服务器

首先,引入flask库并构造主页面:

  1. from flask import Flask  
  2. from flask import request  
  3. from flask import render_template  
  4. @app.route('/', methods=['GET', 'POST'])  
  5. def index():  
  6.     return render_template('index.html')   
  7.     ----------------------  
  8. if __name__ == '__main__':  
  9.     app.run() 

需要注意的是,我们的服务器上只允许上传图片类型的文件,并且不缓存图片(用户可以选择其他的口罩重新制作),所以我们要进行如下配置:

  1. app = Flask(__name__)  
  2. # 取消图片缓存  
  3. app.config['SEND_FILE_MAX_AGE_DEFAULT'] = timedelta(seconds=1 
  4. ALLOWED_EXTENSIONS = set(['bmp', 'png', 'jpg', 'jpeg'])  
  5. UPLOAD_FOLDER=r'./cache/'  
  6. app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER  
  7. def allowed_file(filename):  
  8.     return '.' in filename and \  
  9.            filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS 

我们的Web服务器上包含有两个路由:

  1. /url /add 

url 是粘贴图片的地址,服务器会自动下载图片,add 则为用户手动上传图片 (如果只需用户手动上传图片,不需要引入requests库)

add 路由的函数代码如下:

  1. @app.route('/add', methods=['GET', 'POST'])  
  2. def search():  
  3.     if request.method == 'POST':  
  4.         file = request.files['image']  
  5.         mode = (int)(request.form['mask'])  
  6.         isGoggle = request.form.get('goggle')  
  7.         if file and allowed_file(file.filename):  
  8.             path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)  
  9.             file.save(path)  
  10.             output = add(path, file.filename, mode, isGoggle)  
  11.             return render_template('index.html', outputoutput = output)  
  12.         else:  
  13.             return render_template('index.html', alert = '文件类型必须是图片!' 
  14.     else:  
  15.         return render_template('index.html') 

接着我们配置好 templates 里的 index.html 文件,详细代码请移步 Github 项目。

人脸识别

好了,到这里我们已经成功配置好Web服务器了,接着我们开始写后端处理图片的代码。我们引入 dlib 和 opencv 库:

  1. import cv2  
  2. import dlib  
  3. import numpy as np  
  4. import os 

利用已经训练好的 Dlib 正向人脸检测器 detector = dlib.get_frontal_face_detector() 进行人脸检测,并用 'models/shapepredictor68facelandmarks.dat' 进行 人脸嘴部 20 个特征点坐标( 40 维特征)的提取:

  1. def get_mouth(img):  
  2.     img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
  3.     detector = dlib.get_frontal_face_detector()  
  4.     predictor = dlib.shape_predictor('models/shape_predictor_68_face_landmarks.dat')  
  5.     faces = detector(img_gray, 0)  
  6.     for k, d in enumerate(faces):  
  7.         x = []  
  8.         y = []  
  9.         # 人脸大小的高度  
  10.         height = d.bottom() - d.top()  
  11.         # 人脸大小的宽度  
  12.         width = d.right() - d.left()  
  13.         shape = predictor(img_gray, d)  
  14.         # 49-68 为嘴唇部分  
  15.         for i in range(48, 68):  
  16.             x.append(shape.part(i).x)  
  17.             y.append(shape.part(i).y) 
  18.          # 根据人脸的大小扩大嘴唇对应口罩的区域  
  19.         y_max = (int)(max(y) + height / 3)  
  20.         y_min = (int)(min(y) - height / 3)  
  21.         x_max = (int)(max(x) + width / 3)  
  22.         x_min = (int)(min(x) - width / 3)  
  23.         size = ((x_max-x_min),(y_max-y_min))  
  24.         return x_min, x_max, y_min, y_max, size 

同样的道理,我们进行 人脸眼部特征 的提取:

  1. def get_eye(img):  
  2.     img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
  3.     detector = dlib.get_frontal_face_detector()  
  4.     predictor = dlib.shape_predictor('models/shape_predictor_68_face_landmarks.dat')  
  5.     faces = detector(img_gray, 0)  
  6.     for k, d in enumerate(faces):  
  7.         x = []  
  8.         y = []  
  9.         height = d.bottom() - d.top()  
  10.         width = d.right() - d.left()  
  11.         shape = predictor(img_gray, d)  
  12.         for i in range(36, 48):  
  13.             x.append(shape.part(i).x)  
  14.             y.append(shape.part(i).y)  
  15.         y_max = (int)(max(y) + height / 3)  
  16.         y_min = (int)(min(y) - height / 3)  
  17.         x_max = (int)(max(x) + width / 3)  
  18.         x_min = (int)(min(x) - width / 3)  
  19.         size = ((x_max-x_min),(y_max-y_min))  
  20.         return x_min, x_max, y_min, y_max, size 

识别出嘴唇和眼睛的位置后,我们通过 opencv 处理背景透明的口罩和护目镜素材 ,把背景变成白色:

  1. img2 = cv2.imread('masks/goggle.png', cv2.IMREAD_UNCHANGED)  
  2. img2 = cv2.resize(img2,size)  
  3. alpha_channel = img2[:, :, 3]  
  4. _, mask = cv2.threshold(alpha_channel, 220, 255, cv2.THRESH_BINARY)  
  5. color = img2[:, :, :3]  
  6. img2 = cv2.bitwise_not(cv2.bitwise_not(color, maskmask=mask)) 

然后进行图像融合,把口罩及护目镜添加到我们刚刚得到的嘴唇位置和眼睛位置:

  1. x_min, x_max, y_min, y_max, size = get_eye(img1)  
  2. rows,cols,channels = img2.shape  
  3. roi = img1[y_min: y_min + rows, x_min:x_min + cols]  
  4. img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)  
  5. ret, mask = cv2.threshold(img2gray, 254, 255, cv2.THRESH_BINARY)  
  6. mask_inv = cv2.bitwise_not(mask)  
  7. img1_bg = cv2.bitwise_and(roi,roi,maskmask = mask)  
  8. img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv 
  9. dst = cv2.add(img1_bg,img2_fg)  
  10. img1[y_min: y_min + rows, x_min:x_min + cols] = dst 

到这里,我们人脸识别添加口罩及护目镜的代码就已经成功完成了。

演示😷

项目完成后,

仅需一个命令即可简单地运行Web服务器:

  1. $ python3 server.py 

然后访问:127.0.0.1:5000(端口 5000).

这里支持两种模式,一种是输入URL地址,另外一种是直接上传图片:

目前口罩支持以下几种类型:

举个栗子🌰

原图:

添加口罩及护目镜:

原图:

添加口罩:

感谢🙏

感谢奋斗在第一线的医护人员,感谢春运中的逆行者!

人脸识别 口罩 护目镜
上一篇:选择正确人工智能数据存储的6个准则 下一篇:大规模存储基础设施对人工智能的要求
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

戴口罩难以刷脸支付 刷手行不行?

人工智能技术日益深入生活的同时,公众的隐私担忧也越来越甚。人脸作为生物识别特征数据的一种,与其他识别方式相比具有更容易暴露、难以更改的特性,公众对相关的收集使用活动就更为敏感。那么,有没有其他支付方式?

佚名 ·  2天前
过度防范?莫斯科公交司机接令人工识别中国乘客,人脸识别系统也被授权启用

据外媒报道,莫斯科公共交通运营商上周指示,如果中国公民上了他们的公共汽车,司机应迅速将相关信息告知调度员,由调度员负责报警。

张佳 ·  3天前
复工如何避免间接接触?人脸识别门禁实现硬核防控

随着返工日的临近,全国各地陆续恢复生产和工作,与此同时,疫情预防的工作也不可松懈。据悉,新型冠状病毒的传播方式主要为飞沫传播和间接接触,当下,人人出门都会佩戴口罩,并且经常洗手,可以有效预防飞沫传播,而接触公共设施的间接传播方式不容忽视。

佚名 ·  2020-02-20 14:12:01
人工智能技术快速识别人流中个体感染者风险,同济研发疫情防控识别系统

在摆放于校门口的摄像头前站定,系统马上通过人脸识别技术,结合现场体温检测,对同济大学教职员工、学生的基本情况进行自动分析查询。如果体温正常、满足外地返沪大于14天隔离和上海的相关要求,校门将予以放行;如有发热现象或不满足相关要求,系统将自动报警,不予放行,对相关人员实现......

彭德倩 ·  2020-02-18 07:00:50
支付宝人脸识别被“破解”,我们的钱不安全了么?

技术总归是不断发展进步的,坏人掌握的技术也是一样。并且,任何一个技术都有被黑被破解的可能,只是成本问题。

徐九 ·  2020-02-14 13:36:12
人脸识别背后:可怕的不是技术,而是……

当下AI程序到底会用人类面孔做什么?有多少的恐惧是来源于传言,而非摆在面前的事实?技术的力量是否让人类的担忧不断增多?我们来一起想想这个问题。

读芯术 ·  2020-02-12 22:20:39
30 亿图库,一张照片就能查个人信息!人脸识别再爆隐私争议

这个时代,你的个人信息在手机里的比家里更多。想象一下,那么多生活细节都能放进口袋里,这让隐私问题变得比以往更重要。

Rachel ·  2020-01-21 21:20:00
未来面部识别技术的最大问题是几乎不会出错

近年来,面部识别技术总被推上舆论的风口浪尖,比如针对女性和有色人种的误报率太高、以及对个人自由和隐私的不利影响。在美国众议院监督委员会的第三次专场听证会上,议员希望解决私人企业和政府机构在公共场所使用该技术的一些问题。

佚名 ·  2020-01-16 15:51:32
Copyright©2005-2020 51CTO.COM 版权所有 未经许可 请勿转载