日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩

發(fā)布時(shí)間:2023/12/10 85 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)注


?

import numpy import dlib import cv2 import sys import os#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)dets = detector(gray,0)# 第二個(gè)參數(shù)越大,代表講原圖放大多少倍在進(jìn)行檢測(cè),提高小人臉的檢測(cè)效果。for d in dets:# 使用predictor進(jìn)行人臉關(guān)鍵點(diǎn)檢測(cè) shape為返回的結(jié)果shape = predictor(gray, d)for index, pt in enumerate(shape.parts()):print('Part {}: {}'.format(index, pt))pt_pos = (pt.x, pt.y)cv2.circle(img, pt_pos, 1, (255, 0, 0), 2) #利用cv2.putText標(biāo)注序號(hào)font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, str(index+1),pt_pos,font, 0.3, (0, 0, 255), 1, cv2.LINE_AA) cv2.imshow("image", img) cv2.waitKey(0) cv2.destroyAllWindows()

?

實(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。