【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩
detector = dlib.get_frontal_face_detector()
功能:人臉檢測(cè)畫框
參數(shù):無
返回值:默認(rèn)的人臉檢測(cè)器
faces = detector(img_gray, 0)
功能:對(duì)圖像畫人臉框
參數(shù):img_gray:輸入的圖片
返回值:人臉檢測(cè)矩形框4點(diǎn)坐標(biāo)。坐標(biāo)為[(x1, y1) (x2, y2)]。可以通過函數(shù)的left,right,top,bottom方法分別獲取對(duì)應(yīng)的x1, x2, y1, y2值。(cv里的矩陣和C++的那種一樣,左上角是(0,0)點(diǎn),水平為x方向,豎直為y方向,類似笛卡爾系(區(qū)別是y軸正方向不同),所以top的y坐標(biāo) < bottom的y坐標(biāo)。matplotlib是相反的。)
后面那個(gè)參數(shù)代表將原始圖像是否進(jìn)行放大,1表示放大1倍再檢查,提高小人臉的檢測(cè)效果。
? ? ? ? ? ? ? ? ? ? ? ?
左圖是參數(shù)為0的檢測(cè)情況,右圖是參數(shù)為1的檢測(cè)情況。
上述例子參考自鏈接:http://blog.sina.com.cn/s/blog_49b3ba190102yvl9.html
?
?
注意dlib只能對(duì)灰度圖進(jìn)行檢測(cè):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)注意更改當(dāng)前文件運(yùn)行目錄 為 程序執(zhí)行文件路徑 的方法:
https://www.jb51.net/article/138980.htm
?
下面進(jìn)行代碼實(shí)戰(zhàn):
原圖地址
代碼實(shí)戰(zhàn)1:人臉檢測(cè)
import numpy import dlib import cv2 import sys import os# 修改執(zhí)行目錄為該.py文件所在目錄 #dirname, filename = os.path.split(os.path.abspath(sys.argv[0])) dirname, filename = os.path.split(sys.argv[0]) # print(dirname,filename) # path = os.getcwd() os.chdir(dirname) print(os.getcwd())# 人臉檢測(cè) detector = dlib.get_frontal_face_detector()# 人臉關(guān)鍵點(diǎn)標(biāo)注。 predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat' ) img = cv2.imread('sdtw2.jpg')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #這樣也可以灰度圖但是不建議用:im2 = cv2.imread('tfboys.jpg',flags = 0)faces = detector(gray,0)# 第二個(gè)參數(shù)越大,代表講原圖放大多少倍在進(jìn)行檢測(cè),提高小人臉的檢測(cè)效果。for face in faces:#左上角(x1,y1),右下角(x2,y2)x1, y1, x2, y2 = face.left(), face.top(), face.right(), face.bottom()print(x1,y1,x2,y2)cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imshow("image", img) cv2.waitKey(0)運(yùn)行結(jié)果:
?
代碼實(shí)戰(zhàn)2:人臉關(guān)鍵點(diǎn)標(biāo)注
?
?
實(shí)驗(yàn)結(jié)果:
人臉關(guān)鍵點(diǎn):
附標(biāo)號(hào):
?
代碼實(shí)戰(zhàn)3:佩戴口罩
我們?nèi)?,8,14,28作為口罩關(guān)鍵點(diǎn),即下圖3,9,15,29,放入points_key中
對(duì)于待測(cè)圖片的每一個(gè)人臉框,按照對(duì)應(yīng)points_key來檢測(cè)邊界,將口罩圖片進(jìn)行縮放,填入對(duì)應(yīng)區(qū)域。
注意對(duì)下載后的口罩要進(jìn)行背景去除,這里可以用一些在線處理網(wǎng)站,或者ps等等。(本項(xiàng)目使用已去除背景的口罩已上傳到github)
?
注意實(shí)現(xiàn)的時(shí)候,有個(gè)問題就是透明度的問題,不然會(huì)出現(xiàn)下面這個(gè)問題:
為了方便講解,我們將口罩區(qū)域分成口罩圖像區(qū)域,和口罩真實(shí)區(qū)域。
在代碼實(shí)現(xiàn)的時(shí)候,剛開始只是想著分?jǐn)傁袼刂?#xff0c;比如對(duì)口罩圖像區(qū)域,讓他80%保留原圖像素值,20%來自口罩圖像,這樣進(jìn)行merge。但是效果并不是期待的那樣。
發(fā)現(xiàn)其實(shí)口罩部分還是要口罩占主體,所以換成了20%保留原圖像素值,80%來自口罩圖像,如下圖。
剩下的就是透明度的問題了,這里我采用的是二值化方法,把像素值較小的背景部分隱去,像素值較大的是口罩真實(shí)區(qū)域,采用口罩圖80%和人臉圖20%進(jìn)行merge。
閾值設(shè)置為80,表現(xiàn)良好。
此項(xiàng)目代碼對(duì)應(yīng)代碼和實(shí)驗(yàn)所用到的圖像均放到了github:https://github.com/xuanweiace/put_a_mask_on_the_face/
歡迎下載和star。
?
項(xiàng)目中是用二值化的方法來實(shí)驗(yàn)背景透明的功能,cv2中也自帶了一個(gè)功能可以實(shí)現(xiàn)透明化處理,感興趣的同學(xué)可以搜一下:
透明度覆蓋:
img_mix = cv2.addWeighted(img1, 1, img2,1, 0) #合并,其中參數(shù)1表示透明度,第一個(gè)1表示img1不透明,第二個(gè)1表示img1不透明,如果改成0.5表示合并的時(shí)候已多少透明度覆蓋。
?
相關(guān)拓展鏈接:
識(shí)別戴口罩的人臉的四種方法:https://blog.csdn.net/qq_23670601/article/details/104344917
總結(jié)
以上是生活随笔為你收集整理的【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用了10年智能手机 结果充电姿势都是错的
- 下一篇: 【机器学习】 - 各种人脸数据集下载地址