自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何用人臉識別自動給頭像添加口罩及護目鏡

人工智能 人臉識別
此項目使用人臉識別自動給頭像添加口罩及護目鏡,僅為呼吁大家積極佩戴口罩及護目鏡,為武漢及奮斗在第一線的醫(yī)護人員加油!

給頭像添加口罩及護目鏡

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

寫在前面

武漢爆發(fā)了2020新型冠狀病毒肺炎,大家都紛紛戴上了口罩以預防被傳染。朋友圈也不例外,許多用戶都為自己的頭像戴上了口罩,但是p圖調整口罩的位置浪費了大家很多時間。那么我們如何通過人臉識別自動給頭像添加口罩及護目鏡呢?

此項目使用人臉識別自動給頭像添加口罩及護目鏡,僅為呼吁大家積極佩戴口罩及護目鏡,為武漢及奮斗在第一線的醫(yī)護人員加油!

依賴🐍

在開始前,我們需要在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 維特征)的提?。?nbsp;

  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.          # 根據人臉的大小擴大嘴唇對應口罩的區(qū)域  
  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 

同樣的道理,我們進行 人臉眼部特征 的提?。?nbsp;

  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地址,另外一種是直接上傳圖片:

目前口罩支持以下幾種類型:

舉個栗子🌰

原圖:

 

添加口罩及護目鏡:

 

原圖:

添加口罩:

感謝🙏

感謝奮斗在第一線的醫(yī)護人員,感謝春運中的逆行者! 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2021-07-01 09:32:14

人臉識別AI人工智能

2020-03-05 16:35:06

人臉識別口罩人工智能

2021-08-06 21:16:08

人臉識別AI人工智能

2021-03-10 17:22:01

人臉識別人工智能數據

2020-08-13 11:36:09

人臉識別技術數據

2021-11-03 14:56:15

Facebook 人臉識別技術

2020-12-07 09:34:20

人臉識別隱私安全

2021-08-10 15:52:56

人臉識別AI人工智能

2020-02-22 08:02:07

春節(jié)疫情防控口罩

2022-07-15 11:33:01

供應鏈VR虛擬現實

2020-02-05 16:40:07

面部識別iPhone口罩

2021-04-07 13:31:36

人臉識別人工智能AI

2021-07-28 11:44:39

人工智能AI人臉識別

2018-07-02 10:48:20

2014-02-14 13:57:22

UbuntuWindowsMac

2020-06-11 16:55:16

TensorRT人臉識別人工智能

2019-10-31 12:40:26

人臉識別AI人工智能

2021-05-10 11:08:00

人工智能人臉識別

2020-07-28 08:45:14

人臉識別人工智能數據

2020-02-13 16:24:03

人工智能機器學習技術
點贊
收藏

51CTO技術棧公眾號