|
|
51CTO旗下网站
|
|
移步端
  • 如何用人脸识别自动给头像添加口罩及护目镜

    此项目采用人脸识别自动给头像添加口罩及护目镜,仅为呼吁大家再接再厉佩戴口罩及护目镜,为成都及奋斗在第一线的医护人员加油!

    笔者:Evilran 来源:segmentfault| 2020-02-13 12:50

    送头像添加口罩及护目镜

    品种地址: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地点,此外一种是直接上流传图片:

    脚下口罩支持以下几种类型:

    举个栗子🌰

    原图:

    补充口罩及护目镜:

    原图:

    补充口罩:

    谢谢🙏

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

    【编纂推荐】

    1. 这家AI商店用面具破解中国人脸识别系统!微信、支付宝、火车站无一幸免
    2. 面识别技术总结:副传统艺术到深度学习
    3. 面识别背下:可怕的不是艺术
    4. 30 京图库,一张照片就能查个人信息!面识别再爆隐私争议
    5. 面识别背下:可怕的不是艺术,而是……
    【义务编辑: 庞桂玉 TEL:(010)68476606】

    点赞 0
  • 面识别  口罩  护目镜
  • 分享:
    大家都在看
    猜你喜欢
  • 订阅专栏+更多

    高并发互联网消费金融领域架构设计

    高并发互联网消费金融领域架构设计

    应对高并发架构
    共5章 | jayslife

    人口订阅学习

    Kubernetes:21远处完美通关

    Kubernetes:21远处完美通关

    从小白到修神
    共29章 | king584911644

    200人口订阅学习

    Python使用场景实战手册

    Python使用场景实战手册

    Python使用场景实战手册
    共3章 | KaliArch

    122人口订阅学习

    订阅51CTO邮刊

    点击这里查看样刊

    订阅51CTO邮刊

    51CTO劳务号

    51CTO官微