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